From 11972256b8730f36f59dd5d86394df29527dca62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=88=9A=28noham=29=C2=B2?= <100566912+NohamR@users.noreply.github.com> Date: Mon, 1 Jul 2024 23:58:43 +0200 Subject: [PATCH] eng --- cli-to-re-map | 33 ------ cli2re.html | 120 ---------------------- cli2re.js | 245 -------------------------------------------- current-help-cli | 41 -------- current-help-re.txt | 120 +++++++++++----------- index.html | 120 +++++++++++----------- 6 files changed, 119 insertions(+), 560 deletions(-) delete mode 100644 cli-to-re-map delete mode 100644 cli2re.html delete mode 100644 cli2re.js delete mode 100644 current-help-cli diff --git a/cli-to-re-map b/cli-to-re-map deleted file mode 100644 index 676ee07..0000000 --- a/cli-to-re-map +++ /dev/null @@ -1,33 +0,0 @@ -workDir -> save-dir -saveName -> save-name -baseUrl -> base-url -headers(key:value|key:value) -> header -maxThreads -> <unusable> -minThreads -> thread-count -retryCount -> download-retry-count -timeOut -> <unusable> -muxSetJson -> ? maybe mux-import -useKeyFile -> custom-hls-key -useKeyBase64 -> custom-hls-key -useKeyIV -> custom-hls-iv -downloadRange -> custom-range <need-convert> -liveRecDur -> live-record-limit -stopSpeed -> <unusable> -maxSpeed -> <unusable> -proxyAddress -> custom-proxy -enableDelAfterDone -> del-after-done -enableMuxFastStart -> <unusable> -enableBinaryMerge -> binary-merge -enableParseOnly -> skip-download + skip-merge -enableAudioOnly -> drop-audio .* + drop-subtitle .* -disableDateInfo -> no-date-info -disableIntegrityCheck -> check-segments-count False -noMerge -> skip-merge -noProxy -> use-system-proxy False -registerUrlProtocol -> <unusable> -unregisterUrlProtocol -> <unusable> -enableChaCha20 -> ? -chaCha20KeyBase64 -> ? -chaCha20NonceBase64 -> ? -help -> help -version -> version \ No newline at end of file diff --git a/cli2re.html b/cli2re.html deleted file mode 100644 index 7fc37a2..0000000 --- a/cli2re.html +++ /dev/null @@ -1,120 +0,0 @@ -<!DOCTYPE html> -<meta lang="zh-CN"> - -<head> - <meta charset="UTF-8"> - <title>Command Generator</title> - <link rel="stylesheet" - href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,300;0,700;1,400&display=swap.css"> - <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.5.1/gsap.min.js"></script> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <link rel="stylesheet" href="style.css"> - <link rel="stylesheet" href="button-style.css"> -</head> -<script type="module" src="darkmode.js"></script> -<script type="module" src="cli2re.js"></script> -<script src="cli2re.js"></script> - -<body class="dark"> - <div id="DarkMode"> - <div class="container-switch"> - <div class="switch"> - <div class="toggle-button"> - <div class="toggle"></div> - <div class="moon-mask"></div> - <div class="circles-wrapper"> - <div class="circle"></div> - <div class="circle"></div> - <div class="circle"></div> - <div class="circle"></div> - <div class="circle"></div> - <div class="circle"></div> - <div class="circle"></div> - <div class="circle"></div> - </div> - </div> - </div> - <div class="text"> - </div> - </div> - </div> - <section class="container"> - <a class="link" href="/N_m3u8DL-RE_Command_Generator">RE命令行生成</a> - <header>CLI -> RE</header> - <div id="output">转换后的RE命令行将会显示在这里</div> - <div class="form" action="#"> - <div class="input-box"> - <label for="input">CLI</label> - <textarea id="input" rows="20" placeholder="请输入完整的CLI命令" required></textarea> - </div> - </div> - <div id="info-box" class="info-box"> - <!-- <div class="info"> - <div class="arg-name"> - --headers - </div> - <div class="arg-option"> - "Cookie: None" - </div> - </div> - - <div class="info error"> - <div class="arg-name"> - --headers - </div> - <div class="arg-option"> - "Cookie: None" - </div> - </div> --> - </div> - </section> -</body> -<script> - document.getElementById('input').addEventListener("input", function (e) { - document.getElementById('output').innerText = convert(e.target.value) - }) -</script> -<style> - textarea { - word-wrap: break-word; - color: var(--main-text-color); - background: none; - } - .info-box{ - display: flex; - flex-direction: column; - row-gap: 5px; - - margin-top: 3px; - } - .info { - display: flex; - flex-direction: row; - column-gap: 20px; - width: 100%; - border-radius: 5px; - box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.192); - /* border: solid 1px var(--border-color); */ - background-color: var(--background-color); - color: var(--main-text-color); - } - .info .arg-name{ - font-weight: 500; - } - .info .arg-option{ - font-weight: 300; - } - .info.ok{ - background-color: var(--info-ok-color); - } - .info.error{ - background-color: var(--info-error-color); - } - .info.drop{ - text-decoration: line-through; - color: var(--info-drop-color); - } - .info.unknown{ - color: red; - } -</style> \ No newline at end of file diff --git a/cli2re.js b/cli2re.js deleted file mode 100644 index 3d8c25b..0000000 --- a/cli2re.js +++ /dev/null @@ -1,245 +0,0 @@ -/** - * - * @param {String} prefix - * @returns {String} - */ -String.prototype.removePrefix = function (prefix) { - if (this.match('^' + prefix + '.*$')) { - return this.substring(prefix.length) - } else { - return this.toString() - } -} -/** - * - * @param {String} suffix - * @returns {String} - */ -String.prototype.removeSuffix = function (suffix) { - if (this.match('^.*' + suffix + '$')) { - return this.substring(0, prefix.length) - } else { - return this.toString() - } -} - - -function logOut(...any) { - console.log(...any); -} - -/** - * @param commandLine{String} - */ -function convert(commandLine) { - cleanInfoBox() - const args = { - prefix: "", - /** - * @type {String[]} - */ - options: [ - - ] - } - /** - * @type {String[]} - */ - let firstArgPos = commandLine.indexOf(' ', commandLine.indexOf('N_M3U8DL-CLI')) - args.prefix = commandLine.substring(0, firstArgPos) - let options = Array.from(commandLine.substring(firstArgPos).matchAll('(?:((?:[^"]|^)[\\S\s]+(?:[^"]|$)))|(?:"([^"]+)")')).map((e) => { - return (e[2] ? e[2] : e[1]).trim().removePrefix('--') - }) - logOut(options); - - class Element { - hasArg = false - _drop = false - replacer = (old) => '' - indexInc = (old) => { if (this.hasArg) return 1; else return 0 } - /** - * @param {Boolean} hasArg - * @param {Boolean|(old:String)=>Boolean} drop - * @param {(old:String)=>String|String} replacer - * @param {(old:String)=>number|undefined} inc - * */ - constructor(hasArg, drop, replacer, inc) { - this.hasArg = hasArg - this._drop = drop - this.replacer = replacer - if (inc) { - this.indexInc = inc - } - } - drop(old) { - if (typeof this._drop == "boolean") { - return this._drop - } else - return this._drop(this.replacer(old)) - } - } - let map = { - "workDir": new Element( - true, false, (old) => 'save-dir' - ), - saveName: new Element( - true, false, (old) => 'save-name' - ), - baseUrl: new Element( - true, false, (old) => 'base-url' - ), - headers: new Element( - true, false, (old) => { - return old.split('|').map((kv) => { - return `--header ${kv.substring(0, kv.indexOf(':'))}: ${kv.substring(kv.indexOf(':'))}` - }).join(' ') - } - ), - maxThreads: new Element( - true, (old) => - args.options.includes('--thread-count') - , (old) => 'thread-count' - ), - minThreads: new Element( - true, (old) => - args.options.includes('--thread-count') - , (old) => 'thread-count' - ), - retryCount: new Element( - true, false, (old) => 'download-retry-count' - ), - timeOut: new Element( - true, true - ), - muxSetJson: new Element( - true, true, (old) => 'mux-import' - ), - useKeyFile: new Element( - true, false, (old) => 'custom-hls-key' - ), - useKeyBase64: new Element( - true, false, (old) => 'custom-hls-key' - ), - useKeyIV: new Element( - true, false, (old) => 'custom-hls-iv' - ), - downloadRange: new Element( - true, false, (old) => 'custom-range' - ), - liveRecDur: new Element( - true, false, (old) => 'live-record-limit' - ), - stopSpeed: new Element( - true, true - ), - maxSpeed: new Element( - true, true - ), - proxyAddress: new Element( - true, false, (old) => 'custom-proxy' - ), - enableDelAfterDone: new Element( - false, false, (old) => 'del-after-done' - ), - enableMuxFastStart: new Element( - false, true, (old) => '' - ), - enableBinaryMerge: new Element( - false, false, (old) => 'binary-merge' - ), - enableParseOnly: new Element( - false, false, (old) => 'drop-audio .* drop-subtitle .*' - ), - disableDateInfo: new Element( - false, false, (old) => 'no-date-info' - ), - disableIntegrityCheck: new Element( - false, false, (old) => 'check-segments-count False' - ), - noMerge: new Element( - false, false, (old) => 'skip-merge' - ), - noProxy: new Element( - false, false, (old) => 'use-system-proxy False' - ), - chaCha20KeyBase64: new Element( - true, true, (old) => '' - ), - chaCha20NonceBase64: new Element( - true, true, (old) => '' - ), - } - for (let i = 0; i < options.length; i++) { - const opt = options[i]; - logOut(opt) - /** - * @type {Element} - */ - const ele = map[opt] - if (!ele) { - logOut(`${opt}(unknown)`) - writeInfo('--' + opt,'',"unknown",'unknown') - continue - } - let drop = ele.drop(opt) - if (drop) { - logOut(` --${opt}(drop)`); - } else { - args.options.push(`--${ele.replacer(opt)}`) - logOut(`--${opt} => --${ele.replacer(opt)}`); - } - - logOut(` hasArg ${ele.hasArg}`); - logOut(` indexInc ${ele.indexInc(opt)}`); - let option = "" - for (let j = i + 1; j <= i + ele.indexInc(opt); j++) { - const element = options[j]; - if (!drop) { - option+=element - args.options.push(`"${element}"`) - logOut(` arg: "${element}"`); - } else { - logOut(` arg: ${element}(drop)`); - } - } - if(drop){ - writeInfo('--' + opt,option,"drop","droped") - }else{ - writeInfo('--' + opt,option,"ok") - } - - i += ele.indexInc(opt) - - } - - - - if (args.prefix + ' ' + args.options.join(' ').length == 0) - return '转换后的RE命令行将会显示在这里' - return (args.prefix + ' ' + args.options.join(' ')); -} - -function cleanInfoBox() { - document.getElementById('info-box').innerHTML = '' - -} - -function writeInfo(argName, argOption, type, details) { - let box = document.getElementById('info-box') - let info = document.createElement('div') - info.classList.add("info") - info.classList.add(type) - let name = document.createElement('div') - name.classList.add('arg-name') - if (details) { - name.innerText = argName + `(${details})` - }else{ - name.innerText = argName - } - let option = document.createElement('div') - option.classList.add('arg-option') - option.innerText = argOption - info.appendChild(name) - info.appendChild(option) - box.appendChild(info) -} \ No newline at end of file diff --git a/current-help-cli b/current-help-cli deleted file mode 100644 index bff16ba..0000000 --- a/current-help-cli +++ /dev/null @@ -1,41 +0,0 @@ -N_m3u8DL-CLI 3.0.2.0 - -USAGE: - - N_m3u8DL-CLI <URL|JSON|FILE> [OPTIONS] - -OPTIONS: - - --workDir 设定程序工作目录 - --saveName 设定存储文件名(不包括后缀) - --baseUrl 设定Baseurl - --headers 设定请求头,格式 key:value 使用|分割不同的key&value - --maxThreads (Default: 32) 设定程序的最大线程数 - --minThreads (Default: 16) 设定程序的最小线程数 - --retryCount (Default: 15) 设定程序的重试次数 - --timeOut (Default: 10) 设定程序网络请求的超时时间(单位为秒) - --muxSetJson 使用外部json文件定义混流选项 - --useKeyFile 使用外部16字节文件定义AES-128解密KEY - --useKeyBase64 使用Base64字符串定义AES-128解密KEY - --useKeyIV 使用HEX字符串定义AES-128解密IV - --downloadRange 仅下载视频的一部分分片或长度 - --liveRecDur 直播录制时,达到此长度自动退出软件(HH:MM:SS) - --stopSpeed 当速度低于此值时,重试(单位为KB/s) - --maxSpeed 设置下载速度上限(单位为KB/s) - --proxyAddress 设置HTTP/SOCKS5代理, 如 http://127.0.0.1:8080 - --enableDelAfterDone 开启下载后删除临时文件夹的功能 - --enableMuxFastStart 开启混流mp4的FastStart特性 - --enableBinaryMerge 开启二进制合并分片 - --enableParseOnly 开启仅解析模式(程序只进行到meta.json) - --enableAudioOnly 合并时仅封装音频轨道 - --disableDateInfo 关闭混流中的日期写入 - --disableIntegrityCheck 不检测分片数量是否完整 - --noMerge 禁用自动合并 - --noProxy 不自动使用系统代理 - --registerUrlProtocol 注册m3u8dl链接协议 - --unregisterUrlProtocol 取消注册m3u8dl链接协议 - --enableChaCha20 enableChaCha20 - --chaCha20KeyBase64 ChaCha20KeyBase64 - --chaCha20NonceBase64 ChaCha20NonceBase64 - --help Display this help screen. - --version Display version information. \ No newline at end of file diff --git a/current-help-re.txt b/current-help-re.txt index 80fbde2..bac0716 100644 --- a/current-help-re.txt +++ b/current-help-re.txt @@ -2,70 +2,68 @@ N_m3u8DL-RE (Beta version) 20231113 Usage: - N_m3u8DL-RE <input> [options] + N_m3u8DL-RE_pre <input> [options] Arguments: - <input> 链接或文件 + <input> Input Url or File Options: - --tmp-dir <tmp-dir> 设置临时文件存储目录 - --save-dir <save-dir> 设置输出目录 - --save-name <save-name> 设置保存文件名 - --base-url <base-url> 设置BaseURL - --thread-count <number> 设置下载线程数 [default: 16] - --download-retry-count <number> 每个分片下载异常时的重试次数 [default: 3] - --auto-select 自动选择所有类型的最佳轨道 [default: False] - --skip-merge 跳过合并分片 [default: False] - --skip-download 跳过下载 [default: False] - --check-segments-count 检测实际下载的分片数量和预期数量是否匹配 [default: True] - --binary-merge 二进制合并 [default: False] - --use-ffmpeg-concat-demuxer 使用 ffmpeg 合并时,使用 concat 分离器而非 concat 协议 [default: False] - --del-after-done 完成后删除临时文件 [default: True] - --no-date-info 混流时不写入日期信息 [default: False] - --no-log 关闭日志文件输出 [default: False] - --write-meta-json 解析后的信息是否输出json文件 [default: True] - --append-url-params 将输入Url的Params添加至分片, 对某些网站很有用, 例如 kakao.com [default: False] - -mt, --concurrent-download 并发下载已选择的音频、视频和字幕 [default: False] - -H, --header <header> 为HTTP请求设置特定的请求头, 例如: - -H "Cookie: mycookie" -H "User-Agent: iOS" - --sub-only 只选取字幕轨道 [default: False] - --sub-format <SRT|VTT> 字幕输出类型 [default: SRT] - --auto-subtitle-fix 自动修正字幕 [default: True] - --ffmpeg-binary-path <PATH> ffmpeg可执行程序全路径, 例如 C:\Tools\ffmpeg.exe - --log-level <DEBUG|ERROR|INFO|OFF|WARN> 设置日志级别 [default: INFO] - --ui-language <en-US|zh-CN|zh-TW> 设置UI语言 - --urlprocessor-args <urlprocessor-args> 此字符串将直接传递给URL Processor - --key <key> 设置解密密钥, 程序调用mp4decrpyt/shaka-packager进行解密. 格式: - --key KID1:KEY1 --key KID2:KEY2 - --key-text-file <key-text-file> 设置密钥文件,程序将从文件中按KID搜寻KEY以解密.(不建议使用特大文件) - --decryption-binary-path <PATH> MP4解密所用工具的全路径, 例如 C:\Tools\mp4decrypt.exe - --use-shaka-packager 解密时使用shaka-packager替代mp4decrypt [default: False] - --mp4-real-time-decryption 实时解密MP4分片 [default: False] - -R, --max-speed <SPEED> 设置限速,单位支持 Mbps 或 Kbps,如:15M 100K - -M, --mux-after-done <OPTIONS> 所有工作完成时尝试混流分离的音视频. 输入 "--morehelp mux-after-done" 以查看详细信息 - --custom-hls-method <METHOD> 指定HLS加密方式 (AES_128|AES_128_ECB|CENC|CHACHA20|NONE|SAMPLE_AES|SAMPLE_AES_CTR|UNKNOWN) - --custom-hls-key <FILE|HEX|BASE64> 指定HLS解密KEY. 可以是文件, HEX或Base64 - --custom-hls-iv <FILE|HEX|BASE64> 指定HLS解密IV. 可以是文件, HEX或Base64 - --use-system-proxy 使用系统默认代理 [default: True] - --custom-proxy <URL> 设置请求代理, 如 http://127.0.0.1:8888 - --custom-range <RANGE> 仅下载部分分片. 输入 "--morehelp custom-range" 以查看详细信息 - --task-start-at <yyyyMMddHHmmss> 在此时间之前不会开始执行任务 - --live-perform-as-vod 以点播方式下载直播流 [default: False] - --live-real-time-merge 录制直播时实时合并 [default: False] - --live-keep-segments 录制直播并开启实时合并时依然保留分片 [default: True] - --live-pipe-mux 录制直播并开启实时合并时通过管道+ffmpeg实时混流到TS文件 [default: False] - --live-fix-vtt-by-audio 通过读取音频文件的起始时间修正VTT字幕 [default: False] - --live-record-limit <HH:mm:ss> 录制直播时的录制时长限制 - --live-wait-time <SEC> 手动设置直播列表刷新间隔 ---live-take-count <NUM> 手动设置录制直播时首次获取分片的数量 [default: 16] - --mux-import <OPTIONS> 混流时引入外部媒体文件. 输入 "--morehelp mux-import" 以查看详细信息 - -sv, --select-video <OPTIONS> 通过正则表达式选择符合要求的视频流. 输入 "--morehelp select-video" 以查看详细信息 - -sa, --select-audio <OPTIONS> 通过正则表达式选择符合要求的音频流. 输入 "--morehelp select-audio" 以查看详细信息 - -ss, --select-subtitle <OPTIONS> 通过正则表达式选择符合要求的字幕流. 输入 "--morehelp select-subtitle" 以查看详细信息 - -dv, --drop-video <OPTIONS> 通过正则表达式去除符合要求的视频流. - -da, --drop-audio <OPTIONS> 通过正则表达式去除符合要求的音频流. - -ds, --drop-subtitle <OPTIONS> 通过正则表达式去除符合要求的字幕流. - --ad-keyword <REG> 设置广告分片的URL关键字(正则表达式) - --morehelp <OPTION> 查看某个选项的详细帮助信息 + --tmp-dir <tmp-dir> Set temporary file directory + --save-dir <save-dir> Set output directory + --save-name <save-name> Set output filename + --base-url <base-url> Set BaseURL + --thread-count <number> Set download thread count [default: 10] + --download-retry-count <number> The number of retries when download segment error [default: 3] + --auto-select Automatically selects the best tracks of all types [default: False] + --skip-merge Skip segments merge [default: False] + --skip-download Skip download [default: False] + --check-segments-count Check if the actual number of segments downloaded matches the expected number [default: True] + --binary-merge Binary merge [default: False] + --use-ffmpeg-concat-demuxer When merging with ffmpeg, use the concat demuxer instead of the concat protocol [default: False] + --del-after-done Delete temporary files when done [default: True] + --no-date-info Date information is not written during muxing [default: False] + --no-log Disable log file output [default: False] + --write-meta-json Write meta json after parsed [default: True] + --append-url-params Add Params of input Url to segments, useful for some websites, such as kakao.com [default: False] + -mt, --concurrent-download Concurrently download the selected audio, video and subtitles [default: False] + -H, --header <header> Pass custom header(s) to server, Example: -H "Cookie: mycookie" -H "User-Agent: iOS" + --sub-only Select only subtitle tracks [default: False] + --sub-format <SRT|VTT> Subtitle output format [default: SRT] + --auto-subtitle-fix Automatically fix subtitles [default: True] + --ffmpeg-binary-path <PATH> Full path to the ffmpeg binary, like C:\Tools\ffmpeg.exe + --log-level <DEBUG|ERROR|INFO|OFF|WARN> Set log level [default: INFO] + --ui-language <en-US|zh-CN|zh-TW> Set UI language + --urlprocessor-args <urlprocessor-args> Give these arguments to the URL Processors. + --key <key> Pass decryption key(s) to mp4decrypt/shaka-packager. format: --key KID1:KEY1 --key KID2:KEY2 + --key-text-file <key-text-file> Set the kid-key file, the program will search the KEY with KID from the file.(Very large file are not recommended) + --decryption-binary-path <PATH> Full path to the tool used for MP4 decryption, like C:\Tools\mp4decrypt.exe + --use-shaka-packager Use shaka-packager instead of mp4decrypt to decrypt [default: False] + --mp4-real-time-decryption Decrypt MP4 segments in real time [default: False] + -R, --max-speed <SPEED> Set speed limit, Mbps or Kbps, for example: 15M 100K. + -M, --mux-after-done <OPTIONS> When all works is done, try to mux the downloaded streams. Use "--morehelp mux-after-done" for more details + --custom-hls-method <METHOD> Set HLS encryption method (AES_128|AES_128_ECB|CENC|CHACHA20|NONE|SAMPLE_AES|SAMPLE_AES_CTR|UNKNOWN) + --custom-hls-key <FILE|HEX|BASE64> Set the HLS decryption key. Can be file, HEX or Base64 + --custom-hls-iv <FILE|HEX|BASE64> Set the HLS decryption iv. Can be file, HEX or Base64 + --use-system-proxy Use system default proxy [default: True] + --custom-proxy <URL> Set web request proxy, like http://127.0.0.1:8888 + --custom-range <RANGE> Download only part of the segments. Use "--morehelp custom-range" for more details + --task-start-at <yyyyMMddHHmmss> Task execution will not start before this time + --live-perform-as-vod Download live streams as vod [default: False] + --live-real-time-merge Real-time merge into file when recording live [default: False] + --live-keep-segments Keep segments when recording a live (liveRealTimeMerge enabled) [default: True] + --live-pipe-mux Real-time muxing to TS file through pipeline + ffmpeg (liveRealTimeMerge enabled) [default: False] + --live-fix-vtt-by-audio Correct VTT sub by reading the start time of the audio file [default: False] + --live-record-limit <HH:mm:ss> Recording time limit when recording live + --live-wait-time <SEC> Manually set the live playlist refresh interval + --live-take-count <NUM> Manually set the number of segments downloaded for the first time when recording live [default: 16] + --mux-import <OPTIONS> When MuxAfterDone enabled, allow to import local media files. Use "--morehelp mux-import" for more details + -sv, --select-video <OPTIONS> Select video streams by regular expressions. Use "--morehelp select-video" for more details + -sa, --select-audio <OPTIONS> Select audio streams by regular expressions. Use "--morehelp select-audio" for more details + -ss, --select-subtitle <OPTIONS> Select subtitle streams by regular expressions. Use "--morehelp select-subtitle" for more details + -dv, --drop-video <OPTIONS> Drop video streams by regular expressions. + -da, --drop-audio <OPTIONS> Drop audio streams by regular expressions. + -ds, --drop-subtitle <OPTIONS> Drop subtitle streams by regular expressions. + --ad-keyword <REG> Set URL keywords (regular expressions) for AD segments + --morehelp <OPTION> Set more help info about one option --version Show version information -?, -h, --help Show help and usage information \ No newline at end of file diff --git a/index.html b/index.html index 5eb2f78..66bf212 100644 --- a/index.html +++ b/index.html @@ -55,162 +55,162 @@ </div> </div> <section class="container"> - <a class="link" href="./cli2re.html">CLI命令转RE</a> + <!-- <a class="link" href="./cli2re.html">CLI命令转RE</a> --> <header>Generator</header> <div id="output"></div> <form action="#" class="form" id="generator_body"> <div class="column"> <div class="input-box"> <label for="input">Url</label> - <input id="input" type="text" placeholder="链接或文件" required> + <input id="input" type="text" placeholder="Input Url or File" required> </div> <div class="input-box"> <label>save-name</label> - <input id="save-name" type="text" placeholder="设置保存文件名"> + <input id="save-name" type="text" placeholder="Set output filename"> </div> <div class="input-box"> <label>base-url</label> - <input id="base-url" type="text" placeholder="设置BaseURL"> + <input id="base-url" type="text" placeholder="Set BaseURL"> </div> </div> <div class="column"> <div class="input-box"> <label>save-dir</label> - <input id="save-dir" type="text" placeholder="设置输出目录"> + <input id="save-dir" type="text" placeholder="Set output directory"> </div> <div class="input-box"> <label>tmp-dir</label> - <input id="tmp-dir" type="text" placeholder="设置临时文件存储目录"> + <input id="tmp-dir" type="text" placeholder="Set temporary file directory"> </div> <div class="input-box"> <label>mux-import</label> - <input id="mux-import" type="text" placeholder="混流时引入外部媒体文件"> + <input id="mux-import" type="text" placeholder="When MuxAfterDone enabled, allow to import local media files"> </div> </div> <div class="column"> <div class="input-box"> <label>thread-count</label> - <input id="thread-count" type="text" placeholder="设置下载线程数 [default: 8]" defalut="8"> + <input id="thread-count" type="text" placeholder="Set download thread count [default: 10]" defalut="10"> </div> <div class="input-box"> <label>download-retry-count</label> - <input id="download-retry-count" type="text" placeholder="每个分片下载异常时的重试次数 [default: 3]" defalut="3"> + <input id="download-retry-count" type="text" placeholder="The number of retries when download segment error [default: 3]" defalut="3"> </div> </div> <div class="column"> <div class="input-box"> <label>max-speed</label> - <input id="max-speed" type="text" placeholder="设置限速,单位支持 Mbps 或 Kbps,如:15M 100K" defalut=""> + <input id="max-speed" type="text" placeholder="Set speed limit, Mbps or Kbps, for example: 15M 100K." defalut=""> </div> <div class="input-box"> <label>ffmpeg-binary-path</label> - <input id="ffmpeg-binary-path" type="text" placeholder="ffmpeg可执行程序全路径, 例如 C:\Tools\ffmpeg.exe"> + <input id="ffmpeg-binary-path" type="text" placeholder="Full path to the ffmpeg binary, like C:\Tools\ffmpeg.exe"> </div> </div> <div class="column"> <div class="input-box"> <label>live-take-count</label> - <input id="live-take-count" type="text" placeholder="手动设置录制直播时首次获取分片的数量 [default: 16]"> + <input id="live-take-count" type="text" placeholder="Manually set the number of segments downloaded for the first time when recording live [default: 16]"> </div> <div class="input-box"> <label>urlprocessor-args</label> - <input id="urlprocessor-args" type="text" placeholder="此字符串将直接传递给URL Processor"> + <input id="urlprocessor-args" type="text" placeholder="Give these arguments to the URL Processors."> </div> </div> <div class="column"> <div class="input-box"> <label>key-text-file</label> - <input id="key-text-file" type="text" placeholder="设置密钥文件,程序将从文件中按KID搜寻KEY以解密.(不建议使用特大文件)"> + <input id="key-text-file" type="text" placeholder="Set the kid-key file, the program will search the KEY with KID from the file.(Very large file are not recommended)"> </div> <div class="input-box"> <label>decryption-binary-path</label> - <input id="decryption-binary-path" type="text" placeholder=" MP4解密所用工具的全路径, 例如 C:\Tools\mp4decrypt.exe"> + <input id="decryption-binary-path" type="text" placeholder="Full path to the tool used for MP4 decryption, like C:\Tools\mp4decrypt.exe"> </div> </div> <div class="column"> <div class="input-box"> <label>mux-after-done</label> - <input id="mux-after-done" type="text" placeholder="所有工作完成时尝试混流分离的音视频"> + <input id="mux-after-done" type="text" placeholder="When all works is done, try to mux the downloaded streams"> </div> <div class="input-box"> <label>custom-hls-key</label> - <input id="custom-hls-key" type="text" placeholder="指定HLS解密KEY. 可以是文件, HEX或Base64"> + <input id="custom-hls-key" type="text" placeholder="Set the HLS decryption key. Can be file, HEX or Base64"> </div> </div> <div class="column"> <div class="input-box"> <label>custom-hls-iv</label> - <input id="custom-hls-iv" type="text" placeholder="指定HLS解密IV. 可以是文件, HEX或Base64"> + <input id="custom-hls-iv" type="text" placeholder="Set the HLS decryption iv. Can be file, HEX or Base64"> </div> <div class="input-box"> <label>custom-proxy</label> - <input id="custom-proxy" type="text" placeholder="设置请求代理, 如 http://127.0.0.1:8888"> + <input id="custom-proxy" type="text" placeholder="Set web request proxy, like http://127.0.0.1:8888"> </div> </div> <div class="column"> <div class="input-box"> <label>custom-range</label> - <input id="custom-range" type="text" placeholder="仅下载部分分片"> + <input id="custom-range" type="text" placeholder="Download only part of the segments"> </div> <div class="input-box"> <label>task-start-at</label> - <input id="task-start-at" type="text" placeholder="格式:<yyyyMMddHHmmss>在此时间之前不会开始执行任务"> + <input id="task-start-at" type="text" placeholder="Task execution will not start before this time: yyyyMMddHHmmss"> </div> </div> <div class="column"> <div class="input-box"> <label>live-record-limit</label> - <input id="live-record-limit" type="text" placeholder="录制直播时的录制时长限制,格式: HH:mm:ss"> + <input id="live-record-limit" type="text" placeholder="Recording time limit when recording live: HH:mm:ss"> </div> <div class="input-box"> <label>live-wait-time</label> - <input id="live-wait-time" type="text" placeholder="手动设置直播列表刷新间隔, 单位为秒"> + <input id="live-wait-time" type="text" placeholder="Manually set the live playlist refresh interval"> </div> </div> <div class="column"> <div class="input-box"> <label>ad-keyword</label> - <input id="ad-keyword" type="text" placeholder="设置广告分片的URL关键字(正则表达式)"> + <input id="ad-keyword" type="text" placeholder="Set URL keywords (regular expressions) for AD segments"> </div> </div> <div class="column"> <div class="input-box"> <label>select-video</label> - <input id="select-video" type="text" placeholder="通过正则表达式选择符合要求的视频流"> + <input id="select-video" type="text" placeholder="Select video streams by regular expressions"> </div> <div class="input-box"> <label>select-audio</label> - <input id="select-audio" type="text" placeholder="通过正则表达式选择符合要求的音频流"> + <input id="select-audio" type="text" placeholder="Select audios streams by regular expressions"> </div> <div class="input-box"> <label>select-subtitle</label> - <input id="select-subtitle" type="text" placeholder="通过正则表达式选择符合要求的字幕流"> + <input id="select-subtitle" type="text" placeholder="Select subtitle streams by regular expressions"> </div> </div> <div class="column"> <div class="input-box"> <label>drop-video</label> - <input id="drop-video" type="text" placeholder="通过正则表达式去除符合要求的视频流"> + <input id="drop-video" type="text" placeholder="Drop video streams by regular expressions"> </div> <div class="input-box"> <label>drop-audio</label> - <input id="drop-audio" type="text" placeholder="通过正则表达式去除符合要求的音频流"> + <input id="drop-audio" type="text" placeholder="Drop aduio streams by regular expressions"> </div> <div class="input-box"> <label>drop-subtitle</label> - <input id="drop-subtitle" type="text" placeholder="通过正则表达式去除符合要求的字幕流"> + <input id="drop-subtitle" type="text" placeholder="Drop subtitle streams by regular expressions"> </div> </div> <div class="column"> <div id="header" class="input-box "> <div class="row"> <label>header</label><label class="button" - onclick="insert('#header','header','为HTTP请求设置特定的请求头, 例如: -H "Cookie: mycookie" -H "User-Agent: iOS"')">+</label><label + onclick="insert('#header','header','Pass custom header(s) to server: -H "Cookie: mycookie" -H "User-Agent: iOS"')">+</label><label class="button" onclick="removeLast('#header')">-</label> <input type="text" id="header" - placeholder="为HTTP请求设置特定的请求头, 例如: -H "Cookie: mycookie" -H "User-Agent: iOS""> + placeholder="Pass custom header(s) to server: -H "Cookie: mycookie" -H "User-Agent: iOS""> </div> </div> </div> @@ -218,17 +218,17 @@ <div id="key" class="input-box "> <div class="row"> <label>key</label><label class="button" - onclick="insert('#key','key','设置解密密钥, 程序调用mp4decrpyt/shaka-packager进行解密. 格式: --key KID1:KEY1 --key KID2:KEY2')">+</label><label + onclick="insert('#key','key','Pass decryption key(s) to mp4decrypt/shaka-packager. format: --key KID1:KEY1 --key KID2:KEY2')">+</label><label class="button" onclick="removeLast('#key')">-</label> <input type="text" id="key" - placeholder="设置解密密钥, 程序调用mp4decrpyt/shaka-packager进行解密. 格式: --key KID1:KEY1 --key KID2:KEY2"> + placeholder="Pass decryption key(s) to mp4decrypt/shaka-packager. format: --key KID1:KEY1 --key KID2:KEY2"> </div> </div> </div> <div class="column"> <div class="input-box"> <label for="log-level">log-level</label> - <div class="description">设置日志级别</div> + <div class="description">Set log level</div> <div class="select-box"> <select id="log-level"> <option value="">INFO</option> @@ -241,7 +241,7 @@ </div> <div class="input-box"> <label for="custom-hls-method">custom-hls-method</label> - <div class="description">指定HLS加密方式</div> + <div class="description">Set HLS encryption method</div> <div class="select-box"> <select id="custom-hls-method"> <option value="">AUTO</option> @@ -258,7 +258,7 @@ </div> <div class="input-box"> <label for="sub-format">sub-format</label> - <div class="description">字幕输出类型</div> + <div class="description">Subtitle output format</div> <div class="select-box"> <select id="sub-format"> <option value="">SRT</option> @@ -268,7 +268,7 @@ </div> <div class="input-box"> <label for="ui-language">ui-language</label> - <div class="description">设置UI语言</div> + <div class="description">Set UI language</div> <div class="select-box"> <select id="ui-language"> <option value="">auto</option> @@ -287,112 +287,112 @@ <div> <input type="checkbox" id="no-log" /> <label for="no-log">no-log</label> - <div class="description">关闭日志文件输出</div> + <div class="description">Disable log file output</div> </div> <div> <input type="checkbox" id="auto-select" /> <label for="auto-select">auto-select</label> - <div class="description">自动选择所有类型的最佳轨道</div> + <div class="description">Automatically selects the best tracks of all types</div> </div> <div> <input type="checkbox" id="skip-merge" /> <label for="skip-merge">skip-merge</label> - <div class="description">跳过合并分片</div> + <div class="description">Skip segments merge</div> </div> <div> <input type="checkbox" id="skip-download" /> <label for="skip-download">skip-download</label> - <div class="description">跳过下载</div> + <div class="description">Skip download</div> </div> <div> <input type="checkbox" id="check-segments-count" checked default="true" /> <label for="check-segments-count">check-segments-count</label> - <div class="description">检测实际下载的分片数量和预期数量是否匹配 </div> + <div class="description"> Check if the actual number of segments downloaded matches the expected number </div> </div> <div> <input type="checkbox" id="binary-merge" /> <label for="binary-merge">binary-merge</label> - <div class="description">二进制合并</div> + <div class="description">Binary merge</div> </div> <div> <input type="checkbox" id="use-ffmpeg-concat-demuxer" /> <label for="use-ffmpeg-concat-demuxer">use-ffmpeg-concat-demuxer</label> - <div class="description">使用 ffmpeg 合并时,使用 concat 分离器而非 concat 协议 [default: False]</div> + <div class="description">When merging with ffmpeg, use the concat demuxer instead of the concat protocol</div> </div> <div> <input type="checkbox" id="del-after-done" checked default="true" /> <label for="del-after-done">del-after-done</label> - <div class="description">完成后删除临时文件 </div> + <div class="description">Delete temporary files when done </div> </div> <div> <input type="checkbox" id="no-date-info" /> <label for="no-date-info">no-date-info</label> - <div class="description">混流时不写入日期信息</div> + <div class="description">Date information is not written during muxing</div> </div> <div> <input type="checkbox" id="write-meta-json" default="true" checked /> <label for="write-meta-json">write-meta-json</label> - <div class="description">解析后的信息是否输出json文件</div> + <div class="description">Write meta json after parsed</div> </div> <div> <input type="checkbox" id="append-url-params" /> <label for="append-url-params">append-url-params</label> - <div class="description">将输入Url的Params添加至分片, 对某些网站很有用, 例如 kakao.com</div> + <div class="description">Add Params of input Url to segments, useful for some websites, such as kakao.com</div> </div> <div> <input type="checkbox" id="concurrent-download" /> <label for="concurrent-download">concurrent-download</label> - <div class="description">并发下载已选择的音频、视频和字幕</div> + <div class="description">Concurrently download the selected audio, video and subtitles</div> </div> <div> <input type="checkbox" id="sub-only" /> <label for="sub-only">sub-only</label> - <div class="description">只选取字幕轨道</div> + <div class="description">Select only subtitle tracks</div> </div> <div> <input type="checkbox" id="auto-subtitle-fix" checked default="true" /> <label for="auto-subtitle-fix">auto-subtitle-fix</label> - <div class="description">自动修正字幕 </div> + <div class="description">Automatically fix subtitles </div> </div> <div> <input type="checkbox" id="use-shaka-packager" /> <label for="use-shaka-packager">use-shaka-packager</label> - <div class="description">解密时使用shaka-packager替代mp4decrypt</div> + <div class="description">Use shaka-packager instead of mp4decrypt to decrypt</div> </div> <div> <input type="checkbox" id="mp4-real-time-decryption" /> <label for="mp4-real-time-decryption">mp4-real-time-decryption</label> - <div class="description">实时解密MP4分片</div> + <div class="description">Decrypt MP4 segments in real time</div> </div> <div> <input type="checkbox" id="use-system-proxy" checked default="true" /> <label for="use-system-proxy">use-system-proxy</label> - <div class="description">使用系统默认代理 </div> + <div class="description">Use system default proxy </div> </div> <div> <input type="checkbox" id="live-perform-as-vod" /> <label for="live-perform-as-vod">live-perform-as-vod</label> - <div class="description">以点播方式下载直播流</div> + <div class="description">Download live streams as vod</div> </div> <div> <input type="checkbox" id="live-real-time-merge" /> <label for="live-real-time-merge">live-real-time-merge</label> - <div class="description">录制直播时实时合并</div> + <div class="description">Real-time merge into file when recording live</div> </div> <div> <input type="checkbox" id="live-keep-segments" checked default="true" /> <label for="live-keep-segments">live-keep-segments</label> - <div class="description">录制直播并开启实时合并时依然保留分片 </div> + <div class="description">Keep segments when recording a live (liveRealTimeMerge enabled) </div> </div> <div> <input type="checkbox" id="live-pipe-mux" /> <label for="live-pipe-mux">live-pipe-mux</label> - <div class="description">录制直播并开启实时合并时通过管道+ffmpeg实时混流到TS文件</div> + <div class="description">Real-time muxing to TS file through pipeline + ffmpeg (liveRealTimeMerge enabled)</div> </div> <div> <input type="checkbox" id="live-fix-vtt-by-audio" /> <label for="live-fix-vtt-by-audio">live-fix-vtt-by-audio</label> - <div class="description">通过读取音频文件的起始时间修正VTT字幕 </div> + <div class="description">Correct VTT sub by reading the start time of the audio file </div> </div> </div>