diff --git a/src/libs/metadata/impl/AudioFileParser.cpp b/src/libs/metadata/impl/AudioFileParser.cpp index 60f36eda..4812e734 100644 --- a/src/libs/metadata/impl/AudioFileParser.cpp +++ b/src/libs/metadata/impl/AudioFileParser.cpp @@ -453,7 +453,7 @@ namespace lms::metadata std::vector artistDelimiters{}; track.medium = getMedium(tagReader); - track.artists = getArtists(tagReader, { TagType::Artists, TagType::Artist }, { TagType::ArtistSortOrder }, { TagType::MusicBrainzArtistID }, _params); + track.artists = getArtists(tagReader, { TagType::Artists, TagType::Artist }, { TagType::ArtistsSortOrder, TagType::ArtistSortOrder }, { TagType::MusicBrainzArtistID }, _params); track.artistDisplayName = computeArtistDisplayName(track.artists, getTagValueAs(tagReader, TagType::Artist), _params.artistTagDelimiters); track.conductorArtists = getArtists(tagReader, { TagType::Conductors, TagType::Conductor }, { TagType::ConductorsSortOrder, TagType::ConductorSortOrder }, { TagType::MusicBrainzConductorID }, _params); diff --git a/src/libs/metadata/impl/ITagReader.hpp b/src/libs/metadata/impl/ITagReader.hpp index 0cf72856..fe5f76a0 100644 --- a/src/libs/metadata/impl/ITagReader.hpp +++ b/src/libs/metadata/impl/ITagReader.hpp @@ -43,6 +43,7 @@ namespace lms::metadata Artist, ArtistSortOrder, Artists, + ArtistsSortOrder, // non standard ASIN, Barcode, BPM, diff --git a/src/libs/metadata/impl/avformat/AvFormatTagReader.cpp b/src/libs/metadata/impl/avformat/AvFormatTagReader.cpp index 30134f3e..fb7981c1 100644 --- a/src/libs/metadata/impl/avformat/AvFormatTagReader.cpp +++ b/src/libs/metadata/impl/avformat/AvFormatTagReader.cpp @@ -44,6 +44,7 @@ namespace lms::metadata::avformat { TagType::Artist, { "ARTIST" } }, { TagType::ArtistSortOrder, { "ARTISTSORT", "ARTIST-SORT", "WM/ARTISTSORTORDER" } }, { TagType::Artists, { "ARTISTS", "WM/ARTISTS" } }, + { TagType::ArtistsSortOrder, { "ARTISTSSORT", "ARTISTS-SORT", "WM/ARTISTSSORTORDER" } }, { TagType::ASIN, { "ASIN" } }, { TagType::Barcode, { "BARCODE", "WM/BARCODE" } }, { TagType::BPM, { "BPM" } }, diff --git a/src/libs/metadata/impl/taglib/TagLibTagReader.cpp b/src/libs/metadata/impl/taglib/TagLibTagReader.cpp index 44a0d7ab..b192a2d0 100644 --- a/src/libs/metadata/impl/taglib/TagLibTagReader.cpp +++ b/src/libs/metadata/impl/taglib/TagLibTagReader.cpp @@ -79,6 +79,7 @@ namespace lms::metadata::taglib { TagType::Artist, { "ARTIST" } }, { TagType::ArtistSortOrder, { "ARTISTSORT" } }, { TagType::Artists, { "ARTISTS" } }, + { TagType::ArtistsSortOrder, { "ARTISTSSORT" } }, { TagType::ASIN, { "ASIN" } }, { TagType::Barcode, { "BARCODE" } }, { TagType::BPM, { "BPM" } }, diff --git a/src/libs/metadata/test/AudioFileParser.cpp b/src/libs/metadata/test/AudioFileParser.cpp index 3e90e5b6..2b72d83e 100644 --- a/src/libs/metadata/test/AudioFileParser.cpp +++ b/src/libs/metadata/test/AudioFileParser.cpp @@ -61,10 +61,10 @@ namespace lms::metadata::tests EXPECT_EQ(track->artistDisplayName, "MyArtist1 & MyArtist2"); ASSERT_EQ(track->artists.size(), 2); EXPECT_EQ(track->artists[0].name, "MyArtist1"); - EXPECT_EQ(track->artists[0].sortName, "MyArtist1SortName"); + EXPECT_EQ(track->artists[0].sortName, "MyArtists1SortName"); EXPECT_EQ(track->artists[0].mbid, core::UUID::fromString("9d2e0c8c-8c5e-4372-a061-590955eaeaae")); EXPECT_EQ(track->artists[1].name, "MyArtist2"); - EXPECT_EQ(track->artists[1].sortName, "MyArtist2SortName"); + EXPECT_EQ(track->artists[1].sortName, "MyArtists2SortName"); EXPECT_EQ(track->artists[1].mbid, core::UUID::fromString("5e2cf87f-c8d7-4504-8a86-954dc0840229")); ASSERT_EQ(track->comments.size(), 2); EXPECT_EQ(track->comments[0], "Comment1"); @@ -751,6 +751,52 @@ namespace lms::metadata::tests EXPECT_EQ(track->medium->release->sortName, "MyAlbum"); } + TEST(AudioFileParser, artist_sortNameFallback) + { + { + const TestTagReader testTags{ + { + { TagType::Artist, { "MyArtist" } }, + { TagType::ArtistSortOrder, { "MyArtistSortName" } }, + // No ArtistSortOrder + } + }; + std::unique_ptr track{ TestAudioFileParser{}.parseMetaData(testTags) }; + + ASSERT_EQ(track->artists.size(), 1); + EXPECT_EQ(track->artists[0].sortName, "MyArtistSortName"); + } + + { + const TestTagReader testTags{ + { + { TagType::Artist, { "MyArtist" } }, + { TagType::ArtistsSortOrder, { "MyArtistSortName" } }, + // No ArtistSortOrder + } + }; + std::unique_ptr track{ TestAudioFileParser{}.parseMetaData(testTags) }; + + ASSERT_EQ(track->artists.size(), 1); + EXPECT_EQ(track->artists[0].sortName, "MyArtistSortName"); + } + + { + const TestTagReader testTags{ + { + { TagType::Artist, { "MyArtist" } }, + { TagType::ArtistSortOrder, { "MyArtistSortNameNotUsed" } }, + { TagType::ArtistsSortOrder, { "MyArtistSortName" } }, + // No ArtistSortOrder + } + }; + std::unique_ptr track{ TestAudioFileParser{}.parseMetaData(testTags) }; + + ASSERT_EQ(track->artists.size(), 1); + EXPECT_EQ(track->artists[0].sortName, "MyArtistSortName"); + } + } + TEST(AudioFileParser, advisory) { auto doTest = [](std::string_view value, std::optional expectedValue) { diff --git a/src/libs/metadata/test/TestTagReader.hpp b/src/libs/metadata/test/TestTagReader.hpp index 35040052..12aa2efe 100644 --- a/src/libs/metadata/test/TestTagReader.hpp +++ b/src/libs/metadata/test/TestTagReader.hpp @@ -117,6 +117,7 @@ namespace lms::metadata::tests { TagType::Artist, { "MyArtist1 & MyArtist2" } }, { TagType::Artists, { "MyArtist1", "MyArtist2" } }, { TagType::ArtistSortOrder, { "MyArtist1SortName", "MyArtist2SortName" } }, + { TagType::ArtistsSortOrder, { "MyArtists1SortName", "MyArtists2SortName" } }, { TagType::AlbumArtist, { "MyAlbumArtist1 & MyAlbumArtist2" } }, { TagType::AlbumArtists, { "MyAlbumArtist1", "MyAlbumArtist2" } }, { TagType::AlbumArtistsSortOrder, { "MyAlbumArtist1SortName", "MyAlbumArtist2SortName" } },