# wpf-m3u8 **Repository Path**: haven5/wpf-m3u8 ## Basic Information - **Project Name**: wpf-m3u8 - **Description**: m3u8文件批量下载器 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-10-25 - **Last Updated**: 2026-08-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: Winforms, m3u8, ts视频文件 ## README # m3u8 下载器 #### 介绍 m3u8 文件批量下载器:粘贴地址即可批量抓取分片、自动解密、合并并转封装为 mp4。 代码位于 `M3u8WpfApp/`,是一个 **纯 WPF + MVVM** 的桌面程序。 #### 软件架构 运行环境:.NET 8(net8.0-windows,WPF) 界面:纯 WPF,无第三方 UI 控件库,配色与控件样式集中在 Themes/Theme.xaml 模式:MVVM(View 无业务代码,code-behind 只有 InitializeComponent) 第三方库: | 库 | 版本 | 用途 | | --- | --- | --- | | CommunityToolkit.Mvvm | 8.4.2 | 源生成器提供 `[ObservableProperty]` / `[RelayCommand]` / Messenger | | Microsoft.Extensions.DependencyInjection | 8.0.1 | 依赖注入容器 | | Microsoft.Xaml.Behaviors.Wpf | 1.1.142 | 把控件事件转成命令,避免 code-behind | | Newtonsoft.Json | 13.0.3 | 任务清单 / 站点清单的持久化 | 目录结构: M3u8WpfApp/ Infrastructure/ 对话框、剪贴板、Shell、UI 调度、ViewModel 基类与工厂 Models/ M3u8FileDto、TsFileInfo、SiteInfo 等数据实体 Service/ 解析、下载、合并、ffmpeg、HTTP、站点检索等业务服务 ViewModels/ 7 个 ViewModel,全部通过构造函数注入依赖 Views/ 8 个窗口,只做布局与绑定 Behaviors/ 拖放添加文件、封面悬浮预览 Converters/ 值转换器 Themes/Theme.xaml 统一配色与控件样式(浅色主题) libs/ ffmpeg.exe / yt-dlp.exe(不入库,见下) 分层约定:`M3u8Parser` 是无 I/O 的纯解析工具(可直接单元测试), 需要联网的动作(跟进下级索引、下载 key)由 `M3u8Service` 承担, `DownloadService` 用 `BlockingCollection` + 3 个长驻线程消费任务队列。 #### 运行准备 **ffmpeg.exe 与 yt-dlp.exe 不在仓库里**(体积上百 MB,已被 `.gitignore` 排除), 需要自行下载后放到: M3u8WpfApp/libs/ffmpeg.exe M3u8WpfApp/libs/yt-dlp.exe 构建时会自动复制到输出目录的 `libs/` 下。 缺少 ffmpeg 不会导致程序崩溃:`FfmpegService.Exists` 为 false,主界面状态栏会给出提示。 分片仍然可以正常下载并合并成 `download//.tsv`,只是无法转封装为 mp4, 任务会停在错误状态且不清理分片;用主界面的「复制命令」可拿到 ffmpeg 命令行, 补齐工具后手工执行即可。 #### 构建与运行 git clone # 放好 M3u8WpfApp/libs/ffmpeg.exe dotnet build M3u8WpfApp.sln dotnet run --project M3u8WpfApp 或直接用 Visual Studio 打开根目录的 `M3u8WpfApp.sln`。 #### 使用说明 1. 启动后先阅读并同意使用提示。 2. 点「批量添加」粘贴地址,支持两种格式: - 每行一个 http 地址,名称自动生成为「第 0001 集」 - 名称与地址成对出现,奇数行名称、偶数行地址 3. 「全部开始」或选中若干行「下载选中」,进度、状态在列表中实时刷新。 4. 选中任务即在右侧显示其分片列表,鼠标悬浮显示完整分片地址; 双击任务行复制任务地址,双击分片行复制分片地址。 其他功能: - **资源检索**:导入站点清单(苹果 CMS 风格的采集接口)后按分类 / 关键字搜索, 结果可直接下载、复制播放地址或导出 PotPlayer 播放列表。 - **站点测速**:站点列表以小卡片平铺,点「测试可用性」并发请求接口(8 个并发,单个 3 秒超时), 卡片上直接显示可用 / 不可用和响应毫秒数;测试期间按钮变成「停止测试」,随时可中断。 结果连同测试时间一起写回 `site.json`,下次打开还在。 - **文件合并**:把已有的 ts / mp4 分片按顺序(支持拖放、上下移动)合并成一个文件。 - **查看文件内容**:直接读取 m3u8 / 文本地址的原始内容,便于排查解析问题。 - **打包**:把某个任务的分片目录打成 zip。 运行目录下会生成: download// 任务分片(合并成功后自动清理) download/MergeFiles/ 手工合并的输出 videos/ 成品视频 Settings.json 任务清单 site.json 站点清单 #### 说明 - 分片下载具备断点续传能力:文件已存在且大小不为 0 时直接跳过,中断后重新开始不会重复下载。 - 支持 AES-128 加密的 m3u8,包括从中途某个分片才开始加密的情况; 最多跟进 4 层索引文件(`M3u8Service.MAX_INDEX_DEPTH`)。 - 本工具仅供学习与个人备份使用,请勿用于侵犯他人版权的用途。 #### 特技 1. Gitee 官方博客 [blog.gitee.com](https://gitee.com/haven5)