///
import http from "http";
import https from "https";
import { EventEmitter } from "events";
import { EncryptedM3U8Chunk, M3U8Chunk, Playlist } from "./m3u8";
import type { ActionType } from "./action";
export interface DownloaderConfig {
threads?: number;
output?: string;
tempBase?: string;
ffmpegBase?: string;
key?: string;
verbose?: boolean;
cookies?: string;
headers?: string | string[];
retries?: number;
format?: string;
nomerge?: boolean;
cliMode?: boolean;
}
export interface ArchiveDownloaderConfig extends DownloaderConfig {
slice?: string;
}
export interface Chunk {
url: string;
filename: string;
isEncrypted: boolean;
parentGroup?: ChunkGroup;
key?: string;
iv?: string;
length: number;
sequenceId?: number;
retryCount?: number;
}
export interface ChunkAction {
actionName: ActionType;
actionParams: string;
}
export interface ChunkGroup {
chunks: Chunk[];
actions?: ChunkAction[];
isFinished: boolean;
isNew: boolean;
retryActions?: boolean;
}
export declare type ChunkItem = Chunk | ChunkGroup;
export declare function isChunkGroup(c: ChunkItem): c is ChunkGroup;
declare class Downloader extends EventEmitter {
cliMode: boolean;
tempBase: string;
/** 临时文件目录 */
tempPath: string;
/** m3u8文件路径 */
m3u8Path: string;
/** M3U8 Playlist */
m3u8: Playlist;
/** 输出目录 */
outputPath: string;
/** 并发数量 */
threads: number;
ffmpegBase: string;
allChunks: ChunkItem[];
chunks: ChunkItem[];
pickedChunks: ChunkItem[];
/** Cookies */
cookies: string;
/** HTTP Headers */
headers: object;
key: string;
/** 是否打印调试信息 */
verbose: boolean;
/** 输出格式 */
format: string;
noMerge: boolean;
/** 开始下载时间 */
startedAt: number;
/** 块总长度 */
totalChunkLength: number;
/** 已完成的块数量 */
finishedChunkCount: number;
/** 已完成的块总长度 */
finishedChunkLength: number;
/** 下载错误数 */
errorCount: number;
/** 重试数量 */
retries: number;
/** 超时时间 */
timeout: number;
/** 块超时时间 */
chunkTimeout: number;
autoGenerateChunkList: boolean;
encryptionKeys: {};
httpAgent: http.Agent;
httpsAgent: https.Agent;
axiosInstance: import("axios").AxiosInstance;
protected onChunkNaming: (chunk: M3U8Chunk | EncryptedM3U8Chunk) => string;
constructor(m3u8Path: string, { threads, output, tempBase, key, verbose, retries, format, cookies, headers, nomerge, cliMode, }?: DownloaderConfig);
/**
* 初始化 读取m3u8内容
*/
init(): Promise;
loadM3U8(): Promise;
/**
* 处理块下载任务
* @param task 块下载任务
*/
handleTask(task: Chunk): Promise;
handleChunkGroupAction(action: ChunkAction): Promise;
/**
* ======================
* Some hooks for parsers
* ======================
*/
saveEncryptionKey(url: string, key: string): void;
getEncryptionKey(url: string): any;
setOnChunkNaming(handler: (chunk: M3U8Chunk | EncryptedM3U8Chunk) => string): void;
/**
* 计算以块计算的下载速度
*/
calculateSpeedByChunk(): string;
/**
* 计算以视频长度为基准下载速度倍率
*/
calculateSpeedByRatio(): string;
}
export default Downloader;