import { Emitter } from "mitt";
import { ChannelId, Message } from "./common.js";
import { RecorderCreateOpts, Recorder, SerializedRecorder, RecordHandle, DebugLog, Progress } from "./recorder.js";
import { AnyObject, UnknownObject } from "./utils.js";
import { StreamManager } from "./streamManager.js";
export interface RecorderProvider<E extends AnyObject> {
    id: string;
    name: string;
    siteURL: string;
    matchURL: (this: RecorderProvider<E>, channelURL: string) => boolean;
    resolveChannelInfoFromURL: (this: RecorderProvider<E>, channelURL: string) => Promise<{
        id: ChannelId;
        title: string;
        owner: string;
        uid?: number;
    } | null>;
    createRecorder: (this: RecorderProvider<E>, opts: Omit<RecorderCreateOpts<E>, "providerId">) => Recorder<E>;
    fromJSON: <T extends SerializedRecorder<E>>(this: RecorderProvider<E>, json: T) => Recorder<E>;
    setFFMPEGOutputArgs: (this: RecorderProvider<E>, args: string[]) => void;
}
declare const configurableProps: readonly ["savePathRule", "autoRemoveSystemReservedChars", "autoCheckInterval", "ffmpegOutputArgs", "biliBatchQuery"];
type ConfigurableProp = (typeof configurableProps)[number];
export interface RecorderManager<ME extends UnknownObject, P extends RecorderProvider<AnyObject> = RecorderProvider<UnknownObject>, PE extends AnyObject = GetProviderExtra<P>, E extends AnyObject = ME & PE> extends Emitter<{
    error: {
        source: string;
        err: unknown;
    };
    RecordStart: {
        recorder: Recorder<E>;
        recordHandle: RecordHandle;
    };
    RecordSegment: {
        recorder: Recorder<E>;
        recordHandle?: RecordHandle;
    };
    videoFileCreated: {
        recorder: Recorder<E>;
        filename: string;
    };
    videoFileCompleted: {
        recorder: Recorder<E>;
        filename: string;
    };
    RecorderProgress: {
        recorder: Recorder<E>;
        progress: Progress;
    };
    RecoderLiveStart: {
        recorder: Recorder<E>;
    };
    RecordStop: {
        recorder: Recorder<E>;
        recordHandle: RecordHandle;
        reason?: string;
    };
    Message: {
        recorder: Recorder<E>;
        message: Message;
    };
    RecorderUpdated: {
        recorder: Recorder<E>;
        keys: (string | keyof Recorder<E>)[];
    };
    RecorderAdded: Recorder<E>;
    RecorderRemoved: Recorder<E>;
    RecorderDebugLog: DebugLog & {
        recorder: Recorder<E>;
    };
    Updated: ConfigurableProp[];
}> {
    providers: P[];
    getChannelURLMatchedRecorderProviders: (this: RecorderManager<ME, P, PE, E>, channelURL: string) => P[];
    recorders: Recorder<E>[];
    addRecorder: (this: RecorderManager<ME, P, PE, E>, opts: RecorderCreateOpts<E>) => Recorder<E>;
    removeRecorder: (this: RecorderManager<ME, P, PE, E>, recorder: Recorder<E>) => void;
    startRecord: (this: RecorderManager<ME, P, PE, E>, id: string) => Promise<Recorder<E> | undefined>;
    stopRecord: (this: RecorderManager<ME, P, PE, E>, id: string) => Promise<Recorder<E> | undefined>;
    autoCheckInterval: number;
    isCheckLoopRunning: boolean;
    startCheckLoop: (this: RecorderManager<ME, P, PE, E>) => void;
    stopCheckLoop: (this: RecorderManager<ME, P, PE, E>) => void;
    savePathRule: string;
    autoRemoveSystemReservedChars: boolean;
    ffmpegOutputArgs: string;
    /** b站使用批量查询接口 */
    biliBatchQuery: boolean;
}
export type RecorderManagerCreateOpts<ME extends AnyObject = UnknownObject, P extends RecorderProvider<AnyObject> = RecorderProvider<UnknownObject>, PE extends AnyObject = GetProviderExtra<P>, E extends AnyObject = ME & PE> = Partial<Pick<RecorderManager<ME, P, PE, E>, ConfigurableProp>> & {
    providers: P[];
};
export declare function createRecorderManager<ME extends AnyObject = UnknownObject, P extends RecorderProvider<AnyObject> = RecorderProvider<UnknownObject>, PE extends AnyObject = GetProviderExtra<P>, E extends AnyObject = ME & PE>(opts: RecorderManagerCreateOpts<ME, P, PE, E>): RecorderManager<ME, P, PE, E>;
export declare function genSavePathFromRule<ME extends AnyObject, P extends RecorderProvider<AnyObject>, PE extends AnyObject, E extends AnyObject>(manager: RecorderManager<ME, P, PE, E>, recorder: Recorder<E>, extData: {
    owner: string;
    title: string;
    startTime?: number;
}): string;
export type GetProviderExtra<P> = P extends RecorderProvider<infer E> ? E : never;
export { StreamManager };
