Hello community,

here is the log from the commit of package elisa for openSUSE:Factory checked 
in at 2019-07-03 15:15:06
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/elisa (Old)
 and      /work/SRC/openSUSE:Factory/.elisa.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "elisa"

Wed Jul  3 15:15:06 2019 rev:8 rq:713103 version:0.4.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/elisa/elisa.changes      2019-06-24 
21:53:38.876119213 +0200
+++ /work/SRC/openSUSE:Factory/.elisa.new.4615/elisa.changes    2019-07-03 
15:15:06.830977843 +0200
@@ -1,0 +2,8 @@
+Sun Jun 30 20:33:02 UTC 2019 - [email protected]
+
+- Update to 0.4.2
+  * Fix restore of tracks with missing metadata in playlist (this
+    was the case for tracks without album metadata)
+  * Fix view selector not following the color theme (kde#408435)
+
+-------------------------------------------------------------------

Old:
----
  elisa-0.4.1.tar.xz
  elisa-0.4.1.tar.xz.sig

New:
----
  elisa-0.4.2.tar.xz
  elisa-0.4.2.tar.xz.sig

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

Other differences:
------------------
++++++ elisa.spec ++++++
--- /var/tmp/diff_new_pack.DWm53n/_old  2019-07-03 15:15:09.610983500 +0200
+++ /var/tmp/diff_new_pack.DWm53n/_new  2019-07-03 15:15:09.626983533 +0200
@@ -20,7 +20,7 @@
 %define kf5_version 5.48.0
 %bcond_without lang
 Name:           elisa
-Version:        0.4.1
+Version:        0.4.2
 Release:        0
 Summary:        Music player and collection organizer
 License:        LGPL-3.0-or-later

++++++ elisa-0.4.1.tar.xz -> elisa-0.4.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/CMakeLists.txt 
new/elisa-0.4.2/CMakeLists.txt
--- old/elisa-0.4.1/CMakeLists.txt      2019-06-19 22:41:34.000000000 +0200
+++ new/elisa-0.4.2/CMakeLists.txt      2019-06-29 15:03:26.000000000 +0200
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 3.8)
 
 project(elisa
-    VERSION 0.4.1
+    VERSION 0.4.2
     LANGUAGES CXX)
 
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/autotests/databaseinterfacetest.cpp 
new/elisa-0.4.2/autotests/databaseinterfacetest.cpp
--- old/elisa-0.4.1/autotests/databaseinterfacetest.cpp 2019-06-19 
22:40:52.000000000 +0200
+++ new/elisa-0.4.2/autotests/databaseinterfacetest.cpp 2019-06-29 
15:02:46.000000000 +0200
@@ -4958,6 +4958,155 @@
         QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
         QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
     }
+
+    void enqueueTracksWithMissingMetadata()
+    {
+        QTemporaryFile databaseFile;
+        databaseFile.open();
+
+        qDebug() << "enqueueTracksWithMissingMetadata" << 
databaseFile.fileName();
+
+        DatabaseInterface musicDb;
+
+        musicDb.init(QStringLiteral("enqueueTracksWithMissingMetadata"), 
databaseFile.fileName());
+
+        QSignalSpy musicDbArtistAddedSpy(&musicDb, 
&DatabaseInterface::artistsAdded);
+        QSignalSpy musicDbAlbumAddedSpy(&musicDb, 
&DatabaseInterface::albumsAdded);
+        QSignalSpy musicDbTrackAddedSpy(&musicDb, 
&DatabaseInterface::tracksAdded);
+        QSignalSpy musicDbArtistRemovedSpy(&musicDb, 
&DatabaseInterface::artistRemoved);
+        QSignalSpy musicDbAlbumRemovedSpy(&musicDb, 
&DatabaseInterface::albumRemoved);
+        QSignalSpy musicDbTrackRemovedSpy(&musicDb, 
&DatabaseInterface::trackRemoved);
+        QSignalSpy musicDbAlbumModifiedSpy(&musicDb, 
&DatabaseInterface::albumModified);
+        QSignalSpy musicDbTrackModifiedSpy(&musicDb, 
&DatabaseInterface::trackModified);
+        QSignalSpy musicDbDatabaseErrorSpy(&musicDb, 
&DatabaseInterface::databaseError);
+
+        QCOMPARE(musicDb.allAlbumsData().count(), 0);
+        QCOMPARE(musicDb.allArtistsData().count(), 0);
+        QCOMPARE(musicDb.allTracksData().count(), 0);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 0);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 0);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
+        QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
+
+        auto fullTrack = MusicAudioTrack{true, QStringLiteral("$23"), 
QStringLiteral("0"), QStringLiteral("track6"),
+                QStringLiteral("artist2"), QStringLiteral("album3"), 
QStringLiteral("artist2"),
+                6, 1, QTime::fromMSecsSinceStartOfDay(23), 
{QUrl::fromLocalFile(QStringLiteral("/test/$23"))},
+                QDateTime::fromMSecsSinceEpoch(23),
+                QUrl::fromLocalFile(QStringLiteral("album3")), 5, true,
+                QStringLiteral("genre1"), QStringLiteral("composer1"), 
QStringLiteral("lyricist1"), false};
+
+        fullTrack.setBitRate(154);
+        fullTrack.setChannels(2);
+        fullTrack.setSampleRate(48000);
+
+        auto newTrack = MusicAudioTrack{};
+
+        newTrack.setValid(true);
+        newTrack.setId(QStringLiteral("$29"));
+        newTrack.setParentId(QStringLiteral("0"));
+        newTrack.setTitle(QStringLiteral("track19"));
+        newTrack.setArtist(QStringLiteral("artist2"));
+        newTrack.setDuration(QTime::fromMSecsSinceStartOfDay(29));
+        newTrack.setResourceURI(QUrl::fromLocalFile(QStringLiteral("/$29")));
+        newTrack.setFileModificationTime(QDateTime::fromMSecsSinceEpoch(29));
+        
newTrack.setAlbumCover(QUrl::fromLocalFile(QStringLiteral("/withoutAlbum")));
+        newTrack.setRating(9);
+        newTrack.setIsSingleDiscAlbum(true);
+        newTrack.setGenre(QStringLiteral("genre1"));
+        newTrack.setComposer(QStringLiteral("composer1"));
+        newTrack.setLyricist(QStringLiteral("lyricist1"));
+        newTrack.setHasEmbeddedCover(false);
+
+        musicDb.insertTracksList({fullTrack, newTrack}, mNewCovers);
+
+        QCOMPARE(musicDb.allAlbumsData().count(), 1);
+        QCOMPARE(musicDb.allArtistsData().count(), 1);
+        QCOMPARE(musicDb.allTracksData().count(), 2);
+        QCOMPARE(musicDbArtistAddedSpy.count(), 1);
+        QCOMPARE(musicDbAlbumAddedSpy.count(), 1);
+        QCOMPARE(musicDbTrackAddedSpy.count(), 1);
+        QCOMPARE(musicDbArtistRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumRemovedSpy.count(), 0);
+        QCOMPARE(musicDbTrackRemovedSpy.count(), 0);
+        QCOMPARE(musicDbAlbumModifiedSpy.count(), 0);
+        QCOMPARE(musicDbTrackModifiedSpy.count(), 0);
+        QCOMPARE(musicDbDatabaseErrorSpy.count(), 0);
+
+        auto firstTrackId = 
musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track6"), 
QStringLiteral("artist2"),
+                                                                         
QStringLiteral("album3"), 6, 1);
+        auto firstTrack = musicDb.trackDataFromDatabaseId(firstTrackId);
+
+        auto firstTrackTitle = firstTrack.title();
+        auto firstTrackArtist = firstTrack.artist();
+        auto firstTrackAlbumArtist = firstTrack.albumArtist();
+        auto firstTrackAlbum = firstTrack.album();
+        auto firstTrackImage = firstTrack.albumCover();
+        auto firstTrackDuration = firstTrack.duration();
+        auto firstTrackMilliSecondsDuration = 
firstTrack.duration().msecsSinceStartOfDay();
+        auto firstTrackTrackNumber = firstTrack.trackNumber();
+        auto firstTrackDiscNumber = firstTrack.discNumber();
+        const auto &firstTrackResource = firstTrack.resourceURI();
+        auto firstTrackRating = firstTrack.rating();
+        auto firstIsSingleDiscAlbum = firstTrack.isSingleDiscAlbum();
+
+        QCOMPARE(firstTrack.isValid(), true);
+        QCOMPARE(firstTrackTitle, QStringLiteral("track6"));
+        QCOMPARE(firstTrackArtist, QStringLiteral("artist2"));
+        QCOMPARE(firstTrackAlbumArtist, QStringLiteral("artist2"));
+        QCOMPARE(firstTrackAlbum, QStringLiteral("album3"));
+        QCOMPARE(firstTrackImage.isValid(), true);
+        QCOMPARE(firstTrackImage, 
QUrl::fromLocalFile(QStringLiteral("album3")));
+        QCOMPARE(firstTrackDuration, QTime::fromMSecsSinceStartOfDay(23));
+        QCOMPARE(firstTrackMilliSecondsDuration, 23);
+        QCOMPARE(firstTrackTrackNumber, 6);
+        QCOMPARE(firstTrackDiscNumber, 1);
+        QCOMPARE(firstTrackResource.isValid(), true);
+        QCOMPARE(firstTrackResource, 
QUrl::fromLocalFile(QStringLiteral("/test/$23")));
+        QCOMPARE(firstTrackRating, 5);
+        QCOMPARE(firstIsSingleDiscAlbum, true);
+
+        auto secondTrackId = 
musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral("track19"), 
QStringLiteral("artist2"), {}, {}, {});
+        auto secondTrack = musicDb.trackDataFromDatabaseId(secondTrackId);
+
+        auto secondTrackTitle = secondTrack.title();
+        auto secondTrackArtist = secondTrack.artist();
+        auto secondTrackAlbumArtist = secondTrack.albumArtist();
+        auto secondTrackAlbum = secondTrack.album();
+        auto secondTrackImage = secondTrack.albumCover();
+        auto secondTrackDuration = secondTrack.duration();
+        auto secondTrackMilliSecondsDuration = 
secondTrack.duration().msecsSinceStartOfDay();
+        auto secondTrackTrackNumber = secondTrack.trackNumber();
+        auto secondTrackDiscNumber = secondTrack.discNumber();
+        auto secondTrackChannels = secondTrack.channels();
+        auto secondTrackBitRate = secondTrack.bitRate();
+        auto secondTrackSampleRate = secondTrack.sampleRate();
+        const auto &secondTrackResource = secondTrack.resourceURI();
+        auto secondTrackRating = secondTrack.rating();
+        auto secondIsSingleDiscAlbum = secondTrack.isSingleDiscAlbum();
+
+        QCOMPARE(secondTrack.isValid(), true);
+        QCOMPARE(secondTrackTitle, QStringLiteral("track19"));
+        QCOMPARE(secondTrackArtist, QStringLiteral("artist2"));
+        QCOMPARE(secondTrackAlbumArtist, QString());
+        QCOMPARE(secondTrackAlbum, QString());
+        QCOMPARE(secondTrackImage.isValid(), false);
+        QCOMPARE(secondTrackDuration, QTime::fromMSecsSinceStartOfDay(29));
+        QCOMPARE(secondTrackMilliSecondsDuration, 29);
+        QCOMPARE(secondTrackTrackNumber, 0);
+        QCOMPARE(secondTrackDiscNumber, 0);
+        QCOMPARE(secondTrackChannels, 0);
+        QCOMPARE(secondTrackBitRate, 0);
+        QCOMPARE(secondTrackSampleRate, 0);
+        QCOMPARE(secondTrackResource.isValid(), true);
+        QCOMPARE(secondTrackResource, 
QUrl::fromLocalFile(QStringLiteral("/$29")));
+        QCOMPARE(secondTrackRating, 9);
+        QCOMPARE(secondIsSingleDiscAlbum, true);
+    }
 };
 
 QTEST_GUILESS_MAIN(DatabaseInterfaceTests)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/autotests/mediaplaylisttest.cpp 
