diff --git a/autotests/databaseinterfacetest.cpp b/autotests/databaseinterfacetest.cpp --- a/autotests/databaseinterfacetest.cpp +++ b/autotests/databaseinterfacetest.cpp @@ -301,6 +301,334 @@ QCOMPARE(album.isSingleDiscAlbum(), true); } + void addOneTrackWithoutTitle() + { + DatabaseInterface musicDb; + + musicDb.init(QStringLiteral("testDb")); + + 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 musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); + QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); + QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); + QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDb.allTracks().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(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto newTrack = MusicAudioTrack {true, QStringLiteral("$23"), QStringLiteral("0"), QStringLiteral(), + QStringLiteral("artist8"), QStringLiteral("album4"), QStringLiteral("artist8"), + 9, 1, QTime::fromMSecsSinceStartOfDay(23), {QUrl::fromLocalFile(QStringLiteral("/$23"))}, QDateTime::fromMSecsSinceEpoch(23), + {QUrl::fromLocalFile(QStringLiteral("file://image$23"))}, 9, true, + QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1")}; + + auto newTracks = QList(); + newTracks.push_back(newTrack); + + auto newCovers = mNewCovers; + newCovers[QStringLiteral("file:///$23")] = QUrl::fromLocalFile(QStringLiteral("album4")); + + musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); + + musicDbTrackAddedSpy.wait(300); + + QCOMPARE(musicDb.allAlbums().count(), 1); + QCOMPARE(musicDb.allArtists().count(), 1); + QCOMPARE(musicDb.allTracks().count(), 1); + 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(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto track = musicDb.trackFromDatabaseId(musicDb.trackIdFromTitleAlbumTrackDiscNumber(QStringLiteral(), QStringLiteral("artist8"), + QStringLiteral("album4"), 9, 1)); + + QCOMPARE(track.isValid(), true); + QCOMPARE(track.title(), QStringLiteral()); + QCOMPARE(track.artist(), QStringLiteral("artist8")); + QCOMPARE(track.albumName(), QStringLiteral("album4")); + QCOMPARE(track.albumArtist(), QStringLiteral("artist8")); + QCOMPARE(track.isValidAlbumArtist(), true); + QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album4"))); + QCOMPARE(track.trackNumber(), 9); + QCOMPARE(track.discNumber(), 1); + QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(23)); + QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$23"))); + QCOMPARE(track.rating(), 9); + QCOMPARE(track.genre(), QStringLiteral("genre1")); + QCOMPARE(track.composer(), QStringLiteral("composer1")); + QCOMPARE(track.lyricist(), QStringLiteral("lyricist1")); + + auto album = musicDb.albumFromTitleAndArtist(QStringLiteral("album4"), QStringLiteral("artist8")); + + QCOMPARE(album.isValid(), true); + QCOMPARE(album.tracksCount(), 1); + QCOMPARE(album.title(), QStringLiteral("album4")); + QCOMPARE(album.artist(), QStringLiteral("artist8")); + QCOMPARE(album.isValidArtist(), true); + QCOMPARE(album.albumArtURI(), QUrl::fromLocalFile(QStringLiteral("album4"))); + QCOMPARE(album.isSingleDiscAlbum(), true); + } + + void addOneTrackWithoutAlbum() + { + DatabaseInterface musicDb; + + musicDb.init(QStringLiteral("testDb")); + + 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 musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); + QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); + QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); + QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDb.allTracks().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(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto newTrack = MusicAudioTrack {true, QStringLiteral("$24"), QStringLiteral("0"), QStringLiteral("track10"), + QStringLiteral("artist8"), QStringLiteral(), QStringLiteral("artist8"), + 9, 1, QTime::fromMSecsSinceStartOfDay(24), {QUrl::fromLocalFile(QStringLiteral("/$24"))}, QDateTime::fromMSecsSinceEpoch(24), + QUrl(), 9, true, QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1")}; + + auto newTracks = QList(); + newTracks.push_back(newTrack); + + auto newCovers = mNewCovers; + newCovers[QStringLiteral("file:///$24")] = QUrl::fromLocalFile(QStringLiteral("album4")); + + musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); + + musicDbTrackAddedSpy.wait(300); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 1); + QCOMPARE(musicDb.allTracks().count(), 1); + QCOMPARE(musicDbArtistAddedSpy.count(), 1); + QCOMPARE(musicDbAlbumAddedSpy.count(), 0); + QCOMPARE(musicDbTrackAddedSpy.count(), 1); + QCOMPARE(musicDbArtistRemovedSpy.count(), 0); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); + QCOMPARE(musicDbTrackRemovedSpy.count(), 0); + QCOMPARE(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto track = musicDb.trackFromDatabaseId(musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$24")))); + + QCOMPARE(track.isValid(), true); + QCOMPARE(track.title(), QStringLiteral("track10")); + QCOMPARE(track.artist(), QStringLiteral("artist8")); + QCOMPARE(track.albumName(), QStringLiteral()); + QEXPECT_FAIL("","Album artist is currently associated with the album in the database. if the album is missing, we lose this information", Continue); + QCOMPARE(track.isValidAlbumArtist(), true); + QCOMPARE(track.albumCover(), QUrl()); + QCOMPARE(track.trackNumber(), 9); + QCOMPARE(track.discNumber(), 1); + QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(24)); + QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$24"))); + QCOMPARE(track.rating(), 9); + QCOMPARE(track.genre(), QStringLiteral("genre1")); + QCOMPARE(track.composer(), QStringLiteral("composer1")); + QCOMPARE(track.lyricist(), QStringLiteral("lyricist1")); + } + + void addOneTrackWithoutArtist() + { + DatabaseInterface musicDb; + + musicDb.init(QStringLiteral("testDb")); + + 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 musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); + QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); + QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); + QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDb.allTracks().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(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto newTrack = MusicAudioTrack {true, QStringLiteral("$26"), QStringLiteral("0"), QStringLiteral("track11"), + QStringLiteral(), QStringLiteral("album4"), QStringLiteral(), + 9, 1, QTime::fromMSecsSinceStartOfDay(26), {QUrl::fromLocalFile(QStringLiteral("/$26"))}, QDateTime::fromMSecsSinceEpoch(26), + QUrl::fromLocalFile(QStringLiteral("file://image$26")), 9, true, + QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1")}; + auto newTracks = QList(); + newTracks.push_back(newTrack); + + auto newCovers = mNewCovers; + newCovers[QStringLiteral("file:///$26")] = QUrl::fromLocalFile(QStringLiteral("album4")); + + musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); + + musicDbTrackAddedSpy.wait(300); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDb.allTracks().count(), 1); + QCOMPARE(musicDbArtistAddedSpy.count(), 0); + QCOMPARE(musicDbAlbumAddedSpy.count(), 0); + QCOMPARE(musicDbTrackAddedSpy.count(), 1); + QCOMPARE(musicDbArtistRemovedSpy.count(), 0); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 0); + QCOMPARE(musicDbTrackRemovedSpy.count(), 0); + QCOMPARE(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto track = musicDb.trackFromDatabaseId(musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$26")))); + + QCOMPARE(track.isValid(), true); + QCOMPARE(track.title(), QStringLiteral("track11")); + QCOMPARE(track.artist(), QStringLiteral()); + QCOMPARE(track.albumName(), QStringLiteral()); + QCOMPARE(track.albumArtist(), QStringLiteral()); + QCOMPARE(track.isValidAlbumArtist(), false); + QCOMPARE(track.albumCover(), QUrl()); + QCOMPARE(track.trackNumber(), 9); + QCOMPARE(track.discNumber(), 1); + QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(26)); + QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$26"))); + QCOMPARE(track.rating(), 9); + QCOMPARE(track.genre(), QStringLiteral("genre1")); + QCOMPARE(track.composer(), QStringLiteral("composer1")); + QCOMPARE(track.lyricist(), QStringLiteral("lyricist1")); + } + + void addOneTrackWithoutTrackNumber() + { + DatabaseInterface musicDb; + + musicDb.init(QStringLiteral("testDb")); + + 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 musicDbArtistModifiedSpy(&musicDb, &DatabaseInterface::artistModified); + QSignalSpy musicDbAlbumModifiedSpy(&musicDb, &DatabaseInterface::albumModified); + QSignalSpy musicDbTrackModifiedSpy(&musicDb, &DatabaseInterface::trackModified); + QSignalSpy musicDbDatabaseErrorSpy(&musicDb, &DatabaseInterface::databaseError); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDb.allTracks().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(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto newTrack = MusicAudioTrack {true, QStringLiteral("$26"), QStringLiteral("0"), QStringLiteral("track12"), + QStringLiteral("artist8"), QStringLiteral("album4"), QStringLiteral("artist8"), + -1, 1, QTime::fromMSecsSinceStartOfDay(26), {QUrl::fromLocalFile(QStringLiteral("/$26"))}, QDateTime::fromMSecsSinceEpoch(26), + QUrl::fromLocalFile(QStringLiteral("file://image$26")), 9, true, + QStringLiteral("genre1"), QStringLiteral("composer1"), QStringLiteral("lyricist1")}; + auto newTracks = QList(); + newTracks.push_back(newTrack); + + auto newCovers = mNewCovers; + newCovers[QStringLiteral("file:///$26")] = QUrl::fromLocalFile(QStringLiteral("album4")); + + musicDb.insertTracksList(newTracks, newCovers, QStringLiteral("autoTest")); + + musicDbTrackAddedSpy.wait(300); + + QCOMPARE(musicDb.allAlbums().count(), 1); + QCOMPARE(musicDb.allArtists().count(), 1); + QCOMPARE(musicDb.allTracks().count(), 1); + 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(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + + auto track = musicDb.trackFromDatabaseId(musicDb.trackIdFromFileName(QUrl::fromLocalFile(QStringLiteral("/$26")))); + + QCOMPARE(track.isValid(), true); + QCOMPARE(track.title(), QStringLiteral("track12")); + QCOMPARE(track.artist(), QStringLiteral("artist8")); + QCOMPARE(track.albumName(), QStringLiteral("album4")); + QCOMPARE(track.albumArtist(), QStringLiteral("artist8")); + QCOMPARE(track.isValidAlbumArtist(), true); + QCOMPARE(track.albumCover(), QUrl::fromLocalFile(QStringLiteral("album4"))); + QCOMPARE(track.trackNumber(), -1); + QCOMPARE(track.discNumber(), 1); + QCOMPARE(track.duration(), QTime::fromMSecsSinceStartOfDay(26)); + QCOMPARE(track.resourceURI(), QUrl::fromLocalFile(QStringLiteral("/$26"))); + QCOMPARE(track.rating(), 9); + QCOMPARE(track.genre(), QStringLiteral("genre1")); + QCOMPARE(track.composer(), QStringLiteral("composer1")); + QCOMPARE(track.lyricist(), QStringLiteral("lyricist1")); + } + void addTwoTracksWithoutAlbumArtist() { QTemporaryFile databaseFile; diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp --- a/src/databaseinterface.cpp +++ b/src/databaseinterface.cpp @@ -1184,9 +1184,9 @@ const auto &result = createSchemaQuery.exec(QStringLiteral("CREATE TABLE `Tracks` (" "`ID` INTEGER PRIMARY KEY NOT NULL, " - "`Title` VARCHAR(85) NOT NULL, " - "`AlbumID` INTEGER NOT NULL, " - "`TrackNumber` INTEGER NOT NULL, " + "`Title` VARCHAR(85), " + "`AlbumID` INTEGER, " + "`TrackNumber` INTEGER, " "`DiscNumber` INTEGER DEFAULT -1, " "`Duration` INTEGER NOT NULL, " "`Rating` INTEGER NOT NULL DEFAULT 0, " @@ -1532,17 +1532,17 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " - "`Albums` album, `TracksMapping` tracksMapping " + "`Tracks` tracks, `TracksArtists` trackArtist, " + "`TracksMapping` tracksMapping " + "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " + "LEFT JOIN `Artists` artist ON artist.`ID` = trackArtist.`ArtistID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "WHERE " "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " - "tracks.`AlbumID` = album.`ID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -1562,12 +1562,10 @@ "tracks.`Title`, " "artistAlbum.`Name` " "FROM " - "`Tracks` tracks, " - "`Albums` album " + "`Tracks` tracks " + "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " - "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " - "WHERE " - "tracks.`AlbumID` = album.`ID`"); + "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` "); auto result = d->mSelectAllTracksShortQuery.prepare(selectAllTracksShortText); @@ -1605,16 +1603,16 @@ "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " - "`Albums` album, `TracksMapping` tracksMapping, `DiscoverSource` source " + "`TracksMapping` tracksMapping, `DiscoverSource` source " + "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " "tracks.`ID` = trackArtist.`TrackID` AND " "artist.`ID` = trackArtist.`ArtistID` AND " - "tracks.`AlbumID` = album.`ID` AND " "source.`Name` = :source AND " "source.`ID` = tracksMapping.`DiscoverID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " @@ -1772,7 +1770,8 @@ "tracks.`SampleRate` " "FROM " "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " - "`Albums` album, `TracksMapping` tracksMapping " + "`TracksMapping` tracksMapping " + "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " @@ -1782,7 +1781,6 @@ "tracks.`ID` = trackArtist.`TrackID` AND " "artist.`ID` = trackArtist.`ArtistID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " - "tracks.`AlbumID` = album.`ID` AND " "album.`ID` = :albumId AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`) " "ORDER BY tracks.`DiscNumber` ASC, " @@ -1822,18 +1820,18 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " - "`Albums` album, `TracksMapping` tracksMapping " + "`Tracks` tracks, `TracksArtists` trackArtist, " + "`TracksMapping` tracksMapping " + "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " + "LEFT JOIN `Artists` artist ON artist.`ID` = trackArtist.`ArtistID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracks.`ID` = :trackId AND " - "tracks.`AlbumID` = album.`ID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -2143,17 +2141,16 @@ "tracks.`SampleRate` " "FROM " "`Tracks` tracks, " - "`Artists` artist, " "`TracksArtists` trackArtist, " "`Albums` album " + "LEFT JOIN `Artists` artist ON artist.`ID` = trackArtist.`ArtistID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " "LEFT JOIN `Artists` artistAlbum ON artistAlbum.`ID` = artistAlbumMapping.`ArtistID` " "LEFT JOIN `Composer` trackComposer ON trackComposer.`ID` = tracks.`ComposerID` " "LEFT JOIN `Lyricist` trackLyricist ON trackLyricist.`ID` = tracks.`LyricistID` " "LEFT JOIN `Genre` trackGenre ON trackGenre.`ID` = tracks.`GenreID` " "WHERE " "tracks.`ID` = trackArtist.`TrackID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracks.`AlbumID` = album.`ID` AND " "tracks.`ID` NOT IN (SELECT tracksMapping2.`TrackID` FROM `TracksMapping` tracksMapping2)"); @@ -3286,16 +3283,12 @@ QList &newAlbumIds, QList &newArtistsIds) { qulonglong resultId = 0; + qulonglong albumId = 0; - if (oneTrack.albumArtist().isEmpty()) { - return resultId; - } - - auto albumId = insertAlbum(oneTrack.albumName(), (oneTrack.isValidAlbumArtist() ? oneTrack.albumArtist() : QString()), + /* album is only added if an album name and an album artist are given */ + if(!oneTrack.albumName().isEmpty() && !oneTrack.albumArtist().isEmpty()) { + albumId = insertAlbum(oneTrack.albumName(), (oneTrack.isValidAlbumArtist() ? oneTrack.albumArtist() : QString()), oneTrack.artist(), covers[oneTrack.resourceURI().toString()], 0, true, newAlbumIds, newArtistsIds); - - if (albumId == 0) { - return resultId; } auto otherTrackId = getDuplicateTrackIdFromTitleAlbumTracDiscNumber(oneTrack.title(), oneTrack.albumName(), oneTrack.albumArtist(), @@ -3346,7 +3339,11 @@ if (!isSameTrack) { d->mInsertTrackQuery.bindValue(QStringLiteral(":trackId"), originTrackId); d->mInsertTrackQuery.bindValue(QStringLiteral(":title"), oneTrack.title()); - d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), albumId); + if (albumId != 0) { + d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), albumId); + } else { + d->mInsertTrackQuery.bindValue(QStringLiteral(":album"), {}); + } d->mInsertTrackQuery.bindValue(QStringLiteral(":trackNumber"), oneTrack.trackNumber()); d->mInsertTrackQuery.bindValue(QStringLiteral(":discNumber"), oneTrack.discNumber()); d->mInsertTrackQuery.bindValue(QStringLiteral(":trackDuration"), QVariant::fromValue(oneTrack.duration().msecsSinceStartOfDay())); @@ -3408,18 +3405,21 @@ if (isModifiedTrack) { Q_EMIT trackModified(internalTrackFromDatabaseId(originTrackId)); - modifiedAlbumIds.insert(albumId); + if (albumId != 0) { + modifiedAlbumIds.insert(albumId); + } if (oldAlbumId != 0) { modifiedAlbumIds.insert(oldAlbumId); } } + if (albumId != 0) { + if (updateAlbumFromId(albumId, covers[oneTrack.resourceURI().toString()], oneTrack, newArtistsIds)) { + modifiedAlbumIds.insert(albumId); + } - if (updateAlbumFromId(albumId, covers[oneTrack.resourceURI().toString()], oneTrack, newArtistsIds)) { - modifiedAlbumIds.insert(albumId); - } - - if (updateTracksCount(albumId)) { - modifiedAlbumIds.insert(albumId); + if (updateTracksCount(albumId)) { + modifiedAlbumIds.insert(albumId); + } } } else { d->mInsertTrackQuery.finish(); @@ -4392,7 +4392,6 @@ MusicAudioTrack DatabaseInterface::internalTrackFromDatabaseId(qulonglong id) { auto result = MusicAudioTrack(); - if (!d || !d->mTracksDatabase.isValid() || !d->mInitFinished) { return result; } @@ -4420,7 +4419,6 @@ } const auto ¤tRecord = d->mSelectTrackFromIdQuery.record(); - result = buildTrackFromDatabaseRecord(currentRecord); d->mSelectTrackFromIdQuery.finish();