Hello community,

here is the log from the commit of package kfilemetadata5 for openSUSE:Factory 
checked in at 2018-04-19 15:16:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kfilemetadata5 (Old)
 and      /work/SRC/openSUSE:Factory/.kfilemetadata5.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kfilemetadata5"

Thu Apr 19 15:16:08 2018 rev:57 rq:596869 version:5.45.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/kfilemetadata5/kfilemetadata5.changes    
2018-03-20 21:45:26.921896274 +0100
+++ /work/SRC/openSUSE:Factory/.kfilemetadata5.new/kfilemetadata5.changes       
2018-04-19 15:16:09.707330645 +0200
@@ -1,0 +2,10 @@
+Sat Apr 14 13:19:04 CEST 2018 - lbeltr...@kde.org
+
+- Update to 5.45.0
+  * New feature release
+  * For more details please see:
+  * https://www.kde.org/announcements/kde-frameworks-5.45.0.php
+- Changes since 5.44.0:
+  * taglibextractor: Refactor for better readability
+
+-------------------------------------------------------------------

Old:
----
  kfilemetadata-5.44.0.tar.xz

New:
----
  kfilemetadata-5.45.0.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kfilemetadata5.spec ++++++
--- /var/tmp/diff_new_pack.0SyCkL/_old  2018-04-19 15:16:10.419302349 +0200
+++ /var/tmp/diff_new_pack.0SyCkL/_new  2018-04-19 15:16:10.423302190 +0200
@@ -18,13 +18,13 @@
 
 %bcond_without ffmpeg
 %bcond_without lang
-%define _tar_path 5.44
+%define _tar_path 5.45
 # Full KF5 version (e.g. 5.33.0)
 %{!?_kf5_version: %global _kf5_version %{version}}
 # Last major and minor KF5 version (e.g. 5.33)
 %{!?_kf5_bugfix_version: %global _kf5_bugfix_version %(echo %{_kf5_version} | 
awk -F. '{print $1"."$2}')}
 Name:           kfilemetadata5
-Version:        5.44.0
+Version:        5.45.0
 Release:        0
 %define kf5_version %{version}
 Summary:        Extract Metadata

++++++ kfilemetadata-5.44.0.tar.xz -> kfilemetadata-5.45.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kfilemetadata-5.44.0/CMakeLists.txt 
new/kfilemetadata-5.45.0/CMakeLists.txt
--- old/kfilemetadata-5.44.0/CMakeLists.txt     2018-03-03 11:03:18.000000000 
+0100
+++ new/kfilemetadata-5.45.0/CMakeLists.txt     2018-04-07 21:35:15.000000000 
+0200
@@ -1,11 +1,11 @@
 cmake_minimum_required(VERSION 3.0)
 
-set(KF5_VERSION "5.44.0") # handled by release scripts
-set(KF5_DEP_VERSION "5.44.0") # handled by release scripts
+set(KF5_VERSION "5.45.0") # handled by release scripts
+set(KF5_DEP_VERSION "5.45.0") # handled by release scripts
 project(KFileMetaData VERSION ${KF5_VERSION})
 
 include(FeatureSummary)
-find_package(ECM 5.44.0  NO_MODULE)
+find_package(ECM 5.45.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)
 
@@ -30,7 +30,7 @@
                   SOVERSION 3)
 
 # Dependencies
-set(REQUIRED_QT_VERSION 5.7.0)
+set(REQUIRED_QT_VERSION 5.8.0)
 
 find_package(Qt5 ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE COMPONENTS Xml)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kfilemetadata-5.44.0/po/ca@valencia/kfilemetadata5.po 
new/kfilemetadata-5.45.0/po/ca@valencia/kfilemetadata5.po
--- old/kfilemetadata-5.44.0/po/ca@valencia/kfilemetadata5.po   2018-03-03 
11:03:18.000000000 +0100
+++ new/kfilemetadata-5.45.0/po/ca@valencia/kfilemetadata5.po   2018-04-07 
21:35:15.000000000 +0200
@@ -91,7 +91,7 @@
 #, kde-format
 msgctxt "@label"
 msgid "Duration"