new/elisa-0.4.2/autotests/mediaplaylisttest.cpp
--- old/elisa-0.4.1/autotests/mediaplaylisttest.cpp     2019-06-19 
22:40:52.000000000 +0200
+++ new/elisa-0.4.2/autotests/mediaplaylisttest.cpp     2019-06-29 
15:02:46.000000000 +0200
@@ -2918,6 +2918,140 @@
     QCOMPARE(myPlayList.data(myPlayList.index(3, 0), 
MediaPlayList::MilliSecondsDurationRole).toInt(), 3);
 }
 
+void MediaPlayListTest::restoreTrackWithoutAlbum()
+{
+    QTemporaryFile databaseFile;
+    databaseFile.open();
+
+    qDebug() << "restoreTrackWithoutAlbum" << databaseFile.fileName();
+
+    MediaPlayList myPlayList;
+    QAbstractItemModelTester testModel(&myPlayList);
+    DatabaseInterface myDatabaseContent;
+    TracksListener myListener(&myDatabaseContent);
+
+    QSignalSpy rowsAboutToBeMovedSpy(&myPlayList, 
&MediaPlayList::rowsAboutToBeMoved);
+    QSignalSpy rowsAboutToBeRemovedSpy(&myPlayList, 
&MediaPlayList::rowsAboutToBeRemoved);
+    QSignalSpy rowsAboutToBeInsertedSpy(&myPlayList, 
&MediaPlayList::rowsAboutToBeInserted);
+    QSignalSpy rowsMovedSpy(&myPlayList, &MediaPlayList::rowsMoved);
+    QSignalSpy rowsRemovedSpy(&myPlayList, &MediaPlayList::rowsRemoved);
+    QSignalSpy rowsInsertedSpy(&myPlayList, &MediaPlayList::rowsInserted);
+    QSignalSpy persistentStateChangedSpy(&myPlayList, 
&MediaPlayList::persistentStateChanged);
+    QSignalSpy dataChangedSpy(&myPlayList, &MediaPlayList::dataChanged);
+    QSignalSpy newTrackByNameInListSpy(&myPlayList, 
&MediaPlayList::newTrackByNameInList);
+    QSignalSpy newEntryInListSpy(&myPlayList, &MediaPlayList::newEntryInList);
+
+    QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
+    QCOMPARE(rowsRemovedSpy.count(), 0);
+    QCOMPARE(rowsMovedSpy.count(), 0);
+    QCOMPARE(rowsInsertedSpy.count(), 0);
+    QCOMPARE(persistentStateChangedSpy.count(), 0);
+    QCOMPARE(dataChangedSpy.count(), 0);
+    QCOMPARE(newTrackByNameInListSpy.count(), 0);
+    QCOMPARE(newEntryInListSpy.count(), 0);
+
+    myDatabaseContent.init(QStringLiteral("restoreTrackWithoutAlbum"), 
databaseFile.fileName());
+
+    connect(&myListener, &TracksListener::trackHasChanged,
+            &myPlayList, &MediaPlayList::trackChanged,
+            Qt::QueuedConnection);
+    connect(&myListener, &TracksListener::tracksListAdded,
+            &myPlayList, &MediaPlayList::tracksListAdded,
+            Qt::QueuedConnection);
+    connect(&myPlayList, &MediaPlayList::newTrackByNameInList,
+            &myListener, &TracksListener::trackByNameInList,
+            Qt::QueuedConnection);
+    connect(&myPlayList, &MediaPlayList::newEntryInList,
+            &myListener, &TracksListener::newEntryInList,
+            Qt::QueuedConnection);
+    connect(&myDatabaseContent, &DatabaseInterface::tracksAdded,
+            &myListener, &TracksListener::tracksAdded);
+
+    myDatabaseContent.insertTracksList(mNewTracks, mNewCovers);
+
+    QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
+    QCOMPARE(rowsRemovedSpy.count(), 0);
+    QCOMPARE(rowsMovedSpy.count(), 0);
+    QCOMPARE(rowsInsertedSpy.count(), 0);
+    QCOMPARE(persistentStateChangedSpy.count(), 0);
+    QCOMPARE(dataChangedSpy.count(), 0);
+    QCOMPARE(newTrackByNameInListSpy.count(), 0);
+    QCOMPARE(newEntryInListSpy.count(), 0);
+
+    auto newTrack = MusicAudioTrack{};
+
+    newTrack.setValid(true);
+    newTrack.setId(QStringLiteral("$29"));
+    newTrack.setParentId(QStringLiteral("0"));
+    newTrack.setTitle(QStringLiteral("track19"));
+    newTrack.setArtist(QStringLiteral("artist2"));
+    newTrack.setDuration(QTime::fromMSecsSinceStartOfDay(29));
+    newTrack.setResourceURI(QUrl::fromLocalFile(QStringLiteral("/$29")));
+    newTrack.setFileModificationTime(QDateTime::fromMSecsSinceEpoch(29));
+    
newTrack.setAlbumCover(QUrl::fromLocalFile(QStringLiteral("withoutAlbum")));
+    newTrack.setRating(9);
+    newTrack.setIsSingleDiscAlbum(true);
+    newTrack.setGenre(QStringLiteral("genre1"));
+    newTrack.setComposer(QStringLiteral("composer1"));
+    newTrack.setLyricist(QStringLiteral("lyricist1"));
+    newTrack.setHasEmbeddedCover(false);
+
+    myDatabaseContent.insertTracksList({newTrack}, mNewCovers);
+
+    QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeInsertedSpy.count(), 0);
+    QCOMPARE(rowsRemovedSpy.count(), 0);
+    QCOMPARE(rowsMovedSpy.count(), 0);
+    QCOMPARE(rowsInsertedSpy.count(), 0);
+    QCOMPARE(persistentStateChangedSpy.count(), 0);
+    QCOMPARE(dataChangedSpy.count(), 0);
+    QCOMPARE(newTrackByNameInListSpy.count(), 0);
+    QCOMPARE(newEntryInListSpy.count(), 0);
+
+    auto newEntry = MediaPlayListEntry{};
+
+    newEntry.mTitle = QStringLiteral("track19");
+    newEntry.mArtist = QStringLiteral("artist2");
+
+    myPlayList.enqueueRestoredEntry(newEntry);
+
+    QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
+    QCOMPARE(rowsRemovedSpy.count(), 0);
+    QCOMPARE(rowsMovedSpy.count(), 0);
+    QCOMPARE(rowsInsertedSpy.count(), 1);
+    QCOMPARE(persistentStateChangedSpy.count(), 1);
+    QCOMPARE(dataChangedSpy.count(), 1);
+    QCOMPARE(newTrackByNameInListSpy.count(), 1);
+    QCOMPARE(newEntryInListSpy.count(), 0);
+
+    QCOMPARE(dataChangedSpy.wait(), true);
+
+    QCOMPARE(rowsAboutToBeRemovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeMovedSpy.count(), 0);
+    QCOMPARE(rowsAboutToBeInsertedSpy.count(), 1);
+    QCOMPARE(rowsRemovedSpy.count(), 0);
+    QCOMPARE(rowsMovedSpy.count(), 0);
+    QCOMPARE(rowsInsertedSpy.count(), 1);
+    QCOMPARE(persistentStateChangedSpy.count(), 1);
+    QCOMPARE(dataChangedSpy.count(), 2);
+    QCOMPARE(newTrackByNameInListSpy.count(), 1);
+    QCOMPARE(newEntryInListSpy.count(), 0);
+
+    QCOMPARE(myPlayList.data(myPlayList.index(0, 0), 
MediaPlayList::TitleRole).toString(), QStringLiteral("track19"));
+    QCOMPARE(myPlayList.data(myPlayList.index(0, 0), 
MediaPlayList::AlbumRole).toString(), {});
+    QCOMPARE(myPlayList.data(myPlayList.index(0, 0), 
MediaPlayList::ArtistRole).toString(), QStringLiteral("artist2"));
+    QCOMPARE(myPlayList.data(myPlayList.index(0, 0), 
MediaPlayList::TrackNumberRole).toInt(), 0);
+    QCOMPARE(myPlayList.data(myPlayList.index(0, 0), 
MediaPlayList::DiscNumberRole).toInt(), 0);
+    QCOMPARE(myPlayList.data(myPlayList.index(0, 0), 
MediaPlayList::MilliSecondsDurationRole).toInt(), 29);
+}
+
 void MediaPlayListTest::testHasHeaderAlbumWithSameTitle()
 {
     MediaPlayList myPlayList;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/autotests/mediaplaylisttest.h 
new/elisa-0.4.2/autotests/mediaplaylisttest.h
--- old/elisa-0.4.1/autotests/mediaplaylisttest.h       2019-06-19 
22:40:52.000000000 +0200
+++ new/elisa-0.4.2/autotests/mediaplaylisttest.h       2019-06-29 
15:02:46.000000000 +0200
@@ -73,6 +73,8 @@
 
     void restoreMultipleIdenticalTracks();
 
+    void restoreTrackWithoutAlbum();
+
     void testHasHeaderAlbumWithSameTitle();
 
     void testSavePersistentState();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/org.kde.elisa.appdata.xml 
new/elisa-0.4.2/org.kde.elisa.appdata.xml
--- old/elisa-0.4.1/org.kde.elisa.appdata.xml   2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/org.kde.elisa.appdata.xml   2019-06-29 15:02:46.000000000 
+0200
@@ -140,6 +140,8 @@
   <project_group>KDE</project_group>
   <content_rating type="oars-1.0"/>
   <releases>
+    <release version="0.4.2" date="2019-06-30"/>
+    <release version="0.4.1" date="2019-06-20"/>
     <release version="0.4.0" date="2019-05-20"/>
     <release version="0.3.80" date="2019-05-04"/>
     <release version="0.3.0" date="2018-09-29"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/po/de/elisa.po 
new/elisa-0.4.2/po/de/elisa.po
--- old/elisa-0.4.1/po/de/elisa.po      2019-06-19 22:41:06.000000000 +0200
+++ new/elisa-0.4.2/po/de/elisa.po      2019-06-29 15:03:00.000000000 +0200
@@ -1,14 +1,14 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Burkhard Lück <[email protected]>, 2016, 2017, 2018.
+# Burkhard Lück <[email protected]>, 2016, 2017, 2018, 2019.
 # Frederik Schwarzer <[email protected]>, 2016, 2018.
 msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2019-06-13 07:41+0200\n"
-"PO-Revision-Date: 2018-09-23 20:42+0100\n"
+"PO-Revision-Date: 2019-06-24 14:33+0200\n"
 "Last-Translator: Burkhard Lück <[email protected]>\n"
 "Language-Team: German <[email protected]>\n"
 "Language: de\n"
@@ -16,7 +16,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Lokalize 2.0\n"
+"X-Generator: Lokalize 18.12.3\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
@@ -69,10 +69,9 @@
 msgstr "Ein einfacher Medienspieler geschrieben mit KDE Frameworks"
 
 #: main.cpp:118
-#, fuzzy, kde-format
-#| msgid "(c) 2015-2018, Elisa contributors"
+#, kde-format
 msgid "(c) 2015-2019, Elisa contributors"
-msgstr "(c) 2015-2018, Elisa-Mitwirkende"
+msgstr "(c) 2015-2019, Elisa-Mitwirkende"
 
 #: main.cpp:120
 #, kde-format
@@ -105,154 +104,118 @@
 msgstr "Verschiedene Verbesserungen an der Bedienungsoberfläche"
 
 #: models/trackmetadatamodel.cpp:64
-#, fuzzy, kde-format
-#| msgctxt "Track title for track metadata view"
-#| msgid "Title:"
+#, kde-format
 msgctxt "Track title for track metadata view"
 msgid "Title"
-msgstr "Titel:"
+msgstr "Titel"
 
 #: models/trackmetadatamodel.cpp:67
-#, fuzzy, kde-format
-#| msgctxt "Duration label for track metadata view"
-#| msgid "Duration:"
+#, kde-format
 msgctxt "Duration label for track metadata view"
 msgid "Duration"
-msgstr "Dauer:"
+msgstr "Dauer"
 
 #: models/trackmetadatamodel.cpp:70
-#, fuzzy, kde-format
-#| msgctxt "Track artist for track metadata view"
-#| msgid "Artist:"
+#, kde-format
 msgctxt "Track artist for track metadata view"
 msgid "Artist"
-msgstr "Interpret:"
+msgstr "Interpret"
 
 #: models/trackmetadatamodel.cpp:73
-#, fuzzy, kde-format
-#| msgctxt "Album name for track metadata view"
-#| msgid "Album:"
+#, kde-format
 msgctxt "Album name for track metadata view"
 msgid "Album"
-msgstr "Album:"
+msgstr "Album"
 
 #: models/trackmetadatamodel.cpp:76
-#, fuzzy, kde-format
-#| msgctxt "Album artist for track metadata view"
-#| msgid "Album Artist:"
+#, kde-format
 msgctxt "Album artist for track metadata view"
 msgid "Album Artist"
-msgstr "Interpret des Albums:"
+msgstr "Interpret des Albums"
 
 #: models/trackmetadatamodel.cpp:79
-#, fuzzy, kde-format
-#| msgctxt "Track number for track metadata view"
-#| msgid "Track Number:"
+#, kde-format
 msgctxt "Track number for track metadata view"
 msgid "Track Number"
-msgstr "Nummer des Stücks:"
+msgstr "Nummer des Stücks"
 
 #: models/trackmetadatamodel.cpp:82
-#, fuzzy, kde-format
-#| msgctxt "Disc number for track metadata view"
-#| msgid "Disc Number:"
+#, kde-format
 msgctxt "Disc number for track metadata view"
 msgid "Disc Number"
-msgstr "CD-Nummer:"
+msgstr "CD-Nummer"
 
 #: models/trackmetadatamodel.cpp:85
-#, fuzzy, kde-format
-#| msgctxt "Rating label for information panel"
-#| msgid "Rating:"
+#, kde-format
 msgctxt "Rating label for information panel"
 msgid "Rating"
-msgstr "Bewertung:"
+msgstr "Bewertung"
 
 #: models/trackmetadatamodel.cpp:88
-#, fuzzy, kde-format
-#| msgctxt "Genre label for track metadata view"
-#| msgid "Genre:"
+#, kde-format
 msgctxt "Genre label for track metadata view"
 msgid "Genre"
-msgstr "Genre:"
+msgstr "Genre"
 
 #: models/trackmetadatamodel.cpp:91
-#, fuzzy, kde-format
-#| msgctxt "Lyricist label for track metadata view"
-#| msgid "Lyricist:"
+#, kde-format
 msgctxt "Lyricist label for track metadata view"
 msgid "Lyricist"
-msgstr "Texter:"
+msgstr "Texter"
 
 #: models/trackmetadatamodel.cpp:94
-#, fuzzy, kde-format
-#| msgctxt "Composer name for track metadata view"
-#| msgid "Composer:"
+#, kde-format
 msgctxt "Composer name for track metadata view"
 msgid "Composer"
-msgstr "Komponist:"
+msgstr "Komponist"
 
 #: models/trackmetadatamodel.cpp:97
-#, fuzzy, kde-format
-#| msgctxt "Comment label for track metadata view"
-#| msgid "Comment:"
+#, kde-format
 msgctxt "Comment label for track metadata view"
 msgid "Comment"
-msgstr "Kommentar:"
+msgstr "Kommentar"
 
 #: models/trackmetadatamodel.cpp:100
-#, fuzzy, kde-format
-#| msgctxt "Year label for track metadata view"
-#| msgid "Year:"
+#, kde-format
 msgctxt "Year label for track metadata view"
 msgid "Year"
-msgstr "Jahr:"
+msgstr "Jahr"
 
 #: models/trackmetadatamodel.cpp:103
-#, fuzzy, kde-format
-#| msgctxt "Channels label for track metadata view"
-#| msgid "Channels:"
+#, kde-format
 msgctxt "Channels label for track metadata view"
 msgid "Channels"
-msgstr "Kanäle:"
+msgstr "Kanäle"
 
 #: models/trackmetadatamodel.cpp:106
-#, fuzzy, kde-format
-#| msgctxt "Bit rate label for track metadata view"
-#| msgid "Bit Rate:"
+#, kde-format
 msgctxt "Bit rate label for track metadata view"
 msgid "Bit Rate"
-msgstr "Bitrate:"
+msgstr "Bitrate"
 
 #: models/trackmetadatamodel.cpp:109
-#, fuzzy, kde-format
-#| msgctxt "Sample Rate label for track metadata view"
-#| msgid "Sample Rate:"
+#, kde-format
 msgctxt "Sample Rate label for track metadata view"
 msgid "Sample Rate"
-msgstr "Abtastrate:"
+msgstr "Abtastrate"
 
 #: models/trackmetadatamodel.cpp:112
 #, kde-format
 msgctxt "Last play date label for track metadata view"
 msgid "Last played"
-msgstr ""
+msgstr "Letzte Wiedergabe"
 
 #: models/trackmetadatamodel.cpp:115
-#, fuzzy, kde-format
-#| msgctxt "Play now current track from play list"
-#| msgid "Play Now"
+#, kde-format
 msgctxt "Play counter label for track metadata view"
 msgid "Play count"
-msgstr "Jetzt abspielen"
+msgstr "Wiedergabezähler"
 
 #: models/trackmetadatamodel.cpp:118 qml/ContextViewLyrics.qml:32
-#, fuzzy, kde-format
-#| msgctxt "Lyricist label for track metadata view"
-#| msgid "Lyricist:"
+#, kde-format
 msgctxt "Lyrics label for track metadata view"
 msgid "Lyrics"
-msgstr "Texter:"
+msgstr "Liedtext"
 
 #: models/viewsmodel.cpp:44
 #, kde-format
@@ -261,18 +224,16 @@
 msgstr "Wiedergabe"
 
 #: models/viewsmodel.cpp:45
-#, fuzzy, kde-format
-#| msgctxt "Clear playlist and play"
-#| msgid "Replace and Play"
+#, kde-format
 msgctxt "Title of the view of recently played tracks"
 msgid "Recently Played"
-msgstr "Ersetzen und abspielen"
+msgstr "Vor kurzem gespielt"
 
 #: models/viewsmodel.cpp:46
 #, kde-format
 msgctxt "Title of the view of frequently played tracks"
 msgid "Frequently Played"
-msgstr ""
+msgstr "Oft gespielt"
 
 #: models/viewsmodel.cpp:51 qml/FileBrowserView.qml:70
 #, kde-format
@@ -284,7 +245,7 @@
 #, kde-format
 msgctxt "explanation for sleep inhibit during play of music"
 msgid "Playing Music"
-msgstr ""
+msgstr "Musik-Wiedergabe"
 
 #: qml/ApplicationMenu.qml:26 qml/MediaPlayerControl.qml:62
 #, kde-format
@@ -296,7 +257,7 @@
 #, kde-format
 msgctxt "Refresh Music Collection application menu entry"
 msgid "Refresh Music Collection"
-msgstr ""
+msgstr "Musik-Sammlung neu einlesen"
 
 #: qml/ApplicationMenu.qml:63
 #, kde-format
@@ -311,9 +272,7 @@
 msgstr "Wiedergabeliste anzeigen"
 
 #: qml/ContextView.qml:55
-#, fuzzy, kde-format
-#| msgctxt "Title of the view of the playlist"
-#| msgid "Now Playing"
+#, kde-format
 msgctxt "Title of the context view related to the currently playing track"
 msgid "Now Playing"
 msgstr "Wiedergabe"
@@ -352,12 +311,10 @@
 msgstr "Jetzt abspielen und Wiedergabeliste ersetzen"
 
 #: qml/GridBrowserDelegate.qml:162
-#, fuzzy, kde-format
-#| msgctxt "Hide playlist"
-#| msgid "Hide Playlist"
+#, kde-format
 msgctxt "Add whole container to play list"
 msgid "Add to playlist"
-msgstr "Wiedergabeliste ausblenden"
+msgstr "Zur Wiedergabeliste hinzufügen"
 
 #: qml/HeaderBar.qml:335
 #, kde-format
@@ -461,9 +418,7 @@
 msgstr "Wiedergabeliste"
 
 #: qml/MediaPlayListView.qml:131
-#, fuzzy, kde-format
-#| msgid "1 track"
-#| msgid_plural "%1 track"
+#, kde-format
 msgid "1 track"
 msgid_plural "%1 tracks"
 msgstr[0] "1 Stück"
@@ -484,18 +439,16 @@
 msgstr ""
 
 #: qml/MediaPlayListView.qml:273
-#, fuzzy, kde-format
-#| msgctxt "Title of the view of the playlist"
-#| msgid "Playlist"
+#, kde-format
 msgctxt "Playlist cleared"
 msgid "Playlist cleared"
-msgstr "Wiedergabeliste"
+msgstr "Wiedergabeliste geleert"
 
 #: qml/MediaPlayListView.qml:292
 #, kde-format
 msgctxt "Undo"
 msgid "Undo"
-msgstr ""
+msgstr "Zurücknehmen"
 
 #: qml/MediaTrackDelegate.qml:134
 #, kde-format
@@ -629,4 +582,4 @@
 #, kde-format
 msgctxt "message to show when Elisa is scanning music files"
 msgid "Scanning music"
-msgstr ""
\ No newline at end of file
+msgstr "Musik wird durchsucht"
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/po/it/elisa.po 
new/elisa-0.4.2/po/it/elisa.po
--- old/elisa-0.4.1/po/it/elisa.po      2019-06-19 22:41:12.000000000 +0200
+++ new/elisa-0.4.2/po/it/elisa.po      2019-06-29 15:03:06.000000000 +0200
@@ -16,7 +16,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 2.0\n"
+"X-Generator: Lokalize 18.12.2\n"
 
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/po/pl/elisa.po 
new/elisa-0.4.2/po/pl/elisa.po
--- old/elisa-0.4.1/po/pl/elisa.po      2019-06-19 22:41:18.000000000 +0200
+++ new/elisa-0.4.2/po/pl/elisa.po      2019-06-29 15:03:11.000000000 +0200
@@ -7,7 +7,7 @@
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2019-06-13 07:41+0200\n"
-"PO-Revision-Date: 2019-05-25 07:50+0200\n"
+"PO-Revision-Date: 2019-06-20 20:56+0200\n"
 "Last-Translator: Łukasz Wojniłowicz <[email protected]>\n"
 "Language-Team: Polish <[email protected]>\n"
 "Language: pl\n"
@@ -203,15 +203,13 @@
 #, kde-format
 msgctxt "Last play date label for track metadata view"
 msgid "Last played"
-msgstr ""
+msgstr "Ostatnie odtworzenie"
 
 #: models/trackmetadatamodel.cpp:115
-#, fuzzy, kde-format
-#| msgctxt "Play now current track from play list"
-#| msgid "Play Now"
+#, kde-format
 msgctxt "Play counter label for track metadata view"
 msgid "Play count"
-msgstr "Odtwórz teraz"
+msgstr "Licznik odtworzeń"
 
 #: models/trackmetadatamodel.cpp:118 qml/ContextViewLyrics.qml:32
 #, kde-format
@@ -226,18 +224,16 @@
 msgstr "Teraz odtwarzany"
 
 #: models/viewsmodel.cpp:45
-#, fuzzy, kde-format
-#| msgctxt "Clear playlist and play"
-#| msgid "Replace and Play"
+#, kde-format
 msgctxt "Title of the view of recently played tracks"
 msgid "Recently Played"
-msgstr "Zastąp i odtwarzaj"
+msgstr "Ostatnio odtwarzane"
 
 #: models/viewsmodel.cpp:46
 #, kde-format
 msgctxt "Title of the view of frequently played tracks"
 msgid "Frequently Played"
-msgstr ""
+msgstr "Najczęściej odtwarzane"
 
 #: models/viewsmodel.cpp:51 qml/FileBrowserView.qml:70
 #, kde-format
@@ -261,7 +257,7 @@
 #, kde-format
 msgctxt "Refresh Music Collection application menu entry"
 msgid "Refresh Music Collection"
-msgstr ""
+msgstr "Odśwież zbiór muzyki"
 
 #: qml/ApplicationMenu.qml:63
 #, kde-format
@@ -327,50 +323,46 @@
 msgstr[2] "jeszcze %1 utworów"
 
 #: qml/MediaPlayerControl.qml:69
-#, fuzzy, kde-format
-#| msgid "Repeat"
+#, kde-format
 msgctxt "toggle repeat mode for playlist"
 msgid "Toggle Repeat"
-msgstr "Powtórz"
+msgstr "Włącz/wyłącz powtarzanie"
 
 #: qml/MediaPlayerControl.qml:76
-#, fuzzy, kde-format
-#| msgid "Shuffle"
+#, kde-format
 msgctxt "toggle shuffle mode for playlist"
 msgid "Toggle Shuffle"
-msgstr "Kolejność losowa"
+msgstr "Przełącz losową kolejność"
 
 #: qml/MediaPlayerControl.qml:83
-#, fuzzy, kde-format
-#| msgctxt "Toggle between ascending and descending order"
-#| msgid "Toggle sort order"
+#, kde-format
 msgctxt "toggle mute mode for player"
 msgid "Toggle Mute"
-msgstr "Przełącz porządek szeregowania"
+msgstr "Przełącz wyciszenie"
 
 #: qml/MediaPlayerControl.qml:90
 #, kde-format
 msgctxt "toggle play and pause for the audio player"
 msgid "Toggle Play and Pause"
-msgstr ""
+msgstr "Odtwarzaj/Wstrzymaj"
 
 #: qml/MediaPlayerControl.qml:98
 #, kde-format
 msgctxt "skip backward in playlists"
 msgid "Skip Backward"
-msgstr ""
+msgstr "Przejdź wstecz"
 
 #: qml/MediaPlayerControl.qml:106
 #, kde-format
 msgctxt "skip forward in playlists"
 msgid "Skip Forward"
-msgstr ""
+msgstr "Przejdź naprzód"
 
 #: qml/MediaPlayerControl.qml:114
 #, kde-format
 msgctxt "toggle between maximized and minimized ivre"
 msgid "Toggle Maximize"
-msgstr ""
+msgstr "Przełącz maksymalizację"
 
 #: qml/MediaPlayerControl.qml:189
 #, kde-format
@@ -432,7 +424,7 @@
 #, kde-format
 msgctxt "Your playlist is empty"
 msgid "Your playlist is empty"
-msgstr ""
+msgstr "Twoja lista odtwarzania jest pusta"
 
 #: qml/MediaPlayListView.qml:222
 #, kde-format
@@ -441,6 +433,8 @@
 "Add some songs to get started. You can browse your music using the views on "
 "the left."
 msgstr ""
+"Dodaj jakieś utwory, aby zacząć. Swoją muzykę możesz przeglądać w widokach "
+"po lewej."
 
 #: qml/MediaPlayListView.qml:273
 #, kde-format
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/databaseinterface.cpp 
new/elisa-0.4.2/src/databaseinterface.cpp
--- old/elisa-0.4.1/src/databaseinterface.cpp   2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/databaseinterface.cpp   2019-06-29 15:02:46.000000000 
+0200
@@ -702,8 +702,8 @@
     return result;
 }
 
