UNPKG

@bililive-tools/manager

Version:
83 lines (82 loc) 2.73 kB
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); }