diff --git a/src/lib/system/datasources/moor/music_data_dao.dart b/src/lib/system/datasources/moor/music_data_dao.dart index b0e9548..38269b5 100644 --- a/src/lib/system/datasources/moor/music_data_dao.dart +++ b/src/lib/system/datasources/moor/music_data_dao.dart @@ -418,4 +418,41 @@ class MusicDataDao extends DatabaseAccessor batch.deleteWhere<$BlockedFilesTable, dynamic>(blockedFiles, (tbl) => tbl.path.isIn(paths)); }); } + + @override + Future cleanupDatabase() async { + // get album history entries + final albumHistoryEntries = await (select(historyEntries) + ..where((tbl) => tbl.type.equals(PlayableType.album.toString()))) + .get(); + + // delete history entries with missing album + for (final entry in albumHistoryEntries) { + if ((await (select(albums)..where((tbl) => tbl.id.equals(int.parse(entry.identifier)))).get()) + .isEmpty) { + (delete(historyEntries) + ..where((tbl) => + tbl.type.equals(PlayableType.album.toString()) & + tbl.identifier.equals(entry.identifier))) + .go(); + } + } + + // get album history entries + final artistHistoryEntries = await (select(historyEntries) + ..where((tbl) => tbl.type.equals(PlayableType.artist.toString()))) + .get(); + + // delete history entries with missing album + for (final entry in artistHistoryEntries) { + if ((await (select(artists)..where((tbl) => tbl.id.equals(int.parse(entry.identifier)))).get()) + .isEmpty) { + (delete(historyEntries) + ..where((tbl) => + tbl.type.equals(PlayableType.artist.toString()) & + tbl.identifier.equals(entry.identifier))) + .go(); + } + } + } } diff --git a/src/lib/system/datasources/music_data_source_contract.dart b/src/lib/system/datasources/music_data_source_contract.dart index 1e5cdd4..11d94d8 100644 --- a/src/lib/system/datasources/music_data_source_contract.dart +++ b/src/lib/system/datasources/music_data_source_contract.dart @@ -39,4 +39,6 @@ abstract class MusicDataSource { Stream> get blockedFilesStream; Future addBlockedFiles(List paths); Future removeBlockedFiles(List paths); + + Future cleanupDatabase(); } diff --git a/src/lib/system/repositories/music_data_repository_impl.dart b/src/lib/system/repositories/music_data_repository_impl.dart index 26ee564..9a6a77c 100644 --- a/src/lib/system/repositories/music_data_repository_impl.dart +++ b/src/lib/system/repositories/music_data_repository_impl.dart @@ -128,6 +128,8 @@ class MusicDataRepositoryImpl implements MusicDataRepository { await _updateAlbums(albums); await _musicDataSource.insertSongs(songs); + await _musicDataSource.cleanupDatabase(); + _log.d('updateDatabase finished'); _updateHighlightStreams();