diff --git a/lib/model/source/media_store_source.dart b/lib/model/source/media_store_source.dart index cbe86146b..11f11fab0 100644 --- a/lib/model/source/media_store_source.dart +++ b/lib/model/source/media_store_source.dart @@ -85,12 +85,13 @@ class MediaStoreSource extends CollectionSource { debugPrint('$runtimeType refresh ${stopwatch.elapsed} check obsolete entries'); final knownDateByContentId = Map.fromEntries(knownLiveEntries.map((entry) => MapEntry(entry.contentId, entry.dateModifiedSecs))); - final obsoleteContentIds = (await mediaStoreService.checkObsoleteContentIds(knownDateByContentId.keys.toList())).toSet(); + final knownContentIds = knownDateByContentId.keys.toList(); + final removedContentIds = (await mediaStoreService.checkObsoleteContentIds(knownContentIds)).toSet(); if (topEntries.isNotEmpty) { - final obsoleteTopEntries = topEntries.where((entry) => obsoleteContentIds.contains(entry.contentId)); + final obsoleteTopEntries = topEntries.where((entry) => removedContentIds.contains(entry.contentId)); await removeEntries(obsoleteTopEntries.map((entry) => entry.uri).toSet(), includeTrash: false); } - knownEntries.removeWhere((entry) => obsoleteContentIds.contains(entry.contentId)); + knownEntries.removeWhere((entry) => removedContentIds.contains(entry.contentId)); // show known entries debugPrint('$runtimeType refresh ${stopwatch.elapsed} add known entries'); @@ -109,7 +110,7 @@ class MediaStoreSource extends CollectionSource { // clean up obsolete entries debugPrint('$runtimeType refresh ${stopwatch.elapsed} remove obsolete entries'); - await metadataDb.removeIds(obsoleteContentIds); + await metadataDb.removeIds(removedContentIds); if (directory != null) { // trash @@ -148,7 +149,11 @@ class MediaStoreSource extends CollectionSource { mediaStoreService.getEntries(knownDateByContentId, directory: directory).listen( (entry) { - entry.id = metadataDb.nextId; + // when discovering modified entry with known content ID, + // reuse known entry ID to overwrite it while preserving favourites, etc. + final contentId = entry.contentId; + entry.id = (knownContentIds.contains(contentId) ? knownLiveEntries.firstWhereOrNull((entry) => entry.contentId == contentId)?.id : null) ?? metadataDb.nextId; + pendingNewEntries.add(entry); if (pendingNewEntries.length >= refreshCount) { refreshCount = min(refreshCount * 10, refreshCountMax); @@ -175,7 +180,7 @@ class MediaStoreSource extends CollectionSource { } await analyze(analysisController, entries: analysisEntries); - debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${knownEntries.length} known, ${allNewEntries.length} new, ${obsoleteContentIds.length} obsolete'); + debugPrint('$runtimeType refresh ${stopwatch.elapsed} done for ${knownEntries.length} known, ${allNewEntries.length} new, ${removedContentIds.length} obsolete'); }, onError: (error) => debugPrint('$runtimeType stream error=$error'), ); diff --git a/untranslated.json b/untranslated.json index 73ab30320..be3e30d53 100644 --- a/untranslated.json +++ b/untranslated.json @@ -3,26 +3,6 @@ "entryActionConvert" ], - "es": [ - "timeDays", - "doNotAskAgain", - "entryActionRestore", - "filterBinLabel", - "binEntriesConfirmationDialogMessage", - "collectionActionEmptyBin", - "binPageTitle", - "settingsConfirmationDialogTile", - "settingsConfirmationDialogTitle", - "settingsConfirmationDialogDeleteItems", - "settingsConfirmationDialogMoveToBinItems", - "settingsEnableBin", - "settingsEnableBinSubtitle" - ], - - "pt": [ - "entryActionConvert" - ], - "ru": [ "entryActionConvert" ]