diff --git a/autotests/samplefiles/test.wma b/autotests/samplefiles/test.wma index 5ee99caf60991e563228858260fcb1e0142bc9d1..ff2903c061eecface341c507fb1e110624e3f29c GIT binary patch literal 11660 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 EKQpeapa1{> literal 10448 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 diff --git a/autotests/taglibextractortest.h b/autotests/taglibextractortest.h --- a/autotests/taglibextractortest.h +++ b/autotests/taglibextractortest.h @@ -42,8 +42,12 @@ void testApe_data(); void testMp4(); void testMp4_data(); + void testAsf(); + void testAsf_data(); void testId3Rating_data(); void testId3Rating(); + void testWmaRating_data(); + void testWmaRating(); void testNoMetadata(); void testNoMetadata_data(); diff --git a/autotests/taglibextractortest.cpp b/autotests/taglibextractortest.cpp --- a/autotests/taglibextractortest.cpp +++ b/autotests/taglibextractortest.cpp @@ -309,6 +309,39 @@ ; } +void TagLibExtractorTest::testAsf() +{ + QFETCH(QString, fileType); + QFETCH(QString, mimeType); + + QString fileName = QStringLiteral("test.") + fileType; + + TagLibExtractor plugin{this}; + SimpleExtractionResult result(testFilePath(fileName), mimeType); + plugin.extract(&result); + + QCOMPARE(result.properties().value(Property::AlbumArtist), QVariant(QStringLiteral("Album Artist"))); + QCOMPARE(result.properties().value(Property::Rating).toInt(), 6); + QCOMPARE(result.properties().value(Property::DiscNumber).toInt(), 1); + QCOMPARE(result.properties().value(Property::Conductor), QVariant(QStringLiteral("Conductor"))); + QCOMPARE(result.properties().value(Property::Composer), QVariant(QStringLiteral("Composer"))); + QCOMPARE(result.properties().value(Property::Author), QVariant(QStringLiteral("Author"))); + QCOMPARE(result.properties().value(Property::Lyricist), QVariant(QStringLiteral("Lyricist"))); + QCOMPARE(result.properties().value(Property::Copyright), QVariant(QStringLiteral("Copyright"))); + QCOMPARE(result.properties().value(Property::Publisher), QVariant(QStringLiteral("Publisher"))); +} + +void TagLibExtractorTest::testAsf_data() +{ + QTest::addColumn("fileType"); + QTest::addColumn("mimeType"); + + QTest::addRow("asf") + << QStringLiteral("wma") + << QStringLiteral("audio/x-ms-wma") + ; +} + void TagLibExtractorTest::testId3Rating_data() { QTest::addColumn("path"); @@ -379,6 +412,43 @@ QCOMPARE(result.properties().value(Property::Rating).toInt(), expectedRating); } +void TagLibExtractorTest::testWmaRating() +{ + QFETCH(QString, path); + QFETCH(int, expectedRating); + + TagLibExtractor plugin{this}; + SimpleExtractionResult result(path, "audio/x-ms-wma"); + plugin.extract(&result); + + QCOMPARE(result.properties().value(Property::Rating).toUInt(), expectedRating); +} + +void TagLibExtractorTest::testWmaRating_data() +{ + QTest::addColumn("path"); + QTest::addColumn("expectedRating"); + + QTest::addRow("WMP0") + << QFINDTESTDATA("samplefiles/wma_rating/test0.wma") + << 0 ; + QTest::addRow("WMP1") + << QFINDTESTDATA("samplefiles/wma_rating/test1.wma") + << 2 ; + QTest::addRow("WMP2") + << QFINDTESTDATA("samplefiles/wma_rating/test2.wma") + << 4 ; + QTest::addRow("WMP3") + << QFINDTESTDATA("samplefiles/wma_rating/test3.wma") + << 6 ; + QTest::addRow("WMP4") + << QFINDTESTDATA("samplefiles/wma_rating/test4.wma") + << 8 ; + QTest::addRow("WMP5") + << QFINDTESTDATA("samplefiles/wma_rating/test5.wma") + << 10 ; +} + void TagLibExtractorTest::testNoMetadata_data() { const auto expectedKeys = QList{ diff --git a/src/extractors/taglibextractor.h b/src/extractors/taglibextractor.h --- a/src/extractors/taglibextractor.h +++ b/src/extractors/taglibextractor.h @@ -28,6 +28,9 @@ namespace TagLib { + namespace ASF { + class Tag; + } namespace ID3v2 { class Tag; } @@ -89,6 +92,7 @@ void extractMp4Tags(TagLib::MP4::Tag* mp4Tags, ExtractedData& data); void extractApeTags(TagLib::APE::Tag* apeTags, ExtractedData& data); void extractVorbisTags(TagLib::Ogg::XiphComment* vorbisTags, ExtractedData& data); + void extractAsfTags(TagLib::ASF::Tag* asfTags, ExtractedData& data); }; } diff --git a/src/extractors/taglibextractor.cpp b/src/extractors/taglibextractor.cpp --- a/src/extractors/taglibextractor.cpp +++ b/src/extractors/taglibextractor.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -705,6 +707,84 @@ } } +void TagLibExtractor::extractAsfTags(TagLib::ASF::Tag* asfTags, ExtractedData& data) +{ + if (asfTags->isEmpty()) { + return; + } + + if (!asfTags->copyright().isEmpty()) { + data.copyright = asfTags->copyright(); + } + + TagLib::ASF::AttributeList lstASF = asfTags->attribute("WM/SharedUserRating"); + if (!lstASF.isEmpty()) { + int rating = lstASF.front().toString().toInt(); + //map the rating values of WMP to Baloo rating + //0->0, 1->2, 25->4, 50->6, 75->8, 99->10 + if (rating == 0) { + data.rating = 0; + } else if (rating == 1) { + data.rating = 2; + } else { + data.rating = static_cast(0.09 * rating + 2); + } + } + + lstASF = asfTags->attribute("WM/PartOfSet"); + if (!lstASF.isEmpty()) { + data.discNumber = lstASF.front().toString().toInt(); + } + + lstASF = asfTags->attribute("WM/AlbumArtist"); + for (const auto& attribute : qAsConst(lstASF)) { + if (!data.albumArtists.isEmpty()) { + data.albumArtists += ", "; + } + data.albumArtists += attribute.toString(); + } + + lstASF = asfTags->attribute("WM/Composer"); + for (const auto& attribute : qAsConst(lstASF)) { + if (!data.composers.isEmpty()) { + data.composers += ", "; + } + data.composers += attribute.toString(); + } + + lstASF = asfTags->attribute("WM/Conductor"); + for (const auto& attribute : qAsConst(lstASF)) { + if (!data.conductor.isEmpty()) { + data.conductor += ", "; + } + data.conductor += attribute.toString(); + } + + lstASF = asfTags->attribute("WM/Writer"); + for (const auto& attribute : qAsConst(lstASF)) { + if (!data.lyricists.isEmpty()) { + data.lyricists += ", "; + } + data.lyricists += attribute.toString(); + } + + lstASF = asfTags->attribute("WM/Publisher"); + for (const auto& attribute : qAsConst(lstASF)) { + if (!data.publisher.isEmpty()) { + data.publisher += ", "; + } + data.publisher += attribute.toString(); + } + + lstASF = asfTags->attribute("Author"); + for (const auto& attribute : qAsConst(lstASF)) { + if (!data.author.isEmpty()) { + data.author += ", "; + } + data.author += attribute.toString(); + } +} + void TagLibExtractor::extract(ExtractionResult* result) { const QString fileUrl = result->inputUrl(); @@ -759,6 +839,11 @@ if (opusFile.tag()) { extractVorbisTags(opusFile.tag(), data); } + } else if (mimeType == QLatin1String("audio/x-ms-wma")) { + TagLib::ASF::Tag* asfTags = dynamic_cast(tags); + if (asfTags) { + extractAsfTags(asfTags, data); + } } if (!tags->isEmpty()) {