From fddd527975caab54c3c58e0d59d0e1ddc8b3e9b9 Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Sat, 4 Jan 2025 13:40:52 -0700 Subject: [PATCH] musikr.tag: handle compilation flag --- .../org/oxycblt/musikr/tag/parse/TagFields.kt | 20 +++++++++---------- .../org/oxycblt/musikr/tag/parse/TagParser.kt | 13 ++++++++++-- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagFields.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagFields.kt index a4c48d76a..08620d399 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagFields.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagFields.kt @@ -205,18 +205,16 @@ internal fun Metadata.genreNames() = xiph["GENRE"] ?: mp4["©gen"] ?: mp4["gnre" // Compilation Flag internal fun Metadata.isCompilation() = // TCMP is a non-standard itunes extension + // We also only look for tags that are actually valid + // (i.e. 1 for true, 0 for false) (xiph["COMPILATION"] - ?: xiph["ITUNESCOMPILATION"] - ?: mp4["cpil"] - ?: mp4["----:COM.APPLE.ITUNES:COMPILATION"] - ?: mp4["----:COM.APPLE.ITUNES:ITUNESCOMPILATION"] - ?: id3v2["TCMP"] - ?: id3v2["TXXX:COMPILATION"] - ?: id3v2["TXXX:ITUNESCOMPILATION"]) - ?.let { - // Ignore invalid instances of this tag - it == listOf("1") - } + ?: xiph["ITUNESCOMPILATION"] + ?: mp4["cpil"] + ?: mp4["----:COM.APPLE.ITUNES:COMPILATION"] + ?: mp4["----:COM.APPLE.ITUNES:ITUNESCOMPILATION"] + ?: id3v2["TCMP"] + ?: id3v2["TXXX:COMPILATION"] + ?: id3v2["TXXX:ITUNESCOMPILATION"]) == listOf("1") // ReplayGain information internal fun Metadata.replayGainTrackAdjustment() = diff --git a/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt index fcf3e48b8..42d76af43 100644 --- a/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt +++ b/musikr/src/main/java/org/oxycblt/musikr/tag/parse/TagParser.kt @@ -32,6 +32,7 @@ internal interface TagParser { private data object TagParserImpl : TagParser { override fun parse(file: DeviceFile, metadata: Metadata): ParsedTags { + val compilation = metadata.isCompilation() return ParsedTags( durationMs = metadata.properties.durationMs, replayGainTrackAdjustment = metadata.replayGainTrackAdjustment(), @@ -46,12 +47,20 @@ private data object TagParserImpl : TagParser { albumMusicBrainzId = metadata.albumMusicBrainzId(), albumName = metadata.albumName(), albumSortName = metadata.albumSortName(), - releaseTypes = metadata.releaseTypes() ?: listOf(), + // Compilation flag implies a compilation release type in the case that + // we don't have any other release types + releaseTypes = + metadata.releaseTypes() ?: listOf("compilation").takeIf { compilation } ?: listOf(), artistMusicBrainzIds = metadata.artistMusicBrainzIds() ?: listOf(), artistNames = metadata.artistNames() ?: listOf(), artistSortNames = metadata.artistSortNames() ?: listOf(), albumArtistMusicBrainzIds = metadata.albumArtistMusicBrainzIds() ?: listOf(), - albumArtistNames = metadata.albumArtistNames() ?: listOf(), + // Compilation pretty heavily implies various artists in the case that we don't + // have any other album artists + albumArtistNames = + metadata.albumArtistNames() + ?: listOf("Various Artists").takeIf { compilation } + ?: listOf(), albumArtistSortNames = metadata.albumArtistSortNames() ?: listOf(), genreNames = metadata.genreNames() ?: listOf()) }