-qulonglong DatabaseInterface::trackIdFromTitleAlbumTrackDiscNumber(const 
QString &title, const QString &artist, const QString &album,
-                                                                   int 
trackNumber, int discNumber)
+qulonglong DatabaseInterface::trackIdFromTitleAlbumTrackDiscNumber(const 
QString &title, const QString &artist, const std::optional<QString> &album,
+                                                                   
std::optional<int> trackNumber, std::optional<int> discNumber)
 {
     auto result = qulonglong(0);
 
@@ -3070,6 +3070,20 @@
                                                   
"GROUP_CONCAT(tracks.`ArtistName`, ', ') as AllArtists, "
                                                   "MAX(tracks.`Rating`) as 
HighestRating, "
                                                   "GROUP_CONCAT(genres.`Name`, 
', ') as AllGenres, "
+                                                  "("
+                                                  "SELECT "
+                                                  "COUNT(DISTINCT 
tracks2.DiscNumber) <= 1 "
+                                                  "FROM "
+                                                  "`Tracks` tracks2 "
+                                                  "WHERE "
+                                                  "tracks2.`AlbumTitle` = 
album.`Title` AND "
+                                                  "(tracks2.`AlbumArtistName` 
= album.`ArtistName` OR "
+                                                  "(tracks2.`AlbumArtistName` 
IS NULL AND "
+                                                  "album.`ArtistName` IS NULL"
+                                                  ")"
+                                                  ") AND "
+                                                  "tracks2.`AlbumPath` = 
album.`AlbumPath` "
+                                                  ") as `IsSingleDiscAlbum`, "
                                                   "( "
                                                   "SELECT 
