diff --git a/autotests/databaseinterfacetest.cpp b/autotests/databaseinterfacetest.cpp --- a/autotests/databaseinterfacetest.cpp +++ b/autotests/databaseinterfacetest.cpp @@ -499,6 +499,101 @@ QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); } + void addAndRemoveOneTrackWithoutArtist() + { + 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("album4"), {}, + 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")); + + musicDb.removeTracksList({track.resourceURI()}); + + QCOMPARE(musicDb.allAlbums().count(), 0); + QCOMPARE(musicDb.allArtists().count(), 0); + QCOMPARE(musicDb.allTracks().count(), 0); + QCOMPARE(musicDbArtistAddedSpy.count(), 0); + QCOMPARE(musicDbAlbumAddedSpy.count(), 1); + QCOMPARE(musicDbTrackAddedSpy.count(), 1); + QCOMPARE(musicDbArtistRemovedSpy.count(), 0); + QCOMPARE(musicDbAlbumRemovedSpy.count(), 1); + QCOMPARE(musicDbTrackRemovedSpy.count(), 1); + QCOMPARE(musicDbArtistModifiedSpy.count(), 0); + QCOMPARE(musicDbAlbumModifiedSpy.count(), 0); + QCOMPARE(musicDbTrackModifiedSpy.count(), 0); + QCOMPARE(musicDbDatabaseErrorSpy.count(), 0); + } + void addTwoTracksWithoutAlbumArtist() { QTemporaryFile databaseFile; diff --git a/src/databaseinterface.cpp b/src/databaseinterface.cpp --- a/src/databaseinterface.cpp +++ b/src/databaseinterface.cpp @@ -1597,17 +1597,17 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`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 " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -1667,17 +1667,17 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`Tracks` tracks, `TracksArtists` trackArtist, " "`TracksMapping` tracksMapping, `DiscoverSource` source " "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 " "source.`Name` = :source AND " "source.`ID` = tracksMapping.`DiscoverID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " @@ -1834,17 +1834,17 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`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 " "tracksMapping.`TrackID` = tracks.`ID` AND " "album.`ID` = :albumId AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`) " @@ -1885,16 +1885,17 @@ "tracks.`BitRate`, " "tracks.`SampleRate` " "FROM " - "`Tracks` tracks, `Artists` artist, `TracksArtists` trackArtist, " + "`Tracks` tracks, `TracksArtists` trackArtist, " "`TracksMapping` tracksMapping " - "LEFT JOIN `Albums` album ON album.`ID` = tracks.`AlbumID` " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " + "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 " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`Priority` = (SELECT MIN(`Priority`) FROM `TracksMapping` WHERE `TrackID` = tracks.`ID`)"); @@ -2219,17 +2220,16 @@ "tracks.`SampleRate` " "FROM " "`Tracks` tracks, " - "`Artists` artist, " "`TracksArtists` trackArtist " "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` NOT IN (SELECT tracksMapping2.`TrackID` FROM `TracksMapping` tracksMapping2)"); auto result = prepareQuery(d->mSelectTracksWithoutMappingQuery, selectTracksWithoutMappingQueryText); @@ -2727,16 +2727,16 @@ "tracks.`Channels`, " "tracks.`BitRate`, " "tracks.`SampleRate` " - "FROM `Tracks` tracks, `Artists` artist, `Albums` album, `TracksArtists` trackArtist, " + "FROM `Tracks` tracks, `Albums` album, `TracksArtists` trackArtist, " "`TracksMapping` tracksMapping " "LEFT JOIN `AlbumsArtists` artistAlbumMapping ON artistAlbumMapping.`AlbumID` = album.`ID` " + "LEFT JOIN `Artists` artist ON artist.`ID` = trackArtist.`ArtistID` " "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.`AlbumID` = album.`ID` AND " - "artist.`ID` = trackArtist.`ArtistID` AND " "tracks.`ID` = trackArtist.`TrackID` AND " "tracksMapping.`TrackID` = tracks.`ID` AND " "tracksMapping.`FileName` = :filePath AND " @@ -3396,7 +3396,7 @@ { qulonglong resultId = 0; - if (oneTrack.title().isEmpty() || oneTrack.artist().isEmpty()) { + if (oneTrack.title().isEmpty()) { return resultId; } @@ -3515,7 +3515,7 @@ if (result && d->mInsertTrackQuery.isActive()) { d->mInsertTrackQuery.finish(); - if (!isModifiedTrack || (!isSameTrack && oneTrack.artist() != oldTrack.artist())) { + if (!oneTrack.artist().isEmpty() && ( !isModifiedTrack || (!isSameTrack && oneTrack.artist() != oldTrack.artist())) ) { d->mInsertTrackArtistQuery.bindValue(QStringLiteral(":trackId"), originTrackId); d->mInsertTrackArtistQuery.bindValue(QStringLiteral(":artistId"), insertArtist(oneTrack.artist()));