From 645bda03f34ef96f15147db522d4c953469c00e8 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Thu, 12 Dec 2024 18:22:52 +0100 Subject: [PATCH] Revert "Merge pull request #332 from NBA2K1/main" This reverts commit a15d989656f3b19249030d300fe73f3b68d633c4, reversing changes made to b4cf59a27598bb334ab68ba3c5f62f1f3add8f95. --- .../providers/archive_reader_providers.dart | 24 ++- .../manga/download/download_page_widget.dart | 9 +- .../download/providers/convert_to_cbz.dart | 3 +- .../download/providers/download_provider.dart | 192 +++++++++++------- .../providers/auto_backup.dart | 7 +- .../backup_and_restore/providers/backup.dart | 9 +- .../providers/downloads_state_provider.dart | 5 +- lib/providers/storage_provider.dart | 35 +--- 8 files changed, 160 insertions(+), 124 deletions(-) diff --git a/lib/modules/manga/archive_reader/providers/archive_reader_providers.dart b/lib/modules/manga/archive_reader/providers/archive_reader_providers.dart index 9ac646d..cc1b94c 100644 --- a/lib/modules/manga/archive_reader/providers/archive_reader_providers.dart +++ b/lib/modules/manga/archive_reader/providers/archive_reader_providers.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart'; import 'package:mangayomi/modules/manga/archive_reader/models/models.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:path/path.dart' as p; part 'archive_reader_providers.g.dart'; @riverpod @@ -100,8 +99,13 @@ LocalArchive _extractArchive(String path) { final localArchive = LocalArchive() ..path = path ..extensionType = - setTypeExtension(p.extension(path).replaceFirst(".", "")) - ..name = p.basenameWithoutExtension(path); + setTypeExtension(path.split('/').last.split("\\").last.split(".").last) + ..name = path + .split('/') + .last + .split("\\") + .last + .replaceAll(RegExp(r'\.(cbz|zip|cbt|tar)'), ''); Archive? archive; final inputStream = InputFileStream(path); final extensionType = localArchive.extensionType; @@ -116,13 +120,14 @@ LocalArchive _extractArchive(String path) { final filename = file.name; if (file.isFile) { if (_isImageFile(filename) && !filename.startsWith('.')) { - final data = file.content as Uint8List; if (filename.contains("cover")) { + final data = file.content as Uint8List; localArchive.coverImage = data; } else { + final data = file.content as Uint8List; localArchive.images!.add(LocalImage() ..image = data - ..name = p.basename(filename)); + ..name = filename.split('/').last.split("\\").last); } } } @@ -135,8 +140,13 @@ LocalArchive _extractArchive(String path) { (String, LocalExtensionType, Uint8List, String) _extractArchiveOnly( String path) { final extensionType = - setTypeExtension(p.extension(path).replaceFirst('.', '')); - final name = p.basenameWithoutExtension(path); + setTypeExtension(path.split('/').last.split("\\").last.split(".").last); + final name = path + .split('/') + .last + .split("\\") + .last + .replaceAll(RegExp(r'\.(cbz|zip|cbt|tar)'), ''); Uint8List? coverImage; Archive? archive; diff --git a/lib/modules/manga/download/download_page_widget.dart b/lib/modules/manga/download/download_page_widget.dart index 32f1ab6..6fa2dc8 100644 --- a/lib/modules/manga/download/download_page_widget.dart +++ b/lib/modules/manga/download/download_page_widget.dart @@ -14,7 +14,6 @@ import 'package:mangayomi/services/background_downloader/background_downloader.d import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/utils/global_style.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:path/path.dart' as p; class ChapterPageDownload extends ConsumerStatefulWidget { final Chapter chapter; @@ -50,9 +49,9 @@ class _ChapterPageDownloadState extends ConsumerState List files = []; - final cbzFile = File(p.join(mangaDir!.path, "${widget.chapter.name}.cbz")); + final cbzFile = File("${mangaDir!.path}${widget.chapter.name}.cbz"); final mp4File = File( - p.join(mangaDir.path, "${widget.chapter.name!.replaceForbiddenCharacters(' ')}.mp4")); + "${mangaDir.path}${widget.chapter.name!.replaceForbiddenCharacters(' ')}.mp4"); if (cbzFile.existsSync()) { files = [XFile(cbzFile.path)]; } else if (mp4File.existsSync()) { @@ -73,14 +72,14 @@ class _ChapterPageDownloadState extends ConsumerState try { try { - final cbzFile = File(p.join(mangaDir!.path, "${widget.chapter.name}.cbz")); + final cbzFile = File("${mangaDir!.path}${widget.chapter.name}.cbz"); if (cbzFile.existsSync()) { cbzFile.deleteSync(); } } catch (_) {} try { final mp4File = File( - p.join(mangaDir!.path, "${widget.chapter.name!.replaceForbiddenCharacters(' ')}.mp4")); + "${mangaDir!.path}${widget.chapter.name!.replaceForbiddenCharacters(' ')}.mp4"); if (mp4File.existsSync()) { mp4File.deleteSync(); } diff --git a/lib/modules/manga/download/providers/convert_to_cbz.dart b/lib/modules/manga/download/providers/convert_to_cbz.dart index 60c4696..c52e025 100644 --- a/lib/modules/manga/download/providers/convert_to_cbz.dart +++ b/lib/modules/manga/download/providers/convert_to_cbz.dart @@ -3,7 +3,6 @@ import 'package:archive/archive_io.dart'; import 'package:flutter/foundation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:path/path.dart' as path; part 'convert_to_cbz.g.dart'; @riverpod @@ -35,7 +34,7 @@ List _convertToCBZ((String, String, String, List) datas) { if (imagesPaths.isNotEmpty && pageList.length == imagesPaths.length) { var encoder = ZipFileEncoder(); - encoder.create(path.join(mangaDir, "$chapterName.cbz")); + encoder.create("$mangaDir/$chapterName.cbz"); for (var path in imagesPaths) { encoder.addFile(File(path)); } diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index 9531991..e778060 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -19,7 +19,6 @@ import 'package:mangayomi/utils/extensions/string_extensions.dart'; import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart'; import 'package:path_provider/path_provider.dart'; -import 'package:path/path.dart' as p; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'download_provider.g.dart'; @@ -46,19 +45,10 @@ Future> downloadChapter( : ""; final chapterName = chapter.name!.replaceForbiddenCharacters(' '); - final isManga = manga.isManga!; - final pathSegments = [ - "downloads", - isManga ? "Manga" : "Anime", - "${manga.source} (${manga.lang!.toUpperCase()})", - manga.name!.replaceForbiddenCharacters('_'), - ]; - if (isManga) { - pathSegments.add(scanlator); - pathSegments.add(chapter.name!.replaceForbiddenCharacters('_')); - } - final finalPath = p.joinAll(pathSegments); - path = Directory(p.join(path1!.path, finalPath)); + final isManga = chapter.manga.value!.isManga!; + final finalPath = + "downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}"; + path = Directory("${path1!.path}$finalPath/"); Map videoHeader = {}; bool hasM3U8File = false; bool nonM3U8File = false; @@ -70,7 +60,7 @@ Future> downloadChapter( Future processConvert() async { if (hasM3U8File) { await m3u8Downloader?.mergeTsToMp4( - p.join(path!.path, "$chapterName.mp4"), p.join(path.path, chapterName)); + "${path!.path}$chapterName.mp4", "${path.path}$chapterName"); } else { if (ref.watch(saveAsCBZArchiveStateProvider)) { await ref.watch(convertToCBZProvider(path!.path, mangaDir!.path, @@ -130,7 +120,7 @@ Future> downloadChapter( if (hasM3U8File) { m3u8Downloader = M3u8Downloader( m3u8Url: videosUrls.first.url, - downloadDir: p.join(path!.path, chapterName), + downloadDir: "${path!.path}$chapterName", headers: videosUrls.first.headers ?? {}); (tsList, tsKey, tsIv, m3u8MediaSequence) = await m3u8Downloader!.getTsList(); @@ -154,24 +144,39 @@ Future> downloadChapter( if (pageUrls.isNotEmpty) { bool cbzFileExist = - await File(p.join(mangaDir!.path, "${chapter.name}.cbz")).exists() && + await File("${mangaDir!.path}${chapter.name}.cbz").exists() && ref.watch(saveAsCBZArchiveStateProvider); - bool mp4FileExist = await File(p.join(mangaDir.path, "$chapterName.mp4")).exists(); + bool mp4FileExist = await File("${mangaDir.path}$chapterName.mp4").exists(); if (!cbzFileExist && isManga || !mp4FileExist && !isManga) { for (var index = 0; index < pageUrls.length; index++) { - final path2 = Directory(p.join(path1.path, - "downloads", - isManga ? "Manga" : "Anime", - "${manga.source} (${manga.lang!.toUpperCase()})", - manga.name!.replaceForbiddenCharacters('_'))); - if (!(await path2.exists())) { - await path2.create(recursive: true); + final path2 = Directory("${path1.path}downloads/"); + final path5 = + Directory("${path1.path}downloads/${isManga ? "Manga" : "Anime"}/"); + final path4 = Directory( + "${path5.path}${manga.source} (${manga.lang!.toUpperCase()})/"); + final path3 = Directory( + "${path4.path}${manga.name!.replaceForbiddenCharacters('_')}/"); + + if (!(await path1.exists())) { + await path1.create(); } if (Platform.isAndroid) { - if (!(await File(p.join(path1.path, ".nomedia")).exists())) { - await File(p.join(path1.path, ".nomedia")).create(); + if (!(await File("${path1.path}" ".nomedia").exists())) { + await File("${path1.path}" ".nomedia").create(); } } + if (!(await path2.exists())) { + await path2.create(); + } + if (!(await path5.exists())) { + await path5.create(); + } + if (!(await path4.exists())) { + await path4.create(); + } + if (!(await path3.exists())) { + await path3.create(); + } final page = pageUrls[index]; final cookie = MClient.getCookiesPref(page.url); final headers = isManga @@ -187,70 +192,109 @@ Future> downloadChapter( pageHeaders.addAll(page.headers ?? {}); if (isManga) { - final file = File(p.join(tempDir.path, "Mangayomi", finalPath, "${padIndex(index + 1)}.jpg")); + final file = File( + "${tempDir.path}/Mangayomi/$finalPath/${padIndex(index + 1)}.jpg"); if (file.existsSync()) { Directory(path.path).createSync(recursive: true); - await file.copy(p.join(path.path, "${padIndex(index + 1)}.jpg")); + await file.copy("${path.path}${padIndex(index + 1)}.jpg"); await file.delete(); } else { - if (!(await path.exists())) { + if ((await path.exists())) { + if (await File("${path.path}${padIndex(index + 1)}.jpg") + .exists()) { + } else { + tasks.add(DownloadTask( + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), + filename: "${padIndex(index + 1)}.jpg", + baseDirectory: BaseDirectory.temporary, + directory: 'Mangayomi/$finalPath', + updates: Updates.statusAndProgress, + retries: 3, + allowPause: true, + requiresWiFi: onlyOnWifi)); + } + } else { await path.create(); - } - if (!(await File(p.join(path.path, "${padIndex(index + 1)}.jpg")).exists())) { - tasks.add(DownloadTask( - taskId: page.url, - headers: pageHeaders, - url: page.url.trim().trimLeft().trimRight(), - filename: "${padIndex(index + 1)}.jpg", - baseDirectory: BaseDirectory.temporary, - directory: p.join('Mangayomi', finalPath), - updates: Updates.statusAndProgress, - retries: 3, - allowPause: true, - requiresWiFi: onlyOnWifi)); + if (await File("${path.path}" "${padIndex(index + 1)}.jpg") + .exists()) { + } else { + tasks.add(DownloadTask( + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), + filename: "${padIndex(index + 1)}.jpg", + baseDirectory: BaseDirectory.temporary, + directory: 'Mangayomi/$finalPath', + updates: Updates.statusAndProgress, + allowPause: true, + retries: 3, + requiresWiFi: onlyOnWifi)); + } } } } else { - final file = File(p.join(tempDir.path, "Mangayomi", finalPath, "$chapterName.mp4")); + final file = + File("${tempDir.path}/Mangayomi/$finalPath/$chapterName.mp4"); if (file.existsSync()) { - await file.copy(p.join(path.path, "$chapterName.mp4")); + await file.copy("${path.path}$chapterName.mp4"); await file.delete(); } else if (hasM3U8File) { - final tempFile = File(p.join(tempDir.path, "Mangayomi", finalPath, chapterName, "TS_${index + 1}.ts")); - final file = File(p.join(path.path, chapterName, "TS_${index + 1}.ts")); + final tempFile = File( + "${tempDir.path}/Mangayomi/$finalPath/$chapterName/TS_${index + 1}.ts"); + final file = File("${path.path}$chapterName/TS_${index + 1}.ts"); if (tempFile.existsSync()) { - Directory(p.join(path.path, chapterName)).createSync(recursive: true); - await tempFile.copy(p.join(path.path, chapterName, "TS_${index + 1}.ts")); + Directory("${path.path}$chapterName").createSync(recursive: true); + await tempFile + .copy("${path.path}$chapterName/TS_${index + 1}.ts"); await tempFile.delete(); - } else if (!(file.existsSync())) { + } else if (file.existsSync()) { + } else { tasks.add(DownloadTask( taskId: page.url, headers: pageHeaders, url: page.url.trim().trimLeft().trimRight(), filename: "TS_${index + 1}.ts", baseDirectory: BaseDirectory.temporary, - directory: p.join('Mangayomi', finalPath, chapterName), + directory: 'Mangayomi/$finalPath/$chapterName/', updates: Updates.statusAndProgress, allowPause: true, retries: 3, requiresWiFi: onlyOnWifi)); } } else { - if (!(await path.exists())) { + if ((await path.exists())) { + if (await File("${path.path}$chapterName.mp4").exists()) { + } else { + tasks.add(DownloadTask( + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), + filename: "$chapterName.mp4", + baseDirectory: BaseDirectory.temporary, + directory: 'Mangayomi/$finalPath', + updates: Updates.statusAndProgress, + allowPause: true, + retries: 3, + requiresWiFi: onlyOnWifi)); + } + } else { await path.create(); - } - if (!(await File(p.join(path.path, "$chapterName.mp4")).exists())) { - tasks.add(DownloadTask( - taskId: page.url, - headers: pageHeaders, - url: page.url.trim().trimLeft().trimRight(), - filename: "$chapterName.mp4", - baseDirectory: BaseDirectory.temporary, - directory: p.join("Mangayomi", finalPath), - updates: Updates.statusAndProgress, - allowPause: true, - retries: 3, - requiresWiFi: onlyOnWifi)); + if (await File("${path.path}$chapterName.mp4").exists()) { + } else { + tasks.add(DownloadTask( + taskId: page.url, + headers: pageHeaders, + url: page.url.trim().trimLeft().trimRight(), + filename: "$chapterName.mp4", + baseDirectory: BaseDirectory.temporary, + directory: 'Mangayomi/$finalPath', + updates: Updates.statusAndProgress, + allowPause: true, + retries: 3, + requiresWiFi: onlyOnWifi)); + } } } } @@ -275,7 +319,7 @@ Future> downloadChapter( }); } else { if (hasM3U8File) { - await Directory(p.join(path.path, chapterName)).create(recursive: true); + await Directory("${path.path}$chapterName").create(recursive: true); } savePageUrls(); await FileDownloader().downloadBatch( @@ -350,14 +394,14 @@ Future> downloadChapter( } } if (progress == 1.0) { - final file = File(p.join(tempDir.path, taskProgress.task.directory, taskProgress.task.filename)); - if(hasM3U8File) { - final newFile = await file.copy(p.join(path!.path, chapterName, taskProgress.task.filename)); - await file.delete(); - await m3u8Downloader?.processBytes(newFile, tsKey, tsIv, m3u8MediaSequence); - } else { - await file.copy(p.join(path!.path, taskProgress.task.filename)); - await file.delete(); + final file = File( + "${tempDir.path}/${taskProgress.task.directory}/${taskProgress.task.filename}"); + final newFile = await file.copy( + "${path!.path}${hasM3U8File ? "$chapterName/" : ""}${taskProgress.task.filename}"); + await file.delete(); + if (hasM3U8File) { + await m3u8Downloader?.processBytes( + newFile, tsKey, tsIv, m3u8MediaSequence); } } }, diff --git a/lib/modules/more/backup_and_restore/providers/auto_backup.dart b/lib/modules/more/backup_and_restore/providers/auto_backup.dart index f0d729a..c3a7930 100644 --- a/lib/modules/more/backup_and_restore/providers/auto_backup.dart +++ b/lib/modules/more/backup_and_restore/providers/auto_backup.dart @@ -5,7 +5,6 @@ import 'package:mangayomi/modules/more/backup_and_restore/providers/backup.dart' import 'package:mangayomi/providers/storage_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:path/path.dart' as p; part 'auto_backup.g.dart'; @riverpod @@ -45,7 +44,7 @@ class AutoBackupLocationState extends _$AutoBackupLocationState { void set(String location) { final settings = isar.settings.getSync(227); - state = (p.join(_storageProvider!.path, "backup"), location); + state = ("${_storageProvider!.path}backup", location); isar.writeTxnSync( () => isar.settings.putSync(settings!..autoBackupLocation = location)); } @@ -60,7 +59,7 @@ class AutoBackupLocationState extends _$AutoBackupLocationState { state = ( Platform.isIOS ? _storageProvider!.path - : p.join(_storageProvider!.path, "backup"), + : "${_storageProvider!.path}backup/", settings!.autoBackupLocation ?? "" ); } @@ -83,7 +82,7 @@ Future checkAndBackup(Ref ref) async { final backupLocation = ref.watch(autoBackupLocationStateProvider).$2; Directory? backupDirectory; backupDirectory = Directory(backupLocation.isEmpty - ? p.join(defaulteDirectory!.path, "backup") + ? "${defaulteDirectory!.path}backup/" : backupLocation); if (Platform.isIOS) { backupDirectory = await (storageProvider.getIosBackupDirectory()); diff --git a/lib/modules/more/backup_and_restore/providers/backup.dart b/lib/modules/more/backup_and_restore/providers/backup.dart index 9cefc21..fa81cad 100644 --- a/lib/modules/more/backup_and_restore/providers/backup.dart +++ b/lib/modules/more/backup_and_restore/providers/backup.dart @@ -19,7 +19,6 @@ import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:path/path.dart' as p; part 'backup.g.dart'; @riverpod @@ -119,12 +118,12 @@ void doBackUp(Ref ref, final regExp = RegExp(r'[^a-zA-Z0-9 .()\-\s]'); final name = 'mangayomi_${DateTime.now().toString().replaceAll(regExp, '_').replaceAll(' ', '_')}'; - final backupFilePath = p.join(path, "$name.backup.db"); + final backupFilePath = '$path/$name.backup.db'; final file = File(backupFilePath); file.writeAsStringSync(jsonEncode(datas)); var encoder = ZipFileEncoder(); - encoder.create(p.join(path, "$name.backup")); + encoder.create('$path/$name.backup'); encoder.addFile(File(backupFilePath)); encoder.close(); Directory(backupFilePath).deleteSync(recursive: true); @@ -148,8 +147,8 @@ void doBackUp(Ref ref, alignment: Alignment.topLeft, child: ElevatedButton( onPressed: () { - Share.shareXFiles([XFile(p.join(path, "$name.backup"))], - text: "$name.backup"); + Share.shareXFiles([XFile('$path/$name.backup')], + text: '$name.backup'); }, child: Text(context.l10n.share)), ), diff --git a/lib/modules/more/settings/downloads/providers/downloads_state_provider.dart b/lib/modules/more/settings/downloads/providers/downloads_state_provider.dart index c376b76..d734dec 100644 --- a/lib/modules/more/settings/downloads/providers/downloads_state_provider.dart +++ b/lib/modules/more/settings/downloads/providers/downloads_state_provider.dart @@ -3,7 +3,6 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/providers/storage_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:path/path.dart' as path; part 'downloads_state_provider.g.dart'; @riverpod @@ -45,7 +44,7 @@ class DownloadLocationState extends _$DownloadLocationState { void set(String location) { final settings = isar.settings.getSync(227); - state = (path.join(_storageProvider!.path, 'downloads'), location); + state = ("${_storageProvider!.path}downloads", location); isar.writeTxnSync( () => isar.settings.putSync(settings!..downloadLocation = location)); } @@ -56,7 +55,7 @@ class DownloadLocationState extends _$DownloadLocationState { _storageProvider = await StorageProvider().getDefaultDirectory(); final settings = isar.settings.getSync(227); state = ( - path.join(_storageProvider!.path, 'downloads'), + "${_storageProvider!.path}downloads", settings!.downloadLocation ?? "" ); } diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index fdd04f2..67d30bc 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -48,7 +48,7 @@ class StorageProvider { directory = Directory("/storage/emulated/0/Mangayomi/"); } else { final dir = await getApplicationDocumentsDirectory(); - directory = Directory(path.join(dir.path, 'Mangayomi')); + directory = Directory("${dir.path}/Mangayomi/"); } return directory; } @@ -69,14 +69,14 @@ class StorageProvider { Future getDirectory() async { Directory? directory; - String customPath = isar.settings.getSync(227)!.downloadLocation ?? ""; + String path = isar.settings.getSync(227)!.downloadLocation ?? ""; if (Platform.isAndroid) { directory = - Directory(customPath.isEmpty ? "/storage/emulated/0/Mangayomi/" : "$customPath/"); + Directory(path.isEmpty ? "/storage/emulated/0/Mangayomi/" : "$path/"); } else { final dir = await getApplicationDocumentsDirectory(); - final basePath = customPath.isEmpty ? dir.path : customPath; - directory = Directory(path.join(basePath, "Mangayomi")); + final p = path.isEmpty ? dir.path : path; + directory = Directory("$p/Mangayomi/"); } return directory; } @@ -88,31 +88,18 @@ class StorageProvider { String scanlator = chapter.scanlator?.isNotEmpty ?? false ? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_" : ""; - final isManga = manga.isManga!; + final isManga = chapter.manga.value!.isManga!; final dir = await getDirectory(); - final directoryPath = path.join( - dir!.path, - "downloads", - isManga ? "Manga" : "Anime", - "${manga.source} (${manga.lang!.toUpperCase()})", - manga.name!.replaceForbiddenCharacters('_'), - "$scanlator${chapter.name!.replaceForbiddenCharacters('_')}", - ); - return Directory(directoryPath); + return Directory( + "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/"); } Future getMangaMainDirectory(Chapter chapter) async { final manga = chapter.manga.value!; - final isManga = manga.isManga!; + final isManga = chapter.manga.value!.isManga!; final dir = await getDirectory(); - final directoryPath = path.join( - dir!.path, - "downloads", - isManga ? "Manga" : "Anime", - "${manga.source} (${manga.lang!.toUpperCase()})", - manga.name!.replaceForbiddenCharacters('_'), - ); - return Directory(directoryPath); + return Directory( + "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/"); } Future getDatabaseDirectory() async {