Hello community, here is the log from the commit of package kfilemetadata5 for openSUSE:Factory checked in at 2019-01-21 10:19:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kfilemetadata5 (Old) and /work/SRC/openSUSE:Factory/.kfilemetadata5.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kfilemetadata5" Mon Jan 21 10:19:52 2019 rev:67 rq:665803 version:5.54.0 Changes: -------- --- /work/SRC/openSUSE:Factory/kfilemetadata5/kfilemetadata5.changes 2018-12-19 13:41:00.787990797 +0100 +++ /work/SRC/openSUSE:Factory/.kfilemetadata5.new.28833/kfilemetadata5.changes 2019-01-21 10:19:55.882100556 +0100 @@ -1,0 +2,23 @@ +Mon Jan 14 06:08:46 UTC 2019 - lbeltr...@kde.org + +- Update to 5.54.0 + * New feature release + * For more details please see: + * https://www.kde.org/announcements/kde-frameworks-5.54.0.php +- Changes since 5.53.0: + * Fix some warnings + * fail writing test if mime type is not supported by the extractor + * fix ape disc number extraction + * implement cover extraction for asf files + * extend list of supported mimetypes for embedded image extractor + * Refactor embedded image extractor for greater extensibility + * add missing wav mimetype + * Extract more tags from exif metadata (kde#341162) + * fix extraction of GPS altitude for exif data + +------------------------------------------------------------------- +Sat Dec 15 14:21:02 UTC 2018 - Jan Engelhardt <jeng...@inai.de> + +- Use noun phrase in summaries. + +------------------------------------------------------------------- Old: ---- kfilemetadata-5.53.0.tar.xz New: ---- kfilemetadata-5.54.0.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kfilemetadata5.spec ++++++ --- /var/tmp/diff_new_pack.Lhn1op/_old 2019-01-21 10:19:56.414100022 +0100 +++ /var/tmp/diff_new_pack.Lhn1op/_new 2019-01-21 10:19:56.414100022 +0100 @@ -1,7 +1,7 @@ # # spec file for package kfilemetadata5 # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -16,7 +16,7 @@ # -%define _tar_path 5.53 +%define _tar_path 5.54 # Full KF5 version (e.g. 5.33.0) %{!?_kf5_version: %global _kf5_version %{version}} # Last major and minor KF5 version (e.g. 5.33) @@ -24,9 +24,9 @@ %bcond_without ffmpeg %bcond_without lang Name: kfilemetadata5 -Version: 5.53.0 +Version: 5.54.0 Release: 0 -Summary: Extract Metadata +Summary: Library for extracting Metadata License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-3.0-only Group: Development/Libraries/KDE URL: https://www.kde.org ++++++ kfilemetadata-5.53.0.tar.xz -> kfilemetadata-5.54.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/CMakeLists.txt new/kfilemetadata-5.54.0/CMakeLists.txt --- old/kfilemetadata-5.53.0/CMakeLists.txt 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/CMakeLists.txt 2019-01-06 21:21:52.000000000 +0100 @@ -1,11 +1,11 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.5) -set(KF5_VERSION "5.53.0") # handled by release scripts -set(KF5_DEP_VERSION "5.53.0") # handled by release scripts +set(KF5_VERSION "5.54.0") # handled by release scripts +set(KF5_DEP_VERSION "5.54.0") # handled by release scripts project(KFileMetaData VERSION ${KF5_VERSION}) include(FeatureSummary) -find_package(ECM 5.53.0 NO_MODULE) +find_package(ECM 5.54.0 NO_MODULE) set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://projects.kde.org/projects/kdesupport/extra-cmake-modules") feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/autotests/embeddedimagedatatest.cpp new/kfilemetadata-5.54.0/autotests/embeddedimagedatatest.cpp --- old/kfilemetadata-5.53.0/autotests/embeddedimagedatatest.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/autotests/embeddedimagedatatest.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -55,6 +55,14 @@ { QTest::addColumn<QString>("fileName"); + QTest::addRow("aiff") + << QStringLiteral("test.aif") + ; + + QTest::addRow("ape") + << QStringLiteral("test.ape") + ; + QTest::addRow("opus") << QStringLiteral("test.opus") ; @@ -79,6 +87,21 @@ << QStringLiteral("test.mpc") ; + QTest::addRow("speex") + << QStringLiteral("test.spx") + ; + + QTest::addRow("wav") + << QStringLiteral("test.wav") + ; + + QTest::addRow("wavpack") + << QStringLiteral("test.wv") + ; + + QTest::addRow("wma") + << QStringLiteral("test.wma") + ; } QTEST_GUILESS_MAIN(EmbeddedImageDataTest) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/autotests/exiv2extractortest.cpp new/kfilemetadata-5.54.0/autotests/exiv2extractortest.cpp --- old/kfilemetadata-5.53.0/autotests/exiv2extractortest.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/autotests/exiv2extractortest.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -45,11 +45,14 @@ QCOMPARE(result.types().constFirst(), Type::Image); using namespace KFileMetaData::Property; - double lat = 41.4114341666667; - double lon = 2.1736409444444; - QCOMPARE(result.properties().value(PhotoGpsLatitude).toDouble(), lat); - QCOMPARE(result.properties().value(PhotoGpsLongitude).toDouble(), lon); - QCOMPARE(result.properties().value(PhotoGpsAltitude), QVariant()); + + QCOMPARE(result.properties().value(PhotoGpsLatitude).toDouble(), 41.411); + QCOMPARE(result.properties().value(PhotoGpsLongitude).toDouble(), 2.173); + QVERIFY(qAbs(result.properties().value(PhotoGpsAltitude).toDouble() - 12.2) < 0.0001); + QCOMPARE(result.properties().value(Artist).toString(), QStringLiteral("Artist")); + QCOMPARE(result.properties().value(Description).toString(), QStringLiteral("Description")); + QCOMPARE(result.properties().value(Copyright).toString(), QStringLiteral("Copyright")); + QCOMPARE(result.properties().value(Generator).toString(), QStringLiteral("digiKam-5.9.0")); } QTEST_GUILESS_MAIN(Exiv2ExtractorTest) Binary files old/kfilemetadata-5.53.0/autotests/samplefiles/test.jpg and new/kfilemetadata-5.54.0/autotests/samplefiles/test.jpg differ Binary files old/kfilemetadata-5.53.0/autotests/samplefiles/test.spx and new/kfilemetadata-5.54.0/autotests/samplefiles/test.spx differ Binary files old/kfilemetadata-5.53.0/autotests/samplefiles/test.wma and new/kfilemetadata-5.54.0/autotests/samplefiles/test.wma differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/autotests/taglibextractortest.cpp new/kfilemetadata-5.54.0/autotests/taglibextractortest.cpp --- old/kfilemetadata-5.53.0/autotests/taglibextractortest.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/autotests/taglibextractortest.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -279,7 +279,7 @@ QCOMPARE(result.properties().value(Property::License), QVariant(QStringLiteral("License"))); QCOMPARE(result.properties().value(Property::Lyrics), QVariant(QStringLiteral("Lyrics"))); QCOMPARE(result.properties().value(Property::Channels).toInt(), 1); - QCOMPARE(result.properties().value(Property::DiscNumber).isValid(), false); + QCOMPARE(result.properties().value(Property::DiscNumber).toInt(), 1); QCOMPARE(result.properties().value(Property::Rating).toInt(), 4); QCOMPARE(result.properties().value(Property::ReplayGainAlbumGain), QVariant(-9.44)); QCOMPARE(result.properties().value(Property::ReplayGainAlbumPeak), QVariant(1.099)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/autotests/taglibwritertest.cpp new/kfilemetadata-5.54.0/autotests/taglibwritertest.cpp --- old/kfilemetadata-5.53.0/autotests/taglibwritertest.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/autotests/taglibwritertest.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -65,6 +65,8 @@ KFileMetaData::ExtractorCollection extractors; QList<KFileMetaData::Extractor*> extractorList = extractors.fetchExtractors(mimeType); + if (extractorList.isEmpty()) + QFAIL("This mime type is not supported by the extractor. Likely a newer KDE Frameworks version is required."); KFileMetaData::Extractor* ex = extractorList.first(); KFileMetaData::SimpleExtractionResult result(testFilePath(temporaryFileName), mimeType, KFileMetaData::ExtractionResult::ExtractMetaData); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/po/da/kfilemetadata5.po new/kfilemetadata-5.54.0/po/da/kfilemetadata5.po --- old/kfilemetadata-5.53.0/po/da/kfilemetadata5.po 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/po/da/kfilemetadata5.po 2019-01-06 21:21:52.000000000 +0100 @@ -7,7 +7,7 @@ "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2018-11-17 03:48+0100\n" -"PO-Revision-Date: 2018-07-12 09:47+0100\n" +"PO-Revision-Date: 2018-12-06 20:14+0100\n" "Last-Translator: Martin Schlander <mschlan...@opensuse.org>\n" "Language-Team: Danish <kde-i18n-...@kde.org>\n" "Language: da\n" @@ -393,25 +393,25 @@ #, kde-format msgctxt "@label" msgid "Replay Gain Album Peak" -msgstr "" +msgstr "Replay Gain album-peak" #: src/propertyinfo.cpp:443 #, kde-format msgctxt "@label" msgid "Replay Gain Album Gain" -msgstr "" +msgstr "Replay Gain album-peak" #: src/propertyinfo.cpp:449 #, kde-format msgctxt "@label" msgid "Replay Gain Track Peak" -msgstr "" +msgstr "Replay Gain spor-peak" #: src/propertyinfo.cpp:455 #, kde-format msgctxt "@label" msgid "Replay Gain Track Gain" -msgstr "" +msgstr "Replay Gain spor-peak" #: src/propertyinfo.cpp:461 #, kde-format @@ -462,9 +462,7 @@ msgstr "Oprettelse af skabelon" #: src/propertyinfo.cpp:517 -#, fuzzy, kde-format -#| msgctxt "@label the URL a file was originally downloded from" -#| msgid "Downloaded From" +#, kde-format msgctxt "@label the URL a file was originally downloaded from" msgid "Downloaded From" msgstr "Downloadet fra" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/po/es/kfilemetadata5.po new/kfilemetadata-5.54.0/po/es/kfilemetadata5.po --- old/kfilemetadata-5.53.0/po/es/kfilemetadata5.po 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/po/es/kfilemetadata5.po 2019-01-06 21:21:52.000000000 +0100 @@ -9,7 +9,7 @@ "Project-Id-Version: kfilemetadata\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2018-11-17 03:48+0100\n" -"PO-Revision-Date: 2018-11-24 04:48+0100\n" +"PO-Revision-Date: 2018-12-09 22:22+0100\n" "Last-Translator: Eloy Cuadra <ecua...@eloihr.net>\n" "Language-Team: Spanish <kde-l10n...@kde.org>\n" "Language: es\n" @@ -395,25 +395,25 @@ #, kde-format msgctxt "@label" msgid "Replay Gain Album Peak" -msgstr "" +msgstr "Replay Gain Album Peak" #: src/propertyinfo.cpp:443 #, kde-format msgctxt "@label" msgid "Replay Gain Album Gain" -msgstr "" +msgstr "Replay Gain Album Gain" #: src/propertyinfo.cpp:449 #, kde-format msgctxt "@label" msgid "Replay Gain Track Peak" -msgstr "" +msgstr "Replay Gain Track Peak" #: src/propertyinfo.cpp:455 #, kde-format msgctxt "@label" msgid "Replay Gain Track Gain" -msgstr "" +msgstr "Replay Gain Track Gain" #: src/propertyinfo.cpp:461 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/po/pl/kfilemetadata5.po new/kfilemetadata-5.54.0/po/pl/kfilemetadata5.po --- old/kfilemetadata-5.53.0/po/pl/kfilemetadata5.po 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/po/pl/kfilemetadata5.po 2019-01-06 21:21:52.000000000 +0100 @@ -7,7 +7,7 @@ "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2018-11-17 03:48+0100\n" -"PO-Revision-Date: 2018-10-14 11:28+0100\n" +"PO-Revision-Date: 2018-12-24 06:00+0100\n" "Last-Translator: Łukasz Wojniłowicz <lukasz.wojnilow...@gmail.com>\n" "Language-Team: Polish <kde-i18n-...@kde.org>\n" "Language: pl\n" @@ -463,9 +463,7 @@ msgstr "Tworzenie szablonu" #: src/propertyinfo.cpp:517 -#, fuzzy, kde-format -#| msgctxt "@label the URL a file was originally downloded from" -#| msgid "Downloaded From" +#, kde-format msgctxt "@label the URL a file was originally downloaded from" msgid "Downloaded From" msgstr "Pobrano z" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/po/pt_BR/kfilemetadata5.po new/kfilemetadata-5.54.0/po/pt_BR/kfilemetadata5.po --- old/kfilemetadata-5.53.0/po/pt_BR/kfilemetadata5.po 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/po/pt_BR/kfilemetadata5.po 2019-01-06 21:21:52.000000000 +0100 @@ -1,17 +1,17 @@ # Translation of kfilemetadata5.po to Brazilian Portuguese -# Copyright (C) 2014-2018 This_file_is_part_of_KDE +# Copyright (C) 2014-2019 This_file_is_part_of_KDE # This file is distributed under the same license as the PACKAGE package. # -# André Marcelo Alvarenga <alvare...@kde.org>, 2014, 2015, 2016, 2018. +# André Marcelo Alvarenga <alvare...@kde.org>, 2014, 2015, 2016, 2018, 2019. # Luiz Fernando Ranghetti <elchev...@opensuse.org>, 2017, 2018. msgid "" msgstr "" "Project-Id-Version: kfilemetadata5\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2018-11-17 03:48+0100\n" -"PO-Revision-Date: 2018-11-30 11:20-0200\n" -"Last-Translator: Luiz Fernando Ranghetti <elchev...@opensuse.org>\n" -"Language-Team: Portuguese <kde-i18n-pt...@kde.org>\n" +"PO-Revision-Date: 2019-01-01 10:56-0300\n" +"Last-Translator: André Marcelo Alvarenga <alvare...@kde.org>\n" +"Language-Team: Brazilian Portuguese <kde-i18n-pt...@kde.org>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -107,7 +107,7 @@ #, kde-format msgctxt "@label" msgid "Document Generated By" -msgstr "Documento gerador por" +msgstr "Documento gerado por" #: src/propertyinfo.cpp:148 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/po/zh_CN/kfilemetadata5.po new/kfilemetadata-5.54.0/po/zh_CN/kfilemetadata5.po --- old/kfilemetadata-5.53.0/po/zh_CN/kfilemetadata5.po 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/po/zh_CN/kfilemetadata5.po 2019-01-06 21:21:52.000000000 +0100 @@ -10,7 +10,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2018-11-17 03:48+0100\n" -"PO-Revision-Date: 2018-11-12 09:13\n" +"PO-Revision-Date: 2019-01-05 20:42\n" "Last-Translator: guoyunhe <i...@guoyunhe.me>\n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" @@ -72,12 +72,10 @@ msgstr "评论" #: src/propertyinfo.cpp:97 -#, fuzzy, kde-format -#| msgctxt "@label" -#| msgid "Duration" +#, kde-format msgctxt "@label" msgid "Description" -msgstr "时长" +msgstr "描述" #: src/propertyinfo.cpp:104 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/po/zh_TW/kfilemetadata5.po new/kfilemetadata-5.54.0/po/zh_TW/kfilemetadata5.po --- old/kfilemetadata-5.53.0/po/zh_TW/kfilemetadata5.po 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/po/zh_TW/kfilemetadata5.po 2019-01-06 21:21:52.000000000 +0100 @@ -9,9 +9,9 @@ "Project-Id-Version: \n" "Report-Msgid-Bugs-To: http://bugs.kde.org\n" "POT-Creation-Date: 2018-11-17 03:48+0100\n" -"PO-Revision-Date: 2018-10-30 23:20+0800\n" +"PO-Revision-Date: 2018-12-02 18:47+0800\n" "Last-Translator: pan93412 <pan93...@gmail.com>\n" -"Language-Team: Chinese <kde-i18n-...@kde.org>\n" +"Language-Team: Chinese <zh-l...@linux.org.tw>\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -68,12 +68,10 @@ msgstr "註解" #: src/propertyinfo.cpp:97 -#, fuzzy, kde-format -#| msgctxt "@label" -#| msgid "Duration" +#, kde-format msgctxt "@label" msgid "Description" -msgstr "期間" +msgstr "描述" #: src/propertyinfo.cpp:104 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/src/embeddedimagedata.cpp new/kfilemetadata-5.54.0/src/embeddedimagedata.cpp --- old/kfilemetadata-5.53.0/src/embeddedimagedata.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/src/embeddedimagedata.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -34,6 +34,15 @@ #include <attachedpictureframe.h> #include <mp4tag.h> #include <xiphcomment.h> +#include <apefile.h> +#include <apetag.h> +#include <wavpackfile.h> +#include <speexfile.h> +#include <wavfile.h> +#include <aifffile.h> +#include <asffile.h> +#include <asfattribute.h> +#include <asfpicture.h> #include <QMimeDatabase> #include <QDebug> @@ -45,6 +54,11 @@ public: QMimeDatabase mMimeDatabase; QByteArray getFrontCover(const QString &fileUrl, const QString &mimeType) const; + QByteArray getFrontCoverFromID3(TagLib::ID3v2::Tag* Id3Tags) const; + QByteArray getFrontCoverFromFlacPicture(TagLib::List<TagLib::FLAC::Picture *> lstPic) const; + QByteArray getFrontCoverFromMp4(TagLib::MP4::Tag* mp4Tags) const; + QByteArray getFrontCoverFromApe(TagLib::APE::Tag* apeTags) const; + QByteArray getFrontCoverFromAsf(TagLib::ASF::Tag* asfTags) const; static const QStringList mMimetypes; }; @@ -56,10 +70,18 @@ QStringLiteral("audio/mpeg3"), QStringLiteral("audio/ogg"), QStringLiteral("audio/opus"), + QStringLiteral("audio/speex"), + QStringLiteral("audio/wav"), + QStringLiteral("audio/x-aiff"), + QStringLiteral("audio/x-ape"), QStringLiteral("audio/x-mpeg"), + QStringLiteral("audio/x-ms-wma"), QStringLiteral("audio/x-musepack"), QStringLiteral("audio/x-opus+ogg"), + QStringLiteral("audio/x-speex"), QStringLiteral("audio/x-vorbis+ogg"), + QStringLiteral("audio/x-wav"), + QStringLiteral("audio/x-wavpack"), }; EmbeddedImageData::EmbeddedImageData() @@ -106,93 +128,162 @@ // Handling multiple tags in mpeg files. TagLib::MPEG::File mpegFile(&stream, TagLib::ID3v2::FrameFactory::instance(), true); - if (!mpegFile.ID3v2Tag() || mpegFile.ID3v2Tag()->isEmpty()) { - return QByteArray(); + if (mpegFile.ID3v2Tag()) { + return getFrontCoverFromID3(mpegFile.ID3v2Tag()); } - TagLib::ID3v2::FrameList lstID3v2; - // Attached Front Picture. - lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["APIC"]; - if (!lstID3v2.isEmpty()) { - for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it != lstID3v2.end(); ++it) { - auto *frontCoverFrame = static_cast<TagLib::ID3v2::AttachedPictureFrame *>(*it); - if (frontCoverFrame->type() == frontCoverFrame->FrontCover) { - return QByteArray(frontCoverFrame->picture().data(), frontCoverFrame->picture().size()); - } - } + } else if (mimeType == QLatin1String("audio/x-aiff")) { + + TagLib::RIFF::AIFF::File aiffFile(&stream, true); + if (aiffFile.hasID3v2Tag()) { + return getFrontCoverFromID3(aiffFile.tag()); + } + + } else if ((mimeType == QLatin1String("audio/wav")) + || (mimeType == QLatin1String("audio/x-wav"))) { + + TagLib::RIFF::WAV::File wavFile(&stream, true); + if (wavFile.hasID3v2Tag()) { + return getFrontCoverFromID3(wavFile.ID3v2Tag()); } } else if (mimeType == QLatin1String("audio/mp4")) { TagLib::MP4::File mp4File(&stream, true); - if (!mp4File.tag() || mp4File.tag()->isEmpty()) { - return QByteArray(); - } - TagLib::MP4::Item coverArtItem = mp4File.tag()->item("covr"); - if (coverArtItem.isValid()) - { - TagLib::MP4::CoverArtList coverArtList = coverArtItem.toCoverArtList(); - TagLib::MP4::CoverArt& frontCover = coverArtList.front(); - return QByteArray(frontCover.data().data(), frontCover.data().size()); + if (mp4File.tag()) { + return getFrontCoverFromMp4(mp4File.tag()); } } else if (mimeType == QLatin1String("audio/x-musepack")) { TagLib::MPC::File mpcFile(&stream, true); - if (!mpcFile.tag() || mpcFile.tag()->isEmpty()) { - return QByteArray(); + if (mpcFile.APETag()) { + return getFrontCoverFromApe(mpcFile.APETag()); + } + + } else if (mimeType == QLatin1String("audio/x-ape")) { + + TagLib::APE::File apeFile(&stream, true); + if (apeFile.hasAPETag()) { + return getFrontCoverFromApe(apeFile.APETag()); + } + + } else if (mimeType == QLatin1String("audio/x-wavpack")) { + + TagLib::WavPack::File wavpackFile(&stream, true); + if (wavpackFile.hasAPETag()) { + return getFrontCoverFromApe(wavpackFile.APETag()); } - TagLib::APE::ItemListMap lstMusepack = mpcFile.APETag()->itemListMap(); - TagLib::APE::ItemListMap::ConstIterator itMPC; + } else if (mimeType == QLatin1String("audio/x-ms-wma")) { - /* The cover art tag for APEv2 tags starts with the filename as string - * with zero termination followed by the actual picture data */ - itMPC = lstMusepack.find("COVER ART (FRONT)"); - if (itMPC != lstMusepack.end()) { - TagLib::ByteVector pictureData = (*itMPC).second.binaryData(); - int dataPosition = pictureData.find('\0') + 1; - return QByteArray(pictureData.data() + dataPosition, pictureData.size() - dataPosition); + TagLib::ASF::File asfFile(&stream, true); + TagLib::ASF::Tag* asfTags = dynamic_cast<TagLib::ASF::Tag*>(asfFile.tag()); + if (asfTags) { + return getFrontCoverFromAsf(asfTags); } } else if (mimeType == QLatin1String("audio/flac")) { TagLib::FLAC::File flacFile(&stream, TagLib::ID3v2::FrameFactory::instance(), true); - TagLib::List<TagLib::FLAC::Picture *> lstPic = flacFile.pictureList(); + return getFrontCoverFromFlacPicture(flacFile.pictureList()); + + } else if ((mimeType == QLatin1String("audio/ogg")) + || (mimeType == QLatin1String("audio/x-vorbis+ogg"))) { + + TagLib::Ogg::Vorbis::File oggFile(&stream, true); + if (oggFile.tag()) { + return getFrontCoverFromFlacPicture(oggFile.tag()->pictureList()); + } + + } + else if ((mimeType == QLatin1String("audio/opus")) + || (mimeType == QLatin1String("audio/x-opus+ogg"))) { + + TagLib::Ogg::Opus::File opusFile(&stream, true); + if (opusFile.tag()) { + return getFrontCoverFromFlacPicture(opusFile.tag()->pictureList()); + } + + } else if (mimeType == QLatin1String("audio/speex") || mimeType == QLatin1String("audio/x-speex")) { + + TagLib::Ogg::Speex::File speexFile(&stream, true); + if (speexFile.tag()) { + return getFrontCoverFromFlacPicture(speexFile.tag()->pictureList()); + } + + } + return QByteArray(); +} + +QByteArray +EmbeddedImageData::Private::getFrontCoverFromID3(TagLib::ID3v2::Tag* Id3Tags) const +{ + TagLib::ID3v2::FrameList lstID3v2; + // Attached Front Picture. + lstID3v2 = Id3Tags->frameListMap()["APIC"]; + for (const auto& frame : qAsConst(lstID3v2)) + { + const auto *frontCoverFrame = static_cast<TagLib::ID3v2::AttachedPictureFrame *>(frame); + if (frontCoverFrame->type() == frontCoverFrame->FrontCover) { + return QByteArray(frontCoverFrame->picture().data(), frontCoverFrame->picture().size()); + } + } + return QByteArray(); +} + +QByteArray +EmbeddedImageData::Private::getFrontCoverFromFlacPicture(TagLib::List<TagLib::FLAC::Picture *> lstPic) const +{ + for (const auto &picture : qAsConst(lstPic)) { + if (picture->type() == picture->FrontCover) { + return QByteArray(picture->data().data(), picture->data().size()); + } + } + return QByteArray(); +} - if (!lstPic.isEmpty()) { - for (TagLib::List<TagLib::FLAC::Picture *>::Iterator it = lstPic.begin(); it != lstPic.end(); ++it) { - TagLib::FLAC::Picture *picture = *it; - if (picture->type() == picture->FrontCover) { - return QByteArray(picture->data().data(), picture->data().size()); - } - } - } - - } else { - - TagLib::List<TagLib::FLAC::Picture *> lstPic; - if ((mimeType == QLatin1String("audio/ogg")) - || (mimeType == QLatin1String("audio/x-vorbis+ogg"))) { - TagLib::Ogg::Vorbis::File oggFile(&stream, true); - if (oggFile.tag() && !oggFile.tag()->isEmpty()) { - lstPic = oggFile.tag()->pictureList(); - } - } - if ((mimeType == QLatin1String("audio/opus")) - || (mimeType == QLatin1String("audio/x-opus+ogg"))) { - TagLib::Ogg::Opus::File opusFile(&stream, true); - if (opusFile.tag() && !opusFile.tag()->isEmpty()) { - lstPic = opusFile.tag()->pictureList(); - } - } - if (!lstPic.isEmpty()) { - for (TagLib::List<TagLib::FLAC::Picture *>::Iterator it = lstPic.begin(); it != lstPic.end(); ++it) { - TagLib::FLAC::Picture *picture = *it; - if (picture->type() == picture->FrontCover) { - return QByteArray(picture->data().data(), picture->data().size()); - } - } +QByteArray +EmbeddedImageData::Private::getFrontCoverFromMp4(TagLib::MP4::Tag* mp4Tags) const +{ + TagLib::MP4::Item coverArtItem = mp4Tags->item("covr"); + if (coverArtItem.isValid()) + { + TagLib::MP4::CoverArtList coverArtList = coverArtItem.toCoverArtList(); + TagLib::MP4::CoverArt& frontCover = coverArtList.front(); + return QByteArray(frontCover.data().data(), frontCover.data().size()); + } + return QByteArray(); +} + +QByteArray +EmbeddedImageData::Private::getFrontCoverFromApe(TagLib::APE::Tag* apeTags) const +{ + TagLib::APE::ItemListMap lstApe = apeTags->itemListMap(); + TagLib::APE::ItemListMap::ConstIterator itApe; + + /* The cover art tag for APEv2 tags starts with the filename as string + * with zero termination followed by the actual picture data */ + itApe = lstApe.find("COVER ART (FRONT)"); + if (itApe != lstApe.end()) { + TagLib::ByteVector pictureData = (*itApe).second.binaryData(); + int position = pictureData.find('\0'); + if (position >= 0) { + position += 1; + return QByteArray(pictureData.data() + position, pictureData.size() - position); + } + } + return QByteArray(); +} +QByteArray +EmbeddedImageData::Private::getFrontCoverFromAsf(TagLib::ASF::Tag* asfTags) const +{ + TagLib::ASF::AttributeList lstASF = asfTags->attribute("WM/Picture"); + for (const auto& attribute : qAsConst(lstASF)) { + TagLib::ASF::Picture picture = attribute.toPicture(); + if (picture.type() == TagLib::ASF::Picture::FrontCover) { + TagLib::ByteVector pictureData = picture.picture(); + return QByteArray(pictureData.data(), pictureData.size()); } } return QByteArray(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/src/extractors/exiv2extractor.cpp new/kfilemetadata-5.54.0/src/extractors/exiv2extractor.cpp --- old/kfilemetadata-5.53.0/src/extractors/exiv2extractor.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/src/extractors/exiv2extractor.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -176,6 +176,10 @@ add(result, data, Property::ImageMake, "Exif.Image.Make", QVariant::String); add(result, data, Property::ImageModel, "Exif.Image.Model", QVariant::String); + add(result, data, Property::Description, "Exif.Image.ImageDescription", QVariant::String); + add(result, data, Property::Artist, "Exif.Image.Artist", QVariant::String); + add(result, data, Property::Copyright, "Exif.Image.Copyright", QVariant::String); + add(result, data, Property::Generator, "Exif.Image.Software", QVariant::String); add(result, data, Property::ImageDateTime, "Exif.Image.DateTime", QVariant::DateTime); add(result, data, Property::ImageOrientation, "Exif.Image.Orientation", QVariant::Int); add(result, data, Property::PhotoFlash, "Exif.Photo.Flash", QVariant::Int); @@ -196,7 +200,7 @@ double latitude = fetchGpsDouble(data, "Exif.GPSInfo.GPSLatitude"); double longitude = fetchGpsDouble(data, "Exif.GPSInfo.GPSLongitude"); - double altitude = fetchGpsDouble(data, "Exif.GPSInfo.GPSAltitude"); + double altitude = fetchGpsAltitude(data); QByteArray latRef = fetchByteArray(data, "Exif.GPSInfo.GPSLatitudeRef"); if (!latRef.isEmpty() && latRef[0] == 'S') @@ -206,15 +210,15 @@ if (!longRef.isEmpty() && longRef[0] == 'W') longitude *= -1; - if (latitude) { + if (latitude != 0.0) { result->add(Property::PhotoGpsLatitude, latitude); } - if (longitude) { + if (longitude != 0.0) { result->add(Property::PhotoGpsLongitude, longitude); } - if (altitude) { + if (altitude != 0.0) { result->add(Property::PhotoGpsAltitude, altitude); } } @@ -241,7 +245,7 @@ n = (*it).toRational(0).first; d = (*it).toRational(0).second; - if (d == 0) { + if (d == 0.0) { return 0.0; } @@ -250,7 +254,7 @@ n = (*it).toRational(1).first; d = (*it).toRational(1).second; - if (d == 0) { + if (d == 0.0) { return deg; } @@ -262,7 +266,7 @@ n = (*it).toRational(2).first; d = (*it).toRational(2).second; - if (d == 0) { + if (d == 0.0) { return deg; } @@ -277,6 +281,23 @@ return 0.0; } +double Exiv2Extractor::fetchGpsAltitude(const Exiv2::ExifData& data) +{ + double alt = 0.0; + Exiv2::ExifData::const_iterator it = data.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitude")); + if (it != data.end()) { + alt = it->value().toFloat(); + it = data.findKey(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitudeRef")); + if (it != data.end()) { + auto altRef = it->value().toLong(); + if (altRef) { + alt = alt * -1; + } + } + } + return alt; +} + QByteArray Exiv2Extractor::fetchByteArray(const Exiv2::ExifData& data, const char* name) { Exiv2::ExifData::const_iterator it = data.findKey(Exiv2::ExifKey(name)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/src/extractors/exiv2extractor.h new/kfilemetadata-5.54.0/src/extractors/exiv2extractor.h --- old/kfilemetadata-5.53.0/src/extractors/exiv2extractor.h 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/src/extractors/exiv2extractor.h 2019-01-06 21:21:52.000000000 +0100 @@ -45,6 +45,7 @@ const char* name, QVariant::Type type); double fetchGpsDouble(const Exiv2::ExifData& data, const char* name); + double fetchGpsAltitude(const Exiv2::ExifData& data); QByteArray fetchByteArray(const Exiv2::ExifData& data, const char* name); }; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/src/extractors/taglibextractor.cpp new/kfilemetadata-5.54.0/src/extractors/taglibextractor.cpp --- old/kfilemetadata-5.53.0/src/extractors/taglibextractor.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/src/extractors/taglibextractor.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -72,6 +72,7 @@ QStringLiteral("audio/x-opus+ogg"), QStringLiteral("audio/x-speex"), QStringLiteral("audio/x-vorbis+ogg"), + QStringLiteral("audio/x-wav"), QStringLiteral("audio/x-wavpack"), }; @@ -455,7 +456,11 @@ data.language += (*itApe).second.toString(); } - itApe = lstApe.find("DISCNUMBER"); + + itApe = lstApe.find("DISC"); + if (itApe == lstApe.end()) { + itApe = lstApe.find("DISCNUMBER"); + } if (itApe != lstApe.end()) { data.discNumber = (*itApe).second.toString().toInt(); } @@ -792,7 +797,8 @@ if (mpegFile.hasID3v2Tag()) { extractId3Tags(mpegFile.ID3v2Tag(), data); } - } else if ((mimeType == QLatin1String("audio/x-aiff")) || (mimeType == QLatin1String("audio/wav"))) { + } else if ((mimeType == QLatin1String("audio/x-aiff")) || (mimeType == QLatin1String("audio/wav")) + || (mimeType == QLatin1String("audio/x-wav"))) { /* For some reason, TagLib::RIFF::AIFF::File and TagLib::RIFF::WAV::File tag() return * only an invalid pointer. Use the dynamic_cast instead. */ TagLib::ID3v2::Tag* ID3v2Tag = dynamic_cast<TagLib::ID3v2::Tag*>(tags); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kfilemetadata-5.53.0/src/writercollection.cpp new/kfilemetadata-5.54.0/src/writercollection.cpp --- old/kfilemetadata-5.53.0/src/writercollection.cpp 2018-12-01 15:55:12.000000000 +0100 +++ new/kfilemetadata-5.54.0/src/writercollection.cpp 2019-01-06 21:21:52.000000000 +0100 @@ -85,7 +85,7 @@ } const QStringList entryList = dir.entryList(QDir::Files | QDir::NoDotAndDotDot); - Q_FOREACH (const QString& fileName, entryList) { + for (const QString& fileName : entryList) { // Make sure the same plugin is not loaded twice, even if it // installed in two different locations if (plugins.contains(fileName)) @@ -114,8 +114,8 @@ QPluginLoader loader(pluginPath); if (!loader.load()) { - qWarning() << "Could not create Writer: " << pluginPath; - qWarning() << loader.errorString(); + qCWarning(KFILEMETADATA_LOG) << "Could not create Writer: " << pluginPath; + qCWarning(KFILEMETADATA_LOG) << loader.errorString(); continue; }