@bililive-tools/manager
Version:
Batch scheduling recorders
83 lines (82 loc) • 2.73 kB
JavaScript
import { FFmpegDownloader } from "./FFmpegDownloader.js";
import { mesioDownloader } from "./mesioDownloader.js";
import { BililiveDownloader } from "./BililiveDownloader.js";
import { parseSizeToBytes } from "../utils.js";
export { FFmpegDownloader } from "./FFmpegDownloader.js";
export { mesioDownloader } from "./mesioDownloader.js";
export { BililiveDownloader } from "./BililiveDownloader.js";
export const DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36";
/**
* 创建录制器的工厂函数
*/
export function createBaseDownloader(type, opts, onEnd, onUpdateLiveInfo) {
const segment = parseSizeToBytes(String(opts.segment));
const newOpts = { ...opts, segment };
if (type === "ffmpeg") {
return new FFmpegDownloader(newOpts, onEnd, onUpdateLiveInfo);
}
else if (type === "mesio") {
return new mesioDownloader(newOpts, onEnd, onUpdateLiveInfo);
}
else if (type === "bililive") {
if (opts.formatName === "flv") {
// 录播姬引擎不支持只录音频
if (!opts.onlyAudio) {
return new BililiveDownloader(newOpts, onEnd, onUpdateLiveInfo);
}
}
return new FFmpegDownloader(newOpts, onEnd, onUpdateLiveInfo);
}
else {
throw new Error(`Unsupported recorder type: ${type}`);
}
}
/**
* 选择录制器
*/
export function selectRecorder(preferredRecorder) {
let recorderType;
if (preferredRecorder === "auto") {
// 默认优先使用ffmpeg录制器
recorderType = "ffmpeg";
}
else if (preferredRecorder === "ffmpeg") {
recorderType = "ffmpeg";
}
else if (preferredRecorder === "mesio") {
recorderType = "mesio";
}
else if (preferredRecorder === "bililive") {
recorderType = "bililive";
}
else {
recorderType = "ffmpeg";
}
return recorderType;
}
/**
* 判断原始录制流格式,flv, ts, m4s
*/
export function getSourceFormatName(streamUrl, formatName) {
if (formatName) {
return formatName;
}
if (streamUrl.includes(".m3u8")) {
return "ts";
}
else if (streamUrl.includes(".m4s")) {
// TODO: 使用b站的流进行测试
return "fmp4";
}
else {
return "flv";
}
}
/**
* 创建录制器的工厂函数
*/
export function createDownloader(type, opts, onEnd, onUpdateLiveInfo) {
const recorderType = selectRecorder(type);
const sourceFormatName = getSourceFormatName(opts.url, opts.formatName);
return createBaseDownloader(recorderType, { ...opts, formatName: sourceFormatName }, onEnd, onUpdateLiveInfo);
}