@lzwme/m3u8-dl
Version:
Batch download of m3u8 files and convert to mp4
90 lines (89 loc) • 3.17 kB
JavaScript
;
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);
},
};