/// 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;