music: remove stray real naming

Replace stray Real* class names and replace them with the new Impl
naming scheme.
This commit is contained in:
Alexander Capehart 2023-02-12 19:17:40 -07:00
parent e017d53139
commit bc96c761a0
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 71 additions and 71 deletions

View file

@ -82,11 +82,11 @@ interface Library {
* @param settings [MusicSettings] required. * @param settings [MusicSettings] required.
*/ */
fun from(rawSongs: List<RawSong>, settings: MusicSettings): Library = fun from(rawSongs: List<RawSong>, settings: MusicSettings): Library =
RealLibrary(rawSongs, settings) LibraryImpl(rawSongs, settings)
} }
} }
private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Library { private class LibraryImpl(rawSongs: List<RawSong>, settings: MusicSettings) : Library {
override val songs = buildSongs(rawSongs, settings) override val songs = buildSongs(rawSongs, settings)
override val albums = buildAlbums(songs) override val albums = buildAlbums(songs)
override val artists = buildArtists(songs, albums) override val artists = buildArtists(songs, albums)
@ -125,15 +125,15 @@ private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Li
} }
/** /**
* Build a list [RealSong]s from the given [RawSong]. * Build a list [SongImpl]s from the given [RawSong].
* @param rawSongs The [RawSong]s to build the [RealSong]s from. * @param rawSongs The [RawSong]s to build the [SongImpl]s from.
* @param settings [MusicSettings] required to build [RealSong]s. * @param settings [MusicSettings] required to build [SongImpl]s.
* @return A sorted list of [RealSong]s derived from the [RawSong] that should be suitable for * @return A sorted list of [SongImpl]s derived from the [RawSong] that should be suitable for
* grouping. * grouping.
*/ */
private fun buildSongs(rawSongs: List<RawSong>, settings: MusicSettings) = private fun buildSongs(rawSongs: List<RawSong>, settings: MusicSettings) =
Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING) Sort(Sort.Mode.ByName, Sort.Direction.ASCENDING)
.songs(rawSongs.map { RealSong(it, settings) }.distinct()) .songs(rawSongs.map { SongImpl(it, settings) }.distinct())
/** /**
* Build a list of [Album]s from the given [Song]s. * Build a list of [Album]s from the given [Song]s.
@ -142,11 +142,11 @@ private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Li
* @return A non-empty list of [Album]s. These [Album]s will be incomplete and must be linked * @return A non-empty list of [Album]s. These [Album]s will be incomplete and must be linked
* with parent [Artist] instances in order to be usable. * with parent [Artist] instances in order to be usable.
*/ */
private fun buildAlbums(songs: List<RealSong>): List<RealAlbum> { private fun buildAlbums(songs: List<SongImpl>): List<AlbumImpl> {
// Group songs by their singular raw album, then map the raw instances and their // Group songs by their singular raw album, then map the raw instances and their
// grouped songs to Album values. Album.Raw will handle the actual grouping rules. // grouped songs to Album values. Album.Raw will handle the actual grouping rules.
val songsByAlbum = songs.groupBy { it.rawAlbum } val songsByAlbum = songs.groupBy { it.rawAlbum }
val albums = songsByAlbum.map { RealAlbum(it.key, it.value) } val albums = songsByAlbum.map { AlbumImpl(it.key, it.value) }
logD("Successfully built ${albums.size} albums") logD("Successfully built ${albums.size} albums")
return albums return albums
} }
@ -164,7 +164,7 @@ private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Li
* @return A non-empty list of [Artist]s. These [Artist]s will consist of the combined groupings * @return A non-empty list of [Artist]s. These [Artist]s will consist of the combined groupings
* of [Song]s and [Album]s. * of [Song]s and [Album]s.
*/ */
private fun buildArtists(songs: List<RealSong>, albums: List<RealAlbum>): List<RealArtist> { private fun buildArtists(songs: List<SongImpl>, albums: List<AlbumImpl>): List<ArtistImpl> {
// Add every raw artist credited to each Song/Album to the grouping. This way, // Add every raw artist credited to each Song/Album to the grouping. This way,
// different multi-artist combinations are not treated as different artists. // different multi-artist combinations are not treated as different artists.
val musicByArtist = mutableMapOf<RawArtist, MutableList<Music>>() val musicByArtist = mutableMapOf<RawArtist, MutableList<Music>>()
@ -182,7 +182,7 @@ private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Li
} }
// Convert the combined mapping into artist instances. // Convert the combined mapping into artist instances.
val artists = musicByArtist.map { RealArtist(it.key, it.value) } val artists = musicByArtist.map { ArtistImpl(it.key, it.value) }
logD("Successfully built ${artists.size} artists") logD("Successfully built ${artists.size} artists")
return artists return artists
} }
@ -194,10 +194,10 @@ private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Li
* created. * created.
* @return A non-empty list of [Genre]s. * @return A non-empty list of [Genre]s.
*/ */
private fun buildGenres(songs: List<RealSong>): List<RealGenre> { private fun buildGenres(songs: List<SongImpl>): List<GenreImpl> {
// Add every raw genre credited to each Song to the grouping. This way, // Add every raw genre credited to each Song to the grouping. This way,
// different multi-genre combinations are not treated as different genres. // different multi-genre combinations are not treated as different genres.
val songsByGenre = mutableMapOf<RawGenre, MutableList<RealSong>>() val songsByGenre = mutableMapOf<RawGenre, MutableList<SongImpl>>()
for (song in songs) { for (song in songs) {
for (rawGenre in song.rawGenres) { for (rawGenre in song.rawGenres) {
songsByGenre.getOrPut(rawGenre) { mutableListOf() }.add(song) songsByGenre.getOrPut(rawGenre) { mutableListOf() }.add(song)
@ -205,7 +205,7 @@ private class RealLibrary(rawSongs: List<RawSong>, settings: MusicSettings) : Li
} }
// Convert the mapping into genre instances. // Convert the mapping into genre instances.
val genres = songsByGenre.map { RealGenre(it.key, it.value) } val genres = songsByGenre.map { GenreImpl(it.key, it.value) }
logD("Successfully built ${genres.size} genres") logD("Successfully built ${genres.size} genres")
return genres return genres
} }

View file

@ -46,12 +46,12 @@ import org.oxycblt.auxio.util.toUuidOrNull
import org.oxycblt.auxio.util.unlikelyToBeNull import org.oxycblt.auxio.util.unlikelyToBeNull
/** /**
* Library-backed implementation of [RealSong]. * Library-backed implementation of [Song].
* @param rawSong The [RawSong] to derive the member data from. * @param rawSong The [RawSong] to derive the member data from.
* @param musicSettings [MusicSettings] to perform further user-configured parsing. * @param musicSettings [MusicSettings] to perform further user-configured parsing.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song { class SongImpl(rawSong: RawSong, musicSettings: MusicSettings) : Song {
override val uid = override val uid =
// Attempt to use a MusicBrainz ID first before falling back to a hashed UID. // Attempt to use a MusicBrainz ID first before falling back to a hashed UID.
rawSong.musicBrainzId?.toUuidOrNull()?.let { Music.UID.musicBrainz(MusicMode.SONGS, it) } rawSong.musicBrainzId?.toUuidOrNull()?.let { Music.UID.musicBrainz(MusicMode.SONGS, it) }
@ -90,7 +90,7 @@ class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song {
override val size = requireNotNull(rawSong.size) { "Invalid raw: No size" } override val size = requireNotNull(rawSong.size) { "Invalid raw: No size" }
override val durationMs = requireNotNull(rawSong.durationMs) { "Invalid raw: No duration" } override val durationMs = requireNotNull(rawSong.durationMs) { "Invalid raw: No duration" }
override val dateAdded = requireNotNull(rawSong.dateAdded) { "Invalid raw: No date added" } override val dateAdded = requireNotNull(rawSong.dateAdded) { "Invalid raw: No date added" }
private var _album: RealAlbum? = null private var _album: AlbumImpl? = null
override val album: Album override val album: Album
get() = unlikelyToBeNull(_album) get() = unlikelyToBeNull(_album)
@ -121,7 +121,7 @@ class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song {
albumArtistSortNames.getOrNull(i)) albumArtistSortNames.getOrNull(i))
} }
private val _artists = mutableListOf<RealArtist>() private val _artists = mutableListOf<ArtistImpl>()
override val artists: List<Artist> override val artists: List<Artist>
get() = _artists get() = _artists
override fun resolveArtistContents(context: Context) = resolveNames(context, artists) override fun resolveArtistContents(context: Context) = resolveNames(context, artists)
@ -137,14 +137,14 @@ class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song {
return true return true
} }
private val _genres = mutableListOf<RealGenre>() private val _genres = mutableListOf<GenreImpl>()
override val genres: List<Genre> override val genres: List<Genre>
get() = _genres get() = _genres
override fun resolveGenreContents(context: Context) = resolveNames(context, genres) override fun resolveGenreContents(context: Context) = resolveNames(context, genres)
/** /**
* The [RawAlbum] instances collated by the [RealSong]. This can be used to group [RealSong]s * The [RawAlbum] instances collated by the [Song]. This can be used to group [Song]s
* into an [RealAlbum]. * into an [Album].
*/ */
val rawAlbum = val rawAlbum =
RawAlbum( RawAlbum(
@ -159,16 +159,16 @@ class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song {
.ifEmpty { listOf(RawArtist(null, null)) }) .ifEmpty { listOf(RawArtist(null, null)) })
/** /**
* The [RawArtist] instances collated by the [RealSong]. The artists of the song take priority, * The [RawArtist] instances collated by the [Song]. The artists of the song take priority,
* followed by the album artists. If there are no artists, this field will be a single "unknown" * followed by the album artists. If there are no artists, this field will be a single "unknown"
* [RawArtist]. This can be used to group up [RealSong]s into an [RealArtist]. * [RawArtist]. This can be used to group up [Song]s into an [Artist].
*/ */
val rawArtists = val rawArtists =
rawIndividualArtists.ifEmpty { rawAlbumArtists }.ifEmpty { listOf(RawArtist()) } rawIndividualArtists.ifEmpty { rawAlbumArtists }.ifEmpty { listOf(RawArtist()) }
/** /**
* The [RawGenre] instances collated by the [RealSong]. This can be used to group up [RealSong]s * The [RawGenre] instances collated by the [Song]. This can be used to group up [Song]s
* into a [RealGenre]. ID3v2 Genre names are automatically converted to their resolved names. * into a [Genre]. ID3v2 Genre names are automatically converted to their resolved names.
*/ */
val rawGenres = val rawGenres =
rawSong.genreNames rawSong.genreNames
@ -177,26 +177,26 @@ class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song {
.ifEmpty { listOf(RawGenre()) } .ifEmpty { listOf(RawGenre()) }
/** /**
* Links this [RealSong] with a parent [RealAlbum]. * Links this [Song] with a parent [Album].
* @param album The parent [RealAlbum] to link to. * @param album The parent [Album] to link to.
*/ */
fun link(album: RealAlbum) { fun link(album: AlbumImpl) {
_album = album _album = album
} }
/** /**
* Links this [RealSong] with a parent [RealArtist]. * Links this [Song] with a parent [Artist].
* @param artist The parent [RealArtist] to link to. * @param artist The parent [Artist] to link to.
*/ */
fun link(artist: RealArtist) { fun link(artist: ArtistImpl) {
_artists.add(artist) _artists.add(artist)
} }
/** /**
* Links this [RealSong] with a parent [RealGenre]. * Links this [Song] with a parent [Genre].
* @param genre The parent [RealGenre] to link to. * @param genre The parent [Genre] to link to.
*/ */
fun link(genre: RealGenre) { fun link(genre: GenreImpl) {
_genres.add(genre) _genres.add(genre)
} }
@ -231,13 +231,13 @@ class RealSong(rawSong: RawSong, musicSettings: MusicSettings) : Song {
} }
/** /**
* Library-backed implementation of [RealAlbum]. * Library-backed implementation of [Album].
* @param rawAlbum The [RawAlbum] to derive the member data from. * @param rawAlbum The [RawAlbum] to derive the member data from.
* @param songs The [RealSong]s that are a part of this [RealAlbum]. These items will be linked to * @param songs The [Song]s that are a part of this [Album]. These items will be linked to
* this [RealAlbum]. * this [Album].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RealAlbum(val rawAlbum: RawAlbum, override val songs: List<RealSong>) : Album { class AlbumImpl(val rawAlbum: RawAlbum, override val songs: List<SongImpl>) : Album {
override val uid = override val uid =
// Attempt to use a MusicBrainz ID first before falling back to a hashed UID. // Attempt to use a MusicBrainz ID first before falling back to a hashed UID.
rawAlbum.musicBrainzId?.let { Music.UID.musicBrainz(MusicMode.ALBUMS, it) } rawAlbum.musicBrainzId?.let { Music.UID.musicBrainz(MusicMode.ALBUMS, it) }
@ -263,9 +263,9 @@ class RealAlbum(val rawAlbum: RawAlbum, override val songs: List<RealSong>) : Al
// the same UID but different contents are not equal. // the same UID but different contents are not equal.
override fun hashCode() = 31 * uid.hashCode() + songs.hashCode() override fun hashCode() = 31 * uid.hashCode() + songs.hashCode()
override fun equals(other: Any?) = override fun equals(other: Any?) =
other is RealAlbum && uid == other.uid && songs == other.songs other is AlbumImpl && uid == other.uid && songs == other.songs
private val _artists = mutableListOf<RealArtist>() private val _artists = mutableListOf<ArtistImpl>()
override val artists: List<Artist> override val artists: List<Artist>
get() = _artists get() = _artists
override fun resolveArtistContents(context: Context) = resolveNames(context, artists) override fun resolveArtistContents(context: Context) = resolveNames(context, artists)
@ -298,17 +298,17 @@ class RealAlbum(val rawAlbum: RawAlbum, override val songs: List<RealSong>) : Al
} }
/** /**
* The [RawArtist] instances collated by the [RealAlbum]. The album artists of the song take * The [RawArtist] instances collated by the [Album]. The album artists of the song take
* priority, followed by the artists. If there are no artists, this field will be a single * priority, followed by the artists. If there are no artists, this field will be a single
* "unknown" [RawArtist]. This can be used to group up [RealAlbum]s into an [RealArtist]. * "unknown" [RawArtist]. This can be used to group up [Album]s into an [Artist].
*/ */
val rawArtists = rawAlbum.rawArtists val rawArtists = rawAlbum.rawArtists
/** /**
* Links this [RealAlbum] with a parent [RealArtist]. * Links this [Album] with a parent [Artist].
* @param artist The parent [RealArtist] to link to. * @param artist The parent [Artist] to link to.
*/ */
fun link(artist: RealArtist) { fun link(artist: ArtistImpl) {
_artists.add(artist) _artists.add(artist)
} }
@ -332,14 +332,14 @@ class RealAlbum(val rawAlbum: RawAlbum, override val songs: List<RealSong>) : Al
} }
/** /**
* Library-backed implementation of [RealArtist]. * Library-backed implementation of [Artist].
* @param rawArtist The [RawArtist] to derive the member data from. * @param rawArtist The [RawArtist] to derive the member data from.
* @param songAlbums A list of the [RealSong]s and [RealAlbum]s that are a part of this [RealArtist] * @param songAlbums A list of the [Song]s and [Album]s that are a part of this [Artist]
* , either through artist or album artist tags. Providing [RealSong]s to the artist is optional. * , either through artist or album artist tags. Providing [Song]s to the artist is optional.
* These instances will be linked to this [RealArtist]. * These instances will be linked to this [Artist].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RealArtist(private val rawArtist: RawArtist, songAlbums: List<Music>) : Artist { class ArtistImpl(private val rawArtist: RawArtist, songAlbums: List<Music>) : Artist {
override val uid = override val uid =
// Attempt to use a MusicBrainz ID first before falling back to a hashed UID. // Attempt to use a MusicBrainz ID first before falling back to a hashed UID.
rawArtist.musicBrainzId?.let { Music.UID.musicBrainz(MusicMode.ARTISTS, it) } rawArtist.musicBrainzId?.let { Music.UID.musicBrainz(MusicMode.ARTISTS, it) }
@ -358,7 +358,7 @@ class RealArtist(private val rawArtist: RawArtist, songAlbums: List<Music>) : Ar
// the same UID but different contents are not equal. // the same UID but different contents are not equal.
override fun hashCode() = 31 * uid.hashCode() + songs.hashCode() override fun hashCode() = 31 * uid.hashCode() + songs.hashCode()
override fun equals(other: Any?) = override fun equals(other: Any?) =
other is RealArtist && uid == other.uid && songs == other.songs other is ArtistImpl && uid == other.uid && songs == other.songs
override lateinit var genres: List<Genre> override lateinit var genres: List<Genre>
override fun resolveGenreContents(context: Context) = resolveNames(context, genres) override fun resolveGenreContents(context: Context) = resolveNames(context, genres)
@ -382,12 +382,12 @@ class RealArtist(private val rawArtist: RawArtist, songAlbums: List<Music>) : Ar
for (music in songAlbums) { for (music in songAlbums) {
when (music) { when (music) {
is RealSong -> { is SongImpl -> {
music.link(this) music.link(this)
distinctSongs.add(music) distinctSongs.add(music)
distinctAlbums.add(music.album) distinctAlbums.add(music.album)
} }
is RealAlbum -> { is AlbumImpl -> {
music.link(this) music.link(this)
distinctAlbums.add(music) distinctAlbums.add(music)
noAlbums = false noAlbums = false
@ -403,12 +403,12 @@ class RealArtist(private val rawArtist: RawArtist, songAlbums: List<Music>) : Ar
} }
/** /**
* Returns the original position of this [RealArtist]'s [RawArtist] within the given [RawArtist] * Returns the original position of this [Artist]'s [RawArtist] within the given [RawArtist]
* list. This can be used to create a consistent ordering within child [RealArtist] lists based * list. This can be used to create a consistent ordering within child [Artist] lists based
* on the original tag order. * on the original tag order.
* @param rawArtists The [RawArtist] instances to check. It is assumed that this [RealArtist]'s * @param rawArtists The [RawArtist] instances to check. It is assumed that this [Artist]'s
* [RawArtist] will be within the list. * [RawArtist] will be within the list.
* @return The index of the [RealArtist]'s [RawArtist] within the list. * @return The index of the [Artist]'s [RawArtist] within the list.
*/ */
fun getOriginalPositionIn(rawArtists: List<RawArtist>) = rawArtists.indexOf(rawArtist) fun getOriginalPositionIn(rawArtists: List<RawArtist>) = rawArtists.indexOf(rawArtist)
@ -426,10 +426,10 @@ class RealArtist(private val rawArtist: RawArtist, songAlbums: List<Music>) : Ar
} }
} }
/** /**
* Library-backed implementation of [RealGenre]. * Library-backed implementation of [Genre].
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RealGenre(private val rawGenre: RawGenre, override val songs: List<RealSong>) : Genre { class GenreImpl(private val rawGenre: RawGenre, override val songs: List<SongImpl>) : Genre {
override val uid = Music.UID.auxio(MusicMode.GENRES) { update(rawGenre.name) } override val uid = Music.UID.auxio(MusicMode.GENRES) { update(rawGenre.name) }
override val rawName = rawGenre.name override val rawName = rawGenre.name
override val rawSortName = rawName override val rawSortName = rawName
@ -444,7 +444,7 @@ class RealGenre(private val rawGenre: RawGenre, override val songs: List<RealSon
// the same UID but different contents are not equal. // the same UID but different contents are not equal.
override fun hashCode() = 31 * uid.hashCode() + songs.hashCode() override fun hashCode() = 31 * uid.hashCode() + songs.hashCode()
override fun equals(other: Any?) = override fun equals(other: Any?) =
other is RealGenre && uid == other.uid && songs == other.songs other is GenreImpl && uid == other.uid && songs == other.songs
init { init {
val distinctAlbums = mutableSetOf<Album>() val distinctAlbums = mutableSetOf<Album>()
@ -467,12 +467,12 @@ class RealGenre(private val rawGenre: RawGenre, override val songs: List<RealSon
} }
/** /**
* Returns the original position of this [RealGenre]'s [RawGenre] within the given [RawGenre] * Returns the original position of this [Genre]'s [RawGenre] within the given [RawGenre]
* list. This can be used to create a consistent ordering within child [RealGenre] lists based * list. This can be used to create a consistent ordering within child [Genre] lists based
* on the original tag order. * on the original tag order.
* @param rawGenres The [RawGenre] instances to check. It is assumed that this [RealGenre] 's * @param rawGenres The [RawGenre] instances to check. It is assumed that this [Genre] 's
* [RawGenre] will be within the list. * [RawGenre] will be within the list.
* @return The index of the [RealGenre]'s [RawGenre] within the list. * @return The index of the [Genre]'s [RawGenre] within the list.
*/ */
fun getOriginalPositionIn(rawGenres: List<RawGenre>) = rawGenres.indexOf(rawGenre) fun getOriginalPositionIn(rawGenres: List<RawGenre>) = rawGenres.indexOf(rawGenre)

