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;
