From d61a333f2752b70fcf332b9f710d6bbe36b9233b Mon Sep 17 00:00:00 2001 From: Urs Fleisch Date: Sat, 14 Jun 2025 10:19:36 +0200 Subject: [PATCH] Map lowercase MusicBrainz TIPL keys to properties (#1274) --- .../id3v2/frames/textidentificationframe.cpp | 2 +- tests/test_id3v2.cpp | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/taglib/mpeg/id3v2/frames/textidentificationframe.cpp b/taglib/mpeg/id3v2/frames/textidentificationframe.cpp index aa78d563..743ca8af 100644 --- a/taglib/mpeg/id3v2/frames/textidentificationframe.cpp +++ b/taglib/mpeg/id3v2/frames/textidentificationframe.cpp @@ -315,7 +315,7 @@ PropertyMap TextIdentificationFrame::makeTIPLProperties() const const StringList l = fieldList(); for(auto it = l.begin(); it != l.end(); ++it) { auto found = std::find_if(involvedPeople.begin(), involvedPeople.end(), - [=](const auto &person) { return *it == person.first; }); + [=](const auto &person) { return it->upper() == person.first; }); if(found != involvedPeople.end()) { map.insert(found->second, (++it)->split(",")); } diff --git a/tests/test_id3v2.cpp b/tests/test_id3v2.cpp index 0416c636..27455765 100644 --- a/tests/test_id3v2.cpp +++ b/tests/test_id3v2.cpp @@ -1265,6 +1265,38 @@ public: CPPUNIT_ASSERT_EQUAL(static_cast(nullptr), ID3v2::UserTextIdentificationFrame::find(&tag, "non existing")); CPPUNIT_ASSERT_EQUAL(frame10, ID3v2::CommentsFrame::findByDescription(&tag, "iTunNORM")); CPPUNIT_ASSERT_EQUAL(static_cast(nullptr), ID3v2::CommentsFrame::findByDescription(&tag, "non existing")); + + // Check if the allowed TIPL keys are correctly mapped to properties. + // These are the keys used by MusicBrainz: arranger, engineer, producer, DJ-mix, mix. + // See https://picard-docs.musicbrainz.org/downloads/MusicBrainz_Picard_Tag_Map.html. + // MusicBrainz Picard uses lowercase keys whereas TagLib used uppercase keys. + auto frame11 = new ID3v2::TextIdentificationFrame("TIPL"); + StringList tiplData; + tiplData.append("arranger"); + tiplData.append("an arranger"); + tiplData.append("ENGINEER"); + tiplData.append("an engineer"); + tiplData.append("producer"); + tiplData.append("a producer"); + tiplData.append("DJ-mix"); + tiplData.append("a DJ mixer"); + tiplData.append("mix"); + tiplData.append("a mixer"); + frame11->setText(tiplData); + tag.addFrame(frame11); + + properties = tag.properties(); + CPPUNIT_ASSERT_EQUAL(0u, properties.unsupportedData().size()); + CPPUNIT_ASSERT(properties.contains("ARRANGER")); + CPPUNIT_ASSERT(properties.contains("ENGINEER")); + CPPUNIT_ASSERT(properties.contains("PRODUCER")); + CPPUNIT_ASSERT(properties.contains("DJMIXER")); + CPPUNIT_ASSERT(properties.contains("MIXER")); + CPPUNIT_ASSERT_EQUAL(String("an arranger"), properties["ARRANGER"].front()); + CPPUNIT_ASSERT_EQUAL(String("an engineer"), properties["ENGINEER"].front()); + CPPUNIT_ASSERT_EQUAL(String("a producer"), properties["PRODUCER"].front()); + CPPUNIT_ASSERT_EQUAL(String("a DJ mixer"), properties["DJMIXER"].front()); + CPPUNIT_ASSERT_EQUAL(String("a mixer"), properties["MIXER"].front()); } void testPropertiesMovement()