View file

@ -23,18 +23,18 @@ import org.oxycblt.auxio.music.metadata.*
import org.oxycblt.auxio.music.storage.Directory import org.oxycblt.auxio.music.storage.Directory
/** /**
* Raw information about a [RealSong] obtained from the filesystem/Extractor instances. * Raw information about a [SongImpl] obtained from the filesystem/Extractor instances.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RawSong( class RawSong(
/** /**
* The ID of the [RealSong]'s audio file, obtained from MediaStore. Note that this ID is highly * The ID of the [SongImpl]'s audio file, obtained from MediaStore. Note that this ID is highly
* unstable and should only be used for accessing the audio file. * unstable and should only be used for accessing the audio file.
*/ */
var mediaStoreId: Long? = null, var mediaStoreId: Long? = null,
/** @see Song.dateAdded */ /** @see Song.dateAdded */
var dateAdded: Long? = null, var dateAdded: Long? = null,
/** The latest date the [RealSong]'s audio file was modified, as a unix epoch timestamp. */ /** The latest date the [SongImpl]'s audio file was modified, as a unix epoch timestamp. */
var dateModified: Long? = null, var dateModified: Long? = null,
/** @see Song.path */ /** @see Song.path */
var fileName: String? = null, var fileName: String? = null,
@ -87,12 +87,12 @@ class RawSong(
) )
/** /**
* Raw information about an [RealAlbum] obtained from the component [RealSong] instances. * Raw information about an [AlbumImpl] obtained from the component [SongImpl] instances.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RawAlbum( class RawAlbum(
/** /**
* The ID of the [RealAlbum]'s grouping, obtained from MediaStore. Note that this ID is highly * The ID of the [AlbumImpl]'s grouping, obtained from MediaStore. Note that this ID is highly
* unstable and should only be used for accessing the system-provided cover art. * unstable and should only be used for accessing the system-provided cover art.
*/ */
val mediaStoreId: Long, val mediaStoreId: Long,
@ -132,7 +132,7 @@ class RawAlbum(
} }
/** /**
* Raw information about an [RealArtist] obtained from the component [RealSong] and [RealAlbum] * Raw information about an [ArtistImpl] obtained from the component [SongImpl] and [AlbumImpl]
* instances. * instances.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
@ -174,7 +174,7 @@ class RawArtist(
} }
/** /**
* Raw information about a [RealGenre] obtained from the component [RealSong] instances. * Raw information about a [GenreImpl] obtained from the component [SongImpl] instances.
* @author Alexander Capehart (OxygenCobalt) * @author Alexander Capehart (OxygenCobalt)
*/ */
class RawGenre( class RawGenre(