From 62060bf0d8c8c8dbb19ea0075ab7e4b5172ba547 Mon Sep 17 00:00:00 2001 From: ngfchl Date: Sat, 18 Jul 2026 20:25:53 +0800 Subject: [PATCH] resolve media details by exact file ID --- lib/providers/media_library_provider.dart | 84 ++++++++++++++++++----- 1 file changed, 68 insertions(+), 16 deletions(-) diff --git a/lib/providers/media_library_provider.dart b/lib/providers/media_library_provider.dart index 29036ff..222746c 100644 --- a/lib/providers/media_library_provider.dart +++ b/lib/providers/media_library_provider.dart @@ -540,22 +540,13 @@ class MediaLibraryNotifier extends StateNotifier { for (final original in originals) { try { final detail = await _api!.fsDetail(original.file.id); - final fromCloud = _extractFiles( + final fromCloud = _fileFromDetail( detail, - ).where((file) => file.id == original.file.id).firstOrNull; - final latestName = - fromCloud?.name ?? - _findStringDeep(detail, const ['fileName', 'name', 'resName']) ?? - original.file.name; - final latestGCID = - fromCloud?.gcid ?? - _findStringDeep(detail, const [ - 'gcid', - 'gcId', - 'gcidValue', - 'hash', - ]) ?? - original.file.gcid; + original.file.id, + original.file, + ); + final latestName = fromCloud?.name ?? original.file.name; + final latestGCID = fromCloud?.gcid ?? original.file.gcid; final parentPath = _parentPath(original.file.cloudPath); final latestFile = original.file.copyWith( name: latestName, @@ -1252,6 +1243,68 @@ class MediaLibraryNotifier extends StateNotifier { ); } + CloudFile? _fileFromDetail( + Map detail, + String fileID, + CloudFile fallback, + ) { + final extracted = _extractFiles( + detail, + ).where((file) => file.id == fileID).firstOrNull; + if (extracted != null && extracted.name.isNotEmpty) return extracted; + + Map? findExactMap(dynamic value) { + if (value is Map) { + final map = Map.from(value); + for (final key in const [ + 'fileId', + 'file_id', + 'resId', + 'res_id', + 'id', + ]) { + if (map[key]?.toString() == fileID) return map; + } + for (final child in map.values) { + final found = findExactMap(child); + if (found != null) return found; + } + } else if (value is List) { + for (final child in value) { + final found = findExactMap(child); + if (found != null) return found; + } + } + return null; + } + + final exact = findExactMap(detail); + if (exact == null) return null; + try { + final parsed = CloudFile.fromJson(exact); + if (parsed.name.isNotEmpty) return parsed; + } catch (_) { + // Fall back to extracting fields directly from the exact File ID object. + } + return fallback.copyWith( + name: + _findStringDeep(exact, const ['fileName', 'name', 'resName']) ?? + fallback.name, + gcid: _findStringDeep(exact, const ['gcid', 'gcId', 'gcidValue', 'hash']), + size: _findIntDeep(exact, const [ + 'size', + 'fileSize', + 'resSize', + 'totalSize', + ]), + parentID: _findStringDeep(exact, const [ + 'parentId', + 'parent_id', + 'parentFileId', + ]), + ); + } + List _extractFiles(Map json) { final result = []; final seen = {}; @@ -1279,7 +1332,6 @@ class MediaLibraryNotifier extends StateNotifier { ]); if (preferred != null) { appendList(preferred); - return result; } void visit(dynamic value) {