mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-03-11 17:25:32 +00:00
limited the amount of downloading operations
+ fixed failed downloads caused by spaces in file path
This commit is contained in:
parent
cc5bb1cd2a
commit
e2a862d30b
6 changed files with 70 additions and 33 deletions
|
|
@ -160,6 +160,38 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
);
|
||||
}
|
||||
|
||||
List<Chapter> _getFilteredAndSortedChapters() {
|
||||
final filterScanlator = ref.read(
|
||||
scanlatorsFilterStateProvider(widget.manga!),
|
||||
);
|
||||
final filterUnread = ref.read(
|
||||
chapterFilterUnreadStateProvider(mangaId: widget.manga!.id!),
|
||||
);
|
||||
final filterBookmarked = ref.read(
|
||||
chapterFilterBookmarkedStateProvider(mangaId: widget.manga!.id!),
|
||||
);
|
||||
final filterDownloaded = ref.read(
|
||||
chapterFilterDownloadedStateProvider(mangaId: widget.manga!.id!),
|
||||
);
|
||||
final sortChapter =
|
||||
ref.read(sortChapterStateProvider(mangaId: widget.manga!.id!)).index
|
||||
as int;
|
||||
final chapters =
|
||||
isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.mangaIdEqualTo(widget.manga!.id!)
|
||||
.findAllSync();
|
||||
return _filterAndSortChapter(
|
||||
data: chapters,
|
||||
filterUnread: filterUnread,
|
||||
filterBookmarked: filterBookmarked,
|
||||
filterDownloaded: filterDownloaded,
|
||||
sortChapter: sortChapter,
|
||||
filterScanlator: filterScanlator.$2,
|
||||
);
|
||||
}
|
||||
|
||||
List<Chapter> _filterAndSortChapter({
|
||||
required List<Chapter> data,
|
||||
required int filterUnread,
|
||||
|
|
@ -454,12 +486,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
];
|
||||
},
|
||||
onSelected: (value) {
|
||||
final chapters =
|
||||
isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.mangaIdEqualTo(widget.manga!.id!)
|
||||
.findAllSync();
|
||||
final chapters = _getFilteredAndSortedChapters();
|
||||
if (value == 0 ||
|
||||
value == 1 ||
|
||||
value == 2 ||
|
||||
|
|
@ -482,6 +509,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
chapter: chapter,
|
||||
),
|
||||
);
|
||||
ref.watch(processDownloadsProvider());
|
||||
}
|
||||
} else {
|
||||
final length = switch (value) {
|
||||
|
|
@ -512,15 +540,22 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
}
|
||||
}
|
||||
}
|
||||
ref.watch(processDownloadsProvider());
|
||||
}
|
||||
} else if (value == 4) {
|
||||
final unreadChapters =
|
||||
isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.mangaIdEqualTo(widget.manga!.id!)
|
||||
.isReadEqualTo(false)
|
||||
.findAllSync();
|
||||
final List<Chapter> unreadChapters =
|
||||
_getFilteredAndSortedChapters()
|
||||
.where(
|
||||
(element) =>
|
||||
!(element.isRead ?? false),
|
||||
)
|
||||
.toList();
|
||||
isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.mangaIdEqualTo(widget.manga!.id!)
|
||||
.isReadEqualTo(false)
|
||||
.findAllSync();
|
||||
for (var chapter in unreadChapters) {
|
||||
final entry =
|
||||
isar.downloads
|
||||
|
|
@ -535,13 +570,10 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
);
|
||||
}
|
||||
}
|
||||
ref.watch(processDownloadsProvider());
|
||||
} else if (value == 5) {
|
||||
final allChapters =
|
||||
isar.chapters
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.mangaIdEqualTo(widget.manga!.id!)
|
||||
.findAllSync();
|
||||
final List<Chapter> allChapters =
|
||||
_getFilteredAndSortedChapters();
|
||||
for (var chapter in allChapters) {
|
||||
final entry =
|
||||
isar.downloads
|
||||
|
|
@ -556,6 +588,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
|||
);
|
||||
}
|
||||
}
|
||||
ref.watch(processDownloadsProvider());
|
||||
}
|
||||
},
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1110,7 +1110,7 @@ class _ChapterSetIsReadStateProviderElement
|
|||
}
|
||||
|
||||
String _$chapterSetDownloadStateHash() =>
|
||||
r'321f00669a4644016076dcf5e007355d696d26e3';
|
||||
r'2f35d274b76e28376b0089b2f6ee6d9d7ebcbeec';
|
||||
|
||||
abstract class _$ChapterSetDownloadState
|
||||
extends BuildlessAutoDisposeNotifier<void> {
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import 'package:mangayomi/services/get_chapter_pages.dart';
|
|||
import 'package:mangayomi/services/http/m_client.dart';
|
||||
import 'package:mangayomi/services/download_manager/m3u8/m3u8_downloader.dart';
|
||||
import 'package:mangayomi/services/download_manager/m3u8/models/download.dart';
|
||||
import 'package:mangayomi/utils/extensions/chapter.dart';
|
||||
import 'package:mangayomi/utils/extensions/string_extensions.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/utils/reg_exp_matcher.dart';
|
||||
|
|
@ -383,9 +384,12 @@ Future<void> processDownloads(Ref ref, {bool? useWifi}) async {
|
|||
}
|
||||
if (current < maxConcurrentDownloads) {
|
||||
current++;
|
||||
final downloadItem = ongoingDownloads[index++];
|
||||
final chapter = downloadItem.chapter.value!;
|
||||
chapter.cancelDownloads(downloadItem.id);
|
||||
ref.read(
|
||||
downloadChapterProvider(
|
||||
chapter: ongoingDownloads[index++].chapter.value!,
|
||||
chapter: chapter,
|
||||
useWifi: useWifi,
|
||||
callback: () {
|
||||
downloaded++;
|
||||
|
|
|
|||
|
|
@ -321,7 +321,7 @@ class _DownloadChapterProviderElement
|
|||
void Function()? get callback => (origin as DownloadChapterProvider).callback;
|
||||
}
|
||||
|
||||
String _$processDownloadsHash() => r'6204b2ae0394c2b422ab3b5cd2eaaaa822a59ee1';
|
||||
String _$processDownloadsHash() => r'ef5107f9674f2175a7aa18b8e4fc4555f3b6b584';
|
||||
|
||||
/// See also [processDownloads].
|
||||
@ProviderFor(processDownloads)
|
||||
|
|
|
|||
|
|
@ -18,16 +18,16 @@ class DownloadQueueScreen extends ConsumerWidget {
|
|||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final l10n = l10nLocalizations(context);
|
||||
return StreamBuilder(
|
||||
stream: isar.downloads.filter().idIsNotNull().watch(
|
||||
fireImmediately: true,
|
||||
),
|
||||
stream: isar.downloads
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.isDownloadEqualTo(false)
|
||||
.isStartDownloadEqualTo(true)
|
||||
.sortBySucceededDesc()
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
||||
final entries =
|
||||
snapshot.data!
|
||||
.where((element) => element.isDownload == false)
|
||||
.where((element) => element.isStartDownload == true)
|
||||
.toList();
|
||||
final entries = snapshot.data!;
|
||||
final allQueueLength = entries.toList().length;
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ class StorageProvider {
|
|||
'downloads',
|
||||
itemTypePath,
|
||||
'${manga.source} (${manga.lang!.toUpperCase()})',
|
||||
manga.name!.replaceForbiddenCharacters('_'),
|
||||
manga.name!.replaceForbiddenCharacters('_').trim(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
@ -107,12 +107,12 @@ class StorageProvider {
|
|||
final basedir = await getMangaMainDirectory(chapter);
|
||||
String scanlator =
|
||||
chapter.scanlator?.isNotEmpty ?? false
|
||||
? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_"
|
||||
? chapter.scanlator!.replaceForbiddenCharacters('_').trim()
|
||||
: "";
|
||||
return Directory(
|
||||
path.join(
|
||||
basedir!.path,
|
||||
scanlator + chapter.name!.replaceForbiddenCharacters('_'),
|
||||
scanlator + chapter.name!.replaceForbiddenCharacters('_').trim(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue