music: preserve artist ordering in tags
Preserve the ordering of linked artists so that they line up with the ordering derived from tags.
This commit is contained in:
parent
494aa669cb
commit
459e71b941
1 changed files with 37 additions and 5 deletions
|
@ -386,10 +386,26 @@ class Song constructor(raw: Raw, settings: Settings) : Music() {
|
||||||
|
|
||||||
override fun _finalize() {
|
override fun _finalize() {
|
||||||
checkNotNull(_album) { "Malformed song: No album" }
|
checkNotNull(_album) { "Malformed song: No album" }
|
||||||
|
|
||||||
check(_artists.isNotEmpty()) { "Malformed song: No artists" }
|
check(_artists.isNotEmpty()) { "Malformed song: No artists" }
|
||||||
Sort(Sort.Mode.ByName, true).artistsInPlace(_artists)
|
for( i in _artists.indices ) {
|
||||||
|
// Non-destructively reorder the linked artists so that they align with
|
||||||
|
// the artist ordering within the song metadata.
|
||||||
|
val newIdx = _artists[i]._getOriginalPositionIn(_rawArtists)
|
||||||
|
val other = _artists[newIdx]
|
||||||
|
_artists[newIdx] = _artists[i]
|
||||||
|
_artists[i] = other
|
||||||
|
}
|
||||||
|
|
||||||
check(_genres.isNotEmpty()) { "Malformed song: No genres" }
|
check(_genres.isNotEmpty()) { "Malformed song: No genres" }
|
||||||
Sort(Sort.Mode.ByName, true).genresInPlace(_genres)
|
for( i in _genres.indices ) {
|
||||||
|
// Non-destructively reorder the linked genres so that they align with
|
||||||
|
// the genre ordering within the song metadata.
|
||||||
|
val newIdx = _genres[i]._getOriginalPositionIn(_rawGenres)
|
||||||
|
val other = _genres[newIdx]
|
||||||
|
_genres[newIdx] = _genres[i]
|
||||||
|
_genres[i] = other
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Raw
|
class Raw
|
||||||
|
@ -531,7 +547,14 @@ class Album constructor(raw: Raw, override val songs: List<Song>) : MusicParent(
|
||||||
override fun _finalize() {
|
override fun _finalize() {
|
||||||
check(songs.isNotEmpty()) { "Malformed album: Empty" }
|
check(songs.isNotEmpty()) { "Malformed album: Empty" }
|
||||||
check(_artists.isNotEmpty()) { "Malformed album: No artists" }
|
check(_artists.isNotEmpty()) { "Malformed album: No artists" }
|
||||||
Sort(Sort.Mode.ByName, true).artistsInPlace(_artists)
|
for( i in _artists.indices ) {
|
||||||
|
// Non-destructively reorder the linked artists so that they align with
|
||||||
|
// the artist ordering within the song metadata.
|
||||||
|
val newIdx = _artists[i]._getOriginalPositionIn(_rawArtists)
|
||||||
|
val other = _artists[newIdx]
|
||||||
|
_artists[newIdx] = _artists[i]
|
||||||
|
_artists[i] = other
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Raw(
|
class Raw(
|
||||||
|
@ -566,7 +589,7 @@ class Album constructor(raw: Raw, override val songs: List<Song>) : MusicParent(
|
||||||
* @author OxygenCobalt
|
* @author OxygenCobalt
|
||||||
*/
|
*/
|
||||||
class Artist
|
class Artist
|
||||||
constructor(raw: Raw, songAlbums: List<Music>) : MusicParent() {
|
constructor(private val raw: Raw, songAlbums: List<Music>) : MusicParent() {
|
||||||
override val uid = raw.musicBrainzId?.let { UID.musicBrainz(MusicMode.ARTISTS, it) } ?: UID.auxio(
|
override val uid = raw.musicBrainzId?.let { UID.musicBrainz(MusicMode.ARTISTS, it) } ?: UID.auxio(
|
||||||
MusicMode.ARTISTS
|
MusicMode.ARTISTS
|
||||||
) { update(raw.name) }
|
) { update(raw.name) }
|
||||||
|
@ -616,6 +639,7 @@ constructor(raw: Raw, songAlbums: List<Music>) : MusicParent() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val distinctSongs = mutableSetOf<Song>()
|
val distinctSongs = mutableSetOf<Song>()
|
||||||
val distinctAlbums = mutableSetOf<Album>()
|
val distinctAlbums = mutableSetOf<Album>()
|
||||||
|
@ -646,6 +670,10 @@ constructor(raw: Raw, songAlbums: List<Music>) : MusicParent() {
|
||||||
durationMs = songs.sumOf { it.durationMs }.nonZeroOrNull()
|
durationMs = songs.sumOf { it.durationMs }.nonZeroOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun _getOriginalPositionIn(rawArtists: List<Raw>): Int {
|
||||||
|
return rawArtists.indexOf(raw)
|
||||||
|
}
|
||||||
|
|
||||||
override fun _finalize() {
|
override fun _finalize() {
|
||||||
check(songs.isNotEmpty() || albums.isNotEmpty()) { "Malformed artist: Empty" }
|
check(songs.isNotEmpty() || albums.isNotEmpty()) { "Malformed artist: Empty" }
|
||||||
|
|
||||||
|
@ -680,7 +708,7 @@ constructor(raw: Raw, songAlbums: List<Music>) : MusicParent() {
|
||||||
* A genre.
|
* A genre.
|
||||||
* @author OxygenCobalt
|
* @author OxygenCobalt
|
||||||
*/
|
*/
|
||||||
class Genre constructor(raw: Raw, override val songs: List<Song>) : MusicParent() {
|
class Genre constructor(private val raw: Raw, override val songs: List<Song>) : MusicParent() {
|
||||||
override val uid = UID.auxio(MusicMode.GENRES) { update(raw.name) }
|
override val uid = UID.auxio(MusicMode.GENRES) { update(raw.name) }
|
||||||
|
|
||||||
override val rawName = raw.name
|
override val rawName = raw.name
|
||||||
|
@ -723,6 +751,10 @@ class Genre constructor(raw: Raw, override val songs: List<Song>) : MusicParent(
|
||||||
artists = Sort(Sort.Mode.ByName, true).artists(distinctArtists)
|
artists = Sort(Sort.Mode.ByName, true).artists(distinctArtists)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun _getOriginalPositionIn(rawGenres: List<Raw>): Int {
|
||||||
|
return rawGenres.indexOf(raw)
|
||||||
|
}
|
||||||
|
|
||||||
override fun _finalize() {
|
override fun _finalize() {
|
||||||
check(songs.isNotEmpty()) { "Malformed genre: Empty" }
|
check(songs.isNotEmpty()) { "Malformed genre: Empty" }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue