From 0797085385fe99b90225bb8748325001601bc20e Mon Sep 17 00:00:00 2001 From: zarzet <42882290+zarzet@users.noreply.github.com> Date: Mon, 19 Oct 2026 00:05:05 +0700 Subject: [PATCH] refactor(io): use deleteFileQuietly for exists-then-delete Add deleteFileQuietly to file_access.dart (exists check, delete, swallow errors) and use it for the try/exists/delete/catch (_) {} copies. --- lib/providers/download_queue_provider_paths.dart | 4 +--- lib/providers/library_collections_provider.dart | 15 ++++----------- lib/services/backup_service.dart | 5 ++--- .../downloaded_embedded_cover_resolver.dart | 4 +--- lib/services/motion_artwork_store.dart | 5 ++--- lib/services/platform_bridge.dart | 8 ++------ .../platform_bridge/bridge_library_scan.dart | 9 ++------- lib/utils/ffmpeg_reenrich.dart | 8 ++------ lib/utils/file_access.dart | 7 +++++++ 9 files changed, 23 insertions(+), 42 deletions(-) diff --git a/lib/providers/download_queue_provider_paths.dart b/lib/providers/download_queue_provider_paths.dart index 581e0cbd..ef6b9f4c 100644 --- a/lib/providers/download_queue_provider_paths.dart +++ b/lib/providers/download_queue_provider_paths.dart @@ -69,9 +69,7 @@ extension _DownloadQueuePaths on DownloadQueueNotifier { return false; } finally { if (probe != null) { - try { - if (await probe.exists()) await probe.delete(); - } catch (_) {} + await deleteFileQuietly(probe); } } } diff --git a/lib/providers/library_collections_provider.dart b/lib/providers/library_collections_provider.dart index dd9ed62a..ab94d6a7 100644 --- a/lib/providers/library_collections_provider.dart +++ b/lib/providers/library_collections_provider.dart @@ -11,6 +11,7 @@ import 'package:spotiflac_android/services/ffmpeg_service.dart'; import 'package:spotiflac_android/services/library_collections_database.dart'; import 'package:spotiflac_android/services/library_collections_hydration.dart'; import 'package:spotiflac_android/services/collection_track_batch.dart'; +import 'package:spotiflac_android/utils/file_access.dart'; import 'package:spotiflac_android/utils/logger.dart'; export 'package:spotiflac_android/models/library_collections.dart'; @@ -684,10 +685,7 @@ class LibraryCollectionsNotifier extends Notifier { }); _invalidatePlaylistPickerSummaries(); if (previousCoverPath != null && previousCoverPath != destPath) { - try { - final previous = File(previousCoverPath); - if (await previous.exists()) await previous.delete(); - } catch (_) {} + await deleteFileQuietly(File(previousCoverPath)); } }); @@ -737,10 +735,7 @@ class LibraryCollectionsNotifier extends Notifier { await File(tempPath).rename(destPath); return destPath; } finally { - try { - final temp = File(tempPath); - if (await temp.exists()) await temp.delete(); - } catch (_) {} + await deleteFileQuietly(File(tempPath)); } } @@ -862,9 +857,7 @@ class LibraryCollectionsNotifier extends Notifier { sourcePath, ); } finally { - try { - if (await source.exists()) await source.delete(); - } catch (_) {} + await deleteFileQuietly(source); } } catch (_) { newCoverPath = null; diff --git a/lib/services/backup_service.dart b/lib/services/backup_service.dart index 0af80966..b299f2dc 100644 --- a/lib/services/backup_service.dart +++ b/lib/services/backup_service.dart @@ -12,6 +12,7 @@ import 'package:spotiflac_android/services/history_database.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/services/sqlite_native_snapshot.dart'; import 'package:spotiflac_android/services/user_profile_store.dart'; +import 'package:spotiflac_android/utils/file_access.dart'; import 'package:spotiflac_android/utils/logger.dart'; typedef BackupHistoryPageLoader = @@ -343,9 +344,7 @@ class BackupService { try { if (await staging.exists()) await staging.delete(recursive: true); } catch (_) {} - try { - if (await partFile.exists()) await partFile.delete(); - } catch (_) {} + await deleteFileQuietly(partFile); } } diff --git a/lib/services/downloaded_embedded_cover_resolver.dart b/lib/services/downloaded_embedded_cover_resolver.dart index 19b64280..a3056bc3 100644 --- a/lib/services/downloaded_embedded_cover_resolver.dart +++ b/lib/services/downloaded_embedded_cover_resolver.dart @@ -1046,9 +1046,7 @@ class DownloadedEmbeddedCoverResolver { } static Future _deleteFileIfPresent(File file) async { - try { - if (await file.exists()) await file.delete(); - } catch (_) {} + await deleteFileQuietly(file); } static Future _clearDirectoryContents(Directory directory) async { diff --git a/lib/services/motion_artwork_store.dart b/lib/services/motion_artwork_store.dart index 9d958518..667fda82 100644 --- a/lib/services/motion_artwork_store.dart +++ b/lib/services/motion_artwork_store.dart @@ -9,6 +9,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:spotiflac_android/services/ffmpeg_service.dart'; import 'package:spotiflac_android/services/motion_artwork_download.dart'; import 'package:spotiflac_android/services/motion_artwork_proxy.dart'; +import 'package:spotiflac_android/utils/file_access.dart'; import 'package:spotiflac_android/utils/logger.dart'; import 'package:spotiflac_android/utils/string_utils.dart'; @@ -171,9 +172,7 @@ class MotionArtworkStore { return null; } finally { for (final file in [temporary, infoTemporary]) { - try { - if (file != null && await file.exists()) await file.delete(); - } catch (_) {} + if (file != null) await deleteFileQuietly(file); } } } diff --git a/lib/services/platform_bridge.dart b/lib/services/platform_bridge.dart index a08cbd0a..1791a000 100644 --- a/lib/services/platform_bridge.dart +++ b/lib/services/platform_bridge.dart @@ -7,6 +7,7 @@ import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:spotiflac_android/services/download_request_payload.dart'; import 'package:spotiflac_android/utils/audio_format_utils.dart'; +import 'package:spotiflac_android/utils/file_access.dart'; import 'package:spotiflac_android/utils/logger.dart'; part 'platform_bridge/bridge_codec.dart'; @@ -1558,12 +1559,7 @@ class PlatformBridge { } static Future _deleteFileIfExists(String path) async { - try { - final file = File(path); - if (await file.exists()) { - await file.delete(); - } - } catch (_) {} + await deleteFileQuietly(File(path)); } static Future _nativeWorkerPayloadDir() async { diff --git a/lib/services/platform_bridge/bridge_library_scan.dart b/lib/services/platform_bridge/bridge_library_scan.dart index 69fd49f9..03ef434a 100644 --- a/lib/services/platform_bridge/bridge_library_scan.dart +++ b/lib/services/platform_bridge/bridge_library_scan.dart @@ -27,13 +27,8 @@ class LibraryScanNDJSONFile { } Future delete() async { - try { - if (await file.exists()) await file.delete(); - } catch (_) {} + await deleteFileQuietly(file); // Remove the resumable scan checkpoint after ingestion. - try { - final checkpoint = File('${file.path}.state'); - if (await checkpoint.exists()) await checkpoint.delete(); - } catch (_) {} + await deleteFileQuietly(File('${file.path}.state')); } } diff --git a/lib/utils/ffmpeg_reenrich.dart b/lib/utils/ffmpeg_reenrich.dart index c480bbca..d4e0f55c 100644 --- a/lib/utils/ffmpeg_reenrich.dart +++ b/lib/utils/ffmpeg_reenrich.dart @@ -3,17 +3,13 @@ import 'dart:io'; import 'package:spotiflac_android/services/ffmpeg_service.dart'; import 'package:spotiflac_android/services/library_database.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; +import 'package:spotiflac_android/utils/file_access.dart'; import 'package:spotiflac_android/utils/lyrics_metadata_helper.dart'; bool _hasValue(String? value) => value != null && value.trim().isNotEmpty; Future _safeDeleteFile(String path) async { - try { - final file = File(path); - if (await file.exists()) { - await file.delete(); - } - } catch (_) {} + await deleteFileQuietly(File(path)); } Future _cleanupTempFileAndParent(String path) async { diff --git a/lib/utils/file_access.dart b/lib/utils/file_access.dart index 5d146f62..b66953eb 100644 --- a/lib/utils/file_access.dart +++ b/lib/utils/file_access.dart @@ -249,6 +249,13 @@ class FileAccessStat { const FileAccessStat({this.size, this.modified}); } +/// Deletes [file] when it exists and swallows any error. +Future deleteFileQuietly(File file) async { + try { + if (await file.exists()) await file.delete(); + } catch (_) {} +} + bool isContentUri(String? path) { return path != null && path.startsWith('content://'); }