@lzwme/m3u8-dl 1.6.0-0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.MD +293 -212
- package/README.zh-CN.md +580 -0
- package/cjs/i18n/locales/en.js +1 -1
- package/cjs/i18n/locales/{zh.js → zh-CN.js} +1 -1
- package/cjs/lib/file-download.js +1 -1
- package/cjs/lib/format-options.js +27 -4
- package/cjs/lib/i18n.d.ts +1 -1
- package/cjs/lib/i18n.js +29 -10
- package/cjs/lib/m3u8-download.js +1 -1
- package/cjs/server/download-server.js +3 -2
- package/cjs/types/m3u8.d.ts +2 -2
- package/client/assets/main-ChJ1yjNN.css +1 -0
- package/client/assets/main-DZTEqg-V.js +29 -0
- package/client/index.html +3 -3
- package/client/m3u8-capture.user.js +94 -0
- package/client/play.html +2 -2
- package/package.json +20 -10
- package/client/assets/main-DYJAIw1q.css +0 -1
- package/client/assets/main-XL0wiaDU.js +0 -25
- /package/cjs/i18n/locales/{zh.d.ts → zh-CN.d.ts} +0 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
[][npm-url]
|
|
2
|
+
|
|
3
|
+
# @lzwme/m3u8-dl
|
|
4
|
+
|
|
5
|
+
[![NPM version][npm-badge]][npm-url]
|
|
6
|
+
[![node version][node-badge]][node-url]
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
[](https://github.com/lzwme/m3u8-dl/actions/workflows/node-ci.yml)
|
|
10
|
+
[![npm download][download-badge]][download-url]
|
|
11
|
+
[![GitHub issues][issues-badge]][issues-url]
|
|
12
|
+
[![GitHub forks][forks-badge]][forks-url]
|
|
13
|
+
[![GitHub stars][stars-badge]][stars-url]
|
|
14
|
+
|
|
15
|
+
> **语言**: [English](README.md) | [中文简体](README.zh-CN.MD)
|
|
16
|
+
|
|
17
|
+
一个免费开源功能强大的 m3u8 视频批量下载工具,支持多线程下载、边下边播、WebUI 管理、视频解析等多种功能。支持 CLI命令行、浏览器、PC客户端、Docker 部署以及 Node.js API 调用等多种使用方式。
|
|
18
|
+
|
|
19
|
+
## ✨ 功能特性
|
|
20
|
+
|
|
21
|
+
### 🚀 核心下载功能
|
|
22
|
+
|
|
23
|
+
- **多线程下载**:采用线程池模式,支持自定义线程数,大幅提升下载速度
|
|
24
|
+
- **边下边播模式**:支持使用已下载的 ts 缓存文件在线播放,无需等待完整下载
|
|
25
|
+
- **批量下载**:支持指定多个 m3u8 地址批量下载,支持文本文件批量导入
|
|
26
|
+
- **缓存续传**:下载失败会保留缓存,重试时只下载失败的片段,节省带宽和时间
|
|
27
|
+
- **AES 加密支持**:自动识别并解密常见的 AES-128 加密视频流
|
|
28
|
+
- **格式转换**:自动将下载的 ts 片段合并转换为 mp4 格式(需安装 [ffmpeg](https://ffmpeg.org/download.html))
|
|
29
|
+
- **多格式支持**:支持下载 mp4、mkv 等格式的视频文件
|
|
30
|
+
- **片段过滤**:支持忽略指定时间段的视频片段(如跳过片头片尾)
|
|
31
|
+
|
|
32
|
+
### 🌐 WebUI 下载管理
|
|
33
|
+
|
|
34
|
+
- **现代化界面**:基于 Vue 3 + TypeScript 构建的现代化 Web 界面
|
|
35
|
+
- **实时进度**:通过 WebSocket 实时显示下载进度和状态
|
|
36
|
+
- **任务管理**:支持暂停、恢复、删除下载任务,支持批量操作
|
|
37
|
+
- **下载中心**:集中管理所有下载任务,支持搜索和筛选
|
|
38
|
+
- **配置管理**:可视化配置下载参数(线程数、保存目录等)
|
|
39
|
+
- **访问控制**:支持设置访问密码(token)保护服务
|
|
40
|
+
|
|
41
|
+

|
|
42
|
+
|
|
43
|
+
### 🎬 视频解析功能
|
|
44
|
+
|
|
45
|
+
- **多平台支持**:支持抖音、微博、皮皮虾等平台的视频分享链接解析
|
|
46
|
+
- **无水印下载**:自动提取无水印视频地址并下载
|
|
47
|
+
- **智能识别**:自动识别视频平台并选择合适的解析器
|
|
48
|
+
|
|
49
|
+
### 🔍 m3u8 地址智能提取功能
|
|
50
|
+
|
|
51
|
+
- **网页提取**:支持从视频播放页面自动提取 m3u8 地址
|
|
52
|
+
- **深度搜索**:支持多层级页面搜索,自动发现视频链接
|
|
53
|
+
- **批量提取**:一次提取多个视频链接,支持批量下载
|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
### 🎯 浏览器油猴脚本抓取器
|
|
58
|
+
|
|
59
|
+
- **自动抓取**:自动拦截和抓取网页中的 m3u8 和 mp4 视频链接
|
|
60
|
+
- **实时监控**:监控网络请求(XMLHttpRequest、fetch、Performance API),自动发现视频链接
|
|
61
|
+
- **智能识别**:自动识别视频类型(M3U8/MP4),并提取视频名称
|
|
62
|
+
- **一键跳转**:支持一键跳转到 m3u8-dl WebUI 进行下载
|
|
63
|
+
- **灵活配置**:支持配置排除网址规则,避免在特定页面抓取
|
|
64
|
+
- **拖拽面板**:支持拖拽移动面板位置,自动保存位置
|
|
65
|
+
- **链接管理**:支持复制链接、清空列表等操作
|
|
66
|
+
|
|
67
|
+
> 这是一个 Tampermonkey/Greasemonkey 用户脚本,可在浏览器中自动抓取视频链接,配合 m3u8-dl WebUI 使用,实现无缝下载体验。
|
|
68
|
+
|
|
69
|
+
### 📺 视频搜索功能
|
|
70
|
+
|
|
71
|
+
- **采集站支持**:支持标准采集站 API,通过命令行交互搜索和下载
|
|
72
|
+
- **缓存机制**:自动缓存搜索历史,支持继续未完成的下载
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
### ▶️ 视频播放
|
|
77
|
+
|
|
78
|
+
- **内置播放器**:WebUI、桌面客户端均内置轻量级视频播放器,可直接在线播放已下载的或下载中的视频,无需等待全部完成。
|
|
79
|
+
- **边下边播**:支持 ts 缓存片段自动拼接,边下载边可播放,实现“即下即看”体验。
|
|
80
|
+
- **多格式支持**:播放器支持 mp4、ts 等主流视频格式播放,并可拖动、倍速、全屏、画中画等操作。
|
|
81
|
+
- **历史记录**:自动记录播放进度,可断点续播,方便长视频追剧。
|
|
82
|
+
|
|
83
|
+
> 无需依赖第三方播放器,即可在浏览器或客户端内直接观看下载内容,提升使用便捷性。
|
|
84
|
+
|
|
85
|
+

|
|
86
|
+
|
|
87
|
+
### 💻 多种使用方式
|
|
88
|
+
|
|
89
|
+
- **命令行工具**:提供完整的 CLI 命令,支持各种参数配置
|
|
90
|
+
- **Node.js API**:提供编程接口,方便集成到其他项目
|
|
91
|
+
- **Web 服务**:支持启动为 Web 服务,通过浏览器管理下载
|
|
92
|
+
- **Docker 部署**:提供 Docker 镜像,一键部署到服务器
|
|
93
|
+
- **Electron 桌面应用**:支持打包为桌面应用,包含内置浏览器功能
|
|
94
|
+
|
|
95
|
+
### 🌍 国际化支持
|
|
96
|
+
|
|
97
|
+
- 支持中文和英文多语言
|
|
98
|
+
- 命令行和 WebUI 均支持语言切换
|
|
99
|
+
|
|
100
|
+
## 📦 安装
|
|
101
|
+
|
|
102
|
+
**方式一:使用 Node.js 全局安装**
|
|
103
|
+
|
|
104
|
+
作为 CLI 命令行工具使用。
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm i -g @lzwme/m3u8-dl
|
|
108
|
+
m3u8dl -h
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
或者使用 `npx` 直接运行:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
npx @lzwme/m3u8-dl -h
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**方式二:桌面应用下载**
|
|
118
|
+
|
|
119
|
+
安装为电脑客户端使用。使用难度低,适合大多数普通用户,并且有内置浏览器自动提取视频地址的增强功能。可访问如下地址之一下载最新版本:
|
|
120
|
+
|
|
121
|
+
- [https://m3u8-player.lzw.me/download.html](https://m3u8-player.lzw.me/download.html)
|
|
122
|
+
- [https://github.com/lzwme/m3u8-dl/releases](https://github.com/lzwme/m3u8-dl/releases)
|
|
123
|
+
|
|
124
|
+
## 📖 使用指南
|
|
125
|
+
|
|
126
|
+
> **提示**:如需要下载并转换为 `mp4` 视频格式,您需全局安装 [ffmpeg](https://ffmpeg.org/download.html)。
|
|
127
|
+
> 或者使用 `--ffmpeg-path` 参数指定 ffmpeg 的路径。
|
|
128
|
+
|
|
129
|
+
### 作为 CLI 命令行工具使用
|
|
130
|
+
|
|
131
|
+
查看所有可用命令和选项:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
m3u8dl --help
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### 基础下载
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# 下载单个 m3u8 文件
|
|
141
|
+
m3u8dl https://example.com/video.m3u8
|
|
142
|
+
|
|
143
|
+
# 指定文件名和保存目录
|
|
144
|
+
m3u8dl https://example.com/video.m3u8 --filename "我的视频" --save-dir "./downloads"
|
|
145
|
+
|
|
146
|
+
# 启用边下边播模式
|
|
147
|
+
m3u8dl https://example.com/video.m3u8 --play
|
|
148
|
+
|
|
149
|
+
# 设置线程数(默认 4)
|
|
150
|
+
m3u8dl https://example.com/video.m3u8 --thread-num 8
|
|
151
|
+
|
|
152
|
+
# 不转换为 mp4(仅下载 ts 片段)
|
|
153
|
+
m3u8dl https://example.com/video.m3u8 --no-convert
|
|
154
|
+
|
|
155
|
+
# 忽略指定时间片段(如跳过前 30 秒和最后 60 秒)
|
|
156
|
+
m3u8dl https://example.com/video.m3u8 --ignore-segments "0-30,END-60"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
#### 批量下载
|
|
160
|
+
|
|
161
|
+
**方式一:命令行参数**
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# 下载多个文件,使用 | 分隔文件名和 URL
|
|
165
|
+
m3u8dl "第1集|https://example.com/ep1.m3u8" "第2集|https://example.com/ep2.m3u8" --filename "剧集名称"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**方式二:文本文件批量导入**
|
|
169
|
+
|
|
170
|
+
创建 `剧集列表.txt` 文件,格式如下(使用 `$` 分隔文件名和 URL):
|
|
171
|
+
|
|
172
|
+
```txt
|
|
173
|
+
第1集$https://example.com/ep1.m3u8
|
|
174
|
+
第2集$https://example.com/ep2.m3u8
|
|
175
|
+
第3集$https://example.com/ep3.m3u8
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
然后执行:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
m3u8dl 剧集列表.txt --filename "剧集名称"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### 视频解析下载
|
|
185
|
+
|
|
186
|
+
支持抖音、微博等平台的分享链接:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 抖音视频分享链接
|
|
190
|
+
m3u8dl "https://v.douyin.com/xxxxx/" --type parser
|
|
191
|
+
|
|
192
|
+
# 微博视频分享链接
|
|
193
|
+
m3u8dl "https://weibo.com/xxxxx" --type parser
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
#### 从网页提取 m3u8 地址
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# 从视频播放页面自动提取 m3u8 地址并下载
|
|
200
|
+
m3u8dl "https://example.com/play/12345" --type web
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
#### 视频搜索下载
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# 查看搜索命令帮助
|
|
207
|
+
m3u8dl search --help
|
|
208
|
+
|
|
209
|
+
# 指定采集站 API 并搜索下载(会缓存 API 地址)
|
|
210
|
+
m3u8dl search -u https://api.example.com/provide/vod/
|
|
211
|
+
|
|
212
|
+
# 直接搜索关键词
|
|
213
|
+
m3u8dl search "关键词" -u https://api.example.com/provide/vod/
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
> **声明**:以上仅作示例,请自行搜索查找可用的采集站 API。本工具仅用作技术研究学习,不提供任何具体资源类信息。
|
|
217
|
+
|
|
218
|
+
#### 常用命令行选项
|
|
219
|
+
|
|
220
|
+
| 选项 | 说明 |
|
|
221
|
+
|------|------|
|
|
222
|
+
| `-f, --filename <name>` | 指定文件名 |
|
|
223
|
+
| `-n, --thread-num <number>` | 设置下载线程数(默认 4) |
|
|
224
|
+
| `-p, --play` | 启用边下边播模式 |
|
|
225
|
+
| `-C, --cache-dir <dirpath>` | 指定缓存目录 |
|
|
226
|
+
| `-S, --save-dir <dirpath>` | 指定保存目录 |
|
|
227
|
+
| `--no-convert` | 不转换为 mp4 |
|
|
228
|
+
| `--no-del-cache` | 下载完成后不删除缓存 |
|
|
229
|
+
| `--ffmpeg-path <path>` | 指定 ffmpeg 路径 |
|
|
230
|
+
| `-H, --headers <headers>` | 设置请求头(JSON 格式) |
|
|
231
|
+
| `-I, --ignore-segments <time>` | 忽略指定时间片段 |
|
|
232
|
+
| `--debug` | 启用调试模式 |
|
|
233
|
+
| `--lang <lang>` | 设置语言(zh-CN/en) |
|
|
234
|
+
|
|
235
|
+
### WebUI 下载管理
|
|
236
|
+
|
|
237
|
+
启动 Web 服务,通过浏览器管理下载任务:
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# 启动服务(默认端口 6600)
|
|
241
|
+
m3u8dl server
|
|
242
|
+
|
|
243
|
+
# 指定端口和访问密码
|
|
244
|
+
m3u8dl server -p 8080 -t "your-secret-token"
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
启动后,在浏览器中访问 `http://localhost:6600` 即可使用 WebUI。
|
|
248
|
+
|
|
249
|
+
**WebUI 主要功能:**
|
|
250
|
+
|
|
251
|
+
- 📥 创建下载任务(支持 m3u8 链接、微博和皮皮虾视频分享链接、视频播放网页提取)
|
|
252
|
+
- 📊 实时查看下载进度和速度
|
|
253
|
+
- ⏸️ 暂停/恢复下载任务
|
|
254
|
+
- 🗑️ 删除任务和已下载文件
|
|
255
|
+
- ⚙️ 配置下载参数(线程数、保存目录等)
|
|
256
|
+
- 🔍 搜索和筛选任务
|
|
257
|
+
- 📁 查看已完成的下载
|
|
258
|
+
|
|
259
|
+
**环境变量配置:**
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# 设置端口
|
|
263
|
+
export DS_PORT=6600
|
|
264
|
+
|
|
265
|
+
# 设置访问密码
|
|
266
|
+
export DS_SECRET=your-secret-token
|
|
267
|
+
|
|
268
|
+
# 设置保存目录
|
|
269
|
+
export DS_SAVE_DIR=./downloads
|
|
270
|
+
|
|
271
|
+
# 设置缓存目录
|
|
272
|
+
export DS_CACHE_DIR=./cache
|
|
273
|
+
|
|
274
|
+
# 设置 ffmpeg 路径
|
|
275
|
+
export DS_FFMPEG_PATH=/usr/local/bin/ffmpeg
|
|
276
|
+
|
|
277
|
+
# 启用调试模式
|
|
278
|
+
export DS_DEBUG=1
|
|
279
|
+
|
|
280
|
+
# 限制文件访问(仅允许访问下载和缓存目录)
|
|
281
|
+
export DS_LIMTE_FILE_ACCESS=1
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 以 Node.js API 形式集成调用
|
|
285
|
+
|
|
286
|
+
在您的项目中调用相关 API。代码示例:
|
|
287
|
+
|
|
288
|
+
```ts
|
|
289
|
+
import { m3u8Download, m3u8BatchDownload, VideoParser, getM3u8Urls } from '@lzwme/m3u8-dl';
|
|
290
|
+
|
|
291
|
+
// 示例 1:单文件下载
|
|
292
|
+
const result = await m3u8Download('https://example.com/video.m3u8', {
|
|
293
|
+
filename: '我的视频',
|
|
294
|
+
saveDir: './downloads',
|
|
295
|
+
threadNum: 8,
|
|
296
|
+
debug: true,
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
if (result.errmsg) {
|
|
300
|
+
console.error('下载失败:', result.errmsg);
|
|
301
|
+
} else {
|
|
302
|
+
console.log('下载成功:', result.filepath);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// 示例 2:批量下载
|
|
306
|
+
const fileList = [
|
|
307
|
+
'第1集$https://example.com/ep1.m3u8',
|
|
308
|
+
'第2集$https://example.com/ep2.m3u8',
|
|
309
|
+
];
|
|
310
|
+
await m3u8BatchDownload(fileList, {
|
|
311
|
+
filename: '剧集名称',
|
|
312
|
+
threadNum: 4,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// 示例 3:视频解析下载(抖音、微博等)
|
|
316
|
+
const parser = new VideoParser();
|
|
317
|
+
const parseResult = await parser.parse('https://v.douyin.com/xxxxx/');
|
|
318
|
+
if (parseResult.data) {
|
|
319
|
+
console.log('视频标题:', parseResult.data.title);
|
|
320
|
+
console.log('视频地址:', parseResult.data.url);
|
|
321
|
+
|
|
322
|
+
// 下载视频
|
|
323
|
+
await parser.download('https://v.douyin.com/xxxxx/', {
|
|
324
|
+
filename: parseResult.data.title,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// 示例 4:从网页提取 m3u8 地址
|
|
329
|
+
const urls = await getM3u8Urls({
|
|
330
|
+
url: 'https://example.com/play/12345',
|
|
331
|
+
headers: {
|
|
332
|
+
'User-Agent': 'Mozilla/5.0...',
|
|
333
|
+
},
|
|
334
|
+
deep: 2, // 搜索深度
|
|
335
|
+
});
|
|
336
|
+
console.log('提取到的地址:', Array.from(urls.keys()));
|
|
337
|
+
|
|
338
|
+
// 示例 5:指定 ffmpeg 路径
|
|
339
|
+
import ffmpegStatic from 'ffmpeg-static';
|
|
340
|
+
m3u8Download('https://example.com/video.m3u8', {
|
|
341
|
+
filename: '测试视频',
|
|
342
|
+
ffmpegPath: ffmpegStatic, // 使用 ffmpeg-static 包。适合未全局安装 ffmpeg 的场景
|
|
343
|
+
// 或指定已安装的绝对路径(若已在 PATH 环境变量中,则无需指定)
|
|
344
|
+
// ffmpegPath: '/usr/local/bin/ffmpeg',
|
|
345
|
+
});
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Docker 部署
|
|
349
|
+
|
|
350
|
+
#### 使用 Docker 命令
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# 拉取镜像
|
|
354
|
+
docker pull renxia/m3u8dl-dl:latest
|
|
355
|
+
|
|
356
|
+
# 运行容器
|
|
357
|
+
docker run --rm -it \
|
|
358
|
+
-v ./cache:/app/cache \
|
|
359
|
+
-v ./downloads:/app/downloads \
|
|
360
|
+
-p 6600:6600 \
|
|
361
|
+
-e DS_PORT=6600 \
|
|
362
|
+
-e DS_SECRET=your-secret-token \
|
|
363
|
+
renxia/m3u8dl-dl:latest
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
#### 使用 Docker Compose
|
|
367
|
+
|
|
368
|
+
创建 `docker-compose.yml` 文件:
|
|
369
|
+
|
|
370
|
+
```yml
|
|
371
|
+
services:
|
|
372
|
+
m3u8-dl:
|
|
373
|
+
image: renxia/m3u8dl-dl:latest
|
|
374
|
+
container_name: m3u8-dl
|
|
375
|
+
volumes:
|
|
376
|
+
- ./downloads:/app/downloads
|
|
377
|
+
- ./cache:/app/cache
|
|
378
|
+
ports:
|
|
379
|
+
- '6600:6600'
|
|
380
|
+
environment:
|
|
381
|
+
DS_PORT: '6600'
|
|
382
|
+
DS_SAVE_DIR: '/app/downloads'
|
|
383
|
+
DS_CACHE_DIR: '/app/cache'
|
|
384
|
+
DS_SECRET: '' # 设置访问密码
|
|
385
|
+
DS_DEBUG: ''
|
|
386
|
+
DS_FFMPEG_PATH: '' # 留空则使用系统 PATH 中的 ffmpeg
|
|
387
|
+
DS_LIMTE_FILE_ACCESS: '1' # 限制文件访问
|
|
388
|
+
restart: unless-stopped
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
启动服务:
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
docker-compose up -d
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
部署成功后,浏览器访问 `http://your-server-ip:6600` 即可使用。
|
|
398
|
+
|
|
399
|
+
> **提示**:Docker 镜像已包含 ffmpeg,无需额外安装。镜像同时包含了 [AriaNg](https://github.com/mayswind/AriaNg) 静态资源。
|
|
400
|
+
|
|
401
|
+
### Electron 桌面应用
|
|
402
|
+
|
|
403
|
+
项目支持打包为 Electron 桌面应用,提供更丰富的功能:
|
|
404
|
+
|
|
405
|
+
- 🖥️ 原生桌面体验
|
|
406
|
+
- 🌐 内置浏览器,支持从网页提取视频链接
|
|
407
|
+
- 📱 系统托盘支持
|
|
408
|
+
- 🔄 自动更新功能
|
|
409
|
+
|
|
410
|
+
下载已构建的应用:
|
|
411
|
+
|
|
412
|
+
- https://m3u8-player.lzw.me/download.html
|
|
413
|
+
- https://github.com/lzwme/m3u8-dl/releases
|
|
414
|
+
|
|
415
|
+
### 浏览器脚本安装与使用
|
|
416
|
+
|
|
417
|
+
**安装步骤:**
|
|
418
|
+
|
|
419
|
+
1. 安装浏览器扩展(任选其一):
|
|
420
|
+
- [Violentmonkey](https://violentmonkey.github.io/)(【推荐】开源替代方案)
|
|
421
|
+
- [Tampermonkey](https://www.tampermonkey.net/)(【官方】支持 Chrome、Firefox、Edge、Safari 等)
|
|
422
|
+
- [Greasemonkey](https://www.greasespot.net/)(仅支持 Firefox)
|
|
423
|
+
|
|
424
|
+
2. 安装脚本:
|
|
425
|
+
- 打开 Tampermonkey 管理面板
|
|
426
|
+
- 点击"添加新脚本"
|
|
427
|
+
- 复制 `client/m3u8-capture.user.js` 文件内容
|
|
428
|
+
- 粘贴到编辑器中并保存
|
|
429
|
+
- 或者浏览器直接访问链接:[https://raw.githubusercontent.com/lzwme/m3u8-dl/refs/heads/main/client/m3u8-capture.user.js](https://raw.githubusercontent.com/lzwme/m3u8-dl/refs/heads/main/client/m3u8-capture.user.js)
|
|
430
|
+
|
|
431
|
+
3. 配置 WebUI 地址:
|
|
432
|
+
- 访问任意网页,点击页面右上角的 🎬 图标打开抓取面板
|
|
433
|
+
- 点击设置按钮 ⚙️
|
|
434
|
+
- 输入您的 m3u8-dl WebUI 地址(如 `http://localhost:6600`)
|
|
435
|
+
- 保存设置
|
|
436
|
+
|
|
437
|
+
**功能说明:**
|
|
438
|
+
|
|
439
|
+
- **自动抓取**:脚本会自动监控网页中的网络请求,当检测到 m3u8 或 mp4 视频链接时,自动添加到列表中
|
|
440
|
+
- **视频名称提取**:优先从页面的 `h1`、`h2` 或 `document.title` 提取视频名称
|
|
441
|
+
- **跳转下载**:点击"跳转下载"按钮,会自动跳转到 m3u8-dl WebUI 并填充视频链接和名称(格式:`url|name`)
|
|
442
|
+
- **排除规则**:在设置中可以配置排除网址规则列表,匹配的网址将不展示面板且不抓取视频链接
|
|
443
|
+
- 支持普通字符串匹配(包含匹配)
|
|
444
|
+
- 支持正则表达式(以 `/` 开头和结尾,如 `/example\.com/`)
|
|
445
|
+
|
|
446
|
+
**使用示例:**
|
|
447
|
+
|
|
448
|
+
1. 访问视频播放页面
|
|
449
|
+
2. 脚本自动抓取视频链接,显示在右下角的面板中
|
|
450
|
+
3. 点击"跳转下载"按钮
|
|
451
|
+
4. 自动跳转到 m3u8-dl 的 WebUI,视频链接和名称已自动填充
|
|
452
|
+
5. 在 WebUI 中点击"开始下载"即可
|
|
453
|
+
|
|
454
|
+
**排除规则配置示例:**
|
|
455
|
+
|
|
456
|
+
```
|
|
457
|
+
localhost:6600
|
|
458
|
+
127.0.0.1
|
|
459
|
+
/example\.com/
|
|
460
|
+
admin
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
> **提示**:脚本会自动排除 WebUI 地址页面,避免在 WebUI 页面中抓取。您也可以手动添加更多排除规则。
|
|
464
|
+
|
|
465
|
+
## 🛠️ 技术栈
|
|
466
|
+
|
|
467
|
+
- **后端**:Node.js + TypeScript + Express + WebSocket
|
|
468
|
+
- **前端**:Vue 3 + TypeScript + Vite + Pinia + TailwindCSS
|
|
469
|
+
- **桌面应用**:Electron
|
|
470
|
+
- **代码质量**:Biome (Linter & Formatter)
|
|
471
|
+
- **构建工具**:TypeScript Compiler
|
|
472
|
+
|
|
473
|
+
## 💻 开发指南
|
|
474
|
+
|
|
475
|
+
### 本地开发
|
|
476
|
+
|
|
477
|
+
```bash
|
|
478
|
+
# 克隆项目
|
|
479
|
+
git clone https://github.com/lzwme/m3u8-dl.git
|
|
480
|
+
cd m3u8-dl
|
|
481
|
+
|
|
482
|
+
# 安装依赖
|
|
483
|
+
pnpm install
|
|
484
|
+
|
|
485
|
+
# 开发模式(监听文件变化自动编译)
|
|
486
|
+
pnpm dev
|
|
487
|
+
|
|
488
|
+
# 构建项目
|
|
489
|
+
pnpm build
|
|
490
|
+
|
|
491
|
+
# 代码检查
|
|
492
|
+
pnpm lint
|
|
493
|
+
|
|
494
|
+
# 代码格式化
|
|
495
|
+
pnpm format
|
|
496
|
+
|
|
497
|
+
# 修复代码问题
|
|
498
|
+
pnpm fix
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
构建桌面应用:
|
|
502
|
+
|
|
503
|
+
```bash
|
|
504
|
+
# 进入应用目录
|
|
505
|
+
cd packages/m3u8dl-app
|
|
506
|
+
|
|
507
|
+
# 安装依赖
|
|
508
|
+
pnpm install
|
|
509
|
+
|
|
510
|
+
# 开发模式运行
|
|
511
|
+
pnpm dev
|
|
512
|
+
|
|
513
|
+
# 构建应用
|
|
514
|
+
pnpm build
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### 项目结构
|
|
518
|
+
|
|
519
|
+
```
|
|
520
|
+
m3u8-dl/
|
|
521
|
+
├── src/ # 源代码(TypeScript)
|
|
522
|
+
│ ├── cli.ts # 命令行入口
|
|
523
|
+
│ ├── lib/ # 核心库
|
|
524
|
+
│ ├── server/ # Web 服务
|
|
525
|
+
│ ├── video-parser/ # 视频解析器
|
|
526
|
+
│ └── types/ # 类型定义
|
|
527
|
+
├── packages/
|
|
528
|
+
│ ├── frontend/ # Vue 3 前端项目
|
|
529
|
+
│ ├── m3u8dl-app/ # Electron 桌面应用
|
|
530
|
+
│ └── m3u8-capture/ # 浏览器油猴脚本(TypeScript + Vite)
|
|
531
|
+
├── cjs/ # 编译后的 CommonJS 代码
|
|
532
|
+
└── client/ # 前端构建输出
|
|
533
|
+
└── m3u8-capture.user.js # 浏览器视频地址抓取器油猴脚本(由 packages/m3u8-capture 构建)
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
### 贡献代码
|
|
537
|
+
|
|
538
|
+
欢迎提交 Issue 和 Pull Request!
|
|
539
|
+
|
|
540
|
+
1. [Fork](https://github.com/lzwme/m3u8-dl/fork) 本项目
|
|
541
|
+
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
|
|
542
|
+
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
|
543
|
+
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
|
544
|
+
5. 开启 Pull Request
|
|
545
|
+
|
|
546
|
+
**欢迎贡献想法与代码!** 🎉
|
|
547
|
+
|
|
548
|
+
## 📚 相关资源
|
|
549
|
+
|
|
550
|
+
- [ffmpeg 下载](https://ffmpeg.org/download.html) - 视频处理工具
|
|
551
|
+
- [m3u8 格式说明](https://en.wikipedia.org/wiki/M3U) - M3U8 播放列表格式
|
|
552
|
+
- [项目更新日志](./CHANGELOG.md) - 查看版本更新历史
|
|
553
|
+
|
|
554
|
+
## 🙏 致谢
|
|
555
|
+
|
|
556
|
+
感谢以下项目的启发和参考:
|
|
557
|
+
|
|
558
|
+
- [m3u8-multi-thread-downloader](https://github.com/sahadev/m3u8Downloader)
|
|
559
|
+
- [m3u8Utils](https://github.com/liupishui/m3u8Utils)
|
|
560
|
+
|
|
561
|
+
## License
|
|
562
|
+
|
|
563
|
+
`@lzwme/m3u8-dl` is released under the MIT license.
|
|
564
|
+
|
|
565
|
+
该插件由[志文工作室](https://lzw.me)开发和维护。
|
|
566
|
+
|
|
567
|
+
[stars-badge]: https://img.shields.io/github/stars/lzwme/m3u8-dl.svg
|
|
568
|
+
[stars-url]: https://github.com/lzwme/m3u8-dl/stargazers
|
|
569
|
+
[forks-badge]: https://img.shields.io/github/forks/lzwme/m3u8-dl.svg
|
|
570
|
+
[forks-url]: https://github.com/lzwme/m3u8-dl/network
|
|
571
|
+
[issues-badge]: https://img.shields.io/github/issues/lzwme/m3u8-dl.svg
|
|
572
|
+
[issues-url]: https://github.com/lzwme/m3u8-dl/issues
|
|
573
|
+
[npm-badge]: https://img.shields.io/npm/v/@lzwme/m3u8-dl.svg?style=flat-square
|
|
574
|
+
[npm-url]: https://npmjs.com/package/@lzwme/m3u8-dl
|
|
575
|
+
[node-badge]: https://img.shields.io/badge/node.js-%3E=_14.18.0-green.svg?style=flat-square
|
|
576
|
+
[node-url]: https://nodejs.org/download/
|
|
577
|
+
[download-badge]: https://img.shields.io/npm/dm/@lzwme/m3u8-dl.svg?style=flat-square
|
|
578
|
+
[download-url]: https://npmjs.com/package/@lzwme/m3u8-dl
|
|
579
|
+
[bundlephobia-url]: https://bundlephobia.com/result?p=@lzwme/m3u8-dl@latest
|
|
580
|
+
[bundlephobia-badge]: https://badgen.net/bundlephobia/minzip/@lzwme/m3u8-dl@latest
|
package/cjs/i18n/locales/en.js
CHANGED
|
@@ -33,7 +33,7 @@ exports.default = {
|
|
|
33
33
|
token: 'Specify web service password (authorization header). Default is empty',
|
|
34
34
|
url: 'Video search API address (m3u8 collection site standard API)',
|
|
35
35
|
apidir: 'Specify the directory or specific path where custom video search API is located',
|
|
36
|
-
lang: 'Specify language. Options: zh, en',
|
|
36
|
+
lang: 'Specify language. Options: zh-CN, en',
|
|
37
37
|
},
|
|
38
38
|
},
|
|
39
39
|
api: {
|
package/cjs/lib/file-download.js
CHANGED
|
@@ -4,8 +4,8 @@ exports.fileDownload = fileDownload;
|
|
|
4
4
|
const node_path_1 = require("node:path");
|
|
5
5
|
const fe_utils_1 = require("@lzwme/fe-utils");
|
|
6
6
|
const console_log_colors_1 = require("console-log-colors");
|
|
7
|
-
const i18n_js_1 = require("./i18n.js");
|
|
8
7
|
const format_options_js_1 = require("./format-options.js");
|
|
8
|
+
const i18n_js_1 = require("./i18n.js");
|
|
9
9
|
const utils_js_1 = require("./utils.js");
|
|
10
10
|
async function fileDownload(u, opts) {
|
|
11
11
|
utils_js_1.logger.debug('fileDownload', u, opts);
|
|
@@ -7,22 +7,45 @@ const fe_utils_1 = require("@lzwme/fe-utils");
|
|
|
7
7
|
const video_parser_1 = require("../video-parser");
|
|
8
8
|
const utils_1 = require("./utils");
|
|
9
9
|
const fileSupportExtList = [
|
|
10
|
+
// video
|
|
10
11
|
'.mp4',
|
|
11
12
|
'.mkv',
|
|
12
13
|
'.avi',
|
|
13
14
|
'.mov',
|
|
14
15
|
'.wmv',
|
|
15
16
|
'.ts',
|
|
16
|
-
|
|
17
|
-
'.
|
|
18
|
-
'.
|
|
19
|
-
'.
|
|
17
|
+
// audio
|
|
18
|
+
'.mp3',
|
|
19
|
+
'.wav',
|
|
20
|
+
'.ogg',
|
|
21
|
+
'.m4a',
|
|
22
|
+
'.aac',
|
|
23
|
+
'.flac',
|
|
24
|
+
'.ape',
|
|
25
|
+
// document
|
|
20
26
|
'.doc',
|
|
21
27
|
'.docx',
|
|
22
28
|
'.xls',
|
|
23
29
|
'.xlsx',
|
|
24
30
|
'.ppt',
|
|
25
31
|
'.pptx',
|
|
32
|
+
'.pdf',
|
|
33
|
+
'.mobi',
|
|
34
|
+
'.epub',
|
|
35
|
+
// others
|
|
36
|
+
'.exe',
|
|
37
|
+
'.msi',
|
|
38
|
+
'.zip',
|
|
39
|
+
'.rar',
|
|
40
|
+
'.7z',
|
|
41
|
+
'.tar.gz',
|
|
42
|
+
'.tar.bz2',
|
|
43
|
+
'.tar.xz',
|
|
44
|
+
'.iso',
|
|
45
|
+
'.dmg',
|
|
46
|
+
'.pkg',
|
|
47
|
+
'.deb',
|
|
48
|
+
'.rpm',
|
|
26
49
|
];
|
|
27
50
|
function formatOptions(url, opts) {
|
|
28
51
|
const options = {
|
package/cjs/lib/i18n.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared i18n utility for backend (CLI, SDK, Server)
|
|
3
3
|
*/
|
|
4
4
|
import type { AnyObject } from '@lzwme/fe-utils';
|
|
5
|
-
type Locale = 'zh' | 'en';
|
|
5
|
+
type Locale = 'zh-CN' | 'en';
|
|
6
6
|
export declare const LANG_CODES: Set<string>;
|
|
7
7
|
/**
|
|
8
8
|
* Detect language from OS or environment
|