diff --git a/lib/models/comick/chapter_page_comick.dart b/lib/models/comick/chapter_page_comick.dart index bec1d75..633f185 100644 --- a/lib/models/comick/chapter_page_comick.dart +++ b/lib/models/comick/chapter_page_comick.dart @@ -36,25 +36,6 @@ class ChapterPageComick { chapTitle = json['chapTitle']; checkVol2Chap1 = json['checkVol2Chap1']; } - - Map toJson() { - final Map data = {}; - if (chapter != null) { - data['chapter'] = chapter!.toJson(); - } - - data['matureContent'] = matureContent; - if (chapters != null) { - data['chapters'] = chapters!.map((v) => v.toJson()).toList(); - } - - data['canonical'] = canonical; - data['seoTitle'] = seoTitle; - data['seoDescription'] = seoDescription; - data['chapTitle'] = chapTitle; - data['checkVol2Chap1'] = checkVol2Chap1; - return data; - } } class Chapter { @@ -115,31 +96,6 @@ class Chapter { }); } } - - Map toJson() { - final Map data = {}; - data['id'] = id; - data['chap'] = chap; - - data['title'] = title; - data['server'] = server; - data['hid'] = hid; - data['hash'] = hash; - data['group_name'] = groupName; - - data['created_at'] = createdAt; - data['mdid'] = mdid; - data['comment_count'] = commentCount; - data['up_count'] = upCount; - data['down_count'] = downCount; - data['status'] = status; - data['lang'] = lang; - - if (images != null) { - data['images'] = images!.map((v) => v.toJson()).toList(); - } - return data; - } } class Images { @@ -182,15 +138,4 @@ class Chapters { id = json['id']; title = json['title']; } - - Map toJson() { - final Map data = {}; - data['chap'] = chap; - data['vol'] = vol; - data['hid'] = hid; - data['lang'] = lang; - data['id'] = id; - data['title'] = title; - return data; - } } diff --git a/lib/models/comick/manga_chapter_detail.dart b/lib/models/comick/manga_chapter_detail.dart index 292ab90..a33cb24 100644 --- a/lib/models/comick/manga_chapter_detail.dart +++ b/lib/models/comick/manga_chapter_detail.dart @@ -13,15 +13,6 @@ class MangaChapterModelComick { } total = json['total']; } - - Map toJson() { - final Map data = {}; - if (chapters != null) { - data['chapters'] = chapters!.map((v) => v.toJson()).toList(); - } - data['total'] = total; - return data; - } } class Chapters { @@ -74,26 +65,6 @@ class Chapters { // }); // } } - - Map toJson() { - final Map data = {}; - data['id'] = id; - data['chap'] = chap; - data['title'] = title; - data['vol'] = vol; - data['slug'] = slug; - data['lang'] = lang; - data['created_at'] = createdAt; - data['updated_at'] = updatedAt; - data['up_count'] = upCount; - data['down_count'] = downCount; - data['group_name'] = groupName; - data['hid'] = hid; - if (mdGroups != null) { - data['md_groups'] = mdGroups!.map((v) => v.toJson()).toList(); - } - return data; - } } class MdGroups { @@ -106,11 +77,4 @@ class MdGroups { slug = json['slug']; title = json['title']; } - - Map toJson() { - final Map data = {}; - data['slug'] = slug; - data['title'] = title; - return data; - } } diff --git a/lib/models/comick/manga_detail_comick.dart b/lib/models/comick/manga_detail_comick.dart index fbd4b94..23c0059 100644 --- a/lib/models/comick/manga_detail_comick.dart +++ b/lib/models/comick/manga_detail_comick.dart @@ -30,7 +30,6 @@ class MangaDetailModelComick { if (json['authors'] != null) { authors = json['authors']; } - if (json['genres'] != null) { genres = json['genres']; @@ -38,30 +37,6 @@ class MangaDetailModelComick { matureContent = json['matureContent']; checkVol2Chap1 = json['checkVol2Chap1']; } - - Map toJson() { - final Map data = {}; - // if (firstChap != null) { - // data['firstChap'] = firstChap!.toJson(); - // } - if (comic != null) { - data['comic'] = comic!.toJson(); - } - if (artists != null) { - data['artists'] = artists!.map((v) => v.toJson()).toList(); - } - if (authors != null) { - data['authors'] = authors!.map((v) => v.toJson()).toList(); - } - // data['langList'] = langList; - - if (genres != null) { - data['genres'] = genres!.map((v) => v.toJson()).toList(); - } - data['matureContent'] = matureContent; - data['checkVol2Chap1'] = checkVol2Chap1; - return data; - } } class FirstChap { @@ -81,17 +56,6 @@ class FirstChap { chap = json['chap']; hid = json['hid']; lang = json['lang']; - - } - - Map toJson() { - final Map data = {}; - data['chap'] = chap; - data['hid'] = hid; - data['lang'] = lang; - data['group_name'] = groupName; - - return data; } } @@ -184,41 +148,6 @@ class Comic { // langNative = json['lang_native']; coverUrl = json['cover_url']; } - - Map toJson() { - final Map data = {}; - data['id'] = id; - data['hid'] = hid; - data['title'] = title; - data['country'] = country; - data['status'] = status; - - data['last_chapter'] = lastChapter; - data['chapter_count'] = chapterCount; - data['demographic'] = demographic; - data['hentai'] = hentai; - data['user_follow_count'] = userFollowCount; - data['follow_rank'] = followRank; - data['comment_count'] = commentCount; - data['follow_count'] = followCount; - data['desc'] = desc; - data['parsed'] = parsed; - data['slug'] = slug; - - data['year'] = year; - data['bayesian_rating'] = bayesianRating; - data['rating_count'] = ratingCount; - data['content_rating'] = contentRating; - data['translation_completed'] = translationCompleted; - data['chapter_numbers_reset_on_new_volume_manual'] = - chapterNumbersResetOnNewVolumeManual; - - data['iso639_1'] = iso6391; - data['lang_name'] = langName; - data['lang_native'] = langNative; - data['cover_url'] = coverUrl; - return data; - } } class Artists { @@ -231,11 +160,4 @@ class Artists { name = json['name']; slug = json['slug']; } - - Map toJson() { - final Map data = {}; - data['name'] = name; - data['slug'] = slug; - return data; - } } diff --git a/lib/models/comick/popular_manga_comick.dart b/lib/models/comick/popular_manga_comick.dart index 8618251..7965b62 100644 --- a/lib/models/comick/popular_manga_comick.dart +++ b/lib/models/comick/popular_manga_comick.dart @@ -78,38 +78,6 @@ class PopularMangaModelComick { json['mu_comics'] != null ? MuComics.fromJson(json['mu_comics']) : null; coverUrl = json['cover_url']; } - - Map toJson() { - final Map data = {}; - data['id'] = id; - data['hid'] = hid; - data['slug'] = slug; - data['title'] = title; - data['rating'] = rating; - data['bayesian_rating'] = bayesianRating; - data['rating_count'] = ratingCount; - data['follow_count'] = followCount; - data['desc'] = desc; - data['last_chapter'] = lastChapter as int; - data['translation_completed'] = translationCompleted; - data['view_count'] = viewCount; - data['content_rating'] = contentRating; - data['demographic'] = demographic; - data['genres'] = genres; - data['user_follow_count'] = userFollowCount; - data['year'] = year; - if (mdTitles != null) { - data['md_titles'] = mdTitles!.map((v) => v.toJson()).toList(); - } - if (mdCovers != null) { - data['md_covers'] = mdCovers!.map((v) => v.toJson()).toList(); - } - if (muComics != null) { - data['mu_comics'] = muComics!.toJson(); - } - data['cover_url'] = coverUrl; - return data; - } } class MdTitles { @@ -158,10 +126,4 @@ class MuComics { MuComics.fromJson(Map json) { year = json['year']; } - - Map toJson() { - final Map data = {}; - data['year'] = year; - return data; - } } diff --git a/lib/models/comick/search_manga_cimick.dart b/lib/models/comick/search_manga_cimick.dart index 26d5baf..7b0b308 100644 --- a/lib/models/comick/search_manga_cimick.dart +++ b/lib/models/comick/search_manga_cimick.dart @@ -51,13 +51,4 @@ class MdCovers { h = json['h']; b2key = json['b2key']; } - - Map toJson() { - final Map data = {}; - data['vol'] = vol; - data['w'] = w; - data['h'] = h; - data['b2key'] = b2key; - return data; - } } diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index 9557827..70b43c6 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -36,9 +36,12 @@ class StorageProvider { Future getMangaChapterDirectory( ModelManga modelManga, index) async { + String scanlator = modelManga.chapters![index].scanlator!.isNotEmpty + ? "${modelManga.chapters![index].scanlator!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}_" + : ""; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/${modelManga.chapters![index].name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/"); + "${dir!.path}/downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/$scanlator${modelManga.chapters![index].name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/"); } Future getMangaMainDirectory(ModelManga modelManga, index) async { diff --git a/lib/views/browse/extension/extension_screen.dart b/lib/views/browse/extension/extension_screen.dart index 1c99518..1f2767c 100644 --- a/lib/views/browse/extension/extension_screen.dart +++ b/lib/views/browse/extension/extension_screen.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:grouped_list/grouped_list.dart'; @@ -40,6 +42,10 @@ class ExtensionScreen extends ConsumerWidget { ), ), itemBuilder: (context, SourceModel element) { + if (element.isCloudflare && !Platform.isWindows || + element.isCloudflare && !Platform.isLinux) { + return Container(); + } final source = value.get("${element.sourceName}${element.lang}")!; return ExtensionListTileWidget( diff --git a/lib/views/manga/detail/manga_detail_view.dart b/lib/views/manga/detail/manga_detail_view.dart index c86f2fc..ddcdc9c 100644 --- a/lib/views/manga/detail/manga_detail_view.dart +++ b/lib/views/manga/detail/manga_detail_view.dart @@ -62,22 +62,6 @@ class _MangaDetailViewState extends ConsumerState @override Widget build(BuildContext context) { - _chapters = ref - .watch(chapterFilterResultStateProvider(modelManga: widget.modelManga!)) - .chapters; - _modelManga = ref.watch( - chapterFilterResultStateProvider(modelManga: widget.modelManga!)); - - _pageLength = ref - .watch(chapterFilterResultStateProvider( - modelManga: widget.modelManga!)) - .chapters! - .length + - 1; - - bool reverse = ref.watch( - reverseChapterStateProvider(modelManga: widget.modelManga!))["reverse"]; - return NotificationListener( onNotification: (notification) { if (notification.direction == ScrollDirection.forward) { @@ -133,8 +117,8 @@ class _MangaDetailViewState extends ConsumerState ref .read(chapterNameListStateProvider .notifier) - .selectAll(widget.modelManga! - .chapters![i].name!); + .selectAll( + "${widget.modelManga!.chapters![i].name!}$i"); } }, icon: const Icon(Icons.select_all)), @@ -150,8 +134,8 @@ class _MangaDetailViewState extends ConsumerState ref .read(chapterNameListStateProvider .notifier) - .selectSome(widget.modelManga! - .chapters![i].name!); + .selectSome( + "${widget.modelManga!.chapters![i].name}$i"); } ref .read(isLongPressedStateProvider @@ -166,8 +150,8 @@ class _MangaDetailViewState extends ConsumerState ref .read(chapterNameListStateProvider .notifier) - .selectSome(widget.modelManga! - .chapters![i].name!); + .selectSome( + "${widget.modelManga!.chapters![i].name}$i"); } } }, @@ -247,53 +231,67 @@ class _MangaDetailViewState extends ConsumerState ) ], )), - SafeArea( - child: DraggableScrollbar( - heightScrollThumb: 48.0, - backgroundColor: primaryColor(context), - scrollThumbBuilder: (backgroundColor, thumbAnimation, - labelAnimation, height, - {labelConstraints, labelText}) { - return FadeTransition( - opacity: thumbAnimation, - child: Container( - decoration: BoxDecoration( - color: backgroundColor, - borderRadius: BorderRadius.circular(20)), - height: height, - width: 8.0, - ), - ); - }, - scrollbarTimeToFade: const Duration(seconds: 2), - controller: _scrollController, - child: ListView.builder( - controller: _scrollController, - padding: const EdgeInsets.only(top: 0, bottom: 60), - itemCount: _pageLength, - itemBuilder: (context, index) { - int finalIndex = index - 1; - if (index == 0) { - return _bodyContainer(); - } - int reverseIndex = _chapters!.length - - _chapters!.reversed.toList().indexOf( - _chapters!.reversed - .toList()[finalIndex]) - - 1; + SafeArea(child: Consumer(builder: (context, ref, child) { + _pageLength = ref + .watch(chapterFilterResultStateProvider( + modelManga: widget.modelManga!)) + .chapters! + .length + + 1; + _chapters = ref + .watch(chapterFilterResultStateProvider( + modelManga: widget.modelManga!)) + .chapters; + _modelManga = ref.watch(chapterFilterResultStateProvider( + modelManga: widget.modelManga!)); + bool reverse = ref.watch(reverseChapterStateProvider( + modelManga: widget.modelManga!))["reverse"]; + return DraggableScrollbar( + heightScrollThumb: 48.0, + backgroundColor: primaryColor(context), + scrollThumbBuilder: (backgroundColor, thumbAnimation, + labelAnimation, height, + {labelConstraints, labelText}) { + return FadeTransition( + opacity: thumbAnimation, + child: Container( + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(20)), + height: height, + width: 8.0, + ), + ); + }, + scrollbarTimeToFade: const Duration(seconds: 2), + controller: _scrollController, + child: ListView.builder( + controller: _scrollController, + padding: const EdgeInsets.only(top: 0, bottom: 60), + itemCount: _pageLength, + itemBuilder: (context, index) { + int finalIndex = index - 1; + if (index == 0) { + return _bodyContainer(); + } + int reverseIndex = _chapters!.length - + _chapters!.reversed.toList().indexOf( + _chapters!.reversed.toList()[finalIndex]) - + 1; - List chapters = reverse - ? _chapters!.reversed.toList() - : _chapters!; + List chapters = reverse + ? _chapters!.reversed.toList() + : _chapters!; - return ChapterListTileWidget( - chapters: chapters, - modelManga: _modelManga!, - reverse: reverse, - reverseIndex: reverseIndex, - finalIndex: finalIndex, - ); - }))), + return ChapterListTileWidget( + chapters: chapters, + modelManga: _modelManga!, + reverse: reverse, + reverseIndex: reverseIndex, + finalIndex: finalIndex, + ); + })); + })), ], ), bottomNavigationBar: Consumer( diff --git a/lib/views/manga/detail/providers/state_providers.dart b/lib/views/manga/detail/providers/state_providers.dart index 37373e0..6718690 100644 --- a/lib/views/manga/detail/providers/state_providers.dart +++ b/lib/views/manga/detail/providers/state_providers.dart @@ -445,7 +445,7 @@ class ChapterSetIsBookmarkState extends _$ChapterSetIsBookmarkState { for (var name in ref.watch(chapterNameListStateProvider)) { for (var i = 0; i < modelManga.chapters!.length; i++) { modelManga.chapters![i].isBookmarked = - name == modelManga.chapters![i].name + name == "${modelManga.chapters![i].name}$i" ? !modelManga.chapters![i].isBookmarked : modelManga.chapters![i].isBookmarked; } @@ -463,9 +463,10 @@ class ChapterSetIsReadState extends _$ChapterSetIsReadState { ref.read(isLongPressedStateProvider.notifier).update(false); for (var name in ref.watch(chapterNameListStateProvider)) { for (var i = 0; i < modelManga.chapters!.length; i++) { - modelManga.chapters![i].isRead = name == modelManga.chapters![i].name - ? !modelManga.chapters![i].isRead - : modelManga.chapters![i].isRead; + modelManga.chapters![i].isRead = + name == "${modelManga.chapters![i].name}$i" + ? !modelManga.chapters![i].isRead + : modelManga.chapters![i].isRead; } modelManga.save(); } @@ -482,7 +483,7 @@ class ChapterSetDownloadState extends _$ChapterSetDownloadState { List indexList = []; for (var name in ref.watch(chapterNameListStateProvider)) { for (var i = 0; i < modelManga.chapters!.length; i++) { - if (modelManga.chapters![i].name == name) { + if ("${modelManga.chapters![i].name}$i" == name) { indexList.add(i); } } diff --git a/lib/views/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/views/manga/detail/widgets/chapter_list_tile_widget.dart index 4ca8b35..a5a490d 100644 --- a/lib/views/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/views/manga/detail/widgets/chapter_list_tile_widget.dart @@ -30,9 +30,10 @@ class ChapterListTileWidget extends ConsumerWidget { final isLongPressed = ref.watch(isLongPressedStateProvider); final idx = reverse ? reverseIndex : finalIndex; final chapterNameList = ref.watch(chapterNameListStateProvider); + log(chapterNameList.toString()); final chapterName = modelManga.chapters![idx].name; return Container( - color: chapterNameList.contains(chapterName) + color: chapterNameList.contains("$chapterName$idx") ? primaryColor(context).withOpacity(0.4) : null, child: ListTile( @@ -48,7 +49,7 @@ class ChapterListTileWidget extends ConsumerWidget { if (!isLongPressed) { ref .read(chapterNameListStateProvider.notifier) - .update(chapterName!); + .update("$chapterName$idx"); ref .read(chapterModelStateProvider.notifier) .update(chapters[finalIndex]); @@ -58,7 +59,7 @@ class ChapterListTileWidget extends ConsumerWidget { } else { ref .read(chapterNameListStateProvider.notifier) - .update(chapterName!); + .update("$chapterName$idx"); ref .read(chapterModelStateProvider.notifier) .update(chapters[finalIndex]); @@ -68,7 +69,7 @@ class ChapterListTileWidget extends ConsumerWidget { if (isLongPressed) { ref .read(chapterNameListStateProvider.notifier) - .update(chapterName!); + .update("$chapterName$idx"); ref .read(chapterModelStateProvider.notifier) .update(chapters[finalIndex]); diff --git a/lib/views/manga/download/download_page_widget.dart b/lib/views/manga/download/download_page_widget.dart index eea5be9..7a387d6 100644 --- a/lib/views/manga/download/download_page_widget.dart +++ b/lib/views/manga/download/download_page_widget.dart @@ -77,12 +77,13 @@ class _ChapterPageDownloadState extends ConsumerState child: Padding( padding: const EdgeInsets.symmetric(vertical: 3), child: ValueListenableBuilder>( - valueListenable: ref.watch(hiveBoxMangaDownloadsProvider).listenable(), + valueListenable: + ref.watch(hiveBoxMangaDownloadsProvider).listenable(), builder: (context, val, child) { final entries = val.values .where((element) => - element.modelManga.chapters![element.index].name == - widget.modelManga.chapters![widget.index].name) + "${element.modelManga.chapters![element.index].name}${element.index}" == + "${widget.modelManga.chapters![widget.index].name}${widget.index}") .toList(); if (entries.isNotEmpty) { @@ -117,23 +118,7 @@ class _ChapterPageDownloadState extends ConsumerState child: _downloadWidget(context, true), onSelected: (value) { if (value.toString() == 'Cancel') { - setState(() { - _isStarted = false; - }); - List taskIds = []; - for (var id in entries.first.taskIds) { - taskIds.add(id); - } - FileDownloader() - .cancelTasksWithIds(taskIds) - .then((value) async { - await Future.delayed( - const Duration(seconds: 1)); - ref.watch(hiveBoxMangaDownloadsProvider).delete( - widget.modelManga - .chapters![widget.index].name, - ); - }); + _cancelTasks(); } }, itemBuilder: (context) => [ @@ -148,15 +133,6 @@ class _ChapterPageDownloadState extends ConsumerState child: PopupMenuButton( child: Stack( children: [ - Align( - alignment: Alignment.center, - child: Icon( - Icons.arrow_downward_sharp, - color: Theme.of(context) - .iconTheme - .color! - .withOpacity(0.7), - )), Align( alignment: Alignment.center, child: TweenAnimationBuilder( @@ -187,30 +163,21 @@ class _ChapterPageDownloadState extends ConsumerState alignment: Alignment.center, child: Icon( Icons.arrow_downward_sharp, - color: Theme.of(context) - .scaffoldBackgroundColor, + color: (entries.first.succeeded / + entries.first.total) > + 0.5 + ? Theme.of(context) + .scaffoldBackgroundColor + : Theme.of(context) + .iconTheme + .color! + .withOpacity(0.7), )), ], ), onSelected: (value) { if (value.toString() == 'Cancel') { - setState(() { - _isStarted = false; - }); - List taskIds = []; - for (var id in entries.first.taskIds) { - taskIds.add(id); - } - FileDownloader() - .cancelTasksWithIds(taskIds) - .then((value) async { - await Future.delayed( - const Duration(seconds: 1)); - ref.watch(hiveBoxMangaDownloadsProvider).delete( - widget.modelManga - .chapters![widget.index].name, - ); - }); + _cancelTasks(); } }, itemBuilder: (context) => [ @@ -245,9 +212,11 @@ class _ChapterPageDownloadState extends ConsumerState ), onSelected: (value) { if (value.toString() == 'Retry') { - ref.watch(hiveBoxMangaDownloadsProvider).delete( - widget.modelManga - .chapters![widget.index].name, + ref + .watch( + hiveBoxMangaDownloadsProvider) + .delete( + "${widget.modelManga.chapters![widget.index].name}${widget.index}", ); _startDownload(); setState(() { @@ -269,22 +238,7 @@ class _ChapterPageDownloadState extends ConsumerState child: _downloadWidget(context, true), onSelected: (value) { if (value.toString() == 'Cancel') { - setState(() { - _isStarted = false; - }); - List taskIds = []; - for (var id in _urll) { - taskIds.add(id); - } - FileDownloader() - .cancelTasksWithIds(taskIds) - .then((value) async { - await Future.delayed(const Duration(seconds: 1)); - ref.watch(hiveBoxMangaDownloadsProvider).delete( - widget - .modelManga.chapters![widget.index].name!, - ); - }); + _cancelTasks(); } }, itemBuilder: (context) => [ @@ -309,6 +263,22 @@ class _ChapterPageDownloadState extends ConsumerState ); } + _cancelTasks() { + setState(() { + _isStarted = false; + }); + List taskIds = []; + for (var id in _urll) { + taskIds.add(id); + } + FileDownloader().cancelTasksWithIds(taskIds).then((value) async { + await Future.delayed(const Duration(seconds: 1)); + ref.watch(hiveBoxMangaDownloadsProvider).delete( + "${widget.modelManga.chapters![widget.index].name}${widget.index}", + ); + }); + } + @override bool get wantKeepAlive => true; } diff --git a/lib/views/manga/download/providers/download_provider.dart b/lib/views/manga/download/providers/download_provider.dart index b18a9cf..032f39b 100644 --- a/lib/views/manga/download/providers/download_provider.dart +++ b/lib/views/manga/download/providers/download_provider.dart @@ -23,11 +23,12 @@ Future> downloadChapter(DownloadChapterRef ref, Directory? path; bool isOk = false; final path1 = await storageProvider.getDirectory(); - + String scanlator = modelManga.chapters![index].scanlator!.isNotEmpty + ? "${modelManga.chapters![index].scanlator!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}_" + : ""; final finalPath = - "downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/${modelManga.chapters![index].name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}"; - path = Directory( - "${path1!.path}downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/${modelManga.chapters![index].name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/"); + "downloads/${modelManga.source} (${modelManga.lang!.toUpperCase()})/${modelManga.name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}/$scanlator${modelManga.chapters![index].name!.replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_')}"; + path = Directory("${path1!.path}$finalPath/"); ref .read(getMangaChapterUrlProvider( modelManga: modelManga, @@ -134,7 +135,7 @@ Future> downloadChapter(DownloadChapterRef ref, ref .watch(hiveBoxMangaDownloadsProvider) - .put(modelManga.chapters![index].name!, model); + .put("${modelManga.chapters![index].name!}$index", model); } else { await FileDownloader().downloadBatch( tasks, @@ -150,7 +151,7 @@ Future> downloadChapter(DownloadChapterRef ref, isStartDownload: true); Hive.box(HiveConstant.hiveBoxDownloads) - .put(modelManga.chapters![index].name!, model); + .put("${modelManga.chapters![index].name!}$index", model); }, taskProgressCallback: (task, progress) async { if (progress == 1.0) { diff --git a/lib/views/more/download_queue/download_queue_screen.dart b/lib/views/more/download_queue/download_queue_screen.dart index 21225bc..6528770 100644 --- a/lib/views/more/download_queue/download_queue_screen.dart +++ b/lib/views/more/download_queue/download_queue_screen.dart @@ -96,9 +96,17 @@ class DownloadQueueScreen extends ConsumerWidget { const SizedBox( height: 8, ), - LinearProgressIndicator( - value: element.succeeded / element.total, - ) + TweenAnimationBuilder( + duration: const Duration(milliseconds: 250), + curve: Curves.easeInOut, + tween: Tween( + begin: 0, + end: element.succeeded / element.total, + ), + builder: (context, value, _) => + LinearProgressIndicator( + value: value, + )), ], ), ), @@ -118,8 +126,7 @@ class DownloadQueueScreen extends ConsumerWidget { await Future.delayed( const Duration(seconds: 1)); ref.watch(hiveBoxMangaDownloadsProvider).delete( - element.modelManga - .chapters![element.index].name, + "${element.modelManga.chapters![element.index].name}${element.index}", ); }); }