# m3ud **Repository Path**: solidion/m3ud ## Basic Information - **Project Name**: m3ud - **Description**: m3u站点解析下载,AI生成。 - **Primary Language**: Python - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2026-02-13 - **Last Updated**: 2026-02-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # m3ud - M3U 视频下载器 一个完整的视频网站解析和下载框架,支持从 p8kg0 等网站下载视频。使用外部 M3U8 下载器(N_m3u8DL-CLI)进行高效的并发下载。 ## 功能特性 ✓ **自动解析** - 自动从网站页面提取视频信息、播放源、M3U8 地址 ✓ **播放源优先级** - 根据优先级自动选择播放源(腾讯视频优先) ✓ **并发下载** - 支持配置并行数,默认 5 个并发下载 ✓ **配置管理** - 灵活的 JSON 配置文件,支持自定义路径和下载器 ✓ **完整日志** - 下载日志记录,便于跟踪下载状态 ✓ **易于扩展** - 模块化设计,轻松添加新网站支持 ## 项目结构 ``` m3ud/ ├── base_parser.py # 基础解析器类 ├── p8kg0.py # p8kg0 网站解析器 ├── config.py # 配置文件管理 ├── downloader_core.py # M3U8 下载核心模块 ├── downloader.py # 主程序入口 ├── config.json.example # 配置文件示例 ├── requirements.txt # 项目依赖 ├── README.md # 本文件 ├── test/ # 测试工具目录(仅开发用) │ ├── fetch_page.py │ ├── parse_html.py │ ├── test_parser.py │ └── analyze_play_page.py └── check_project.py # 项目检查工具 ``` ## 核心模块说明 ### 1. base_parser.py - 基础解析器类 定义所有网站解析器的通用接口和数据结构。 **主要类:** - `Episode` - 集数信息(名称和URL) - `PlaySource` - 播放源信息(名称和集数列表) - `VideoInfo` - 视频信息(标题、描述、封面、播放源列表) - `BaseParser` - 抽象基类,定义解析器接口 ### 2. p8kg0.py - p8kg0 网站解析器 实现 p8kg0 网站的完整解析逻辑。 **主要方法:** - `get_video_info(video_id)` - 获取视频基本信息 - `parse_html(html_content, video_id)` - 解析 HTML 内容 - `get_m3u8_url(video_id, source_id, episode_index)` - 获取单集 M3U8 地址 - `get_m3u8_list(video_id, play_source_name)` - 获取整个播放源的 M3U8 列表 ### 3. config.py - 配置管理 管理下载器的配置,支持 JSON 配置文件。 **默认配置:** ```json { "parallel_count": 5, "download_path": "D:/M3U-Downloads/", "downloader_path": "D:/M3U下载/N_m3u8DL-CLI_v3.0.2.exe" } ``` **主要方法:** - `get_parallel_count()` - 获取并行下载数 - `get_download_path()` - 获取下载路径 - `get_downloader_path()` - 获取下载器路径 - `validate()` - 验证配置有效性 ### 4. downloader_core.py - M3U8 下载管理 管理 M3U8 的下载,使用外部下载器进行实际下载。 **主要类:** - `DownloadTask` - 单个下载任务 - `M3U8Downloader` - 下载管理器,支持并发下载 **主要方法:** - `download(m3u8_url, filename, save_dir)` - 下载单个 M3U8 - `download_batch(tasks)` - 批量下载任务 - `save_download_log(results, filename)` - 保存下载日志 ### 5. downloader.py - 主程序入口 命令行工具,完整的下载流程。 ## 安装和配置 ### 1. 安装依赖 ```bash pip install -r requirements.txt ``` **依赖包:** - requests - HTTP 库 - beautifulsoup4 - HTML 解析 ### 2. 配置下载器 复制配置文件示例并修改: ```bash cp config.json.example config.json ``` 编辑 `config.json`: ```json { "parallel_count": 5, "download_path": "D:/M3U-Downloads/", "downloader_path": "D:/M3U下载/N_m3u8DL-CLI_v3.0.2.exe" } ``` **配置说明:** - `parallel_count` - 并行下载数(1-10) - `download_path` - 视频保存路径 - `downloader_path` - M3U8 下载器(N_m3u8DL-CLI.exe)的完整路径 ## 使用方法 ### 基本用法 ```bash python downloader.py [play_source] ``` **参数:** - `site` - 站点名称(如 p8kg0) - `video_id` - 视频ID - `play_source` - 播放源名称(可选,不指定则自动选择第一个) ### 示例 ```bash # 下载 ID 为 4382 的视频,使用第一个播放源 python downloader.py p8kg0 4382 # 明确指定使用腾讯视频播放源 python downloader.py p8kg0 4382 腾讯视频 # 明确指定使用优酷视频播放源 python downloader.py p8kg0 4382 优酷视频 ``` ## 下载过程详解 1. **解析视频信息** - 从网站获取视频标题、播放源列表等 2. **选择播放源** - 按优先级选择播放源(腾讯视频 > 其他) 3. **获取M3U8列表** - 从每一集的播放页面提取 M3U8 地址 4. **创建下载任务** - 为每一集创建下载任务 5. **并发下载** - 使用配置的并发数并行下载所有集数 6. **保存日志** - 记录下载结果到 JSON 日志文件 ## 输出格式 **目录结构:** ``` {下载路径}/{video_id}/ ├── {视频名称}-{video_id}-{集名称}.mp4 ├── download_log_*.json └── ... ``` **示例:** ``` D:/M3U-Downloads/4382/ ├── 夏日重现-4382-第01集.mp4 ├── 夏日重现-4382-第02集.mp4 ├── ... └── download_log_20240213_123456.json ``` **下载日志(JSON 格式):** ```json { "timestamp": "2024-02-13T12:34:56.789012", "total": 25, "success": 24, "failed": 1, "tasks": [ { "filename": "夏日重现-4382-第01集.mp4", "status": "completed", "error": null }, { "filename": "夏日重现-4382-第02集.mp4", "status": "failed", "error": "Network error" } ] } ``` ## M3U8 下载器说明 项目使用 **N_m3u8DL-CLI** 作为外部下载工具。 **下载器特性:** - 支持 HLS/DASH 流下载 - 自动 AES-128 解密 - 支持多线程下载 - 自动合并分片 - 支持 FastStart 等高级特性 **下载器参数:** ``` --workDir 设定程序工作目录 --saveName 设定存储文件名(不包括后缀) --maxThreads (Default: 32) 设定程序的最大线程数 --minThreads (Default: 16) 设定程序的最小线程数 --enableDelAfterDone 开启下载后删除临时文件夹的功能 ``` 更多参数见 downloader.md 的完整参数列表。 ## 扩展支持新网站 1. **创建新的解析器** ```python from parser import BaseParser, VideoInfo class NewSiteParser(BaseParser): def __init__(self): super().__init__('https://newsite.com') def get_video_info(self, video_id: str) -> VideoInfo: # 实现获取视频信息 pass def parse_html(self, html_content: str, video_id: str) -> VideoInfo: # 实现 HTML 解析 pass def get_m3u8_list(self, video_id: str, play_source_name: str): # 实现获取 M3U8 列表 pass ``` 2. **在 downloader.py 中注册** ```python if site_name.lower() == "newsite": parser = NewSiteParser() ``` ## 故障排除 ### 问题1:找不到下载器 **错误信息:** `M3U8下载器不存在` **解决方案:** 1. 检查 N_m3u8DL-CLI.exe 是否存在于配置路径 2. 更新 config.json 中的 `downloader_path` 3. 确保路径使用正确的分隔符 `/` 而非 `\` ### 问题2:无法创建下载路径 **错误信息:** `无法创建下载路径` **解决方案:** 1. 检查下载路径是否有写入权限 2. 确保磁盘空间充足 3. 路径中不要包含特殊字符 ### 问题3:M3U8 地址获取失败 **错误信息:** `获取M3U8列表失败` **解决方案:** 1. 确保网络连接正常 2. 检查视频 ID 是否正确 3. 网站可能已更改页面结构,需要更新解析规则 ## 项目检查 验证项目安装和配置是否正确: ```bash python check_project.py ``` ## 技术栈 - **语言:** Python 3.7+ - **HTTP 库:** requests - **HTML 解析:** BeautifulSoup4 - **并发:** concurrent.futures.ThreadPoolExecutor - **外部工具:** N_m3u8DL-CLI v3.0.2+ ## 许可证 MIT License ## 贡献 欢迎提交 Issue 和 Pull Request! ## 更新日志 ### v1.0.0 (2024-02-13) - ✓ 基础框架完成 - ✓ p8kg0 网站支持 - ✓ M3U8 下载功能 - ✓ 配置管理系统 - ✓ 并发下载支持