limited the amount of downloading operations

+ fixed failed downloads caused by spaces in file path
This commit is contained in:
Schnitzel5 2025-05-02 02:10:57 +02:00
parent cc5bb1cd2a
commit e2a862d30b
6 changed files with 70 additions and 33 deletions

View file

@ -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());
}
},
),

View file

@ -1110,7 +1110,7 @@ class _ChapterSetIsReadStateProviderElement
}
String _$chapterSetDownloadStateHash() =>
r'321f00669a4644016076dcf5e007355d696d26e3';
r'2f35d274b76e28376b0089b2f6ee6d9d7ebcbeec';
abstract class _$ChapterSetDownloadState
extends BuildlessAutoDisposeNotifier<void> {

View file

@ -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++;

View file

@ -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)

View file

@ -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(

View file

@ -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(),
),
);
}