UNPKG

@lzwme/m3u8-dl

Version:

Batch download of m3u8 files and convert to mp4

90 lines (89 loc) 3.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.apiManage = void 0; const enquirer_1 = require("enquirer"); const utils_1 = require("../utils"); const CommSearchApi_1 = require("./CommSearchApi"); exports.apiManage = { api: new Map(), current: null, load(apidir, force = false) { const files = (0, utils_1.findFiles)(apidir, (filepath, s) => !s.isFile() || /\.c?js/.test(filepath)); for (const filepath of files) { const sApi = require(filepath); this.add(sApi.default || sApi, force); } }, /** 添加 API 到列表中 */ add(sApi, force = false) { if (Array.isArray(sApi)) return sApi.forEach(d => this.add(d)); if (sApi.api?.startsWith('http') && !('search' in sApi)) sApi = new CommSearchApi_1.CommSearchApi(sApi); if (this.validate(sApi) && (force || !this.api.has(sApi.key))) { this.api.set(sApi.key, sApi); utils_1.logger.debug('添加Api:', sApi.desc || sApi.key); } }, /** API 有效性校验 */ validate(sApi, desc) { if (!sApi) return false; const requiredKeys = ['enable', 'key', 'search', 'detail']; if (!sApi.key) sApi.key = sApi.desc; for (const key of requiredKeys) { if (!(key in sApi)) { utils_1.logger.warn(`【API校验不通过】${desc} 缺少关键属性 ${key}`); return false; } if ((key === 'search' || key === 'detail') && typeof sApi[key] !== 'function') return false; } return sApi.enable !== false; }, /** 选择一个 API */ async select() { if (!this.api.size) { utils_1.logger.error('没有可用的 API,请配置或指定 url、apidir 参数'); process.exit(-1); } if (this.api.size === 1) { this.current = [...this.api.values()][0]; return; } const apis = [...this.api.values()]; const v = await (0, enquirer_1.prompt)({ type: 'select', name: 'k', message: '请选择 API 站点', choices: apis.map(d => ({ name: String(d.key), message: d.desc })), validate: value => value.length >= 1, }); this.current = apis.find(d => String(d.key) === v.k); }, async search(wd, api) { const result = []; try { if (api) return (await api.search(wd)).list; for (api of this.api.values()) { const r = await api.search(wd); if (Array.isArray(r.list)) { r.list.forEach(d => { d.api_key = api.key; result.push(d); }); } } } catch (error) { utils_1.logger.error('搜索失败!', error.message); } return result; }, detail(info) { const api = this.api.get(info.api_key) || this.current; return api.detail(info.vod_id); }, };