fix: preserve imported media artwork during scans

This commit is contained in:
ngfchl
2026-07-18 13:53:26 +08:00
parent 54b9dd55bc
commit b235852395
2 changed files with 51 additions and 3 deletions
+46 -2
View File
@@ -160,9 +160,40 @@ class MediaLibraryStore {
Future<void> replaceItems(List<MediaLibraryItem> items) async {
final db = await _db;
await db.transaction((txn) async {
await txn.delete('media_items');
await txn.execute('''
CREATE TEMP TABLE IF NOT EXISTS desired_media_items (
library_id TEXT NOT NULL,
file_id TEXT NOT NULL,
PRIMARY KEY (library_id, file_id)
)
''');
await txn.delete('desired_media_items');
for (final item in items) {
await txn.insert('media_items', _itemRow(item));
await txn.insert('desired_media_items', {
'library_id': item.libraryID,
'file_id': item.file.id,
});
await _upsertItem(txn, item);
}
// Metadata updates deliberately omit poster/backdrop. Imported artwork is
// expensive to rebuild and remains valid while the resource still exists.
await txn.execute('''
DELETE FROM media_items
WHERE NOT EXISTS (
SELECT 1 FROM desired_media_items desired
WHERE desired.library_id = media_items.library_id
AND desired.file_id = media_items.file_id
)
''');
});
}
Future<void> upsertItems(Iterable<MediaLibraryItem> items) async {
final values = items.toList();
if (values.isEmpty) return;
await (await _db).transaction((txn) async {
for (final item in values) {
await _upsertItem(txn, item);
}
});
}
@@ -467,6 +498,19 @@ class MediaLibraryStore {
'updated_at': _epoch(item.updatedAt) ?? 0,
};
Future<void> _upsertItem(Transaction txn, MediaLibraryItem item) async {
final values = _itemRow(item);
final updated = await txn.update(
'media_items',
values,
where: 'library_id = ? AND file_id = ?',
whereArgs: [item.libraryID, item.file.id],
);
if (updated == 0) {
await txn.insert('media_items', values);
}
}
static int? _asInt(Object? value) =>
value is int ? value : int.tryParse('$value');
+5 -1
View File
@@ -293,7 +293,7 @@ class MediaLibraryNotifier extends StateNotifier<MediaLibraryState> {
a.title.toLowerCase().compareTo(b.title.toLowerCase()),
);
pendingPersistence = pendingPersistence.then(
(_) => _saveAllItems([...initialItems, ...unique.values]),
(_) => _upsertItems([item]),
);
await pendingPersistence;
state = state.copyWith(
@@ -768,6 +768,10 @@ class MediaLibraryNotifier extends StateNotifier<MediaLibraryState> {
return _store.replaceItems(items);
}
Future<void> _upsertItems(Iterable<MediaLibraryItem> items) {
return _store.upsertItems(items);
}
/*
List<MediaLibraryDefinition> _loadLibraries() {
final raw = StorageManager.get<dynamic>(StorageKeys.mediaLibraries);