From d22de34fd38959d9d82e8c64a2852624e65898f0 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Tue, 13 Jun 2023 10:03:48 -0600 Subject: [PATCH] music: use sets for library information Use a Set when storing all song, album, artist, and genre information. These all have no consistent ordering due to parallelization, and should be communicated as such. --- .../oxycblt/auxio/music/device/DeviceLibrary.kt | 16 ++++++++-------- .../auxio/music/device/DeviceMusicImpl.kt | 4 ++-- .../org/oxycblt/auxio/music/device/RawMusic.kt | 6 +++--- .../org/oxycblt/auxio/music/user/UserLibrary.kt | 6 +++--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt index 905954fd2..613a6473b 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceLibrary.kt @@ -203,7 +203,7 @@ class DeviceLibraryFactoryImpl @Inject constructor(private val musicSettings: Mu // Now that all songs are processed, also process albums and group them into their // respective artists. - val albums = albumGrouping.values.map { AlbumImpl(it, musicSettings) } + val albums = albumGrouping.values.mapTo(mutableSetOf()) { AlbumImpl(it, musicSettings) } for (album in albums) { for (rawArtist in album.rawArtists) { val key = RawArtist.Key(rawArtist) @@ -236,18 +236,18 @@ class DeviceLibraryFactoryImpl @Inject constructor(private val musicSettings: Mu } // Artists and genres do not need to be grouped and can be processed immediately. - val artists = artistGrouping.values.map { ArtistImpl(it, musicSettings) } - val genres = genreGrouping.values.map { GenreImpl(it, musicSettings) } + val artists = artistGrouping.values.mapTo(mutableSetOf()) { ArtistImpl(it, musicSettings) } + val genres = genreGrouping.values.mapTo(mutableSetOf()) { GenreImpl(it, musicSettings) } - return DeviceLibraryImpl(songGrouping.values, albums, artists, genres) + return DeviceLibraryImpl(songGrouping.values.toSet(), albums, artists, genres) } } class DeviceLibraryImpl( - override val songs: Collection, - override val albums: Collection, - override val artists: Collection, - override val genres: Collection + override val songs: Set, + override val albums: Set, + override val artists: Set, + override val genres: Set ) : DeviceLibrary { // Use a mapping to make finding information based on it's UID much faster. private val songUidMap = buildMap { songs.forEach { put(it.uid, it.finalize()) } } diff --git a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt index 095be1967..ce18f6880 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/device/DeviceMusicImpl.kt @@ -298,7 +298,7 @@ class AlbumImpl( dates = if (min != null && max != null) Date.Range(min, max) else null durationMs = totalDuration dateAdded = earliestDateAdded - songs = Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING).songs(grouping.music) + songs = Sort(Sort.Mode.ByTrack, Sort.Direction.ASCENDING).songs(grouping.music) hashCode = 31 * hashCode + rawAlbum.hashCode() hashCode = 31 * hashCode + songs.hashCode() @@ -394,7 +394,7 @@ class ArtistImpl(grouping: Grouping, musicSettings: MusicSetti } } - songs = Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING).songs(distinctSongs) + songs = Sort(Sort.Mode.ByDate, Sort.Direction.ASCENDING).songs(distinctSongs) albums = Sort(Sort.Mode.ByDate, Sort.Direction.DESCENDING).albums(albumMap.keys) explicitAlbums = albums.filter { unlikelyToBeNull(albumMap[it]) } implicitAlbums = albums.filterNot { unlikelyToBeNull(albumMap[it]) } diff --git a/app/src/main/java/org/oxycblt/auxio/music/device/RawMusic.kt b/app/src/main/java/org/oxycblt/auxio/music/device/RawMusic.kt index b3037b0de..9b92046be 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/device/RawMusic.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/device/RawMusic.kt @@ -121,7 +121,7 @@ data class RawAlbum( /** * Allows [RawAlbum]s to be compared by "fundamental" information that is unlikely to change on - * an item-by-item basis. + * an item-by-item */ data class Key(private val inner: RawAlbum) { // Albums are grouped as follows: @@ -169,7 +169,7 @@ data class RawArtist( /** * Allows [RawArtist]s to be compared by "fundamental" information that is unlikely to change on - * an item-by-item basis. + * an item-by-item */ data class Key(private val inner: RawArtist) { // Artists are grouped as follows: @@ -216,7 +216,7 @@ data class RawGenre( /** * Allows [RawGenre]s to be compared by "fundamental" information that is unlikely to change on - * an item-by-item basis. + * an item-by-item */ data class Key(private val inner: RawGenre) { // Cache the hashCode for HashMap efficiency. diff --git a/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt b/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt index 0228764a3..bb1dda066 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/user/UserLibrary.kt @@ -42,7 +42,7 @@ import org.oxycblt.auxio.util.logE */ interface UserLibrary { /** The current user-defined playlists. */ - val playlists: List + val playlists: Collection /** * Find a [Playlist] instance corresponding to the given [Music.UID]. @@ -173,8 +173,8 @@ private class UserLibraryImpl( override fun equals(other: Any?) = other is UserLibraryImpl && other.playlistMap == playlistMap override fun toString() = "UserLibrary(playlists=${playlists.size})" - override val playlists: List - get() = playlistMap.values.toList() + override val playlists: Collection + get() = playlistMap.values.toSet() override fun findPlaylist(uid: Music.UID) = playlistMap[uid]