UNPKG

@bililive-tools/manager

Version:
144 lines (143 loc) 7.27 kB
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;