diff --git a/autotests/taglibwritertest.h b/autotests/taglibwritertest.h --- a/autotests/taglibwritertest.h +++ b/autotests/taglibwritertest.h @@ -41,6 +41,8 @@ void testExtendedData_data(); void testRating(); void testRating_data(); + void testComplexContactData(); + void testComplexContactData_data(); }; #endif // TAGLIBWRITERTEST_H diff --git a/autotests/taglibwritertest.cpp b/autotests/taglibwritertest.cpp --- a/autotests/taglibwritertest.cpp +++ b/autotests/taglibwritertest.cpp @@ -541,4 +541,92 @@ ; } +void TagLibWriterTest::testComplexContactData() +{ + QFETCH(QString, fileType); + QFETCH(QString, mimeType); + + QString temporaryFileName = testFilePath(QStringLiteral("writertest.") + fileType); + + QFile::copy(testFilePath("test." + fileType), temporaryFileName); + TagLibWriter writerPlugin{this}; + + WriteData data(temporaryFileName, mimeType); + + data.add(Property::Artist, QStringLiteral("Artist1 feat Artist2")); + data.add(Property::AlbumArtist, QStringLiteral("Artist1 feat. Artist2")); + data.add(Property::Composer, QStringLiteral("Composer1; Composer2")); + data.add(Property::Lyricist, QStringLiteral("Lyricist1 ft Lyricist2")); + data.add(Property::Genre, QStringLiteral("Genre1; Genre2")); + + writerPlugin.write(data); + + KFileMetaData::SimpleExtractionResult result(temporaryFileName, mimeType, KFileMetaData::ExtractionResult::ExtractMetaData); + extractResult(mimeType, result); + + QCOMPARE(result.properties().value(Property::Artist), QVariant(QStringLiteral("Artist1 feat Artist2"))); + QCOMPARE(result.properties().value(Property::AlbumArtist), QVariant(QStringLiteral("Artist1 feat. Artist2"))); + QCOMPARE(result.properties().value(Property::Composer), QVariant(QStringLiteral("Composer1; Composer2"))); + QCOMPARE(result.properties().value(Property::Lyricist), QVariant(QStringLiteral("Lyricist1 ft Lyricist2"))); + QCOMPARE(result.properties().value(Property::Genre), QVariant(QStringLiteral("Genre1; Genre2"))); + + QFile::remove(temporaryFileName); +} + +void TagLibWriterTest::testComplexContactData_data() +{ + QTest::addColumn("fileType"); + QTest::addColumn("mimeType"); + + QTest::addRow("aiff") + << QStringLiteral("aif") + << QStringLiteral("audio/x-aiff") + ; + + QTest::addRow("ape") + << QStringLiteral("ape") + << QStringLiteral("audio/x-ape") + ; + + QTest::addRow("flac") + << QStringLiteral("flac") + << QStringLiteral("audio/flac") + ; + + QTest::addRow("mp3") + << QStringLiteral("mp3") + << QStringLiteral("audio/mpeg3") + ; + + QTest::addRow("mpc") + << QStringLiteral("mpc") + << QStringLiteral("audio/x-musepack") + ; + + QTest::addRow("ogg") + << QStringLiteral("ogg") + << QStringLiteral("audio/ogg") + ; + + QTest::addRow("opus") + << QStringLiteral("opus") + << QStringLiteral("audio/opus") + ; + + QTest::addRow("speex") + << QStringLiteral("spx") + << QStringLiteral("audio/speex") + ; + + QTest::addRow("wav") + << QStringLiteral("wav") + << QStringLiteral("audio/wav") + ; + + QTest::addRow("wavpack") + << QStringLiteral("wv") + << QStringLiteral("audio/x-wavpack") + ; +} + QTEST_GUILESS_MAIN(TagLibWriterTest) diff --git a/src/extractors/taglibextractor.cpp b/src/extractors/taglibextractor.cpp --- a/src/extractors/taglibextractor.cpp +++ b/src/extractors/taglibextractor.cpp @@ -166,66 +166,57 @@ result->add(Property::Lyrics, TStringToQString(savedProperties["LYRICS"].toString()).trimmed()); } if (savedProperties.contains("ARTIST")) { - const auto artistString = TStringToQString(savedProperties["ARTIST"].toString(";")).trimmed(); - const auto artists = contactsFromString(artistString); + const auto artists = savedProperties["ARTIST"]; for (const auto& artist : artists) { - result->add(Property::Artist, artist); + result->add(Property::Artist, TStringToQString(artist)); } } if (savedProperties.contains("GENRE")) { - const auto genreString = TStringToQString(savedProperties["GENRE"].toString(";")).trimmed(); - const auto genres = contactsFromString(genreString); + const auto genres = savedProperties["GENRE"]; for (const auto& genre : genres) { - result->add(Property::Genre, genre); + result->add(Property::Genre, TStringToQString(genre)); } } if (savedProperties.contains("ALBUMARTIST")) { - const auto albumArtistsString = TStringToQString(savedProperties["ALBUMARTIST"].toString(";")).trimmed(); - const auto albumArtists = contactsFromString(albumArtistsString); - for (const auto& res : albumArtists) { - result->add(Property::AlbumArtist, res); + const auto albumArtists = savedProperties["ALBUMARTIST"]; + for (const auto& albumArtist : albumArtists) { + result->add(Property::AlbumArtist, TStringToQString(albumArtist)); } } if (savedProperties.contains("COMPOSER")) { - const auto composersString = TStringToQString(savedProperties["COMPOSER"].toString(";")).trimmed(); - const auto composers = contactsFromString(composersString); - for (const auto& comp : composers) { - result->add(Property::Composer, comp); + const auto composers = savedProperties["COMPOSER"]; + for (const auto& composer : composers) { + result->add(Property::Composer, TStringToQString(composer)); } } if (savedProperties.contains("LYRICIST")) { - const auto lyricistsString = TStringToQString(savedProperties["LYRICIST"].toString(";")).trimmed(); - const auto lyricists = contactsFromString(lyricistsString); - for (const auto& lyr : lyricists) { - result->add(Property::Lyricist, lyr); + const auto lyricists = savedProperties["LYRICIST"]; + for (const auto& lyricist : lyricists) { + result->add(Property::Lyricist, TStringToQString(lyricist)); } } if (savedProperties.contains("CONDUCTOR")) { - const auto conductorString = TStringToQString(savedProperties["CONDUCTOR"].toString(";")).trimmed(); - const auto conductors = contactsFromString(conductorString); - for (const auto& con: conductors) { - result->add(Property::Conductor, con); + const auto conductors = savedProperties["CONDUCTOR"]; + for (const auto& conductor : conductors) { + result->add(Property::Conductor, TStringToQString(conductor)); } } if (savedProperties.contains("ARRANGER")) { - const auto arrangerString = TStringToQString(savedProperties["ARRANGER"].toString(";")).trimmed(); - const auto arrangers = contactsFromString(arrangerString); - for (const auto& arr: arrangers) { - result->add(Property::Arranger, arr); + const auto arrangers = savedProperties["ARRANGER"]; + for (const auto& arranger : arrangers) { + result->add(Property::Arranger, TStringToQString(arranger)); } } if (savedProperties.contains("PERFORMER")) { - const auto performersString = TStringToQString(savedProperties["PERFORMER"].toString(";")).trimmed(); - const auto performers = contactsFromString(performersString); - for (const auto& per: performers) { - result->add(Property::Performer, per); + const auto performers = savedProperties["PERFORMER"]; + for (const auto& performer : performers) { + result->add(Property::Performer, TStringToQString(performer)); } } if (savedProperties.contains("AUTHOR")) { - const auto authorString = TStringToQString(savedProperties["AUTHOR"].toString(";")).trimmed(); - const auto authors = contactsFromString(authorString); - for (const auto& aut: authors) { - result->add(Property::Author, aut); + const auto authors = savedProperties["AUTHOR"]; + for (const auto& author: authors) { + result->add(Property::Author, TStringToQString(author)); } } @@ -364,20 +355,14 @@ lstASF = asfTags->attribute("Author"); if (!lstASF.isEmpty()) { const auto attribute = lstASF.front(); - const auto authors = contactsFromString(TStringToQString(attribute.toString()).trimmed()); - for (const auto& aut: authors) { - result->add(Property::Author, aut); - } + result->add(Property::Author, TStringToQString(attribute.toString()).trimmed()); } // Lyricist is called "WRITER" for wma/asf files lstASF = asfTags->attribute("WM/Writer"); if (!lstASF.isEmpty()) { const auto attribute = lstASF.front(); - const auto lyricists = contactsFromString(TStringToQString(attribute.toString()).trimmed()); - for (const auto& lyr : lyricists) { - result->add(Property::Lyricist, lyr); - } + result->add(Property::Lyricist, TStringToQString(attribute.toString()).trimmed()); } /*