From b1f97fdf69f03328055860b56ce75983c9ea744d Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 20 Apr 2024 02:40:10 +0200 Subject: [PATCH] Chapters download menu download ahead only if required Instead of checking if download ahead is required because not enough unread downloaded chapters existed, it just downloaded the next n unread undownloaded chapters --- .../ChaptersDownloadActionMenuItems.tsx | 5 +-- src/lib/data/Mangas.ts | 32 ++++++++++++------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/components/chapter/ChaptersDownloadActionMenuItems.tsx b/src/components/chapter/ChaptersDownloadActionMenuItems.tsx index 51029835..83c855d6 100644 --- a/src/components/chapter/ChaptersDownloadActionMenuItems.tsx +++ b/src/components/chapter/ChaptersDownloadActionMenuItems.tsx @@ -34,8 +34,9 @@ export const ChaptersDownloadActionMenuItems = ({ settings: { downloadAheadLimit }, } = useMetadataServerSettings(); - const handleSelect = (size?: number, onlyUnread: boolean = true) => { + const handleSelect = (size?: number, onlyUnread: boolean = true, downloadAhead: boolean = false) => { Mangas.performAction('download', mangaIds, { + downloadAhead, onlyUnread, size, }).catch(defaultPromiseErrorHandler('ChapterDownloadButton::handleSelect')); @@ -56,7 +57,7 @@ export const ChaptersDownloadActionMenuItems = ({ handleSelect(DownloadRange.NEXT_25)}> {t('chapter.action.download.add.label.next_twentyfive')} - handleSelect(downloadAheadLimit)}> + handleSelect(downloadAheadLimit, undefined, true)}> {t('chapter.action.download.add.label.ahead', { count: downloadAheadLimit })} handleSelect(DownloadRange.UNREAD)}> diff --git a/src/lib/data/Mangas.ts b/src/lib/data/Mangas.ts index caff090f..55b2469a 100644 --- a/src/lib/data/Mangas.ts +++ b/src/lib/data/Mangas.ts @@ -118,6 +118,7 @@ export type MigrateMode = 'copy' | 'migrate'; type DownloadChaptersOptions = { size?: number; onlyUnread?: boolean; + downloadAhead?: boolean; }; type MarkAsReadOptions = { wasManuallyMarkedAsRead: boolean }; type ChangeCategoriesOptions = { changeCategoriesPatch: UpdateMangaCategoriesPatchInput }; @@ -245,22 +246,28 @@ export class Mangas { static async downloadChapters( mangaIds: number[], - { size, onlyUnread }: DownloadChaptersOptions = {}, + { size, onlyUnread, downloadAhead = false }: DownloadChaptersOptions = {}, ): Promise { - const chapters = await Mangas.getChapterIdsWithState(mangaIds, { - isRead: onlyUnread ? false : undefined, - isDownloaded: false, - }); + const [unReadUnDownloadedChapters, unReadDownloadedChapters] = await Promise.all([ + Mangas.getChapterIdsWithState(mangaIds, { + isRead: onlyUnread ? false : undefined, + isDownloaded: false, + }), + downloadAhead ? Mangas.getChapterIdsWithState(mangaIds, { isRead: false, isDownloaded: true }) : [], + ]); - if (!chapters.length) { + const downloadAheadSize = Math.abs(unReadDownloadedChapters.length - (size ?? unReadDownloadedChapters.length)); + const actualSize = downloadAhead ? downloadAheadSize : size; + + const mangaIdToChapters = Object.groupBy(unReadUnDownloadedChapters, ({ mangaId }) => mangaId); + const chapterIdsToDownload = Object.values(mangaIdToChapters) + .map((mangaChapters) => mangaChapters!.slice(0, actualSize)) // the result of groupBy can't result in undefined values + .flat(); + + if (!chapterIdsToDownload.length) { return Promise.resolve(); } - const mangaIdToChapters = Object.groupBy(chapters, ({ mangaId }) => mangaId); - const chapterIdsToDownload = Object.values(mangaIdToChapters) - .map((mangaChapters) => mangaChapters!.slice(0, size)) // the result of groupBy can't result in undefined values - .flat(); - return Chapters.download(Chapters.getIds(chapterIdsToDownload)); } @@ -412,6 +419,7 @@ export class Mangas { wasManuallyMarkedAsRead, changeCategoriesPatch, mangaIdToMigrateTo, + downloadAhead, onlyUnread, size, ...migrateOptions @@ -419,7 +427,7 @@ export class Mangas { ): Promise { switch (action) { case 'download': - return Mangas.downloadChapters(mangaIds, { onlyUnread, size }); + return Mangas.downloadChapters(mangaIds, { downloadAhead, onlyUnread, size }); case 'delete': return Mangas.deleteChapters(mangaIds); case 'mark_as_read':