# PyDownloader **Repository Path**: cnull_project/py-downloader ## Basic Information - **Project Name**: PyDownloader - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-28 - **Last Updated**: 2025-10-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PyDownload: m3u8 下载器 特性: - 多线程分片下载(ThreadPoolExecutor) - 断点续传(.part临时文件 + Range 续传尝试) - 下载进度输出(tqdm或简易打印) - 支持AES-128加密分片解密(cryptography) - 支持点播(VOD)与直播(Live) - 支持批量下载 - Python 类封装,CLI入口 - 可选合并为MP4,并输出合并进度(基于ffmpeg) ## 安装依赖 ```bash pip install -r requirements.txt ``` 可选:安装 ffmpeg(用于合并为 MP4) - Windows:可用 winget 安装 `winget install Gyan.FFmpeg`(或下载静态包并将 `ffmpeg.exe` 所在 `bin` 目录加入 PATH) - macOS(Homebrew):`brew install ffmpeg` - Linux(Debian/Ubuntu):`sudo apt-get install ffmpeg` ## 命令行使用示例 - 单个URL(点播/直播自动识别,直播可设置限制): ```bash python main.py "https://example.com/path/to/playlist.m3u8" --output-dir out --workers 8 ``` - 多个URL(顺序下载到独立子目录): ```bash python main.py "https://a.m3u8" "https://b.m3u8" --output-dir out ``` - 批量文件: ```bash python main.py --batch-file urls.txt --output-dir out ``` - 直播限制示例(抓取600秒或最多300个分片): ```bash python main.py "https://live.m3u8" --live-seconds 600 --live-seg-limit 300 --poll 5 ``` - 合并为 MP4 并显示合并进度(需 ffmpeg): ```bash python main.py "https://example.com/vod.m3u8" --merge-mp4 --mp4-name output.mp4 ``` ## 断点续传 - 若分片文件已存在,自动跳过。 - 若存在 `.part` 文件,会尝试通过 `Range` 继续下载;如果服务器不支持Range,则重头下载。 - 对 AES-128 加密分片:为保证 CBC 解密正确性,不进行 Range 续传,遇到 `.part` 会从头重新下载该分片。 ## 加密支持 - 支持 `#EXT-X-KEY:METHOD=AES-128` 的分片:自动下载密钥并使用CBC模式解密。 - IV优先使用分片或key行中的 `IV=0x...`;否则使用分片序号推导。 ## 注意 - 若服务器未提供 `#EXT-X-ENDLIST`,视为直播。 - 若播放列表为主列表(含 `#EXT-X-STREAM-INF`),自动选择带宽最高的子播放列表。 - 合并TS到MP4不在本示例范围,如需可使用 `ffmpeg`: ```bash ffmpeg -y -i "concat:seg_00000000.ts|seg_00000001.ts|..." -c copy output.mp4 ``` ## 代码入口 - 类封装:`m3u8_downloader.py` 中 `M3U8Downloader`。 - 批量函数:`download_batch(urls, base_output_dir, **kwargs)`。 - CLI:`main.py`。