@lzwme/m3u8-dl
Version:
Batch download of m3u8 files and convert to mp4
66 lines (65 loc) • 2.79 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.m3u8BatchDownload = m3u8BatchDownload;
const node_fs_1 = require("node:fs");
const node_path_1 = require("node:path");
const m3u8_download_1 = require("./lib/m3u8-download");
const utils_1 = require("./lib/utils");
async function formatUrls(urls, options) {
const taskset = new Map();
for (const url of urls) {
if (!url)
continue;
if ((0, node_fs_1.existsSync)(url)) {
const content = await node_fs_1.promises.readFile(url, 'utf8');
if (content.includes('.m3u8')) {
const list = content
.split('\n')
.filter(d => d.includes('.m3u8'))
.map((href, idx) => {
if (href.startsWith('http'))
href = `${idx}|${href}`;
return href;
});
const o = { ...options };
if (!o.filename)
o.filename = (0, node_path_1.basename)(url).split('.')[0];
const t = await formatUrls(list, o);
for (const d of t.entries())
taskset.set(d[0], d[1]);
continue;
}
}
taskset.set(url, options);
}
return taskset;
}
async function m3u8BatchDownload(urls, options) {
const tasks = await formatUrls(urls, options);
return new Promise(rs => {
let preDLing = false;
const run = () => {
const [key, keyNext] = [...tasks.keys()];
if (key) {
const o = { ...tasks.get(key) };
tasks.delete(key);
const p = o.onProgress;
o.onProgress = (finished, total, info) => {
if (p)
p(finished, total, info);
if (!preDLing && keyNext && tasks.size && m3u8_download_1.workPoll.freeNum > 1 && total - finished < options.threadNum) {
utils_1.logger.debug('\n[预下载下一集]', 'freeNum:', m3u8_download_1.workPoll.freeNum, 'totalNum:', m3u8_download_1.workPoll.totalNum, 'totalTask:', m3u8_download_1.workPoll.totalTask, tasks.size);
preDLing = true;
(0, m3u8_download_1.preDownLoad)(keyNext, options).then(() => (preDLing = false));
}
};
(0, m3u8_download_1.m3u8Download)(key, o).then(r => (tasks.size === 0 ? rs((0, node_fs_1.existsSync)(r.filepath)) : run()));
}
};
run();
}).then(d => {
if (m3u8_download_1.workPoll.freeNum === m3u8_download_1.workPoll.numThreads)
m3u8_download_1.workPoll.close();
return d;
});
}
;