From 72058ba5c739d3dcb20672cd1ec056b1267161e1 Mon Sep 17 00:00:00 2001 From: renxia Date: Tue, 4 Jul 2023 16:44:47 +0800 Subject: [PATCH] =?UTF-8?q?wip:=20=E6=94=B9=E8=BF=9B=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E7=9A=84=E6=89=A7=E8=A1=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/m3u8-download.ts | 4 +-- src/lib/storage.ts | 4 +-- src/lib/video-search.ts | 57 +++++++++++++++++++++----------------- src/m3u8-batch-download.ts | 4 +-- 4 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/lib/m3u8-download.ts b/src/lib/m3u8-download.ts index fa5a916..c470442 100644 --- a/src/lib/m3u8-download.ts +++ b/src/lib/m3u8-download.ts @@ -67,7 +67,7 @@ async function m3u8InfoParse(url: string, options: M3u8DLOptions = {}) { if (!options.force && existsSync(filepath)) return result; - const m3u8Info = await parseM3U8('', url, options.cacheDir).catch(e => logger.error(e)); + const m3u8Info = await parseM3U8('', url, options.cacheDir).catch(e => logger.error('[parseM3U8][failed]', e)); if (m3u8Info && m3u8Info?.tsCount > 0) result.m3u8Info = m3u8Info; return result; @@ -191,7 +191,7 @@ export async function m3u8Download(url: string, options: M3u8DLOptions = {}) { result.filepath = await m3u8Convert(options, m3u8Info.data); if (result.filepath && existsSync(options.cacheDir) && options.delCache) rmrfAsync(options.cacheDir); - } else logger.debug('Download Failed! Please retry!', stats.tsFailed); + } else logger.warn('Download Failed! Please retry!', stats.tsFailed); } logger.debug('Done!', url, result.m3u8Info); return result; diff --git a/src/lib/storage.ts b/src/lib/storage.ts index cf8d774..da04f3c 100644 --- a/src/lib/storage.ts +++ b/src/lib/storage.ts @@ -2,7 +2,7 @@ import { LiteStorage } from '@lzwme/fe-utils'; import { resolve } from 'node:path'; import { homedir } from 'node:os'; import { type VSOptions } from './video-search'; -import type { M3u8DLOptions } from '../types'; +import type { M3u8DLOptions, VideoDetails } from '../types'; export interface M3u8StorConfig extends VSOptions { /** 播放地址缓存 */ @@ -24,8 +24,8 @@ export interface M3u8StorConfig extends VSOptions { /** 最近一次搜索下载的信息缓存 */ latestSearchDL?: { keyword: string; - name: string; urls: string[]; + info: VideoDetails; dlOptions: M3u8DLOptions; }; } diff --git a/src/lib/video-search.ts b/src/lib/video-search.ts index 792d510..673d7d3 100644 --- a/src/lib/video-search.ts +++ b/src/lib/video-search.ts @@ -1,5 +1,5 @@ import { Request } from '@lzwme/fe-utils'; -import type { VideoListResult, VideoSearchResult, CliOptions } from '../types'; +import type { VideoListResult, VideoSearchResult, CliOptions, VideoDetails } from '../types'; import { stor, type M3u8StorConfig } from './storage.js'; import { logger } from './utils.js'; import { m3u8BatchDownload } from '../m3u8-batch-download.js'; @@ -150,18 +150,42 @@ export async function VideoSerachAndDL( baseOpts: CliOptions ): Promise { const cache = stor.get(); - if (cache.latestSearchDL?.keyword) { + const doDownload = async (info: VideoDetails, urls: string[]) => { + const p = await prompt<{ play: boolean }>({ + type: 'confirm', + name: 'play', + initial: baseOpts.play, + message: `【${greenBright(info.vod_name)}】是否边下边播?`, + }); + baseOpts.play = p.play; + try { + cache.latestSearchDL = { + ...cache.latestSearchDL, + info, + urls, + dlOptions: { filename: info.vod_name.replaceAll(' ', '_'), ...baseOpts }, + }; + stor.save({ latestSearchDL: cache.latestSearchDL }); + const r = await m3u8BatchDownload(cache.latestSearchDL.urls, cache.latestSearchDL.dlOptions); + if (r) stor.set({ latestSearchDL: null }); + } catch (error) { + logger.info('cachel download'); + } + }; + + if (cache.latestSearchDL?.urls) { const p = await prompt<{ k: boolean }>({ type: 'confirm', name: 'k', - initial: baseOpts.play, - message: `存在上次未完成的下载【${greenBright(cache.latestSearchDL.name)}】,是否继续?`, + initial: true, + message: `存在上次未完成的下载【${greenBright(cache.latestSearchDL.info.vod_name)}】,是否继续?`, }); if (p.k) { - await m3u8BatchDownload(cache.latestSearchDL.urls, cache.latestSearchDL.dlOptions); + await doDownload(cache.latestSearchDL.info, cache.latestSearchDL.urls); + } else { + stor.set({ latestSearchDL: null }); } - stor.set({ latestSearchDL: null }); } const vs = new VideoSearch(); @@ -254,26 +278,7 @@ export async function VideoSerachAndDL( }); if (answer.url !== '-1') { - const p = await prompt<{ play: boolean }>({ - type: 'confirm', - name: 'play', - initial: baseOpts.play, - message: `【${greenBright(info.vod_name)}】是否边下边播?`, - }); - baseOpts.play = p.play; - try { - cache.latestSearchDL = { - keyword, - name: info.vod_name, - urls: answer.url === '1' ? urls : [answer.url], - dlOptions: { filename: info.vod_name.replaceAll(' ', '_'), ...baseOpts }, - }; - stor.save({ latestSearchDL: cache.latestSearchDL }); - await m3u8BatchDownload(cache.latestSearchDL.urls, cache.latestSearchDL.dlOptions); - stor.set({ latestSearchDL: null }); - } catch (error) { - logger.info('cachel download'); - } + await doDownload(info, answer.url === '1' ? urls : [answer.url]); } return VideoSerachAndDL(keyword, options, baseOpts); diff --git a/src/m3u8-batch-download.ts b/src/m3u8-batch-download.ts index ced4b96..87f7e1c 100644 --- a/src/m3u8-batch-download.ts +++ b/src/m3u8-batch-download.ts @@ -35,7 +35,7 @@ async function formatUrls(urls: string[], options: M3u8DLOptions): Promise(rs => { + return new Promise(rs => { let preDLing = false; const run = async () => { const [key, keyNext] = [...tasks.keys()]; @@ -62,7 +62,7 @@ export async function m3u8BatchDownload(urls: string[], options: M3u8DLOptions) } }; - m3u8Download(key, o).then(() => (tasks.size === 0 ? rs() : run())); + m3u8Download(key, o).then(r => (tasks.size === 0 ? rs(existsSync(r.filepath)) : run())); } };