tracksCover.`FileName` "
                                                   "FROM "
@@ -3131,6 +3145,20 @@
                                                   
"GROUP_CONCAT(tracks.`ArtistName`, ', ') as AllArtists, "
                                                   "MAX(tracks.`Rating`) as 
HighestRating, "
                                                   "GROUP_CONCAT(genres.`Name`, 
', ') as AllGenres, "
+                                                  "("
+                                                  "SELECT "
+                                                  "COUNT(DISTINCT 
tracks2.DiscNumber) <= 1 "
+                                                  "FROM "
+                                                  "`Tracks` tracks2 "
+                                                  "WHERE "
+                                                  "tracks2.`AlbumTitle` = 
album.`Title` AND "
+                                                  "(tracks2.`AlbumArtistName` 
= album.`ArtistName` OR "
+                                                  "(tracks2.`AlbumArtistName` 
IS NULL AND "
+                                                  "album.`ArtistName` IS NULL"
+                                                  ")"
+                                                  ") AND "
+                                                  "tracks2.`AlbumPath` = 
album.`AlbumPath` "
+                                                  ") as `IsSingleDiscAlbum`, "
                                                   "( "
                                                   "SELECT 
tracksCover.`FileName` "
                                                   "FROM "
@@ -4770,9 +4798,9 @@
                                                    "`Tracks` tracks "
                                                    "WHERE "
                                                    "tracks.`Title` = :title 