-msgstr "Duració"
+msgstr "Durada"
 
 #: src/propertyinfo.cpp:128
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kfilemetadata-5.44.0/po/id/kfilemetadata5.po 
new/kfilemetadata-5.45.0/po/id/kfilemetadata5.po
--- old/kfilemetadata-5.44.0/po/id/kfilemetadata5.po    2018-03-03 
11:03:18.000000000 +0100
+++ new/kfilemetadata-5.45.0/po/id/kfilemetadata5.po    2018-04-07 
21:35:15.000000000 +0200
@@ -15,6 +15,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Lokalize 2.0\n"
 
 #: src/propertyinfo.cpp:48
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kfilemetadata-5.44.0/po/zh_CN/kfilemetadata5.po 
new/kfilemetadata-5.45.0/po/zh_CN/kfilemetadata5.po
--- old/kfilemetadata-5.44.0/po/zh_CN/kfilemetadata5.po 2018-03-03 
11:03:18.000000000 +0100
+++ new/kfilemetadata-5.45.0/po/zh_CN/kfilemetadata5.po 2018-04-07 
21:35:15.000000000 +0200
@@ -10,7 +10,7 @@
 "Project-Id-Version: kdeorg\n"
 "Report-Msgid-Bugs-To: http://bugs.kde.org\n";
 "POT-Creation-Date: 2017-10-17 03:36+0200\n"
-"PO-Revision-Date: 2018-02-28 02:23-0500\n"
+"PO-Revision-Date: 2018-04-05 09:22-0400\n"
 "Last-Translator: guoyunhebrave <guoyunhebr...@gmail.com>\n"
 "Language-Team: Chinese Simplified\n"
 "Language: zh_CN\n"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kfilemetadata-5.44.0/src/extractors/taglibextractor.cpp 
new/kfilemetadata-5.45.0/src/extractors/taglibextractor.cpp
--- old/kfilemetadata-5.44.0/src/extractors/taglibextractor.cpp 2018-03-03 
11:03:18.000000000 +0100
+++ new/kfilemetadata-5.45.0/src/extractors/taglibextractor.cpp 2018-04-07 
21:35:15.000000000 +0200
@@ -43,7 +43,7 @@
 
 using namespace KFileMetaData;
 
-static QString t2q(const TagLib::String& t)
+static QString convertWCharsToQString(const TagLib::String& t)
 {
     return QString::fromWCharArray((const wchar_t*)t.toCWString(), t.length());
 }
@@ -55,359 +55,337 @@
 
 QStringList TagLibExtractor::mimetypes() const
 {
-    QStringList types;
-    // MP3, FLAC, Vorbis, Opus,  MPC, Speex, WavPack TrueAudio, WAV, AIFF, MP4 
and ASF files.
-    // MP3
-    types << QStringLiteral("audio/mpeg");
-    types << QStringLiteral("audio/mpeg3"); types << 
QStringLiteral("audio/x-mpeg");
-
-    // M4A
-    types << QStringLiteral("audio/mp4");
-
-    // FLAC
-    types << QStringLiteral("audio/flac");
-
-    // MPC
-    types << QStringLiteral("audio/x-musepack");
+    return QStringList{
+        QStringLiteral("audio/mpeg"),
+        QStringLiteral("audio/mpeg3"), 
+        QStringLiteral("audio/x-mpeg"),
+        QStringLiteral("audio/mp4"),
+        QStringLiteral("audio/flac"),
+        QStringLiteral("audio/x-musepack"),
+        QStringLiteral("audio/ogg"), 
+        QStringLiteral("audio/x-vorbis+ogg"),
+        QStringLiteral("audio/opus"), 
+        QStringLiteral("audio/x-opus+ogg"),
+        QStringLiteral("audio/wav"),
+        QStringLiteral("audio/x-aiff"),
+        QStringLiteral("audio/x-ape"),
+        QStringLiteral("audio/x-wavpack")
+    };
+}
 
