diff --git a/go_backend/exports.go b/go_backend/exports.go index 7c5eba22..f466f722 100644 --- a/go_backend/exports.go +++ b/go_backend/exports.go @@ -2195,6 +2195,13 @@ func ScanLibraryFolderJSON(folderPath string) (string, error) { return ScanLibraryFolder(folderPath) } +// ScanLibraryFolderIncrementalJSON performs an incremental library scan +// existingFilesJSON: JSON object mapping filePath -> modTime (unix millis) +// Returns IncrementalScanResult as JSON +func ScanLibraryFolderIncrementalJSON(folderPath, existingFilesJSON string) (string, error) { + return ScanLibraryFolderIncremental(folderPath, existingFilesJSON) +} + func GetLibraryScanProgressJSON() string { return GetLibraryScanProgress() } diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index ce43cf6f..c37e69dd 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -723,6 +723,14 @@ import Gobackend // Import Go framework if let error = error { throw error } return response + case "scanLibraryFolderIncremental": + let args = call.arguments as! [String: Any] + let folderPath = args["folder_path"] as! String + let existingFiles = args["existing_files"] as? String ?? "{}" + let response = GobackendScanLibraryFolderIncrementalJSON(folderPath, existingFiles, &error) + if let error = error { throw error } + return response + case "getLibraryScanProgress": let response = GobackendGetLibraryScanProgressJSON() return response diff --git a/lib/screens/settings/library_settings_page.dart b/lib/screens/settings/library_settings_page.dart index 943db500..c22f03d4 100644 --- a/lib/screens/settings/library_settings_page.dart +++ b/lib/screens/settings/library_settings_page.dart @@ -135,7 +135,7 @@ class _LibrarySettingsPageState extends ConsumerState { } } - Future _startScan() async { + Future _startScan({bool forceFullScan = false}) async { final settings = ref.read(settingsProvider); final libraryPath = settings.localLibraryPath; @@ -156,7 +156,10 @@ class _LibrarySettingsPageState extends ConsumerState { return; } - await ref.read(localLibraryProvider.notifier).startScan(libraryPath); + await ref.read(localLibraryProvider.notifier).startScan( + libraryPath, + forceFullScan: forceFullScan, + ); } Future _cancelScan() async { @@ -378,7 +381,7 @@ class _LibrarySettingsPageState extends ConsumerState { totalFiles: libraryState.scanTotalFiles, onCancel: _cancelScan, ) - else + else ...[ Opacity( opacity: settings.localLibraryPath.isNotEmpty ? 1.0 : 0.5, child: SettingsItem( @@ -392,6 +395,18 @@ class _LibrarySettingsPageState extends ConsumerState { : null, ), ), + Opacity( + opacity: settings.localLibraryPath.isNotEmpty ? 1.0 : 0.5, + child: SettingsItem( + icon: Icons.sync, + title: context.l10n.libraryForceFullScan, + subtitle: context.l10n.libraryForceFullScanSubtitle, + onTap: settings.localLibraryPath.isNotEmpty + ? () => _startScan(forceFullScan: true) + : null, + ), + ), + ], Opacity( opacity: libraryState.items.isNotEmpty ? 1.0 : 0.5, child: SettingsItem(