///
import { EventEmitter } from "events";
import FileConcentrator, { TaskStatus } from "./file_concentrator";
import { M3U8Chunk, Playlist } from "./m3u8";
import type { ActionType } from "./action";
import { NamingStrategy } from "./types";
export interface DownloaderConfig {
threads?: number;
output?: string;
tempDir?: string;
key?: string;
verbose?: boolean;
cookies?: string;
headers?: string | string[];
retries?: number;
proxy?: string;
format?: string;
noMerge?: boolean;
keep?: boolean;
keepEncryptedChunks?: boolean;
chunkNamingStrategy?: NamingStrategy;
cliMode?: boolean;
}
export interface ArchiveDownloaderConfig extends DownloaderConfig {
slice?: string;
}
export interface LiveDownloaderConfig extends DownloaderConfig {
}
export interface DownloadTask {
id: number;
filename: string;
parentGroup?: DownloadTaskGroup;
retryCount: number;
chunk: M3U8Chunk;
}
export interface DownloadTaskGroupAction {
actionName: ActionType;
actionParams: string;
}
export interface DownloadTaskGroup {
subTasks: DownloadTask[];
actions?: DownloadTaskGroupAction[];
isFinished: boolean;
isNew: boolean;
retryActions?: boolean;
}
export type DownloadTaskItem = DownloadTask | DownloadTaskGroup;
export interface OnKeyUpdatedParams {
keyUrls: string[];
m3u8Url: string;
explicitKeys: string[];
saveEncryptionKey: (url: string, key: string) => void;
}
export declare function isTaskGroup(c: DownloadTaskItem): c is DownloadTaskGroup;
declare class Downloader extends EventEmitter {
cliMode: boolean;
/** 临时文件目录 */
tempPath: string;
/** m3u8文件路径 */
m3u8Path: string;
/** M3U8 Playlist */
m3u8: Playlist;
/** 输出目录 */
outputPath: string;
/** 输出文件列表 */
outputFileList: string[];
/** 并发数量 */
threads: number;
downloadTasks: DownloadTaskItem[];
allDownloadTasks: DownloadTaskItem[];
/** Cookies */
cookies: string;
/** HTTP Headers */
headers: Record;
key: string;
/** 是否打印调试信息 */
verbose: boolean;
/** 输出格式 */
format: string;
noMerge: boolean;
/** 开始下载时间 */
startedAt: number;
/** 块总长度 */
totalChunkLength: number;
/** 已完成的块数量 */
finishedChunkCount: number;
/** 已完成的块总长度 */
finishedChunkLength: number;
/** 重试数量 */
retries: number;
/** 超时时间 */
timeout: number;
/** 块超时时间 */
chunkTimeout: number;
proxy: string;
autoGenerateChunkList: boolean;
encryptionKeys: {};
keepTemporaryFiles: boolean;
keepEncryptedChunks: boolean;
chunkNamingStrategy: NamingStrategy;
fileConcentrator: FileConcentrator;
taskStatusRecord: TaskStatus[];
_internal_dropChunksInArchiveMode: boolean;
protected onKeyUpdated({ keyUrls, explicitKeys, saveEncryptionKey }: OnKeyUpdatedParams): Promise;
protected onTaskOutputFileNaming(chunk: M3U8Chunk, id: number): string;
constructor(m3u8Path: string, { threads, output, key, verbose, retries, proxy, format, cookies, headers, noMerge, cliMode, keep, keepEncryptedChunks, chunkNamingStrategy, tempDir, }?: DownloaderConfig);
/**
* 初始化 读取m3u8内容
*/
init(): Promise;
loadM3U8(): Promise;
checkKeys(): Promise;
/**
* 退出前的清理工作
*/
clean(): Promise;
/**
* 处理块下载任务
* @param task 块下载任务
*/
handleTask(task: DownloadTask): Promise;
handleChunkGroupAction(action: DownloadTaskGroupAction): Promise;
/**
* ======================
* Some hooks for parsers
* ======================
*/
saveEncryptionKey(url: string, key: string): void;
getEncryptionKey(url: string): any;
setOnKeyUpdated(handler: (params: OnKeyUpdatedParams) => Promise): void;
/**
* 计算以块计算的下载速度
*/
calculateSpeedByChunk(): string;
/**
* 计算以视频长度为基准下载速度倍率
*/
calculateSpeedByRatio(): string;
setOnTaskOutputFileNaming(namingFunction: (chunk: M3U8Chunk, id: number) => string): void;
}
export default Downloader;