From 8c625e212a53ca319d2512da00681bc9573dd0da Mon Sep 17 00:00:00 2001 From: nyne Date: Sun, 5 Oct 2025 17:22:57 +0800 Subject: [PATCH] fix downloading issue when chapter name contains special characters. Close #533 --- lib/foundation/local.dart | 21 ++++++++++++++++++++- lib/network/download.dart | 20 ++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/foundation/local.dart b/lib/foundation/local.dart index 36cbe47..1d21c61 100644 --- a/lib/foundation/local.dart +++ b/lib/foundation/local.dart @@ -423,6 +423,7 @@ class LocalManager with ChangeNotifier { if (comic.hasChapters) { var cid = ep is int ? comic.chapters!.ids.elementAt(ep - 1) : (ep as String); + cid = getChapterDirectoryName(cid); directory = Directory(FilePath.join(directory.path, cid)); } var files = []; @@ -600,7 +601,10 @@ class LocalManager with ChangeNotifier { } var shouldRemovedDirs = []; for (var chapter in chapters) { - var dir = Directory(FilePath.join(c.baseDir, chapter)); + var dir = Directory(FilePath.join( + c.baseDir, + getChapterDirectoryName(chapter), + )); if (dir.existsSync()) { shouldRemovedDirs.add(dir); } @@ -668,6 +672,21 @@ class LocalManager with ChangeNotifier { } }); } + + static String getChapterDirectoryName(String name) { + var builder = StringBuffer(); + for (var i = 0; i < name.length; i++) { + var char = name[i]; + if (char == '/' || char == '\\' || char == ':' || char == '*' || + char == '?' + || char == '"' || char == '<' || char == '>' || char == '|') { + builder.write('_'); + } else { + builder.write(char); + } + } + return builder.toString(); + } } enum LocalSortType { diff --git a/lib/network/download.dart b/lib/network/download.dart index 7ab6777..269ec83 100644 --- a/lib/network/download.dart +++ b/lib/network/download.dart @@ -107,7 +107,21 @@ class ImagesDownloadTask extends DownloadTask with _TransferSpeedMixin { var local = LocalManager().find(id, comicType); if (path != null) { if (local == null) { - Directory(path!).deleteIgnoreError(recursive: true); + Future.sync(() async { + var tasks = this.tasks.values.toList(); + for (var i = 0; i < tasks.length; i++) { + if (!tasks[i].isComplete) { + tasks[i].cancel(); + await tasks[i].wait(); + } + } + try { + await Directory(path!).delete(recursive: true); + } + catch(e) { + Log.error("Download", "Failed to delete directory: $e"); + } + }); } else if (chapters != null) { for (var c in chapters!) { var dir = Directory(FilePath.join(path!, c)); @@ -197,7 +211,9 @@ class ImagesDownloadTask extends DownloadTask with _TransferSpeedMixin { if (comic!.chapters != null) { saveTo = Directory(FilePath.join( path!, - _images!.keys.elementAt(_chapter), + LocalManager.getChapterDirectoryName( + _images!.keys.elementAt(_chapter), + ), )); if (!saveTo.existsSync()) { saveTo.createSync(recursive: true);