AND "
-                                                   "tracks.`AlbumTitle` = 
:album AND "
-                                                   "tracks.`TrackNumber` = 
:trackNumber AND "
-                                                   "tracks.`DiscNumber` = 
:discNumber AND "
+                                                   "(tracks.`AlbumTitle` = 
:album OR (:album IS NULL AND tracks.`AlbumTitle` IS NULL)) AND "
+                                                   "(tracks.`TrackNumber` = 
:trackNumber OR (:trackNumber IS NULL AND tracks.`TrackNumber` IS NULL)) AND "
+                                                   "(tracks.`DiscNumber` = 
:discNumber OR (:discNumber IS NULL AND tracks.`DiscNumber` IS NULL)) AND "
                                                    "tracks.`ArtistName` = 
:artist");
 
         auto result = 
prepareQuery(d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery, 
selectTrackQueryText);
@@ -5632,9 +5660,13 @@
     d->mInsertTrackQuery.bindValue(QStringLiteral(":albumPath"), trackPath);
     if (oneTrack.trackNumberIsValid()) {
         d->mInsertTrackQuery.bindValue(QStringLiteral(":trackNumber"), 
oneTrack.trackNumber());
+    } else {
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":trackNumber"), {});
     }
     if (oneTrack.discNumberIsValid()) {
         d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), 
