2021-12-21 12:16:40 +01:00
|
|
|
/*
|
|
|
|
* APIMusicDirectoryConverter.kt
|
|
|
|
* Copyright (C) 2009-2021 Ultrasonic developers
|
|
|
|
*
|
|
|
|
* Distributed under terms of the GNU GPLv3 license.
|
|
|
|
*/
|
|
|
|
|
2017-09-02 19:40:32 +02:00
|
|
|
@file:JvmName("APIMusicDirectoryConverter")
|
2018-02-17 20:36:19 +01:00
|
|
|
package org.moire.ultrasonic.domain
|
2017-09-02 19:40:32 +02:00
|
|
|
|
2017-09-03 19:49:03 +02:00
|
|
|
import java.text.DateFormat
|
|
|
|
import java.text.SimpleDateFormat
|
|
|
|
import java.util.Locale
|
2017-09-02 19:40:32 +02:00
|
|
|
import org.moire.ultrasonic.api.subsonic.models.MusicDirectory as APIMusicDirectory
|
2020-06-13 19:04:31 +02:00
|
|
|
import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild
|
2017-09-02 19:40:32 +02:00
|
|
|
|
2021-12-21 12:16:40 +01:00
|
|
|
/*
|
|
|
|
* Converts MusicDirectory entity from [org.moire.ultrasonic.api.subsonic.SubsonicAPIClient]
|
|
|
|
* to app domain entities.
|
|
|
|
*
|
|
|
|
* Unlike other API endpoints getMusicDirectory doesn't return instances of Albums or Songs,
|
|
|
|
* but just children, which can be albums or songs.
|
|
|
|
*/
|
|
|
|
|
2017-09-03 19:49:03 +02:00
|
|
|
internal val dateFormat: DateFormat by lazy {
|
|
|
|
SimpleDateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault())
|
|
|
|
}
|
|
|
|
|
2021-12-21 12:16:40 +01:00
|
|
|
fun MusicDirectoryChild.toTrackEntity(): MusicDirectory.Entry = MusicDirectory.Entry(id).apply {
|
|
|
|
populateCommonProps(this, this@toTrackEntity)
|
|
|
|
populateTrackProps(this, this@toTrackEntity)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun MusicDirectoryChild.toAlbumEntity(): MusicDirectory.Album = MusicDirectory.Album(id).apply {
|
|
|
|
populateCommonProps(this, this@toAlbumEntity)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun populateCommonProps(
|
|
|
|
entry: MusicDirectory.Child,
|
|
|
|
source: MusicDirectoryChild
|
|
|
|
) {
|
|
|
|
entry.parent = source.parent
|
|
|
|
entry.isDirectory = source.isDir
|
|
|
|
entry.title = source.title
|
|
|
|
entry.album = source.album
|
|
|
|
entry.artist = source.artist
|
|
|
|
entry.artistId = source.artistId
|
|
|
|
entry.year = source.year
|
|
|
|
entry.genre = source.genre
|
|
|
|
entry.coverArt = source.coverArt
|
|
|
|
entry.duration = source.duration
|
|
|
|
entry.path = source.path
|
|
|
|
entry.isVideo = source.isVideo
|
|
|
|
entry.created = source.created?.time
|
|
|
|
entry.starred = source.starred != null
|
|
|
|
entry.discNumber = source.discNumber
|
|
|
|
|
|
|
|
if (source.streamId.isNotBlank()) {
|
|
|
|
entry.id = source.streamId
|
2017-09-03 19:49:03 +02:00
|
|
|
}
|
2021-12-21 12:16:40 +01:00
|
|
|
if (source.publishDate != null) {
|
|
|
|
entry.artist = dateFormat.format(source.publishDate!!.time)
|
2017-09-03 19:49:03 +02:00
|
|
|
}
|
2017-09-02 19:40:32 +02:00
|
|
|
}
|
|
|
|
|
2021-12-21 12:16:40 +01:00
|
|
|
private fun populateTrackProps(
|
|
|
|
entry: MusicDirectory.Entry,
|
|
|
|
source: MusicDirectoryChild
|
|
|
|
) {
|
|
|
|
entry.size = source.size
|
|
|
|
entry.contentType = source.contentType
|
|
|
|
entry.suffix = source.suffix
|
|
|
|
entry.transcodedContentType = source.transcodedContentType
|
|
|
|
entry.transcodedSuffix = source.transcodedSuffix
|
|
|
|
entry.track = source.track
|
|
|
|
entry.albumId = source.albumId
|
|
|
|
entry.bitRate = source.bitRate
|
|
|
|
entry.type = source.type
|
|
|
|
entry.userRating = source.userRating
|
|
|
|
entry.averageRating = source.averageRating
|
|
|
|
}
|
|
|
|
|
|
|
|
fun List<MusicDirectoryChild>.toDomainEntityList(): List<MusicDirectory.Child> {
|
|
|
|
val newList: MutableList<MusicDirectory.Child> = mutableListOf()
|
|
|
|
|
|
|
|
forEach {
|
|
|
|
if (it.isDir)
|
|
|
|
newList.add(it.toAlbumEntity())
|
|
|
|
else
|
|
|
|
newList.add(it.toTrackEntity())
|
|
|
|
}
|
|
|
|
|
|
|
|
return newList
|
|
|
|
}
|
|
|
|
|
|
|
|
fun List<MusicDirectoryChild>.toTrackList(): List<MusicDirectory.Entry> = this.map {
|
|
|
|
it.toTrackEntity()
|
|
|
|
}
|
2017-09-14 22:01:55 +02:00
|
|
|
|
2017-09-02 19:40:32 +02:00
|
|
|
fun APIMusicDirectory.toDomainEntity(): MusicDirectory = MusicDirectory().apply {
|
|
|
|
name = this@toDomainEntity.name
|
2021-12-21 12:16:40 +01:00
|
|
|
addAll(this@toDomainEntity.childList.toDomainEntityList())
|
2017-09-02 19:40:32 +02:00
|
|
|
}
|