From a30e6db71d3298a9c3fca62024582071219336b6 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 27 Nov 2024 15:20:03 -0700 Subject: [PATCH] music: fix in-process grouping problems Parent objects cannot process anything related to eachother until finalize without causing set issues, fix that --- .../music/stack/interpret/Interpreter.kt | 6 ++- .../stack/interpret/model/DeviceMusicImpl.kt | 37 +++++++++++-------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/Interpreter.kt b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/Interpreter.kt index 7695c7f7d..b2b01301f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/Interpreter.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/Interpreter.kt @@ -99,7 +99,11 @@ class InterpreterImpl @Inject constructor(private val preparer: Preparer) : Inte null } } - return LibraryImpl(songs, albums, artists, genres) + return LibraryImpl( + songs, + albums.onEach { it.finalize() }, + artists.onEach { it.finalize() }, + genres.onEach { it.finalize() }) } private data class LinkedSongImpl(private val albumLinkedSong: AlbumLinker.LinkedSong) : diff --git a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt index 35511ef8a..907c279e7 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/stack/interpret/model/DeviceMusicImpl.kt @@ -120,8 +120,10 @@ class AlbumImpl(linkedAlbum: LinkedAlbum) : Album { else if (song.date > it.max) Date.Range(it.min, song.date) else it } ?: Date.Range(song.date, song.date) } - hashCode = 31 * hashCode + song.hashCode() - cover = ParentCover(song.cover, emptyList()) + } + + fun finalize() { + cover = ParentCover(songs.first().cover, songs.map { it.cover }) } } @@ -139,16 +141,11 @@ class ArtistImpl(private val preArtist: PreArtist) : Artist { override val songs = mutableSetOf() + private val albums = mutableListOf() override var explicitAlbums = mutableSetOf() override var implicitAlbums = mutableSetOf() - override val genres: List by lazy { - // TODO: Not sure how to integrate this into music loading. - Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING) - .genres(songs.flatMapTo(mutableSetOf()) { it.genres }) - .sortedByDescending { genre -> songs.count { it.genres.contains(genre) } } - } - + override var genres = listOf() override var durationMs = 0L override lateinit var cover: ParentCover @@ -171,16 +168,21 @@ class ArtistImpl(private val preArtist: PreArtist) : Artist { fun link(song: SongImpl) { songs.add(song) durationMs += song.durationMs - if (!explicitAlbums.contains(song.album)) { - implicitAlbums.add(song.album) - } hashCode = 31 * hashCode + song.hashCode() - cover = ParentCover(song.cover, emptyList()) } fun link(album: AlbumImpl) { - explicitAlbums.add(album) - implicitAlbums.remove(album) + albums.add(album) + } + + fun finalize() { + explicitAlbums.addAll(albums) + implicitAlbums.addAll(songs.mapTo(mutableSetOf()) { it.album } - albums.toSet()) + cover = ParentCover(songs.first().cover, songs.map { it.cover }) + genres = + Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING) + .genres(songs.flatMapTo(mutableSetOf()) { it.genres }) + .sortedByDescending { genre -> songs.count { it.genres.contains(genre) } } } } @@ -209,9 +211,12 @@ class GenreImpl(private val preGenre: PreGenre) : Genre { fun link(song: SongImpl) { songs.add(song) - artists.addAll(song.artists) durationMs += song.durationMs hashCode = 31 * hashCode + song.hashCode() cover = ParentCover(song.cover, emptyList()) } + + fun finalize() { + artists.addAll(songs.flatMapTo(mutableSetOf()) { it.artists }) + } }