oneTrack.discNumber());
+    } else {
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), {});
     }
     d->mInsertTrackQuery.bindValue(QStringLiteral(":trackDuration"), 
QVariant::fromValue<qlonglong>(oneTrack.duration().msecsSinceStartOfDay()));
     d->mInsertTrackQuery.bindValue(QStringLiteral(":trackRating"), 
oneTrack.rating());
@@ -5657,12 +5689,18 @@
     d->mInsertTrackQuery.bindValue(QStringLiteral(":year"), oneTrack.year());
     if (oneTrack.channelsIsValid()) {
         d->mInsertTrackQuery.bindValue(QStringLiteral(":channels"), 
oneTrack.channels());
+    } else {
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":channels"), {});
     }
     if (oneTrack.bitRateIsValid()) {
         d->mInsertTrackQuery.bindValue(QStringLiteral(":bitRate"), 
oneTrack.bitRate());
+    } else {
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":bitRate"), {});
     }
     if (oneTrack.sampleRateIsValid()) {
         d->mInsertTrackQuery.bindValue(QStringLiteral(":sampleRate"), 
oneTrack.sampleRate());
+    } else {
+        d->mInsertTrackQuery.bindValue(QStringLiteral(":sampleRate"), {});
     }
     d->mInsertTrackQuery.bindValue(QStringLiteral(":hasEmbeddedCover"), 
oneTrack.hasEmbeddedCover());
 
@@ -6455,8 +6493,8 @@
     return result;
 }
 
-qulonglong 
DatabaseInterface::internalTrackIdFromTitleAlbumTracDiscNumber(const QString 
&title, const QString &artist, const QString &album,
-                                                                          int 
trackNumber, int discNumber)
+qulonglong 
DatabaseInterface::internalTrackIdFromTitleAlbumTracDiscNumber(const QString 
&title, const QString &artist, const std::optional<QString> &album,
+                                                                          
std::optional<int> trackNumber, std::optional<int> discNumber)
 {
     auto result = qulonglong(0);
 
@@ -6466,9 +6504,21 @@
 
     
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":title"),
 title);
     
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":artist"),
 artist);
-    
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":album"),
 album);
-    
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":trackNumber"),
 trackNumber);
-    
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":discNumber"),
 discNumber);
+    if (album.has_value()) {
+        
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":album"),
 album.value());
+    } else {
+        
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":album"),
 {});
+    }
+    if (trackNumber.has_value()) {
+        
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":trackNumber"),
 trackNumber.value());
