@bililive-tools/manager
Version:
Batch scheduling recorders
99 lines (98 loc) • 4.44 kB
TypeScript
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 };