-    // Vorbis
-    types << QStringLiteral("audio/ogg"); types << 
QStringLiteral("audio/x-vorbis+ogg");
+void TagLibExtractor::extractMP3(TagLib::FileStream& stream, ExtractedData& 
data)
+{
+    // Handling multiple tags in mpeg files.
+    TagLib::MPEG::File mpegFile(&stream, 
TagLib::ID3v2::FrameFactory::instance(), true);
+    if (!mpegFile.ID3v2Tag() || mpegFile.ID3v2Tag()->isEmpty()) {
+        return;
+    }
+    
+    TagLib::ID3v2::FrameList lstID3v2;
 
-    // Opus
-    types << QStringLiteral("audio/opus"); types << 
QStringLiteral("audio/x-opus+ogg");
+    // Artist.
+    lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPE1"];
+    if (!lstID3v2.isEmpty()) {
+        for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it 
!= lstID3v2.end(); ++it) {
+            if (!data.artists.isEmpty()) {
+                data.artists += ", ";
+            }
+            data.artists += (*it)->toString();
+        }
+    }
 
-    // WAV
-    types << QStringLiteral("audio/wav");
+    // Album Artist.
+    lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPE2"];
+    if (!lstID3v2.isEmpty()) {
+        for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it 
!= lstID3v2.end(); ++it) {
+            if (!data.albumArtists.isEmpty()) {
+                data.albumArtists += ", ";
+            }
+            data.albumArtists += (*it)->toString();
+        }
+    }
 
-    // AIFF
-    types << QStringLiteral("audio/x-aiff");
+    // Composer.
+    lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TCOM"];
+    if (!lstID3v2.isEmpty()) {
+        for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it 
!= lstID3v2.end(); ++it) {
+            if (!data.composers.isEmpty()) {
+                data.composers += ", ";
+            }
+            data.composers += (*it)->toString();
+        }
+    }
 
-    // APE
-    types << QStringLiteral("audio/x-ape");
+    // Lyricist.
+    lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TEXT"];
+    if (!lstID3v2.isEmpty()) {
+        for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it 
!= lstID3v2.end(); ++it) {
+            if (!data.lyricists.isEmpty()) {
+                data.lyricists += ", ";
+            }
+            data.lyricists += (*it)->toString();
+        }
+    }
 
-    // WV
-    types << QStringLiteral("audio/x-wavpack");
+    // Genre.
+    lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TCON"];
+    if (!lstID3v2.isEmpty()) {
+        for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it 
!= lstID3v2.end(); ++it) {
+            data.genres.append((*it)->toString());
+        }
+    }
 
-    return types;
+    // Disc number.
+    lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPOS"];
+    if (!lstID3v2.isEmpty()) {
+        for (TagLib::ID3v2::FrameList::ConstIterator it = lstID3v2.begin(); it 
!= lstID3v2.end(); ++it) {
+            data.discNumber = (*it)->toString().toInt();
+        }
+    }
 }
 
