Skip to content

Commit

Permalink
wip: 改进失败重试的执行逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
renxia committed Jul 4, 2023
1 parent 1ad2ca7 commit 72058ba
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 32 deletions.
4 changes: 2 additions & 2 deletions src/lib/m3u8-download.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions src/lib/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
/** 播放地址缓存 */
Expand All @@ -24,8 +24,8 @@ export interface M3u8StorConfig extends VSOptions {
/** 最近一次搜索下载的信息缓存 */
latestSearchDL?: {
keyword: string;
name: string;
urls: string[];
info: VideoDetails;
dlOptions: M3u8DLOptions;
};
}
Expand Down
57 changes: 31 additions & 26 deletions src/lib/video-search.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -150,18 +150,42 @@ export async function VideoSerachAndDL(
baseOpts: CliOptions
): Promise<void> {
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();
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/m3u8-batch-download.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ async function formatUrls(urls: string[], options: M3u8DLOptions): Promise<Map<s
export async function m3u8BatchDownload(urls: string[], options: M3u8DLOptions) {
const tasks = await formatUrls(urls, options);

return new Promise<void>(rs => {
return new Promise<boolean>(rs => {
let preDLing = false;
const run = async () => {
const [key, keyNext] = [...tasks.keys()];
Expand All @@ -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()));
}
};

Expand Down

0 comments on commit 72058ba

Please sign in to comment.