+    } else {
+        
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":trackNumber"),
 {});
+    }
+    if (discNumber.has_value()) {
+        
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":discNumber"),
 discNumber.value());
+    } else {
+        
d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery.bindValue(QStringLiteral(":discNumber"),
 {});
+    }
 
     auto queryResult = 
execQuery(d->mSelectTrackIdFromTitleArtistAlbumTrackDiscNumberQuery);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/databaseinterface.h 
new/elisa-0.4.2/src/databaseinterface.h
--- old/elisa-0.4.1/src/databaseinterface.h     2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/databaseinterface.h     2019-06-29 15:02:46.000000000 
+0200
@@ -33,6 +33,7 @@
 #include <QPair>
 
 #include <memory>
+#include <optional>
 
 class DatabaseInterfacePrivate;
 class QMutex;
@@ -127,6 +128,11 @@
             return operator[](key_type::AlbumIdRole).toULongLong();
         }
 
+        bool hasAlbum() const
+        {
+            return find(key_type::AlbumRole) != end();
+        }
+
         QString album() const
         {
             return operator[](key_type::AlbumRole).toString();
@@ -137,11 +143,21 @@
             return operator[](key_type::AlbumArtistRole).toString();
         }
 
+        bool hasTrackNumber() const
+        {
+            return find(key_type::TrackNumberRole) != end();
+        }
+
         int trackNumber() const
         {
             return operator[](key_type::TrackNumberRole).toInt();
         }
 
+        bool hasDiscNumber() const
+        {
+            return find(key_type::DiscNumberRole) != end();
+        }
+
         int discNumber() const
         {
             return operator[](key_type::DiscNumberRole).toInt();
@@ -367,8 +383,8 @@
 
     TrackDataType trackDataFromDatabaseId(qulonglong id);
 
-    qulonglong trackIdFromTitleAlbumTrackDiscNumber(const QString &title, 
const QString &artist, const QString &album,
-                                                    int trackNumber, int 
discNumber);
+    qulonglong trackIdFromTitleAlbumTrackDiscNumber(const QString &title, 
const QString &artist, const std::optional<QString> &album,
+                                                    std::optional<int> 
trackNumber, std::optional<int> discNumber);
 
     qulonglong trackIdFromFileName(const QUrl &fileName);
 
@@ -447,8 +463,8 @@
 
     MusicAudioTrack internalTrackFromDatabaseId(qulonglong id);
 
-    qulonglong internalTrackIdFromTitleAlbumTracDiscNumber(const QString 
&title, const QString &artist, const QString &album,
-                                                           int trackNumber, 
int discNumber);
+    qulonglong internalTrackIdFromTitleAlbumTracDiscNumber(const QString 
&title, const QString &artist, const std::optional<QString> &album,
+                                                           std::optional<int> 
trackNumber, std::optional<int> discNumber);
 
     qulonglong getDuplicateTrackIdFromTitleAlbumTrackDiscNumber(const QString 
&title, const QString &trackArtist, const QString &album,
                                                                 const QString 
&albumArtist, const QString &trackPath, int trackNumber,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/manageaudioplayer.cpp 
new/elisa-0.4.2/src/manageaudioplayer.cpp
--- old/elisa-0.4.1/src/manageaudioplayer.cpp   2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/manageaudioplayer.cpp   2019-06-29 15:02:46.000000000 
+0200
@@ -557,8 +557,9 @@
         return;
     }
 
-    if (*itTitle != mCurrentTrack.data(mTitleRole) || *itArtistName != 
mCurrentTrack.data(mArtistNameRole) ||
-            *itAlbumName != mCurrentTrack.data(mAlbumNameRole)) {
+    if (*itTitle != mCurrentTrack.data(mTitleRole) ||
+            (itArtistName->isValid() && *itArtistName != 
mCurrentTrack.data(mArtistNameRole)) ||
+            (itAlbumName->isValid() && *itAlbumName != 
mCurrentTrack.data(mAlbumNameRole))) {
         if (mCurrentTrack.isValid() && 
mCurrentTrack.data(mTitleRole).isValid() && 
mCurrentTrack.data(mArtistNameRole).isValid() &&
                 mCurrentTrack.data(mAlbumNameRole).isValid()) {
             mPersistentState.clear();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/mediaplaylist.cpp 
new/elisa-0.4.2/src/mediaplaylist.cpp
--- old/elisa-0.4.1/src/mediaplaylist.cpp       2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/mediaplaylist.cpp       2019-06-29 15:02:46.000000000 
+0200
@@ -146,7 +146,14 @@
                                               
d->mTrackData[index.row()][TrackDataType::key_type::ImageUrlRole].toUrl().toString()}}.toJson();
             break;
         default:
-            result = 
d->mTrackData[index.row()][static_cast<TrackDataType::key_type>(role)];
+            const auto &trackData = d->mTrackData[index.row()];
+            auto roleEnum = static_cast<TrackDataType::key_type>(role);
+            auto itData = trackData.find(roleEnum);
+            if (itData != trackData.end()) {
+                result = itData.value();
+            } else {
+                result = {};
+            }
         }
     } else {
         switch(role)
@@ -338,11 +345,11 @@
                 Q_EMIT newEntryInList(0, entryString, ElisaUtils::FileName);
             }
         } else {
-            Q_EMIT newTrackByNameInList(newEntry.mTitle.toString(),
-                                        newEntry.mArtist.toString(),
-                                        newEntry.mAlbum.toString(),
-                                        newEntry.mTrackNumber.toInt(),
-                                        newEntry.mDiscNumber.toInt());
+            Q_EMIT newTrackByNameInList(newEntry.mTitle,
+                                        newEntry.mArtist,
+                                        newEntry.mAlbum,
+                                        newEntry.mTrackNumber,
+                                        newEntry.mDiscNumber);
         }
     } else {
         Q_EMIT newEntryInList(newEntry.mId, {}, ElisaUtils::Track);
@@ -710,9 +717,21 @@
 
             oneData.push_back(oneTrack.title());
             oneData.push_back(oneTrack.artist());
-            oneData.push_back(oneTrack.album());
-            oneData.push_back(QString::number(oneTrack.trackNumber()));
-            oneData.push_back(QString::number(oneTrack.discNumber()));
+            if (oneTrack.hasAlbum()) {
+                oneData.push_back(oneTrack.album());
+            } else {
+                oneData.push_back({});
+            }
+            if (oneTrack.hasTrackNumber()) {
+                oneData.push_back(QString::number(oneTrack.trackNumber()));
+            } else {
+                oneData.push_back({});
+            }
+            if (oneTrack.hasDiscNumber()) {
+                oneData.push_back(QString::number(oneTrack.discNumber()));
+            } else {
+                oneData.push_back({});
+            }
             oneData.push_back(QString::number(oneEntry.mEntryType));
 
             result.push_back(QVariant(oneData));
@@ -778,10 +797,10 @@
         auto restoredTitle = trackData[0];
         auto restoredArtist = trackData[1];
         auto restoredAlbum = trackData[2];
-        auto restoredTrackNumber = trackData[3].toInt();
-        auto restoredDiscNumber = trackData[4].toInt();
+        auto restoredTrackNumber = trackData[3];
+        auto restoredDiscNumber = trackData[4];
 
-        ElisaUtils::PlayListEntryType mEntryType = 
static_cast<ElisaUtils::PlayListEntryType>(trackData[5].toInt());
+        auto mEntryType = 
static_cast<ElisaUtils::PlayListEntryType>(trackData[5].toInt());
 
         enqueueRestoredEntry({restoredTitle, restoredArtist, restoredAlbum, 
restoredTrackNumber, restoredDiscNumber, mEntryType});
     }