-void TagLibExtractor::extract(ExtractionResult* result)
+void TagLibExtractor::extractMP4(TagLib::FileStream& stream, ExtractedData& 
data)
 {
-    const QString fileUrl = result->inputUrl();
-    const QString mimeType = result->inputMimetype();
-
-    // Open the file readonly. Important if we're sandboxed.
-    TagLib::FileStream stream(fileUrl.toUtf8().constData(), true);
-    if (!stream.isOpen()) {
-        qWarning() << "Unable to open file readonly: " << fileUrl;
+    TagLib::MP4::File mp4File(&stream, true);
+    if (!mp4File.tag() || mp4File.tag()->isEmpty()) {
         return;
     }
+    TagLib::MP4::ItemListMap allTags = mp4File.tag()->itemListMap();
 
-#if (TAGLIB_MAJOR_VERSION > 1) || (TAGLIB_MAJOR_VERSION == 1 && 
TAGLIB_MINOR_VERSION >= 11)
-    TagLib::FileRef file(&stream, true);
-#else
-    TagLib::FileRef file(stream.name());
-#endif
-    if (file.isNull()) {
-        qWarning() << "Unable to open file: " << fileUrl;
-        return;
+    TagLib::MP4::ItemListMap::Iterator itAlbumArtists = allTags.find("aART");
+    if (itAlbumArtists != allTags.end()) {
+        data.albumArtists = itAlbumArtists->second.toStringList().toString(", 
");
     }
 
-    TagLib::Tag* tags = file.tag();
-    result->addType(Type::Audio);
-
-    TagLib::String artists;
-    TagLib::String albumArtists;
-    TagLib::String composers;
-    TagLib::String lyricists;
-    TagLib::StringList genres;
-    QVariant discNumber;
-
-    // Handling multiple tags in mpeg files.
-    if ((mimeType == QLatin1String("audio/mpeg")) || (mimeType == 
QLatin1String("audio/mpeg3")) || (mimeType == QLatin1String("audio/x-mpeg"))) {
-        TagLib::MPEG::File mpegFile(&stream, 
TagLib::ID3v2::FrameFactory::instance(), true);
-        if (mpegFile.ID3v2Tag() && !mpegFile.ID3v2Tag()->isEmpty()) {
-            TagLib::ID3v2::FrameList lstID3v2;
-
-            // Artist.
-            lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPE1"];
-            if (!lstID3v2.isEmpty()) {
-                for (TagLib::ID3v2::FrameList::ConstIterator it = 
lstID3v2.begin(); it != lstID3v2.end(); ++it) {
-                    if (!artists.isEmpty()) {
-                        artists += ", ";
-                    }
-                    artists += (*it)->toString();
-                }
-            }
-
-            // Album Artist.
-            lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPE2"];
-            if (!lstID3v2.isEmpty()) {
-                for (TagLib::ID3v2::FrameList::ConstIterator it = 
lstID3v2.begin(); it != lstID3v2.end(); ++it) {
-                    if (!albumArtists.isEmpty()) {
-                        albumArtists += ", ";
-                    }
-                    albumArtists += (*it)->toString();
-                }
-            }
+    TagLib::MP4::ItemListMap::Iterator itDiscNumber = allTags.find("disk");
+    if (itDiscNumber != allTags.end()) {
+        data.discNumber = itDiscNumber->second.toInt();
+    }
 
-            // Composer.
-            lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TCOM"];
-            if (!lstID3v2.isEmpty()) {
-                for (TagLib::ID3v2::FrameList::ConstIterator it = 
lstID3v2.begin(); it != lstID3v2.end(); ++it) {
-                    if (!composers.isEmpty()) {
-                        composers += ", ";
-                    }
-                    composers += (*it)->toString();
-                }
-            }
+    TagLib::String composerAtomName(TagLib::String("©wrt", 
TagLib::String::UTF8).to8Bit(), TagLib::String::Latin1);
 
-            // Lyricist.
-            lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TEXT"];
-            if (!lstID3v2.isEmpty()) {
-                for (TagLib::ID3v2::FrameList::ConstIterator it = 
lstID3v2.begin(); it != lstID3v2.end(); ++it) {
-                    if (!lyricists.isEmpty()) {
-                        lyricists += ", ";
-                    }
-                    lyricists += (*it)->toString();
-                }
-            }
+    TagLib::MP4::ItemListMap::Iterator itComposers = 
allTags.find(composerAtomName);
+    if (itComposers != allTags.end()) {
+        data.composers = itComposers->second.toStringList().toString(", ");
+    }
+}
 
-            // Genre.
-            lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TCON"];
-            if (!lstID3v2.isEmpty()) {
-                for (TagLib::ID3v2::FrameList::ConstIterator it = 
lstID3v2.begin(); it != lstID3v2.end(); ++it) {
-                    genres.append((*it)->toString());
-                }
-            }
+void TagLibExtractor::extractMusePack(TagLib::FileStream& stream, 
ExtractedData& data)
+{
+    TagLib::MPC::File mpcFile(&stream, true);
+    if (!mpcFile.tag() || mpcFile.tag()->isEmpty()) {
+        return;
+    }
+    
+    TagLib::APE::ItemListMap lstMusepack = mpcFile.APETag()->itemListMap();
+    TagLib::APE::ItemListMap::ConstIterator itMPC;
+
+    itMPC = lstMusepack.find("ARTIST");
+    if (itMPC != lstMusepack.end()) {
+        if (!data.artists.isEmpty()) {
+            data.artists += ", ";
+        }
+        data.artists += (*itMPC).second.toString();
+    }
 
-            // Disc number.
-            lstID3v2 = mpegFile.ID3v2Tag()->frameListMap()["TPOS"];
-            if (!lstID3v2.isEmpty()) {
-                for (TagLib::ID3v2::FrameList::ConstIterator it = 
lstID3v2.begin(); it != lstID3v2.end(); ++it) {
-                    discNumber = (*it)->toString().toInt();
-                }
-            }
+    itMPC = lstMusepack.find("ALBUM ARTIST");
+    if (itMPC != lstMusepack.end()) {
+        if(!data.albumArtists.isEmpty()) {
+            data.albumArtists += ", ";
+        }
+        data.albumArtists += (*itMPC).second.toString();
+    }
 
+    itMPC = lstMusepack.find("COMPOSER");
+    if (itMPC != lstMusepack.end()) {
+        if (!data.composers.isEmpty()) {
+            data.composers += ", ";
         }
+        data.composers += (*itMPC).second.toString();
     }
 
-    if (mimeType == QStringLiteral("audio/mp4")) {
-        TagLib::MP4::File mp4File(&stream, true);
-        if (mp4File.tag() && !mp4File.tag()->isEmpty()) {
-            TagLib::MP4::ItemListMap allTags = mp4File.tag()->itemListMap();
-
-            TagLib::MP4::ItemListMap::Iterator itAlbumArtists = 
allTags.find("aART");
-            if (itAlbumArtists != allTags.end()) {
-                albumArtists = 
itAlbumArtists->second.toStringList().toString(", ");
-            }
+    itMPC = lstMusepack.find("LYRICIST");
+    if (itMPC != lstMusepack.end()) {
+        if (!data.lyricists.isEmpty()) {
+            data.lyricists += ", ";
+        }
+        data.lyricists += (*itMPC).second.toString();
+    }
 
-            TagLib::MP4::ItemListMap::Iterator itDiscNumber = 
allTags.find("disk");
-            if (itDiscNumber != allTags.end()) {
-                discNumber = itDiscNumber->second.toInt();
-            }
+    itMPC = lstMusepack.find("GENRE");
+    if (itMPC != lstMusepack.end()) {
+        data.genres.append((*itMPC).second.toString());
+    }
+}
 
-            TagLib::String composerAtomName(TagLib::String("©wrt", 
TagLib::String::UTF8).to8Bit(), TagLib::String::Latin1);
+void TagLibExtractor::extractOgg(TagLib::FileStream& stream, const QString& 
mimeType, ExtractedData& data)
+{
+    TagLib::Ogg::FieldListMap lstOgg;
 
-            TagLib::MP4::ItemListMap::Iterator itComposers = 
allTags.find(composerAtomName);
-            if (itComposers != allTags.end()) {
-                composers = itComposers->second.toStringList().toString(", ");
-            }
+    if (mimeType == QStringLiteral("audio/flac")) {
+        TagLib::FLAC::File flacFile(&stream, 
TagLib::ID3v2::FrameFactory::instance(), true);
+        if (flacFile.xiphComment() && !flacFile.xiphComment()->isEmpty()) {
+            lstOgg = flacFile.xiphComment()->fieldListMap();
         }
     }
 
-    // Handling multiple tags in Ogg containers.
-    {
-        TagLib::Ogg::FieldListMap lstOgg;
-
-        // FLAC files.
-        if (mimeType == QLatin1String("audio/flac")) {
-            TagLib::FLAC::File flacFile(&stream, 
TagLib::ID3v2::FrameFactory::instance(), true);
-            if (flacFile.xiphComment() && !flacFile.xiphComment()->isEmpty()) {
-                lstOgg = flacFile.xiphComment()->fieldListMap();
-            }
+    // Vorbis files.
+    if (mimeType == QStringLiteral("audio/ogg") || mimeType == 
QStringLiteral("audio/x-vorbis+ogg")) {
+        TagLib::Ogg::Vorbis::File oggFile(&stream, true);
+        if (oggFile.tag() && !oggFile.tag()->isEmpty()) {
+            lstOgg = oggFile.tag()->fieldListMap();
         }
+    }
 
-        // Vorbis files.
-        if (mimeType == QLatin1String("audio/ogg") || mimeType == 
QLatin1String("audio/x-vorbis+ogg")) {
-            TagLib::Ogg::Vorbis::File oggFile(&stream, true);
-            if (oggFile.tag() && !oggFile.tag()->isEmpty()) {
-                lstOgg = oggFile.tag()->fieldListMap();
-            }
+    if (mimeType == QStringLiteral("audio/opus") || mimeType == 
QStringLiteral("audio/x-opus+ogg")) {
+        TagLib::Ogg::Opus::File opusFile(&stream, true);
+        if (opusFile.tag() && !opusFile.tag()->isEmpty()) {
+            lstOgg = opusFile.tag()->fieldListMap();
         }
+    }
 
-        // Opus files.
-        if (mimeType == QLatin1String("audio/opus") || mimeType == 
QLatin1String("audio/x-opus+ogg")) {
-            TagLib::Ogg::Opus::File opusFile(&stream, true);
-            if (opusFile.tag() && !opusFile.tag()->isEmpty()) {
-                lstOgg = opusFile.tag()->fieldListMap();
-            }
-        }
+    // Handling OGG container tags.
+    if (!lstOgg.isEmpty()) {
+        TagLib::Ogg::FieldListMap::ConstIterator itOgg;
 
-        // Handling OGG container tags.
-        if (!lstOgg.isEmpty()) {
-            TagLib::Ogg::FieldListMap::ConstIterator itOgg;
-
-            // Artist.
-            itOgg = lstOgg.find("ARTIST");
-            if (itOgg != lstOgg.end()) {
-                if (!artists.isEmpty()) {
-                    artists += ", ";
-                }
-                artists += (*itOgg).second.toString(", ");
+        itOgg = lstOgg.find("ARTIST");
+        if (itOgg != lstOgg.end()) {
+            if (!data.artists.isEmpty()) {
+                data.artists += ", ";
             }
+            data.artists += (*itOgg).second.toString(", ");
+        }
 
-            // Album Artist.
-            itOgg = lstOgg.find("ALBUMARTIST");
-            if (itOgg != lstOgg.end()) {
-                if (!albumArtists.isEmpty()) {
-                    albumArtists += ", ";
-                }
-                albumArtists += (*itOgg).second.toString(", ");
+        itOgg = lstOgg.find("ALBUMARTIST");
+        if (itOgg != lstOgg.end()) {
+            if (!data.albumArtists.isEmpty()) {
+                data.albumArtists += ", ";
             }
+            data.albumArtists += (*itOgg).second.toString(", ");
+        }
 
-            // Composer.
-            itOgg = lstOgg.find("COMPOSER");
-            if (itOgg != lstOgg.end()) {
-                if (!composers.isEmpty()) {
-                    composers += ", ";
-                }
-                composers += (*itOgg).second.toString(", ");
+        itOgg = lstOgg.find("COMPOSER");
+        if (itOgg != lstOgg.end()) {
+            if (!data.composers.isEmpty()) {
+                data.composers += ", ";
             }
+            data.composers += (*itOgg).second.toString(", ");
+        }
 
-            // Lyricist.
-            itOgg = lstOgg.find("LYRICIST");
-            if (itOgg != lstOgg.end()) {
-                if (!lyricists.isEmpty()) {
-                    lyricists += ", ";
-                }
-                lyricists += (*itOgg).second.toString(", ");
+        itOgg = lstOgg.find("LYRICIST");
+        if (itOgg != lstOgg.end()) {
+            if (!data.lyricists.isEmpty()) {
+                data.lyricists += ", ";
             }
+            data.lyricists += (*itOgg).second.toString(", ");
+        }
 
-            // Genre.
-            itOgg = lstOgg.find("GENRE");
-            if (itOgg != lstOgg.end()) {
-                genres.append((*itOgg).second);
-            }
+        itOgg = lstOgg.find("GENRE");
+        if (itOgg != lstOgg.end()) {
+            data.genres.append((*itOgg).second);
+        }
 
-            // Disc Number.
-            itOgg = lstOgg.find("DISCNUMBER");
-            if (itOgg != lstOgg.end()) {
-                discNumber = (*itOgg).second.toString("").toInt();
-            }
+        itOgg = lstOgg.find("DISCNUMBER");
+        if (itOgg != lstOgg.end()) {
+            data.discNumber = (*itOgg).second.toString("").toInt();
         }
     }
+}
 
-    // Handling multiple tags in Musepack files.
-    if (mimeType == QLatin1String("audio/x-musepack")) {
-        TagLib::MPC::File mpcFile(&stream, true);
-        if (mpcFile.tag() && !mpcFile.tag()->isEmpty()) {
-            TagLib::APE::ItemListMap lstMusepack = 
mpcFile.APETag()->itemListMap();
-            TagLib::APE::ItemListMap::ConstIterator itMPC;
-
-            // Artist.
-            itMPC = lstMusepack.find("ARTIST");
-            if (itMPC != lstMusepack.end()) {
-                if (!artists.isEmpty()) {
-                    artists += ", ";
-                }
-                artists += (*itMPC).second.toString();
-            }
+void TagLibExtractor::extract(ExtractionResult* result)
+{
+    const QString fileUrl = result->inputUrl();
+    const QString mimeType = result->inputMimetype();
 
-            // Album Artist.
-            itMPC = lstMusepack.find("ALBUM ARTIST");
-            if (itMPC != lstMusepack.end()) {
-                if(!albumArtists.isEmpty()) {
-                    albumArtists += ", ";
-                }
-                albumArtists += (*itMPC).second.toString();
-            }
+    // Open the file readonly. Important if we're sandboxed.
+    TagLib::FileStream stream(fileUrl.toUtf8().constData(), true);
+    if (!stream.isOpen()) {
+        qWarning() << "Unable to open file readonly: " << fileUrl;
+        return;
+    }
 
-            // Composer.
-            itMPC = lstMusepack.find("COMPOSER");
-            if (itMPC != lstMusepack.end()) {
-                if (!composers.isEmpty()) {
-                    composers += ", ";
-                }
-                composers += (*itMPC).second.toString();
-            }
+#if (TAGLIB_MAJOR_VERSION > 1) || (TAGLIB_MAJOR_VERSION == 1 && 
TAGLIB_MINOR_VERSION >= 11)
+    TagLib::FileRef file(&stream, true);
+#else
+    TagLib::FileRef file(stream.name());
+#endif
+    if (file.isNull()) {
+        qWarning() << "Unable to open file: " << fileUrl;
+        return;
+    }
 
-            // Lyricist.
-            itMPC = lstMusepack.find("LYRICIST");
-            if (itMPC != lstMusepack.end()) {
-                if (!lyricists.isEmpty()) {
-                    lyricists += ", ";
-                }
-                lyricists += (*itMPC).second.toString();
-            }
+    TagLib::Tag* tags = file.tag();
+    result->addType(Type::Audio);
 
-            // Genre.
-            itMPC = lstMusepack.find("GENRE");
-            if (itMPC != lstMusepack.end()) {
-                genres.append((*itMPC).second.toString());
-            }
-        }
+    ExtractedData data;
+    
+    if ((mimeType == QStringLiteral("audio/mpeg")) 
+        || (mimeType == QStringLiteral("audio/mpeg3")) 
+        || (mimeType == QStringLiteral("audio/x-mpeg"))) {
+        extractMP3(stream, data);
+    } else if (mimeType == QStringLiteral("audio/mp4")) {
+        extractMP4(stream, data);
+    } else if (mimeType == QStringLiteral("audio/x-musepack")) {
+        extractMusePack(stream, data);
+    } else {
+        extractOgg(stream, mimeType, data);
     }
 
     if (!tags->isEmpty()) {
-        QString title = t2q(tags->title());
+        QString title = convertWCharsToQString(tags->title());
         if (!title.isEmpty()) {
             result->add(Property::Title, title);
         }
 
-        QString comment = t2q(tags->comment());
+        QString comment = convertWCharsToQString(tags->comment());
         if (!comment.isEmpty()) {
             result->add(Property::Comment, comment);
         }
 
-        if (genres.isEmpty()) {
-            genres.append(tags->genre());
+        if (data.genres.isEmpty()) {
+            data.genres.append(tags->genre());
         }
 
-        for (uint i = 0; i < genres.size(); i++) {
-            QString genre = t2q(genres[i]).trimmed();
+        for (uint i = 0; i < data.genres.size(); i++) {
+            QString genre = convertWCharsToQString(data.genres[i]).trimmed();
 
             // Convert from int
             bool ok = false;
             int genreNum = genre.toInt(&ok);
             if (ok) {
-                genre = t2q(TagLib::ID3v1::genre(genreNum));
+                genre = convertWCharsToQString(TagLib::ID3v1::genre(genreNum));
             }
 
             result->add(Property::Genre, genre);
         }
 
-        QString artistString;
-        if (artists.isEmpty()) {
-            artistString = t2q(tags->artist());
-        } else {
-            artistString = t2q(artists).trimmed();
-        }
-
-        QStringList artists = contactsFromString(artistString);
-        foreach(const QString& artist, artists) {
+        const auto artistString = data.artists.isEmpty() 
+            ? convertWCharsToQString(tags->artist()) 
+            : convertWCharsToQString(data.artists).trimmed();
+        const auto artists = contactsFromString(artistString);
+        for (auto& artist : artists) {
             result->add(Property::Artist, artist);
         }
 
-        QString composersString = t2q(composers).trimmed();
-        QStringList composers = contactsFromString(composersString);
-        foreach(const QString& comp, composers) {
+        const auto  composersString = 
convertWCharsToQString(data.composers).trimmed();
+        const auto composers = contactsFromString(composersString);
+        for (auto& comp : composers) {
             result->add(Property::Composer, comp);
         }
 
-        QString lyricistsString = t2q(lyricists).trimmed();
-        QStringList lyricists = contactsFromString(lyricistsString);
-        foreach(const QString& lyr, lyricists) {
+        const auto lyricistsString = 
convertWCharsToQString(data.lyricists).trimmed();
+        const auto lyricists = contactsFromString(lyricistsString);
+        for (auto& lyr : lyricists) {
             result->add(Property::Lyricist, lyr);
         }
 
-        QString album = t2q(tags->album());
+        const auto album = convertWCharsToQString(tags->album());
         if (!album.isEmpty()) {
             result->add(Property::Album, album);
 
-            QString albumArtistsString = t2q(albumArtists).trimmed();
-            QStringList albumArtists = contactsFromString(albumArtistsString);
-            foreach(const QString& res, albumArtists) {
+            const auto albumArtistsString = 
convertWCharsToQString(data.albumArtists).trimmed();
+            const auto albumArtists = contactsFromString(albumArtistsString);
+            for (auto& res : albumArtists) {
                 result->add(Property::AlbumArtist, res);
             }
         }
@@ -421,8 +399,8 @@
         }
     }
 
-    if (discNumber.isValid()) {
-        result->add(Property::DiscNumber, discNumber);
+    if (data.discNumber.isValid()) {
+        result->add(Property::DiscNumber, data.discNumber);
     }
 
     TagLib::AudioProperties* audioProp = file.audioProperties();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kfilemetadata-5.44.0/src/extractors/taglibextractor.h 
new/kfilemetadata-5.45.0/src/extractors/taglibextractor.h
--- old/kfilemetadata-5.44.0/src/extractors/taglibextractor.h   2018-03-03 
11:03:18.000000000 +0100
+++ new/kfilemetadata-5.45.0/src/extractors/taglibextractor.h   2018-04-07 
21:35:15.000000000 +0200
@@ -22,6 +22,9 @@
 #define TAGLIBEXTRACTOR_H
 
 #include "extractorplugin.h"
+#include <tstring.h>
+#include <tstringlist.h>
+#include <tfilestream.h>
 
 namespace KFileMetaData
 {
@@ -37,6 +40,20 @@
 
     void extract(ExtractionResult* result) Q_DECL_OVERRIDE;
     QStringList mimetypes() const Q_DECL_OVERRIDE;
+    
+private:
+    struct ExtractedData {
+        TagLib::String artists;
+        TagLib::String albumArtists;
+        TagLib::String composers;
+        TagLib::String lyricists;
+        TagLib::StringList genres;
+        QVariant discNumber;
+    };
+    void extractMP3(TagLib::FileStream& stream, ExtractedData& data);
+    void extractMP4(TagLib::FileStream& stream, ExtractedData& data);
+    void extractMusePack(TagLib::FileStream& stream, ExtractedData& data);
+    void extractOgg(TagLib::FileStream& stream, const QString& mimetype, 
ExtractedData& data);
 };
 
 }


Reply via email to