@bililive-tools/manager
Version:
Batch scheduling recorders
144 lines (143 loc) • 7.27 kB
TypeScript
import { DebouncedFunc } from "lodash-es";
import type { Recorder } from "./recorder.js";
export type AnyObject = Record<string, any>;
export type UnknownObject = Record<string, unknown>;
export type PickRequired<T, K extends keyof T> = T & Pick<Required<T>, K>;
export declare function asyncThrottle(fn: () => Promise<void>, time: number, opts?: {
immediateRunWhenEndOfDefer?: boolean;
}): DebouncedFunc<() => void>;
export declare function replaceExtName(filePath: string, newExtName: string): string;
/**
* 接收 fn ,返回一个和 fn 签名一致的函数 fn'。当已经有一个 fn' 在运行时,再调用
* fn' 会直接返回运行中 fn' 的 Promise,直到 Promise 结束 pending 状态
*/
export declare function singleton<Fn extends (...args: any) => Promise<any>>(fn: Fn): Fn;
/**
* 从数组中按照特定算法提取一些值(允许同个索引重复提取)。
* 算法的行为类似 flex 的 space-between。
*
* examples:
* ```
* console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 1))
* // [1]
* console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 3))
* // [1, 4, 7]
* console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 4))
* // [1, 3, 5, 7]
* console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 11))
* // [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7]
* ```
*/
export declare function getValuesFromArrayLikeFlexSpaceBetween<T>(array: T[], columnCount: number): T[];
export declare function ensureFolderExist(fileOrFolderPath: string): void;
export declare function assert(assertion: unknown, msg?: string): asserts assertion;
export declare function assertStringType(data: unknown, msg?: string): asserts data is string;
export declare function assertNumberType(data: unknown, msg?: string): asserts data is number;
export declare function assertObjectType(data: unknown, msg?: string): asserts data is object;
export declare function formatDate(date: Date, format: string): string;
export declare function removeSystemReservedChars(str: string): string;
export declare function isFfmpegStartSegment(line: string): boolean;
export declare function isMesioStartSegment(line: string): boolean;
export declare function isBililiveStartSegment(line: string): boolean;
export declare function isFfmpegStart(line: string): boolean;
export declare function cleanTerminalText(text: string): string;
export declare const formatTemplate: (string: string, ...args: any[]) => string;
/**
* 检查ffmpeg无效流
* @param count 连续多少次帧数不变就判定为无效流
* @returns
* "receive repart stream": b站最后的无限流
* "receive invalid aac stream": ADTS无法被解析的flv流
* "invalid stream": 一段时间内帧数不变
*/
export declare function createFFmpegInvalidStreamChecker(count?: number): (ffmpegLogLine: string) => [boolean, string];
export declare function createTimeoutChecker(onTimeout: () => void, time: number, autoStart?: boolean): {
update: () => void;
stop: () => void;
start: () => void;
};
export declare function downloadImage(imageUrl: string, savePath: string): Promise<void>;
/**
* 根据指定的顺序对对象数组进行排序
* @param objects 要排序的对象数组
* @param order 指定的顺序
* @param key 用于排序的键
* @returns 排序后的对象数组
*/
export declare function sortByKeyOrder<T, K extends keyof T>(objects: T[], order: T[K][], key: K): T[];
/**
* 重试执行异步函数
* @param fn 要重试的异步函数
* @param retries 重试次数,默认为3次
* @param delay 重试延迟时间(毫秒),默认为1000ms
* @returns Promise
*/
export declare function retry<T>(fn: () => Promise<T>, retries?: number, delay?: number): Promise<T>;
export declare const isBetweenTimeRange: (range: undefined | [] | [string | null, string | null]) => boolean;
export declare const sleep: (ms: number) => Promise<unknown>;
/**
* 判断是否应该使用严格画质模式
* @param qualityRetryLeft 剩余的画质重试次数
* @param qualityRetry 初始画质重试次数配置
* @param isManualStart 是否手动启动
* @returns 是否使用严格画质模式
*/
export declare function shouldUseStrictQuality(qualityRetryLeft: number, qualityRetry: number, isManualStart?: boolean): boolean;
/**
* 检查标题是否包含黑名单关键词
* @param title 直播间标题
* @param titleKeywords 关键词配置,支持两种格式:
* 1. 逗号分隔的关键词:'关键词1,关键词2,关键词3'
* 2. 正则表达式:'/pattern/flags'(如:'/回放|录播/i')
* @returns 如果标题包含关键词返回 true,否则返回 false
*/
declare function hasBlockedTitleKeywords(title: string, titleKeywords: string | undefined): boolean;
/**
* 检查是否需要进行标题关键词检查
*/
declare function shouldCheckTitleKeywords(isManualStart: boolean | undefined, titleKeywords: string | undefined): boolean;
/**
* 逆向格式化"xxxB", "xxxKB", "xxxMB", "xxxGB"为字节数,如果值为空返回0,如果为数字则直接返回数字,如果带单位则转换为字节数
* @param sizeStr 大小字符串
* @returns 字节数
*/
export declare function parseSizeToBytes(sizeStr: string): number | string;
export declare const byte2MB: (bytes: number) => number;
export declare function checkTitleKeywordsWhileRecording(recorder: Recorder, isManualStart: boolean | undefined, getInfo: (channelId: string) => Promise<{
title: string;
}>): Promise<boolean>;
/**
* 检查开始录制前的标题关键词
* @param title 直播间标题
* @param recorder 录制器实例
* @param isManualStart 是否手动启动
* @returns 如果标题包含关键词返回 true(不应录制),否则返回 false
*/
export declare function checkTitleKeywordsBeforeRecord(title: string, recorder: Recorder, isManualStart: boolean | undefined): boolean;
declare const _default: {
replaceExtName: typeof replaceExtName;
singleton: typeof singleton;
getValuesFromArrayLikeFlexSpaceBetween: typeof getValuesFromArrayLikeFlexSpaceBetween;
ensureFolderExist: typeof ensureFolderExist;
assert: typeof assert;
assertStringType: typeof assertStringType;
assertNumberType: typeof assertNumberType;
assertObjectType: typeof assertObjectType;
asyncThrottle: typeof asyncThrottle;
isFfmpegStartSegment: typeof isFfmpegStartSegment;
createFFmpegInvalidStreamChecker: typeof createFFmpegInvalidStreamChecker;
createTimeoutChecker: typeof createTimeoutChecker;
downloadImage: typeof downloadImage;
md5: (str: string) => string;
uuid: () => `${string}-${string}-${string}-${string}-${string}`;
sortByKeyOrder: typeof sortByKeyOrder;
retry: typeof retry;
isBetweenTimeRange: (range: undefined | [] | [string | null, string | null]) => boolean;
hasBlockedTitleKeywords: typeof hasBlockedTitleKeywords;
shouldCheckTitleKeywords: typeof shouldCheckTitleKeywords;
shouldUseStrictQuality: typeof shouldUseStrictQuality;
sleep: (ms: number) => Promise<unknown>;
checkTitleKeywordsWhileRecording: typeof checkTitleKeywordsWhileRecording;
checkTitleKeywordsBeforeRecord: typeof checkTitleKeywordsBeforeRecord;
};
export default _default;