@lzwme/m3u8-dl 1.6.0-0 → 1.7.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.
@@ -0,0 +1,580 @@
1
+ [![@lzwme/m3u8-dl](https://nodei.co/npm/@lzwme/m3u8-dl.png)][npm-url]
2
+
3
+ # @lzwme/m3u8-dl
4
+
5
+ [![NPM version][npm-badge]][npm-url]
6
+ [![node version][node-badge]][node-url]
7
+ ![license MIT](https://img.shields.io/github/license/lzwme/m3u8-dl)
8
+
9
+ [![build status](https://github.com/lzwme/m3u8-dl/actions/workflows/node-ci.yml/badge.svg)](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
+ ![](examples/img/m3u8dl-webui-new.jpg)
42
+
43
+ ### 🎬 视频解析功能
44
+
45
+ - **多平台支持**:支持抖音、微博、皮皮虾等平台的视频分享链接解析
46
+ - **无水印下载**:自动提取无水印视频地址并下载
47
+ - **智能识别**:自动识别视频平台并选择合适的解析器
48
+
49
+ ### 🔍 m3u8 地址智能提取功能
50
+
51
+ - **网页提取**:支持从视频播放页面自动提取 m3u8 地址
52
+ - **深度搜索**:支持多层级页面搜索,自动发现视频链接
53
+ - **批量提取**:一次提取多个视频链接,支持批量下载
54
+
55
+ ![](./examples/img/m3u8dl-web-browser.jpg)
56
+
57
+ ### 🎯 浏览器油猴脚本抓取器
58
+
59
+ - **自动抓取**:自动拦截和抓取网页中的 m3u8 和 mp4 视频链接
60
+ - **实时监控**:监控网络请求(XMLHttpRequest、fetch、Performance API),自动发现视频链接
61
+ - **智能识别**:自动识别视频类型(M3U8/MP4),并提取视频名称
62
+ - **一键跳转**:支持一键跳转到 M3U8-DL WebUI 进行下载
63
+ - **灵活配置**:支持配置排除网址规则,避免在特定页面抓取
64
+ - **拖拽面板**:支持拖拽移动面板位置,自动保存位置
65
+ - **链接管理**:支持复制链接、清空列表等操作
66
+
67
+ > 这是一个 Violentmonkey/Tampermonkey/Greasemonkey 用户脚本,可在浏览器中自动抓取视频链接,配合 M3U8-DL WebUI 使用,实现无缝下载体验。
68
+
69
+ ### 📺 视频搜索功能
70
+
71
+ - **采集站支持**:支持标准采集站 API,通过命令行交互搜索和下载
72
+ - **缓存机制**:自动缓存搜索历史,支持继续未完成的下载
73
+
74
+ ![](./examples/img/m3u8dl-search-demo.png)
75
+
76
+ ### ▶️ 视频播放
77
+
78
+ - **内置播放器**:WebUI、桌面客户端均内置轻量级视频播放器,可直接在线播放已下载的或下载中的视频,无需等待全部完成。
79
+ - **边下边播**:支持 ts 缓存片段自动拼接,边下载边可播放,实现“即下即看”体验。
80
+ - **多格式支持**:播放器支持 mp4、ts 等主流视频格式播放,并可拖动、倍速、全屏、画中画等操作。
81
+ - **历史记录**:自动记录播放进度,可断点续播,方便长视频追剧。
82
+
83
+ > 无需依赖第三方播放器,即可在浏览器或客户端内直接观看下载内容,提升使用便捷性。
84
+
85
+ ![](./examples/img/m3u8dl-video-play.jpg)
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
+ - 打开用户脚本管理器(Violentmonkey/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
@@ -43,6 +43,14 @@ declare const _default: {
43
43
  accessDenied: string;
44
44
  invalidUrl: string;
45
45
  notFound: string;
46
+ invalidParams: string;
47
+ taskNotFound: string;
48
+ onlyRenameCompleted: string;
49
+ invalidFilename: string;
50
+ fileNotFound: string;
51
+ fileExists: string;
52
+ renameFailed: string;
53
+ duplicateDownload: string;
46
54
  };
47
55
  success: {
48
56
  configUpdated: string;
@@ -52,6 +60,7 @@ declare const _default: {
52
60
  resumed: string;
53
61
  noResumableTasks: string;
54
62
  deleted: string;
63
+ renamed: string;
55
64
  };
56
65
  };
57
66
  download: {
@@ -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: {
@@ -45,6 +45,14 @@ exports.default = {
45
45
  accessDenied: 'Access denied',
46
46
  invalidUrl: 'Invalid url parameter',
47
47
  notFound: 'Not Found',
48
+ invalidParams: 'Invalid parameters',
49
+ taskNotFound: 'Task not found',
50
+ onlyRenameCompleted: 'Only completed tasks with normal status can be renamed',
51
+ invalidFilename: 'Filename contains invalid characters',
52
+ fileNotFound: 'File not found',
53
+ fileExists: 'File already exists',
54
+ renameFailed: 'Rename failed: {error}',
55
+ duplicateDownload: '{count} URL(s) already exist, duplicate download',
48
56
  },
49
57
  success: {
50
58
  configUpdated: 'Config updated successfully',
@@ -54,6 +62,7 @@ exports.default = {
54
62
  resumed: 'Resumed {count} download task(s)',
55
63
  noResumableTasks: 'No resumable download tasks found',
56
64
  deleted: 'Deleted {count} download task(s)',
65
+ renamed: 'Renamed successfully',
57
66
  },
58
67
  },
59
68
  download: {
@@ -43,6 +43,14 @@ declare const _default: {
43
43
  accessDenied: string;
44
44
  invalidUrl: string;
45
45
  notFound: string;
46
+ invalidParams: string;
47
+ taskNotFound: string;
48
+ onlyRenameCompleted: string;
49
+ invalidFilename: string;
50
+ fileNotFound: string;
51
+ fileExists: string;
52
+ renameFailed: string;
53
+ duplicateDownload: string;
46
54
  };
47
55
  success: {
48
56
  configUpdated: string;
@@ -52,6 +60,7 @@ declare const _default: {
52
60
  resumed: string;
53
61
  noResumableTasks: string;
54
62
  deleted: string;
63
+ renamed: string;
55
64
  };
56
65
  };
57
66
  download: {
@@ -33,7 +33,7 @@ exports.default = {
33
33
  token: '指定web服务密码(请求头authorization)。默认为空',
34
34
  url: '影视搜索的接口地址(m3u8采集站标准接口)',
35
35
  apidir: '指定自定义视频搜索 api 所在的目录或具体路径',
36
- lang: '指定语言。可选值:zh, en',
36
+ lang: '指定语言。可选值:zh-CN, en',
37
37
  },
38
38
  },
39
39
  api: {
@@ -45,6 +45,14 @@ exports.default = {
45
45
  accessDenied: '访问被拒绝',
46
46
  invalidUrl: '无效的 url 参数',
47
47
  notFound: '未找到',
48
+ invalidParams: '参数无效',
49
+ taskNotFound: '任务不存在',
50
+ onlyRenameCompleted: '只能重命名已完成且状态正常的任务',
51
+ invalidFilename: '文件名包含非法字符',
52
+ fileNotFound: '文件未找到',
53
+ fileExists: '文件已存在',
54
+ renameFailed: '重命名失败: {error}',
55
+ duplicateDownload: '有 {count} 个 URL 已存在,重复下载',
48
56
  },
49
57
  success: {
50
58
  configUpdated: '配置更新成功',
@@ -54,6 +62,7 @@ exports.default = {
54
62
  resumed: '已恢复 {count} 个下载任务',
55
63
  noResumableTasks: '没有找到可恢复的下载任务',
56
64
  deleted: '已删除 {count} 个下载任务',
65
+ renamed: '重命名成功',
57
66
  },
58
67
  },
59
68
  download: {
@@ -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);