@@ -893,19 +912,23 @@
             }
             continue;
         } else if (oneEntry.mEntryType != ElisaUtils::Artist && 
!oneEntry.mIsValid && !oneEntry.mTrackUrl.isValid()) {
-            if (track.title() != oneEntry.mTitle) {
+            if (track.find(TrackDataType::key_type::TitleRole) != track.end() 
&&
+                    track.title() != oneEntry.mTitle) {
                 continue;
             }
 
-            if (track.album() != oneEntry.mAlbum) {
+            if (track.find(TrackDataType::key_type::AlbumRole) != track.end() 
&&
+                    track.album() != oneEntry.mAlbum) {
                 continue;
             }
 
-            if (track.trackNumber() != oneEntry.mTrackNumber) {
+            if (track.find(TrackDataType::key_type::TrackNumberRole) != 
track.end() &&
+                    track.trackNumber() != oneEntry.mTrackNumber) {
                 continue;
             }
 
-            if (track.discNumber() != oneEntry.mDiscNumber) {
+            if (track.find(TrackDataType::key_type::DiscNumberRole) != 
track.end() &&
+                    track.discNumber() != oneEntry.mDiscNumber) {
                 continue;
             }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/mediaplaylist.h 
new/elisa-0.4.2/src/mediaplaylist.h
--- old/elisa-0.4.1/src/mediaplaylist.h 2019-06-19 22:40:52.000000000 +0200
+++ new/elisa-0.4.2/src/mediaplaylist.h 2019-06-29 15:02:46.000000000 +0200
@@ -175,7 +175,7 @@
 
     void hideUndoInline();
 
-    void newTrackByNameInList(const QString &title, const QString &artist, 
const QString &album, int trackNumber, int discNumber);
+    void newTrackByNameInList(const QVariant &title, const QVariant &artist, 
const QVariant &album, const QVariant &trackNumber, const QVariant &discNumber);
 
     void newEntryInList(qulonglong newDatabaseId,
                         const QString &entryTitle,
@@ -319,6 +319,12 @@
           mTrackNumber(trackNumber), mDiscNumber(discNumber), 
mEntryType(entryType) {
     }
 
+    MediaPlayListEntry(QVariant title, QVariant artist, QVariant album, 
QVariant trackNumber,
+                       QVariant discNumber, ElisaUtils::PlayListEntryType 
entryType = ElisaUtils::Unknown)
+        : mTitle(std::move(title)), mAlbum(std::move(album)), 
mArtist(std::move(artist)),
+          mTrackNumber(std::move(trackNumber)), 
mDiscNumber(std::move(discNumber)), mEntryType(entryType) {
+    }
+
     explicit MediaPlayListEntry(const MusicAudioTrack &track)
         : mTitle(track.title()), mAlbum(track.albumName()), 
mTrackNumber(track.trackNumber()),
           mDiscNumber(track.discNumber()), mId(track.databaseId()), 
mIsValid(true) {
@@ -353,9 +359,9 @@
 
     QVariant mTrackUrl;
 
-    QVariant mTrackNumber = -1;
+    QVariant mTrackNumber;
 
-    QVariant mDiscNumber = -1;
+    QVariant mDiscNumber;
 
     qulonglong mId = 0;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/qml/ViewSelector.qml 
new/elisa-0.4.2/src/qml/ViewSelector.qml
--- old/elisa-0.4.1/src/qml/ViewSelector.qml    2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/qml/ViewSelector.qml    2019-06-29 15:02:46.000000000 
+0200
@@ -40,19 +40,6 @@
 
     implicitWidth: elisaTheme.dp(225)
 
-    Rectangle {
-        anchors.fill: parent
-        z: 1
-
-        border.color: myPalette.base
-
-        Behavior on border.color {
-            ColorAnimation {
-                duration: 300
-            }
-        }
-    }
-
     ScrollView {
         focus: true
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/trackslistener.cpp 
new/elisa-0.4.2/src/trackslistener.cpp
--- old/elisa-0.4.1/src/trackslistener.cpp      2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/trackslistener.cpp      2019-06-29 15:02:46.000000000 
+0200
@@ -66,17 +66,17 @@
         }
 
         for (auto itTrack = d->mTracksByNameSet.begin(); itTrack != 
d->mTracksByNameSet.end(); ) {
-            if (std::get<0>(*itTrack) != oneTrack.title()) {
+            if (!std::get<0>(*itTrack).isEmpty() && std::get<0>(*itTrack) != 
oneTrack.title()) {
                 ++itTrack;
                 continue;
             }
 
-            if (std::get<1>(*itTrack) != oneTrack.artist()) {
+            if (!std::get<1>(*itTrack).isEmpty() && std::get<1>(*itTrack) != 
oneTrack.artist()) {
                 ++itTrack;
                 continue;
             }
 
-            if (std::get<2>(*itTrack) != oneTrack.album()) {
+            if (!std::get<2>(*itTrack).isEmpty() && std::get<2>(*itTrack) != 
oneTrack.album()) {
                 ++itTrack;
                 continue;
             }
@@ -113,11 +113,33 @@
     }
 }
 
-void TracksListener::trackByNameInList(const QString &title, const QString 
&artist, const QString &album, int trackNumber, int discNumber)
+void TracksListener::trackByNameInList(const QVariant &title, const QVariant 
&artist, const QVariant &album,
+                                       const QVariant &trackNumber, const 
QVariant &discNumber)
 {
-    auto newTrackId = 
d->mDatabase->trackIdFromTitleAlbumTrackDiscNumber(title, artist, album, 
trackNumber, discNumber);
+    const auto realTitle = title.toString();
+    const auto realArtist = artist.toString();
+    const auto albumIsValid = !album.isNull() && album.isValid() && 
!album.toString().isEmpty();
+    auto realAlbum = std::optional<QString>{};
+    if (albumIsValid) {
+        realAlbum = album.toString();
+    }
+    auto trackNumberIsValid = bool{};
+    const auto trackNumberValue = trackNumber.toInt(&trackNumberIsValid);
+    auto realTrackNumber = std::optional<int>{};
+    if (trackNumberIsValid) {
+        realTrackNumber = trackNumberValue;
+    }
+    auto discNumberIsValid = bool{};
+    const auto discNumberValue = discNumber.toInt(&discNumberIsValid);
+    auto realDiscNumber = std::optional<int>{};
+    if (discNumberIsValid) {
+        realDiscNumber = discNumberValue;
+    }
+
+    auto newTrackId = 
d->mDatabase->trackIdFromTitleAlbumTrackDiscNumber(realTitle, realArtist, 
realAlbum,
+                                                                         
realTrackNumber, realDiscNumber);
     if (newTrackId == 0) {
-        auto newTrack = std::tuple<QString, QString, QString, int, int>(title, 
artist, album, trackNumber, discNumber);
+        auto newTrack = std::tuple<QString, QString, QString, int, 
int>(realTitle, realArtist, album.toString(), trackNumber.toInt(), 
discNumber.toInt());
         d->mTracksByNameSet.push_back(newTrack);
 
         return;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/elisa-0.4.1/src/trackslistener.h 
new/elisa-0.4.2/src/trackslistener.h
--- old/elisa-0.4.1/src/trackslistener.h        2019-06-19 22:40:52.000000000 
+0200
+++ new/elisa-0.4.2/src/trackslistener.h        2019-06-29 15:02:46.000000000 
+0200
@@ -63,7 +63,7 @@
 
     void trackModified(const TracksListener::TrackDataType &modifiedTrack);
 
-    void trackByNameInList(const QString &title, const QString &artist, const 
QString &album, int trackNumber, int discNumber);
+    void trackByNameInList(const QVariant &title, const QVariant &artist, 
const QVariant &album, const QVariant &trackNumber, const QVariant &discNumber);
 
     void newEntryInList(qulonglong newDatabaseId,
                         const QString &entryTitle,



Reply via email to