├── bin └── .gitkeep ├── videos └── _trash │ └── .gitkeep ├── vtt2ass ├── ass │ └── .gitkeep ├── vttcss │ └── .gitkeep ├── vtt2ass.bat ├── params.yaml └── convert.js ├── modules ├── cmd-here.bat ├── module.langs.json ├── module.apiclient.json ├── module.colors.json └── module.vttconvert.js ├── .github └── ISSUE_TEMPLATE.md ├── .gitignore ├── config └── config.main.yml ├── .eslintrc.yml ├── LICENSE.md ├── package.json ├── docs ├── CHANGELOG.md └── README.md ├── hidive.js └── yarn.lock /bin/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /videos/_trash/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vtt2ass/ass/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vtt2ass/vttcss/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modules/cmd-here.bat: -------------------------------------------------------------------------------- 1 | @title CMD 2 | @cmd /k PROMPT @$S$P$_$_$G$S 3 | -------------------------------------------------------------------------------- /vtt2ass/vtt2ass.bat: -------------------------------------------------------------------------------- 1 | @title HIDIVE Downloader NX: HIDIVE vtt2ass 2 | @echo. 3 | @node convert 4 | @echo. 5 | @pause 6 | -------------------------------------------------------------------------------- /vtt2ass/params.yaml: -------------------------------------------------------------------------------- 1 | #HIDIVE DOWNLOADER NX: vtt2ass 2 | folderVTT: ./vttcss/ 3 | folderASS: ./ass/ 4 | relTag: HIDIVE 5 | #rFont: Arial 6 | fontSize: 34 7 | timePad: 5 8 | #eof 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ** Main info: ** 4 | 5 | Script version: 6 | Show ID: 7 | Episode ID: 8 | 9 | ** Additional Info: ** 10 | 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /jadx/ 2 | /node_modules/ 3 | /modules/ffmpeg/ 4 | /modules/mkvtoolnix/ 5 | .yarn 6 | ffmpeg 7 | *.profile.yml 8 | *.session.yml 9 | *.ios.json 10 | package-lock.json 11 | requests-list.txt 12 | *.exe 13 | *.dll 14 | *.ts 15 | *.mkv 16 | *.mp4 17 | *.ass 18 | *.vtt 19 | *.css 20 | -------------------------------------------------------------------------------- /modules/module.langs.json: -------------------------------------------------------------------------------- 1 | { 2 | "jpn": "Japanese", 3 | "eng": "English", 4 | "spa": "Spanish", 5 | "spa-eu": "Spanish", 6 | "spa-la": "Spanish LatAm", 7 | "fre": "French", 8 | "ger": "German", 9 | "kor": "Korean", 10 | "por": "Portuguese", 11 | "tur": "Turkish", 12 | "ita": "Italian" 13 | } 14 | -------------------------------------------------------------------------------- /modules/module.apiclient.json: -------------------------------------------------------------------------------- 1 | { 2 | "wwwhost" : "https://www.hidive.com", 3 | "apihost" : "https://api.hidive.com", 4 | "apikey" : "508efd7b42d546e19cc24f4d0b414e57e351ca73", 5 | "devName" : "Android", 6 | "appId" : "24i-Android", 7 | "clientWeb": "okhttp/3.4.1", 8 | "clientExo": "smartexoplayer/1.6.0.R (Linux;Android 6.0) ExoPlayerLib/2.6.0" 9 | } 10 | -------------------------------------------------------------------------------- /config/config.main.yml: -------------------------------------------------------------------------------- 1 | #HIDIVE Downloader NX configuration v3 2 | bin: 3 | ffmpeg: ${__dirname}/bin/ffmpeg 4 | mkvmerge: ${__dirname}/bin/mkvmerge 5 | dir: 6 | content: ${__dirname}/videos/ 7 | trash: ${__dirname}/videos/_trash/ 8 | cli: 9 | releaseGroup: HIDIVE 10 | # assTitleTag: HIDIVE 11 | # muxTitleTag: HIDIVE 12 | fileSuffix: SIZEp 13 | videoQuality: 720p 14 | dubLanguage: eng 15 | # mp4mux: false 16 | # muxSubs: false 17 | # capsSubs: false 18 | # assFont: Open Sans Semibold 19 | # noCleanUp: false 20 | #eof 21 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | commonjs: true 3 | es6: true 4 | node: true 5 | extends: 'eslint:recommended' 6 | globals: 7 | Atomics: readonly 8 | SharedArrayBuffer: readonly 9 | parserOptions: 10 | ecmaVersion: 2018 11 | rules: 12 | no-empty: 13 | - error 14 | - { "allowEmptyCatch": true } 15 | indent: 16 | - error 17 | - 4 18 | - { "SwitchCase": 1 } 19 | linebreak-style: 20 | - error 21 | - windows 22 | quotes: 23 | - error 24 | - single 25 | semi: 26 | - error 27 | - always 28 | no-fallthrough: 29 | - off 30 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 AniDL 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hidive-downloader-nx", 3 | "version": "2.1.0", 4 | "description": "Download videos from HIDIVE via cli.", 5 | "keywords": [ 6 | "download", 7 | "downloader", 8 | "hidive", 9 | "util", 10 | "utility", 11 | "cli" 12 | ], 13 | "author": "AniDL", 14 | "homepage": "https://github.com/seiya-dev/hidive-downloader-nx", 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/seiya-dev/hidive-downloader-nx.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/seiya-dev/hidive-downloader-nx/issues" 21 | }, 22 | "license": "MIT", 23 | "main": "hidive.js", 24 | "dependencies": { 25 | "got": "^11.8.2", 26 | "hls-download": "^2.6.10", 27 | "m3u8-parsed": "^1.3.0", 28 | "sei-helper": "^3.3.0", 29 | "yaml": "^2.2.1", 30 | "yargs": "^17.6.2" 31 | }, 32 | "scripts": { 33 | "eslint": "eslint *.js modules", 34 | "eslint-fix": "eslint *.js modules vtt2ass --fix", 35 | "test": "echo \"Error: no test specified\" && exit 1" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /vtt2ass/convert.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // modules 4 | const fs = require('fs'); 5 | const vtt = require('./../modules/module.vttconvert'); 6 | const yaml = require('../node_modules/yaml'); 7 | 8 | // converter const 9 | const param = yaml.parse( 10 | fs.readFileSync(__dirname + '/params.yaml','utf8') 11 | ); 12 | 13 | // list files 14 | const vttRegx = /\.vtt$/; 15 | const files = filterByRegx(fs.readdirSync(param.folderVTT), vttRegx); 16 | 17 | // filter 18 | function filterByRegx(arr, regx) { 19 | return arr.filter(i=>{ 20 | return i.match(new RegExp(regx)); 21 | }); 22 | } 23 | 24 | // convert 25 | for(const f of files){ 26 | const vttFile = param.folderVTT + f; 27 | const cssFile = param.folderVTT + f.replace(vttRegx, '.css'); 28 | const assFile = param.folderASS + f.replace(vttRegx, '.ass'); 29 | if( fs.existsSync(vttFile) && fs.existsSync(cssFile) ){ 30 | const vttContent = fs.readFileSync(vttFile, 'utf8'); 31 | const cssContent = fs.readFileSync(cssFile, 'utf8'); 32 | console.log(`[INFO] Converting: ${f} ...`); 33 | const assContent = vtt(param.relTag, param.fontSize, vttContent, cssContent, param.timePad, param.rFont); 34 | fs.writeFileSync(assFile, assContent, 'utf8'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /docs/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Change Log 2 | 3 | ### 2.0.0 (2020/22/06) 4 | - Updated all modules 5 | - Updated api key 6 | 7 | ### 1.11.0 (2019/08/12) 8 | - Updated `module.vttconvert` module, improved css parsing 9 | 10 | ### 1.10.0 (2019/08/07) 11 | - Added `rfont` option for font replacing in subtitles 12 | 13 | ### 1.9.4 (2019/08/01) 14 | - Fix downloading premium videos (Closes #16) 15 | 16 | ### 1.9.3 (2019/07/29) 17 | - Api key updated (Closes #14) 18 | 19 | ### 1.9.2 (2019/07/27) 20 | - New api key required for using this application 21 | - Updated `module.vttconvert` module 22 | 23 | ### 1.9.1-broken (2019/06/25) 24 | - App is broken, see: seiya-dev/hidive-downloader-nx#14 25 | 26 | ### 1.9.0 (2019/06/16) 27 | - Api keys updated to newer version (Closes #12) 28 | - update modules 29 | 30 | ### 1.8.0 (2019/05/03) 31 | - replace `request` module with `got` 32 | - changed proxy cli options 33 | - changed `login` option name to `auth` 34 | - moved api constants to `module.apiclient.json` 35 | - moved language list to `module.langs.json` 36 | - update modules 37 | 38 | ### 1.7.2 (2019/03/17) 39 | - Fix subtitles downloading (Closes #7, #8) 40 | 41 | ### 1.7.1 (2019/02/09) 42 | - Fix saving `.ass` file in standalone `vtt2ass` script (thanks to @arisudesu) 43 | - Fix muxing with subtitles (Closes #6) 44 | 45 | ### 1.7.0 (2019/01/25) 46 | - Improved conversion VTT+CSS to ASS, ASS style names are same as in CSS and merged 47 | - Separate script for conversion VTT+CSS to ASS locally in `vtt2ass` folder 48 | 49 | ### 1.5.0 (2019/01/24) 50 | - Added new option `caps` — Mux caption subs only for non-Japanese dub / Mux full subs only for Japanese dub 51 | - Added new option `ftag` — Custom title tag in muxed file info (thanks to @Golumpa, closes #3) 52 | - Added new options to configuration file 53 | - Fixed path to `vttconvert` module (Closes #4) 54 | 55 | ### 1.4.0 (2019/01/23) 56 | - Improved conversion VTT+CSS to ASS, ASS style names are same as in CSS 57 | 58 | ### 1.3.0 (2018/12/07) 59 | - Improved episode selection and file naming 60 | - `hls-download` configuration changed, split download to 10 pieces instead of 5 61 | 62 | ### 1.2.1 (2018/12/06) 63 | - Fix broken subtitles parsing 64 | 65 | ### 1.2.0 (2018/12/05) 66 | - Select episodes by hyphen-sequence 67 | 68 | ### 1.1.1 (2018/12/04) 69 | - Fixed VTT+CSS parsing with some subtitles 70 | 71 | ### 1.1.0 (2018/12/01) 72 | - `stag` option for subtitles, updated configuration file 73 | - Removed `dateformat` module 74 | 75 | ### 1.0.0 (2018/11/30) 76 | - First public release 77 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Migrated into Multi-Downloader-NX 2 | 3 | This downloader has been rewritten and migrated into Multi-Downloader-NX: https://github.com/anidl/multi-downloader-nx 4 | 5 | # HIDIVE Downloader NX 6 | 7 | HIDIVE Downloader NX is capable of downloading videos from the *HIDIVE* streaming service. 8 | Api key required for using this application. 9 | 10 | ## Legal Warning 11 | 12 | This application is not endorsed by or affiliated with *HIDIVE*. This application enables you to download videos for offline viewing which may be forbidden by law in your country. The usage of this application may also cause a violation of the *Terms of Service* between you and the stream provider. This tool is not responsible for your actions; please make an informed decision before using this application. 13 | 14 | ## Prerequisites 15 | 16 | * NodeJS >= 12.2.0 (https://nodejs.org/) 17 | * NPM >= 5.3.0 (https://www.npmjs.org/) 18 | * ffmpeg >= 4.0.0 (https://www.videohelp.com/software/ffmpeg) 19 | * MKVToolNix >= 20.0.0 (https://www.videohelp.com/software/MKVToolNix) 20 | 21 | ### Paths Configuration 22 | 23 | By default this application uses the following paths to programs (main executables): 24 | * `./modules/mkvtoolnix/mkvmerge` 25 | * `./modules/ffmpeg` 26 | 27 | To change these paths you need to edit `config.main.yml` in `./modules/` directory. 28 | 29 | ### Node Modules 30 | 31 | After installing NodeJS with NPM go to directory with `package.json` file and type: `npm i`. 32 | * [check dependencies](https://david-dm.org/seiya-dev/hidive-downloader-nx) 33 | 34 | ## CLI Options 35 | 36 | ### Authentication 37 | 38 | * `--auth` enter auth mode 39 | 40 | ### Get Show ID 41 | 42 | * `--search ` sets the show title for search 43 | 44 | ### Download Video 45 | 46 | * `-s -e ` sets the show id and episode ids (comma-separated, hyphen-sequence) 47 | * `-q ` sets the video quality [360p, 480p, 720p, 1080p] 48 | * `--dub` select dub language [eng, jpn, ...] (eng dub by default) 49 | * `--br` force download broadcast version 50 | * `--nosubs` skip download subtitles for non-japanese dub (if available) 51 | 52 | ### Proxy 53 | 54 | * `--proxy ` http(s)/socks proxy WHATWG url (ex. https://myproxyhost:1080) 55 | * `--proxy-auth ` Colon-separated username and password for proxy 56 | * `--ssp` don't use proxy for stream downloading 57 | 58 | ### Muxing 59 | 60 | `[note] this application mux into mkv by default` 61 | * `--mp4` mux into mp4 62 | * `--mks` add subtitles to mkv (if available) 63 | * `--caps` mux only caption subs for non-Japanese dub 64 | 65 | ### Filenaming (optional) 66 | 67 | * `-a ` release group (title tag) ("HIDIVE" by default) 68 | * `-t ` show title override 69 | * `--ep ` episode number override (ignored in batch mode) 70 | * `--suffix ` filename suffix override (first "SIZEp" will be replaced with actual video size, "SIZEp" by default) 71 | 72 | ### Utility 73 | 74 | * `--stag` custom title tag in subtitle file (override `-a` option) 75 | * `--rfont` Replace all default fonts with custom font in subtitle file 76 | * `--ftag` custom title tag in muxed file info (override `-a` option) 77 | * `--nocleanup` move unnecessary files to trash folder after completion instead of deleting 78 | * `-h`, `--help` show all options 79 | 80 | ## Filename Template 81 | 82 | [`release group`] `title` - `episode` [`suffix`].`extension` 83 | 84 | ## CLI Examples 85 | 86 | * `node hidive --search "K-ON"` search "K-ON" in title 87 | * `node hidive -s 125 -e s01e001,s01e002` download episodes s01e001 and s01e002 from show with id 125 88 | * `node hidive -s 337 -e ova01` download episode ova01 from show with id 337 89 | * `node hidive -s 125 -e s01e003-005,ova01` download episodes s01e003-005 and ova01 from show with id 125 90 | * `node hidive -s 125 -e ova01-07` download episodes ova01-07 from show with id 125 91 | * `node hidive -s 125 -e movie03` download episodes movie03 from show with id 125 92 | * `node hidive -s 125 -e movie01-02` download episodes movie01-02 from show with id 125 93 | -------------------------------------------------------------------------------- /modules/module.colors.json: -------------------------------------------------------------------------------- 1 | { 2 | "aliceblue": "#f0f8ff", 3 | "antiquewhite": "#faebd7", 4 | "aqua": "#00ffff", 5 | "aquamarine": "#7fffd4", 6 | "azure": "#f0ffff", 7 | "beige": "#f5f5dc", 8 | "bisque": "#ffe4c4", 9 | "black": "#000000", 10 | "blanchedalmond": "#ffebcd", 11 | "blue": "#0000ff", 12 | "blueviolet": "#8a2be2", 13 | "brown": "#a52a2a", 14 | "burlywood": "#deb887", 15 | "cadetblue": "#5f9ea0", 16 | "chartreuse": "#7fff00", 17 | "chocolate": "#d2691e", 18 | "coral": "#ff7f50", 19 | "cornflowerblue": "#6495ed", 20 | "cornsilk": "#fff8dc", 21 | "crimson": "#dc143c", 22 | "cyan": "#00ffff", 23 | "darkblue": "#00008b", 24 | "darkcyan": "#008b8b", 25 | "darkgoldenrod": "#b8860b", 26 | "darkgray": "#a9a9a9", 27 | "darkgreen": "#006400", 28 | "darkgrey": "#a9a9a9", 29 | "darkkhaki": "#bdb76b", 30 | "darkmagenta": "#8b008b", 31 | "darkolivegreen": "#556b2f", 32 | "darkorange": "#ff8c00", 33 | "darkorchid": "#9932cc", 34 | "darkred": "#8b0000", 35 | "darksalmon": "#e9967a", 36 | "darkseagreen": "#8fbc8f", 37 | "darkslateblue": "#483d8b", 38 | "darkslategray": "#2f4f4f", 39 | "darkslategrey": "#2f4f4f", 40 | "darkturquoise": "#00ced1", 41 | "darkviolet": "#9400d3", 42 | "deeppink": "#ff1493", 43 | "deepskyblue": "#00bfff", 44 | "dimgray": "#696969", 45 | "dimgrey": "#696969", 46 | "dodgerblue": "#1e90ff", 47 | "firebrick": "#b22222", 48 | "floralwhite": "#fffaf0", 49 | "forestgreen": "#228b22", 50 | "fuchsia": "#ff00ff", 51 | "gainsboro": "#dcdcdc", 52 | "ghostwhite": "#f8f8ff", 53 | "goldenrod": "#daa520", 54 | "gold": "#ffd700", 55 | "gray": "#808080", 56 | "green": "#008000", 57 | "greenyellow": "#adff2f", 58 | "grey": "#808080", 59 | "honeydew": "#f0fff0", 60 | "hotpink": "#ff69b4", 61 | "indianred": "#cd5c5c", 62 | "indigo": "#4b0082", 63 | "ivory": "#fffff0", 64 | "khaki": "#f0e68c", 65 | "lavenderblush": "#fff0f5", 66 | "lavender": "#e6e6fa", 67 | "lawngreen": "#7cfc00", 68 | "lemonchiffon": "#fffacd", 69 | "lightblue": "#add8e6", 70 | "lightcoral": "#f08080", 71 | "lightcyan": "#e0ffff", 72 | "lightgoldenrodyellow": "#fafad2", 73 | "lightgray": "#d3d3d3", 74 | "lightgreen": "#90ee90", 75 | "lightgrey": "#d3d3d3", 76 | "lightpink": "#ffb6c1", 77 | "lightsalmon": "#ffa07a", 78 | "lightseagreen": "#20b2aa", 79 | "lightskyblue": "#87cefa", 80 | "lightslategray": "#778899", 81 | "lightslategrey": "#778899", 82 | "lightsteelblue": "#b0c4de", 83 | "lightyellow": "#ffffe0", 84 | "lime": "#00ff00", 85 | "limegreen": "#32cd32", 86 | "linen": "#faf0e6", 87 | "magenta": "#ff00ff", 88 | "maroon": "#800000", 89 | "mediumaquamarine": "#66cdaa", 90 | "mediumblue": "#0000cd", 91 | "mediumorchid": "#ba55d3", 92 | "mediumpurple": "#9370db", 93 | "mediumseagreen": "#3cb371", 94 | "mediumslateblue": "#7b68ee", 95 | "mediumspringgreen": "#00fa9a", 96 | "mediumturquoise": "#48d1cc", 97 | "mediumvioletred": "#c71585", 98 | "midnightblue": "#191970", 99 | "mintcream": "#f5fffa", 100 | "mistyrose": "#ffe4e1", 101 | "moccasin": "#ffe4b5", 102 | "navajowhite": "#ffdead", 103 | "navy": "#000080", 104 | "oldlace": "#fdf5e6", 105 | "olive": "#808000", 106 | "olivedrab": "#6b8e23", 107 | "orange": "#ffa500", 108 | "orangered": "#ff4500", 109 | "orchid": "#da70d6", 110 | "palegoldenrod": "#eee8aa", 111 | "palegreen": "#98fb98", 112 | "paleturquoise": "#afeeee", 113 | "palevioletred": "#db7093", 114 | "papayawhip": "#ffefd5", 115 | "peachpuff": "#ffdab9", 116 | "peru": "#cd853f", 117 | "pink": "#ffc0cb", 118 | "plum": "#dda0dd", 119 | "powderblue": "#b0e0e6", 120 | "purple": "#800080", 121 | "red": "#ff0000", 122 | "rosybrown": "#bc8f8f", 123 | "royalblue": "#4169e1", 124 | "saddlebrown": "#8b4513", 125 | "salmon": "#fa8072", 126 | "sandybrown": "#f4a460", 127 | "seagreen": "#2e8b57", 128 | "seashell": "#fff5ee", 129 | "sienna": "#a0522d", 130 | "silver": "#c0c0c0", 131 | "skyblue": "#87ceeb", 132 | "slateblue": "#6a5acd", 133 | "slategray": "#708090", 134 | "slategrey": "#708090", 135 | "snow": "#fffafa", 136 | "springgreen": "#00ff7f", 137 | "steelblue": "#4682b4", 138 | "tan": "#d2b48c", 139 | "teal": "#008080", 140 | "thistle": "#d8bfd8", 141 | "tomato": "#ff6347", 142 | "turquoise": "#40e0d0", 143 | "violet": "#ee82ee", 144 | "wheat": "#f5deb3", 145 | "white": "#ffffff", 146 | "whitesmoke": "#f5f5f5", 147 | "yellow": "#ffff00", 148 | "yellowgreen": "#9acd32" 149 | } 150 | -------------------------------------------------------------------------------- /modules/module.vttconvert.js: -------------------------------------------------------------------------------- 1 | // const 2 | const cssPrefixRx = /\.rmp-container>\.rmp-content>\.rmp-cc-area>\.rmp-cc-container>\.rmp-cc-display>\.rmp-cc-cue /g; 3 | 4 | // colors 5 | const colors = require('./module.colors'); 6 | const defaultStyleName = 'Default'; 7 | const defaultStyleFont = 'Arial'; 8 | 9 | // predefined 10 | let relGroup = ''; 11 | let fontSize = 0; 12 | let tmMrg = 0; 13 | let rFont = ''; 14 | 15 | function loadCSS(cssStr) { 16 | let css = cssStr; 17 | css = css.replace(cssPrefixRx, '').replace(/[\r\n]+/g, '\n').split('\n'); 18 | let defaultSFont = rFont == '' ? defaultStyleFont : rFont; 19 | let defaultStyle = `${defaultSFont},40,&H00FFFFFF,&H00FFFFFF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1,0,2,20,20,20,1`; //base for nonDialog 20 | let styles = { [defaultStyleName]: { params: defaultStyle, list: [] } }; 21 | let classList = { [defaultStyleName]: 1 }; 22 | for (let i in css) { 23 | let clx, clz, clzx, rgx; 24 | let l = css[i]; 25 | if (l === '') continue; 26 | let m = l.match(/^(.*)\{(.*)\}$/); 27 | if (!m) console.error(`[WARN] VTT2ASS: Invalid css in line ${i}: ${l}`); 28 | // console.log("m"); 29 | // console.log(m); 30 | // console.log(""); 31 | 32 | if (m[1] === '') { //updates default style, which is then used as a base for other styles 33 | let style = parseStyle(defaultStyleName, m[2], defaultStyle); 34 | // console.log("Result style"); 35 | // console.log(style); 36 | styles[defaultStyleName].params = style; 37 | defaultStyle = style; 38 | } 39 | else { 40 | 41 | clx = m[1].replace(/\./g, '').split(','); 42 | clz = clx[0].replace(/-C(\d+)_(\d+)$/i,'').replace(/-(\d+)$/i,''); 43 | classList[clz] = (classList[clz] || 0) + 1; 44 | rgx = classList[clz]; 45 | let classSubNum = rgx > 1 ? `-${rgx}` : ''; 46 | clzx = clz + classSubNum; 47 | 48 | let style = parseStyle(clzx, m[2], defaultStyle); 49 | // console.log("Result style"); 50 | // console.log(style); 51 | styles[clzx] = { params: style, list: clx }; 52 | } 53 | } 54 | //console.log(styles); 55 | return styles; 56 | } 57 | 58 | function parseStyle(stylegroup, line, style) { 59 | // console.log("Parse Style call: " + stylegroup); 60 | // console.log(line); 61 | // console.log(style); 62 | 63 | let defaultSFont = rFont == '' ? defaultStyleFont : rFont; //redeclare cause of let 64 | 65 | if (stylegroup.startsWith('Subtitle') || stylegroup.startsWith('Song')) { //base for dialog, everything else use defaultStyle 66 | style = `${defaultSFont},${fontSize},&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2.6,0,2,20,20,46,1`; 67 | } 68 | 69 | // Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, 70 | // BackColour, Bold, Italic, Underline, StrikeOut, 71 | // ScaleX, ScaleY, Spacing, Angle, BorderStyle, 72 | // Outline, Shadow, Alignment, MarginL, MarginR, 73 | // MarginV, Encoding 74 | style = style.split(','); 75 | for (let s of line.split(';')) { 76 | if (s == '') continue; 77 | let st = s.trim().split(':'); 78 | let cl; 79 | switch (st[0]) { 80 | case 'font-family': 81 | if (rFont != '') { //do rewrite if rFont is specified 82 | if (stylegroup.startsWith('Subtitle') || stylegroup.startsWith('Song')) { 83 | style[0] = rFont; //dialog to rFont 84 | } else { 85 | style[0] = defaultStyleFont; //non-dialog to Arial 86 | } 87 | } else { //otherwise keep default style 88 | style[0] = st[1].match(/[\s"]*([^",]*)/)[1]; 89 | } 90 | break; 91 | case 'font-size': 92 | style[1] = getPxSize(st[1], style[1]); //scale it based on input style size... so for dialog, this is the dialog font size set in config, for non dialog, it's 40 from default font size 93 | break; 94 | case 'color': 95 | cl = getColor(st[1]); 96 | if (cl !== null) { 97 | if (cl == '&H0000FFFF'){ 98 | style[2] = style[3] = '&H00FFFFFF'; 99 | } 100 | else{ 101 | style[2] = style[3] = cl; 102 | } 103 | } 104 | break; 105 | case 'font-weight': 106 | if (stylegroup.startsWith('Subtitle') || stylegroup.startsWith('Song')) { //don't touch font-weight if dialog 107 | break; 108 | } 109 | // console.log("Changing bold weight"); 110 | // console.log(stylegroup); 111 | if (st[1] === 'bold') { 112 | style[6] = -1; 113 | break; 114 | } 115 | if (st[1] === 'normal') { 116 | break; 117 | } 118 | case 'font-style': 119 | if (st[1] === 'italic') { 120 | style[7] = -1; 121 | break; 122 | } 123 | case 'background': 124 | if(st[1] === 'none'){ 125 | break; 126 | } 127 | case 'text-shadow': 128 | if (stylegroup.startsWith('Subtitle') || stylegroup.startsWith('Song')) { //don't touch shadow if dialog 129 | break; 130 | } 131 | st[1] = st[1].split(',').map(r => r.trim()); 132 | st[1] = st[1].map(r => { return ( r.split(' ').length > 3 ? r.replace(/(\d+)px black$/,'') : r.replace(/black$/,'') ).trim(); }); 133 | st[1] = st[1].map(r => r.replace(/-/g,'').replace(/px/g,'').replace(/(^| )0( |$)/g,' ').trim()).join(' '); 134 | st[1] = st[1].split(' '); 135 | if(st[1].length != 10){ 136 | console.log(`[WARN] VTT2ASS: Can't properly parse text-shadow: ${s.trim()}`); 137 | break; 138 | } 139 | st[1] = [...new Set(st[1])]; 140 | if(st[1].length > 1){ 141 | console.log(`[WARN] VTT2ASS: Can't properly parse text-shadow: ${s.trim()}`); 142 | break; 143 | } 144 | style[16] = st[1][0]; 145 | break; 146 | default: 147 | console.error(`[WARN] VTT2ASS: Unknown style: ${s.trim()}`); 148 | } 149 | } 150 | return style.join(','); 151 | } 152 | 153 | function getPxSize(size_line, font_size) { 154 | let m = size_line.trim().match(/([\d.]+)(.*)/); 155 | if (!m) console.error(`[WARN] VTT2ASS: Unknown size: ${size_line}`); 156 | if (m[2] === 'em') m[1] *= font_size; 157 | return Math.round(m[1]); 158 | } 159 | 160 | function getColor(c) { 161 | if (c[0] !== '#') { 162 | c = colors[c]; 163 | } 164 | else if (c.length < 7) { 165 | c = `#${c[1]}${c[1]}${c[2]}${c[2]}${c[3]}${c[3]}`; 166 | } 167 | let m = c.match(/#(..)(..)(..)/); 168 | if (!m) return null; 169 | return `&H00${m[3]}${m[2]}${m[1]}`.toUpperCase(); 170 | } 171 | 172 | function loadVTT(vttStr) { 173 | const rx = /^([\d:.]*) --> ([\d:.]*)\s?(.*?)\s*$/; 174 | let lines = vttStr.replace(/\r?\n/g, '\n').split('\n'); 175 | let data = []; 176 | let record = null; 177 | let lineBuf = []; 178 | for (let l of lines) { 179 | let m = l.match(rx); 180 | if (m) { 181 | let caption = ''; 182 | if (lineBuf.length > 0) { 183 | caption = lineBuf.pop(); 184 | } 185 | if (caption !== '' && lineBuf.length > 0) { 186 | lineBuf.pop(); 187 | } 188 | if (record !== null) { 189 | record.text = lineBuf.join('\n'); 190 | data.push(record); 191 | } 192 | record = { 193 | caption, 194 | time: { 195 | start: m[1], 196 | end: m[2], 197 | ext: m[3].split(' ').map(x => x.split(':')).reduce((p, c) => (p[c[0]] = c[1]) && p, {}), 198 | } 199 | }; 200 | lineBuf = []; 201 | continue; 202 | } 203 | lineBuf.push(l); 204 | } 205 | if (record !== null) { 206 | if (lineBuf[lineBuf.length - 1] === '') { 207 | lineBuf.pop(); 208 | } 209 | record.text = lineBuf.join('\n'); 210 | data.push(record); 211 | } 212 | return data; 213 | } 214 | 215 | function convert(css, vtt) { 216 | let stylesMap = {}; 217 | let ass = [ 218 | '\ufeff[Script Info]', 219 | 'Title: '+relGroup, 220 | 'ScriptType: v4.00+', 221 | 'WrapStyle: 0', 222 | 'PlayResX: 1280', 223 | 'PlayResY: 720', 224 | 'ScaledBorderAndShadow: yes', 225 | '', 226 | '[V4+ Styles]', 227 | 'Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding', 228 | ]; 229 | for (let s in css) { 230 | ass.push(`Style: ${s},${css[s].params}`); 231 | css[s].list.forEach(x => stylesMap[x] = s); 232 | } 233 | ass = ass.concat([ 234 | '', 235 | '[Events]', 236 | 'Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text' 237 | ]); 238 | let events = { 239 | subtitle: [], 240 | caption: [], 241 | capt_pos: [], 242 | song_cap: [], 243 | }; 244 | let linesMap = {}; 245 | for (let l in vtt) { 246 | let x = convertLine(stylesMap, vtt[l]); 247 | if (x.ind !== '' && linesMap[x.ind] !== undefined){ 248 | if(x.subInd > 1){ 249 | let fx = convertLine(stylesMap, vtt[l-x.subInd+1]); 250 | if(x.style != fx.style){ 251 | x.text = `{\\r${x.style}}${x.text}{\\r}`; 252 | } 253 | } 254 | events[x.type][linesMap[x.ind]] += '\\N' + x.text; 255 | } 256 | else { 257 | events[x.type].push(x.res); 258 | if (x.ind !== '') { 259 | linesMap[x.ind] = events[x.type].length - 1; 260 | } 261 | } 262 | 263 | } 264 | if(events.subtitle.length>0){ 265 | ass = ass.concat( 266 | //`Comment: 0,0:00:00.00,0:00:00.00,${defaultStyleName},,0,0,0,,** Subtitles **`, 267 | events.subtitle 268 | ); 269 | } 270 | if(events.caption.length>0){ 271 | ass = ass.concat( 272 | //`Comment: 0,0:00:00.00,0:00:00.00,${defaultStyleName},,0,0,0,,** Captions **`, 273 | events.caption 274 | ); 275 | } 276 | if(events.capt_pos.length>0){ 277 | ass = ass.concat( 278 | //`Comment: 0,0:00:00.00,0:00:00.00,${defaultStyleName},,0,0,0,,** Captions with position **`, 279 | events.capt_pos 280 | ); 281 | } 282 | if(events.song_cap.length>0){ 283 | ass = ass.concat( 284 | //`Comment: 0,0:00:00.00,0:00:00.00,${defaultStyleName},,0,0,0,,** Song captions **`, 285 | events.song_cap 286 | ); 287 | } 288 | return ass.join('\r\n') + '\r\n'; 289 | } 290 | 291 | function convertLine(css, l) { 292 | let start = convertTime(l.time.start); 293 | let end = convertTime(l.time.end); 294 | let txt = convertText(l.text); 295 | let type = txt.style.match(/Caption/i) ? 'caption' : (txt.style.match(/SongCap/i) ? 'song_cap' : 'subtitle'); 296 | type = type == 'caption' && l.time.ext.position !== undefined ? 'capt_pos' : type; 297 | if (l.time.ext.align === 'left') { 298 | txt.text = `{\\an7}${txt.text}`; 299 | } 300 | let ind = '', subInd = 1; 301 | let sMinus = 0; // (19.2 * 2); 302 | if (l.time.ext.position !== undefined) { 303 | let pos = parseInt(l.time.ext.position); 304 | let PosX = pos < 0 ? (1280 / 100 * (100 - pos)) : ((1280 - sMinus) / 100 * pos); 305 | let line = parseInt(l.time.ext.line) || 0; 306 | let PosY = line < 0 ? (720 / 100 * (100 - line)) : ((720 - sMinus) / 100 * line); 307 | txt.text = `{\\pos(${parseFloat(PosX.toFixed(3))},${parseFloat(PosY.toFixed(3))})}${txt.text}`; 308 | } 309 | else if(l.time.ext.line !== undefined && type == 'caption'){ 310 | let line = parseInt(l.time.ext.line); 311 | let PosY = line < 0 ? (720 / 100 * (100 - line)) : ((720 - sMinus) / 100 * line); 312 | txt.text = `{\\pos(640,${parseFloat(PosY.toFixed(3))})}${txt.text}`; 313 | } 314 | else { 315 | let indregx = txt.style.match(/(.*)_(\d+)$/); 316 | if(indregx !== null){ 317 | ind = indregx[1]; 318 | subInd = parseInt(indregx[2]); 319 | } 320 | } 321 | let style = css[txt.style] || defaultStyleName; 322 | let res = `Dialogue: 0,${start},${end},${style},,0,0,0,,${txt.text}`; 323 | return { type, ind, subInd, start, end, style, text: txt.text, res }; 324 | } 325 | 326 | function convertText(text) { 327 | let m = text.match(/]*)>([\S\s]*)<\/c>/); 328 | let style = ''; 329 | if (m) { 330 | style = m[1]; 331 | text = m[2]; 332 | } 333 | let xtext = text 334 | .replace(/\n/g, '\\N') 335 | .replace(/ \\N$/g, '\\N') 336 | .replace(/]*>([^<]*)<\/b>/g, '{\\b1}$1{\\b0}') 337 | .replace(/]*>([^<]*)<\/i>/g, '{\\i1}$1{\\i0}') 338 | .replace(/]*>([^<]*)<\/u>/g, '{\\u1}$1{\\u0}') 339 | // .replace(/]*>[^<]*<\/c>/g, '') 340 | // .replace(/]*>[^<]*<\/ruby>/g, '') 341 | .replace(/<[^>]>/g, '') 342 | .replace(/\\N$/, ''); 343 | text = xtext; 344 | return { style, text }; 345 | } 346 | 347 | function convertTime(tm) { 348 | let m = tm.match(/([\d:]*)\.?(\d*)/); 349 | if (!m) return '0:00:00.00'; 350 | return toSubTime(m[0]); 351 | } 352 | 353 | function toSubTime(str) { 354 | let n = [], x, sx; 355 | x = str.split(/[:.]/).map(x => Number(x)); 356 | x[3] = '0.'+('00'+x[3]).slice(-3); 357 | sx = (x[0]*60*60 + x[1]*60 + x[2] + Number(x[3]) - tmMrg).toFixed(2); 358 | sx = sx.toString().split('.'); 359 | n.unshift(sx[1]); 360 | sx = Number(sx[0]); 361 | n.unshift(('0'+((sx%60).toString())).slice(-2)); 362 | n.unshift(('0'+((Math.floor(sx/60)%60).toString())).slice(-2)); 363 | n.unshift((Math.floor(sx/3600)%60).toString()); 364 | return n.slice(0, 3).join(':') + '.' + n[3]; 365 | } 366 | 367 | module.exports = (group, xFontSize, vttStr, cssStr, timeMargin, replaceFont) => { 368 | relGroup = group; 369 | fontSize = xFontSize > 0 ? xFontSize : 34; // 1em to pix 370 | tmMrg = timeMargin ? timeMargin : 0; // 371 | rFont = replaceFont ? replaceFont : rFont; 372 | return convert( 373 | loadCSS(cssStr), 374 | loadVTT(vttStr) 375 | ); 376 | }; 377 | -------------------------------------------------------------------------------- /hidive.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // modules build-in 4 | const path = require('path'); 5 | const fs = require('fs'); 6 | const crypto = require('crypto'); 7 | 8 | // package json 9 | const pkg = require('./package'); 10 | 11 | // program name 12 | console.log(`\n=== HIDIVE Downloader NX ${pkg.version} ===\n`); 13 | const modulesFolder = path.join(__dirname,'modules'); 14 | const configFolder = path.join(__dirname,'config'); 15 | 16 | // modules extra 17 | const yaml = require('yaml'); 18 | const shlp = require('sei-helper'); 19 | const yargs = require('yargs'); 20 | 21 | // requests 22 | const got = require('got'); 23 | const m3u8 = require('m3u8-parsed'); 24 | const streamdl = require('hls-download'); 25 | const vtt = require(modulesFolder+'/module.vttconvert'); 26 | 27 | // api config 28 | const api = require(modulesFolder+'/module.apiclient'); 29 | const langCode = require(modulesFolder+'/module.langs'); 30 | 31 | // config 32 | const configFile = path.join(configFolder, 'config.main.yml'); 33 | const profileFile = path.join(configFolder, 'config.profile.yml'); 34 | const sessionFile = path.join(configFolder, 'config.session.yml'); 35 | 36 | // client default 37 | let client = { 38 | // base 39 | ipAddress : '', 40 | xNonce : '', 41 | xSignature: '', 42 | // personal 43 | visitId : '', 44 | // profile data 45 | profile: { 46 | userId : 0, 47 | profileId: 0, 48 | deviceId : '', 49 | }, 50 | }; 51 | 52 | // defaults 53 | let cfg = {}; 54 | 55 | // check configs 56 | if(!fs.existsSync(configFile)){ 57 | console.log('[ERROR] config file not found!'); 58 | process.exit(); 59 | } 60 | else{ 61 | cfg = yaml.parse( 62 | fs.readFileSync(configFile, 'utf8') 63 | .replace(/\${__dirname}/g, __dirname.replace(/\\/g,'/')) 64 | ); 65 | } 66 | 67 | // load profile 68 | if(fs.existsSync(profileFile)){ 69 | client.profile = yaml.parse(fs.readFileSync(profileFile, 'utf8')); 70 | } 71 | 72 | // cookies 73 | let session = {}; 74 | 75 | // load cookies 76 | if(fs.existsSync(sessionFile)){ 77 | session = yaml.parse(fs.readFileSync(sessionFile, 'utf8')); 78 | } 79 | 80 | // cli 81 | let argv = yargs 82 | .wrap(Math.min(100)) 83 | .usage('Usage: $0 [options]') 84 | .help(false).version(false) 85 | 86 | // login 87 | .describe('auth','Enter auth mode') 88 | 89 | // search 90 | .describe('search','Sets the show title for search') 91 | 92 | // params 93 | .describe('s','Sets the show id') 94 | .describe('e','Select episode ids (comma-separated, hyphen-sequence)') 95 | 96 | .describe('q','Video quality') 97 | .choices('q', ['360p','480p','720p','1080p']) 98 | .default('q', cfg.cli.videoQuality) 99 | 100 | .describe('dub','Select dub language') 101 | .choices('dub', Object.keys(langCode)) 102 | .default('dub', cfg.cli.dubLanguage) 103 | 104 | .describe('br','Force download broadcast version instead of home video version (if both versions presents)') 105 | .boolean('br') 106 | 107 | .describe('nosubs','Skip download subtitles for non-japanese dub (if available)') 108 | .boolean('nosubs') 109 | 110 | // proxy 111 | .describe('proxy','http(s)/socks proxy WHATWG url (ex. https://myproxyhost:1080/)') 112 | .describe('proxy-auth','Colon-separated username and password for proxy') 113 | .describe('ssp','Ignore proxy settings for stream downloading') 114 | .boolean('ssp') 115 | 116 | .describe('mp4','Mux into mp4') 117 | .boolean('mp4') 118 | .default('mp4',cfg.cli.mp4mux) 119 | .describe('mks','Add subtitles to mkv (if available)') 120 | .boolean('mks') 121 | .default('mks',cfg.cli.muxSubs) 122 | .describe('caps','Caption subs only for non-Japanese dub / Full subs only for Japanese dub') 123 | .boolean('caps') 124 | .default('caps',cfg.cli.capsSubs) 125 | 126 | .describe('a','Filenaming: Release group (title tag)') 127 | .default('a',cfg.cli.releaseGroup) 128 | .describe('t','Filenaming: Series title override') 129 | .describe('ep','Filenaming: Episode number override (ignored in batch mode)') 130 | .describe('suffix','Filenaming: Filename suffix override (first "SIZEp" will be replaced with actual video size)') 131 | .default('suffix',cfg.cli.fileSuffix) 132 | 133 | // util 134 | .describe('stag','Custom title tag in subtitle file') 135 | .default('stag',cfg.cli.assTitleTag) 136 | .describe('rfont','Replace all default fonts with custom font in subtitle file') 137 | .default('rfont',cfg.cli.assFont) 138 | .describe('ftag','Custom title tag in muxed file info') 139 | .default('ftag',cfg.cli.muxTitleTag) 140 | .describe('nocleanup','Move temporary files to trash folder instead of deleting') 141 | .boolean('nocleanup') 142 | .default('nocleanup',cfg.cli.noCleanUp) 143 | 144 | // help 145 | .describe('h','Show this help') 146 | .alias('h','help') 147 | .boolean('h') 148 | .version(false) 149 | 150 | .argv; 151 | 152 | // fn variables 153 | let fnTitle = '', 154 | fnEpNum = '', 155 | fnSuffix = '', 156 | fnOutput = '', 157 | tsDlPath = false, 158 | sxList = [], 159 | fontSize = 34; 160 | 161 | // go to work folder 162 | try { 163 | fs.accessSync(cfg.dir.content, fs.R_OK | fs.W_OK); 164 | } catch (e) { 165 | console.log(e); 166 | console.log('[ERROR] %s',e.messsage); 167 | process.exit(); 168 | } 169 | process.chdir(cfg.dir.content); 170 | 171 | // select mode 172 | if(argv.auth){ 173 | doAuth(); 174 | } 175 | else if(argv.search){ 176 | doSearch(); 177 | } 178 | else if(argv.s && !isNaN(parseInt(argv.s,10)) && parseInt(argv.s,10) > 0){ 179 | getShow(); 180 | } 181 | else{ 182 | yargs.showHelp(); 183 | process.exit(); 184 | } 185 | 186 | 187 | // init 188 | async function doInit(){ 189 | if(!client.ipAddress){ 190 | const newIp = await reqData('Ping', ''); 191 | if(!newIp.ok){return false;} 192 | client.ipAddress = JSON.parse(newIp.res.body).IPAddress; 193 | } 194 | if(!client.profile.deviceId){ 195 | const newDevice = await reqData('InitDevice', {'DeviceName': api.devName}); 196 | if(!newDevice.ok){return false;} 197 | client.profile = Object.assign(client.profile,{ 198 | deviceId: JSON.parse(newDevice.res.body).Data.DeviceId, 199 | }); 200 | fs.writeFileSync(profileFile,yaml.stringify(client.profile)); 201 | } 202 | if(!client.visitId){ 203 | const newVisitId = await reqData('InitVisit', {}); 204 | if(!newVisitId.ok){return false;} 205 | client.visitId = JSON.parse(newVisitId.res.body).Data.VisitId; 206 | } 207 | return true; 208 | } 209 | 210 | // Auth 211 | async function doAuth(){ 212 | const aInit = await doInit(); 213 | if(!aInit){return;} 214 | console.log('[INFO] Authentication'); 215 | const iLogin = await shlp.question('[Q] LOGIN/EMAIL'); 216 | const iPsswd = await shlp.question('[Q] PASSWORD '); 217 | const auth = await reqData('Authenticate', {'Email':iLogin,'Password':iPsswd}); 218 | if(!auth.ok){return;} 219 | const authData = JSON.parse(auth.res.body).Data; 220 | client.profile = Object.assign(client.profile, { 221 | userId: authData.User.Id, 222 | profileId: authData.Profiles[0].Id, 223 | }); 224 | fs.writeFileSync(profileFile,yaml.stringify(client.profile)); 225 | console.log('[INFO] Auth complete!'); 226 | console.log(`[INFO] Service level for "${iLogin}" is ${authData.User.ServiceLevel}`); 227 | } 228 | 229 | // Search 230 | async function doSearch(){ 231 | const aInit = await doInit(); 232 | if(!aInit){return;} 233 | const searchItems = await reqData('Search', {'Query':argv.search}); 234 | if(!searchItems.ok){return;} 235 | const sItems = JSON.parse(searchItems.res.body).Data.TitleResults; 236 | if(sItems.length>0){ 237 | console.log('[INFO] Search Results:'); 238 | for(let i=0;i{ 259 | if(e.match('-')){ 260 | let eRegx = e.split('-'); 261 | let eSplitNum, eFirstNum, eLastNum; 262 | if( eRegx.length == 2 && eRegx[0].match(/^s\d{2}e\d{3}$/i) && eRegx[1].match(/^\d{3}$/) ){ 263 | eSplitNum = eRegx[0].split('e'); 264 | eFirstNum = parseInt(eSplitNum[1]); 265 | eLastNum = parseInt(eRegx[1]); 266 | if(eFirstNum < eLastNum){ 267 | for(let i=eFirstNum;i0){ 323 | for(let s=0;s 1 ? `${showData.Name} S${ssNum}` : showData.Name; 329 | let epNum = selEpsArr[s].epKey.match(/e(\d+)$/) ? ('0'+selEpsArr[s].epKey.match(/e(\d+)$/)[1]).slice(-2) : selEpsArr[s].nameLong.toUpperCase(); 330 | console.log(`[INFO] ${showTitle} - ${epNum}`); 331 | // set customs 332 | fnTitle = argv.title ? argv.title : showTitle; 333 | fnEpNum = selEpsArr.length < 2 && argv.ep ? argv.ep : epNum; 334 | // -- 335 | let videoList = videoData.Data.VideoLanguages; 336 | let subsList = videoData.Data.CaptionLanguages; 337 | console.log('[INFO] Available dubs and subtitles:'); 338 | console.log('\tVideos: '+videoList.join('\n\t\t')); 339 | console.log('\tSubs : '+subsList.join('\n\t\t')); 340 | console.log(`[INFO] Selected dub: ${langCode[argv.dub]}`); 341 | let videoUrls = videoData.Data.VideoUrls, videoUrl = ''; 342 | let subsUrls = videoData.Data.CaptionVttUrls; 343 | fontSize = videoData.Data.FontSize ? videoData.Data.FontSize : fontSize; 344 | let videoSel = videoList.filter( v => v.match(langCode[argv.dub]) ); 345 | if(videoSel.length===0){ 346 | console.log('[ERROR] Selected dub not found!\n'); 347 | } 348 | else if(videoSel.length===1){ 349 | videoUrl = videoUrls[videoSel[0]].hls[0]; 350 | console.log(`[INFO] Selected release: ${videoSel[0].split(',')[1].trim()}`); 351 | await downloadMedia(videoUrl,subsUrls,videoData.Data.FontSize); 352 | } 353 | else if(videoSel.length===2){ 354 | if(argv.br){ 355 | videoUrl = videoUrls[videoSel.filter(v=>v.match(/Broadcast/))[0]].hls[0]; 356 | console.log('[INFO] Selected release: Broadcast'); 357 | await downloadMedia(videoUrl,subsUrls,videoData.Data.FontSize); 358 | } 359 | else{ 360 | videoUrl = videoUrls[videoSel.filter(v=>v.match(/Home Video/))[0]].hls[0]; 361 | console.log('[INFO] Selected release: Home Video'); 362 | await downloadMedia(videoUrl,subsUrls,videoData.Data.FontSize); 363 | } 364 | } 365 | } 366 | } 367 | } 368 | else{ 369 | console.log('[INFO] Episodes not selected!'); 370 | } 371 | } 372 | 373 | async function getStream(data){ 374 | if(argv.skipdl){ 375 | return { ok: true }; 376 | } 377 | else{ 378 | data.fn = data.fn + '.ts'; 379 | return await new streamdl(data).download(); 380 | } 381 | } 382 | 383 | async function downloadMedia(videoUrl,subsUrls,fontSize){ 384 | let getVideoQualities = await getData(videoUrl); 385 | if(!getVideoQualities.ok){return;} 386 | let s = m3u8(getVideoQualities.res.body).playlists; 387 | console.log('[INFO] Available qualities:'); 388 | for(let i=0;i 0){ 450 | for(let z=0; z 0 && !argv.mp4 ? true : false; 503 | // ftag 504 | argv.ftag = argv.ftag ? argv.ftag : argv.a; 505 | argv.ftag = shlp.cleanupFilename(argv.ftag); 506 | // check exec 507 | if( !argv.mp4 && !isFile(cfg.bin.mkvmerge) && !isFile(cfg.bin.mkvmerge+'.exe') ){ 508 | console.log('[WARN] MKVMerge not found, skip using this...'); 509 | cfg.bin.mkvmerge = false; 510 | } 511 | if( !isFile(cfg.bin.ffmpeg) && !isFile(cfg.bin.ffmpeg+'.exe') ){ 512 | console.log((cfg.bin.mkvmerge?'\n':'')+'[WARN] FFmpeg not found, skip using this...'); 513 | cfg.bin.ffmpeg = false; 514 | } 515 | // mux to mkv 516 | if(!argv.mp4 && cfg.bin.mkvmerge){ 517 | let mkvmux = []; 518 | // defaults 519 | mkvmux.push('--output',`${fnOutput}.mkv`); 520 | mkvmux.push('--disable-track-statistics-tags','--engage','no_variable_data'); 521 | // video 522 | mkvmux.push('--track-name',`1:[${argv.ftag}]`); 523 | mkvmux.push('--language',`0:${argv.dub}`); 524 | mkvmux.push('--video-tracks','1','--audio-tracks','0'); 525 | mkvmux.push('--no-subtitles','--no-attachments'); 526 | mkvmux.push(`${fnOutput}.ts`); 527 | // subtitles 528 | if(addSubs){ 529 | for(let t in sxList){ 530 | if(capsOpt(sxList[t].isCaps)){ 531 | mkvmux.push('--track-name',`0:${sxList[t].language}`); 532 | mkvmux.push('--language',`0:${sxList[t].langCode}`); 533 | mkvmux.push(`${sxList[t].file}`); 534 | } 535 | } 536 | } 537 | fs.writeFileSync(`${fnOutput}.json`,JSON.stringify(mkvmux,null,' ')); 538 | shlp.exec('mkvmerge',`"${cfg.bin.mkvmerge}"`,`@"${fnOutput}.json"`); 539 | fs.unlinkSync(`${fnOutput}.json`); 540 | } 541 | else if(cfg.bin.ffmpeg){ 542 | let ffsubs = {fsubs:'',meta1:'',meta2:''}; 543 | if(addSubs){ 544 | for(let t in sxList){ 545 | if(capsOpt(sxList[t].isCaps)){ 546 | ffsubs.fsubs += `-i "${sxList[t].file}" `; 547 | ffsubs.meta1 += `-map ${(parseInt(t)+1)} -c:s copy `; 548 | ffsubs.meta2 += `-metadata:s:s:${(t)} title="${sxList[t].language}" -metadata:s:s:${(t)} language=${sxList[t].langCode} `; 549 | } 550 | } 551 | } 552 | let ffext = !argv.mp4 ? 'mkv' : 'mp4'; 553 | let ffmux = `-i "${fnOutput}.ts" `; 554 | ffmux += ffsubs.fsubs; 555 | ffmux += '-map 0 -c:v copy -c:a copy '; 556 | ffmux += ffsubs.meta1; 557 | ffmux += '-metadata encoding_tool="no_variable_data" '; 558 | ffmux += `-metadata:s:v:0 title="[${argv.ftag}]" -metadata:s:a:0 language=${argv.dub} `; 559 | ffmux += ffsubs.meta2; 560 | ffmux += `"${fnOutput}.${ffext}"`; 561 | // mux to mkv 562 | try{ shlp.exec('ffmpeg',`"${cfg.bin.ffmpeg}"`,ffmux); }catch(e){} 563 | } 564 | else{ 565 | console.log('\n[INFO] Done!\n'); 566 | return; 567 | } 568 | if(argv.nocleanup){ 569 | fs.renameSync(fnOutput+'.ts', path.join(cfg.dir.trash,`/${fnOutput}.ts`)); 570 | if(addSubs){ 571 | for(let t in sxList){ 572 | fs.renameSync(sxList[t].file, path.join(cfg.dir.trash,`/${sxList[t].file}`)); 573 | } 574 | } 575 | } 576 | else{ 577 | fs.unlinkSync(fnOutput+'.ts'); 578 | if(addSubs){ 579 | for(let t in sxList){ 580 | fs.unlinkSync(sxList[t].file); 581 | } 582 | } 583 | } 584 | console.log('\n[INFO] Done!\n'); 585 | } 586 | 587 | function capsOpt(isCaps){ 588 | return !argv.caps 589 | || argv.caps && isCaps && argv.dub != 'jpn' 590 | || argv.caps && !isCaps && argv.dub == 'jpn' 591 | ? true : false; 592 | } 593 | 594 | function isFile(file){ 595 | try{ 596 | const isFile = fs.statSync(file).isFile(); 597 | return isFile; 598 | } 599 | catch(e){ 600 | return false; 601 | } 602 | } 603 | 604 | // Generate Nonce 605 | function generateNonce(){ 606 | const initDate = new Date(); 607 | const nonceDate = [ 608 | initDate.getUTCFullYear().toString().slice(-2), // yy 609 | ('0'+(initDate.getUTCMonth()+1)).slice(-2), // MM 610 | ('0'+initDate.getUTCDate()).slice(-2), // dd 611 | ('0'+initDate.getUTCHours()).slice(-2), // HH 612 | ('0'+initDate.getUTCMinutes()).slice(-2) // mm 613 | ].join(''); // => "yyMMddHHmm" (UTC) 614 | const nonceCleanStr = nonceDate + api.apikey; 615 | const nonceHash = crypto.createHash('sha256').update(nonceCleanStr).digest('hex'); 616 | return nonceHash; 617 | } 618 | 619 | // Generate Signature 620 | function generateSignature(body, visitId, profile){ 621 | const sigCleanStr = [ 622 | client.ipAddress, 623 | api.appId, 624 | profile.deviceId, 625 | visitId, 626 | profile.userId, 627 | profile.profileId, 628 | body, 629 | client.xNonce, 630 | api.apikey, 631 | ].join(''); 632 | return crypto.createHash('sha256').update(sigCleanStr).digest('hex'); 633 | } 634 | 635 | // getData 636 | async function getData(reqUrl){ 637 | return await reqData(reqUrl, '', 'GET'); 638 | } 639 | 640 | // postApi 641 | async function reqData(method, body, type){ 642 | let options = { headers: {} }; 643 | // get request type 644 | const isGet = type == 'GET' ? true : false; 645 | // set request type, url and user agent 646 | options.method = isGet ? 'GET' : 'POST'; 647 | options.url = ( !isGet ? api.apihost + '/api/v1/' : '') + method; 648 | options.headers['user-agent'] = isGet ? api.clientExo : api.clientWeb; 649 | // set api data 650 | if(!isGet){ 651 | options.body = body == '' ? body : JSON.stringify(body); 652 | // set api headers 653 | if(method != 'Ping'){ 654 | let visitId = client.visitId ? client.visitId : ''; 655 | let vprofile = { 656 | userId: client.profile.userId || 0, 657 | profileId: client.profile.profileId || 0, 658 | deviceId: client.profile.deviceId || '', 659 | }; 660 | client.xNonce = generateNonce(); 661 | client.xSignature = generateSignature(options.body, visitId, vprofile); 662 | options.headers = Object.assign(options.headers, { 663 | 'X-VisitId' : visitId, 664 | 'X-UserId' : vprofile.userId, 665 | 'X-ProfileId' : vprofile.profileId, 666 | 'X-DeviceId' : vprofile.deviceId, 667 | 'X-Nonce' : client.xNonce, 668 | 'X-Signature' : client.xSignature, 669 | }); 670 | } 671 | options.headers = Object.assign({ 672 | 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8', 673 | 'X-ApplicationId': api.appId, 674 | }, options.headers); 675 | // cookies 676 | let cookiesList = Object.keys(session); 677 | if(cookiesList.length > 0 && method != 'Ping'){ 678 | options.headers.Cookie = shlp.cookie.make(session,cookiesList); 679 | } 680 | } 681 | else if(isGet && !options.url.match(/\?/)){ 682 | client.xNonce = generateNonce(); 683 | client.xSignature = generateSignature(options.body,client.visitId,client.profile); 684 | options.url = options.url + '?' + (new URLSearchParams({ 685 | 'X-ApplicationId': api.appId, 686 | 'X-DeviceId' : client.profile.deviceId, 687 | 'X-VisitId' : client.visitId, 688 | 'X-UserId' : client.profile.userId, 689 | 'X-ProfileId' : client.profile.profileId, 690 | 'X-Nonce' : client.xNonce, 691 | 'X-Signature' : client.xSignature, 692 | })).toString(); 693 | } 694 | // check m3u8 request and ssp param 695 | let useProxy = isGet && argv.ssp && options.url.match(/\.m3u8/) ? false : true; 696 | // set proxy 697 | if(useProxy && argv.proxy){ 698 | /* 699 | try{ 700 | let proxyUrl = buildProxyUrl(argv.proxy,argv['proxy-auth']); 701 | options.agent = new ProxyAgent(proxyUrl); 702 | options.timeout = 10000; 703 | } 704 | catch(e){ 705 | console.log(`[WARN] Not valid proxy URL${e.input?' ('+e.input+')':''}!`); 706 | console.log(`[WARN] Skiping...\n`); 707 | } 708 | */ 709 | } 710 | try{ 711 | if(argv.debug){ 712 | console.log('[DEBUG] Request params:'); 713 | console.log(options); 714 | } 715 | let res = await got(options); 716 | if(!isGet && res.headers && res.headers['set-cookie']){ 717 | const newReqCookies = shlp.cookie.parse(res.headers['set-cookie']); 718 | session = Object.assign(session, newReqCookies); 719 | fs.writeFileSync(sessionFile,yaml.stringify(session)); 720 | } 721 | if(!isGet){ 722 | const resJ = JSON.parse(res.body); 723 | if(resJ.Code > 0){ 724 | console.log(`[ERROR] Code ${resJ.Code} (${resJ.Status}): ${resJ.Message}\n`); 725 | if(resJ.Code == 81 || resJ.Code == 5){ 726 | console.log('[NOTE] App was broken because of changes in official app.'); 727 | console.log('[NOTE] See: https://github.com/anidl/hidive-downloader-nx/issues/1\n'); 728 | } 729 | if(resJ.Code == 55){ 730 | console.log('[NOTE] You need premium account to view this video.'); 731 | } 732 | return { 733 | ok: false, 734 | res, 735 | }; 736 | } 737 | } 738 | return { 739 | ok: true, 740 | res, 741 | }; 742 | } 743 | catch(error){ 744 | if(error.statusCode && error.statusMessage){ 745 | console.log(`\n[ERROR] ${error.name} ${error.statusCode}: ${error.statusMessage}\n`); 746 | } 747 | else{ 748 | console.log(`\n[ERROR] ${error.name}: ${error.code}\n`); 749 | } 750 | return { 751 | ok: false, 752 | error, 753 | }; 754 | } 755 | } 756 | 757 | // make proxy url 758 | /* 759 | function buildProxyUrl(proxyBaseUrl,proxyAuth){ 760 | let proxyCfg = new URL(proxyBaseUrl); 761 | if(!proxyCfg.hostname || !proxyCfg.port){ 762 | throw new Error(); 763 | } 764 | if(proxyAuth && proxyAuth.match(':')){ 765 | proxyCfg.auth = proxyAuth; 766 | } 767 | return url.format({ 768 | protocol: proxyCfg.protocol, 769 | slashes: true, 770 | auth: proxyCfg.auth, 771 | hostname: proxyCfg.hostname, 772 | port: proxyCfg.port, 773 | }); 774 | } 775 | */ 776 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 6 6 | cacheKey: 8 7 | 8 | "@babel/runtime@npm:^7.12.5": 9 | version: 7.20.7 10 | resolution: "@babel/runtime@npm:7.20.7" 11 | dependencies: 12 | regenerator-runtime: ^0.13.11 13 | checksum: 4629ce5c46f06cca9cfb9b7fc00d48003335a809888e2b91ec2069a2dcfbfef738480cff32ba81e0b7c290f8918e5c22ddcf2b710001464ee84ba62c7e32a3a3 14 | languageName: node 15 | linkType: hard 16 | 17 | "@sindresorhus/is@npm:^4.0.0": 18 | version: 4.2.0 19 | resolution: "@sindresorhus/is@npm:4.2.0" 20 | checksum: 59040dfb75c2eb6ab76e8c7ac10b7f7f6ba740f0b5ac618a89a8bcdbaf923836a8e998078d59d81f6f13f4b6bbe15bfe1bca962c877edcbe9160d1c100c56fd7 21 | languageName: node 22 | linkType: hard 23 | 24 | "@szmarczak/http-timer@npm:^4.0.5": 25 | version: 4.0.6 26 | resolution: "@szmarczak/http-timer@npm:4.0.6" 27 | dependencies: 28 | defer-to-connect: ^2.0.0 29 | checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 30 | languageName: node 31 | linkType: hard 32 | 33 | "@tootallnate/once@npm:1": 34 | version: 1.1.2 35 | resolution: "@tootallnate/once@npm:1.1.2" 36 | checksum: e1fb1bbbc12089a0cb9433dc290f97bddd062deadb6178ce9bcb93bb7c1aecde5e60184bc7065aec42fe1663622a213493c48bbd4972d931aae48315f18e1be9 37 | languageName: node 38 | linkType: hard 39 | 40 | "@types/cacheable-request@npm:^6.0.1": 41 | version: 6.0.3 42 | resolution: "@types/cacheable-request@npm:6.0.3" 43 | dependencies: 44 | "@types/http-cache-semantics": "*" 45 | "@types/keyv": ^3.1.4 46 | "@types/node": "*" 47 | "@types/responselike": ^1.0.0 48 | checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 49 | languageName: node 50 | linkType: hard 51 | 52 | "@types/http-cache-semantics@npm:*": 53 | version: 4.0.1 54 | resolution: "@types/http-cache-semantics@npm:4.0.1" 55 | checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 56 | languageName: node 57 | linkType: hard 58 | 59 | "@types/keyv@npm:^3.1.4": 60 | version: 3.1.4 61 | resolution: "@types/keyv@npm:3.1.4" 62 | dependencies: 63 | "@types/node": "*" 64 | checksum: e009a2bfb50e90ca9b7c6e8f648f8464067271fd99116f881073fa6fa76dc8d0133181dd65e6614d5fb1220d671d67b0124aef7d97dc02d7e342ab143a47779d 65 | languageName: node 66 | linkType: hard 67 | 68 | "@types/node@npm:*": 69 | version: 18.11.18 70 | resolution: "@types/node@npm:18.11.18" 71 | checksum: 03f17f9480f8d775c8a72da5ea7e9383db5f6d85aa5fefde90dd953a1449bd5e4ffde376f139da4f3744b4c83942166d2a7603969a6f8ea826edfb16e6e3b49d 72 | languageName: node 73 | linkType: hard 74 | 75 | "@types/responselike@npm:^1.0.0": 76 | version: 1.0.0 77 | resolution: "@types/responselike@npm:1.0.0" 78 | dependencies: 79 | "@types/node": "*" 80 | checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 81 | languageName: node 82 | linkType: hard 83 | 84 | "@videojs/vhs-utils@npm:^3.0.5": 85 | version: 3.0.5 86 | resolution: "@videojs/vhs-utils@npm:3.0.5" 87 | dependencies: 88 | "@babel/runtime": ^7.12.5 89 | global: ^4.4.0 90 | url-toolkit: ^2.2.1 91 | checksum: 637dc9a8848027eab4213d6e85439d216577d0cb0346767c15bbb07a5a730aa30545f0b5d7bfd636f40212e490f34bf103e331f0bc180b4d3c245e77f30b437f 92 | languageName: node 93 | linkType: hard 94 | 95 | "acorn-walk@npm:^8.2.0": 96 | version: 8.2.0 97 | resolution: "acorn-walk@npm:8.2.0" 98 | checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 99 | languageName: node 100 | linkType: hard 101 | 102 | "acorn@npm:^8.7.0": 103 | version: 8.8.1 104 | resolution: "acorn@npm:8.8.1" 105 | bin: 106 | acorn: bin/acorn 107 | checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f 108 | languageName: node 109 | linkType: hard 110 | 111 | "agent-base@npm:6, agent-base@npm:^6.0.0, agent-base@npm:^6.0.2": 112 | version: 6.0.2 113 | resolution: "agent-base@npm:6.0.2" 114 | dependencies: 115 | debug: 4 116 | checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d 117 | languageName: node 118 | linkType: hard 119 | 120 | "ansi-regex@npm:^5.0.1": 121 | version: 5.0.1 122 | resolution: "ansi-regex@npm:5.0.1" 123 | checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b 124 | languageName: node 125 | linkType: hard 126 | 127 | "ansi-styles@npm:^4.0.0": 128 | version: 4.3.0 129 | resolution: "ansi-styles@npm:4.3.0" 130 | dependencies: 131 | color-convert: ^2.0.1 132 | checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 133 | languageName: node 134 | linkType: hard 135 | 136 | "ast-types@npm:^0.13.2": 137 | version: 0.13.4 138 | resolution: "ast-types@npm:0.13.4" 139 | dependencies: 140 | tslib: ^2.0.1 141 | checksum: 5a51f7b70588ecced3601845a0e203279ca2f5fdc184416a0a1640c93ec0a267241d6090a328e78eebb8de81f8754754e0a4f1558ba2a3d638f8ccbd0b1f0eff 142 | languageName: node 143 | linkType: hard 144 | 145 | "bytes@npm:3.1.0": 146 | version: 3.1.0 147 | resolution: "bytes@npm:3.1.0" 148 | checksum: 7c3b21c5d9d44ed455460d5d36a31abc6fa2ce3807964ba60a4b03fd44454c8cf07bb0585af83bfde1c5cc2ea4bbe5897bc3d18cd15e0acf25a3615a35aba2df 149 | languageName: node 150 | linkType: hard 151 | 152 | "cacheable-lookup@npm:^5.0.3": 153 | version: 5.0.4 154 | resolution: "cacheable-lookup@npm:5.0.4" 155 | checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d 156 | languageName: node 157 | linkType: hard 158 | 159 | "cacheable-request@npm:^7.0.2": 160 | version: 7.0.2 161 | resolution: "cacheable-request@npm:7.0.2" 162 | dependencies: 163 | clone-response: ^1.0.2 164 | get-stream: ^5.1.0 165 | http-cache-semantics: ^4.0.0 166 | keyv: ^4.0.0 167 | lowercase-keys: ^2.0.0 168 | normalize-url: ^6.0.1 169 | responselike: ^2.0.0 170 | checksum: 6152813982945a5c9989cb457a6c499f12edcc7ade323d2fbfd759abc860bdbd1306e08096916bb413c3c47e812f8e4c0a0cc1e112c8ce94381a960f115bc77f 171 | languageName: node 172 | linkType: hard 173 | 174 | "cliui@npm:^8.0.1": 175 | version: 8.0.1 176 | resolution: "cliui@npm:8.0.1" 177 | dependencies: 178 | string-width: ^4.2.0 179 | strip-ansi: ^6.0.1 180 | wrap-ansi: ^7.0.0 181 | checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 182 | languageName: node 183 | linkType: hard 184 | 185 | "clone-response@npm:^1.0.2": 186 | version: 1.0.3 187 | resolution: "clone-response@npm:1.0.3" 188 | dependencies: 189 | mimic-response: ^1.0.0 190 | checksum: 4e671cac39b11c60aa8ba0a450657194a5d6504df51bca3fac5b3bd0145c4f8e8464898f87c8406b83232e3bc5cca555f51c1f9c8ac023969ebfbf7f6bdabb2e 191 | languageName: node 192 | linkType: hard 193 | 194 | "color-convert@npm:^2.0.1": 195 | version: 2.0.1 196 | resolution: "color-convert@npm:2.0.1" 197 | dependencies: 198 | color-name: ~1.1.4 199 | checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 200 | languageName: node 201 | linkType: hard 202 | 203 | "color-name@npm:~1.1.4": 204 | version: 1.1.4 205 | resolution: "color-name@npm:1.1.4" 206 | checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 207 | languageName: node 208 | linkType: hard 209 | 210 | "core-util-is@npm:~1.0.0": 211 | version: 1.0.3 212 | resolution: "core-util-is@npm:1.0.3" 213 | checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 214 | languageName: node 215 | linkType: hard 216 | 217 | "data-uri-to-buffer@npm:3": 218 | version: 3.0.1 219 | resolution: "data-uri-to-buffer@npm:3.0.1" 220 | checksum: c59c3009686a78c071806b72f4810856ec28222f0f4e252aa495ec027ed9732298ceea99c50328cf59b151dd34cbc3ad6150bbb43e41fc56fa19f48c99e9fc30 221 | languageName: node 222 | linkType: hard 223 | 224 | "debug@npm:4": 225 | version: 4.3.2 226 | resolution: "debug@npm:4.3.2" 227 | dependencies: 228 | ms: 2.1.2 229 | peerDependenciesMeta: 230 | supports-color: 231 | optional: true 232 | checksum: 820ea160e267e23c953c9ed87e7ad93494d8cda2f7349af5e7e3bb236d23707ee3022f477d5a7d2ee86ef2bf7d60aa9ab22d1f58080d7deb9dccd073585e1e43 233 | languageName: node 234 | linkType: hard 235 | 236 | "decompress-response@npm:^6.0.0": 237 | version: 6.0.0 238 | resolution: "decompress-response@npm:6.0.0" 239 | dependencies: 240 | mimic-response: ^3.1.0 241 | checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 242 | languageName: node 243 | linkType: hard 244 | 245 | "deep-is@npm:~0.1.3": 246 | version: 0.1.4 247 | resolution: "deep-is@npm:0.1.4" 248 | checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 249 | languageName: node 250 | linkType: hard 251 | 252 | "defer-to-connect@npm:^2.0.0": 253 | version: 2.0.1 254 | resolution: "defer-to-connect@npm:2.0.1" 255 | checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b 256 | languageName: node 257 | linkType: hard 258 | 259 | "degenerator@npm:^3.0.1": 260 | version: 3.0.1 261 | resolution: "degenerator@npm:3.0.1" 262 | dependencies: 263 | ast-types: ^0.13.2 264 | escodegen: ^1.8.1 265 | esprima: ^4.0.0 266 | vm2: ^3.9.3 267 | checksum: 110d5fa772933d21484995e518feeb2ea54e5804421edf8546900973a227dcdf621a0cbac0a5d0a13273424ea3763aba815246dfffa386483f5480d60f50bed1 268 | languageName: node 269 | linkType: hard 270 | 271 | "depd@npm:~1.1.2": 272 | version: 1.1.2 273 | resolution: "depd@npm:1.1.2" 274 | checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 275 | languageName: node 276 | linkType: hard 277 | 278 | "dom-walk@npm:^0.1.0": 279 | version: 0.1.2 280 | resolution: "dom-walk@npm:0.1.2" 281 | checksum: 19eb0ce9c6de39d5e231530685248545d9cd2bd97b2cb3486e0bfc0f2a393a9addddfd5557463a932b52fdfcf68ad2a619020cd2c74a5fe46fbecaa8e80872f3 282 | languageName: node 283 | linkType: hard 284 | 285 | "emoji-regex@npm:^8.0.0": 286 | version: 8.0.0 287 | resolution: "emoji-regex@npm:8.0.0" 288 | checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 289 | languageName: node 290 | linkType: hard 291 | 292 | "end-of-stream@npm:^1.1.0": 293 | version: 1.4.4 294 | resolution: "end-of-stream@npm:1.4.4" 295 | dependencies: 296 | once: ^1.4.0 297 | checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b 298 | languageName: node 299 | linkType: hard 300 | 301 | "escalade@npm:^3.1.1": 302 | version: 3.1.1 303 | resolution: "escalade@npm:3.1.1" 304 | checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 305 | languageName: node 306 | linkType: hard 307 | 308 | "escodegen@npm:^1.8.1": 309 | version: 1.14.3 310 | resolution: "escodegen@npm:1.14.3" 311 | dependencies: 312 | esprima: ^4.0.1 313 | estraverse: ^4.2.0 314 | esutils: ^2.0.2 315 | optionator: ^0.8.1 316 | source-map: ~0.6.1 317 | dependenciesMeta: 318 | source-map: 319 | optional: true 320 | bin: 321 | escodegen: bin/escodegen.js 322 | esgenerate: bin/esgenerate.js 323 | checksum: 381cdc4767ecdb221206bbbab021b467bbc2a6f5c9a99c9e6353040080bdd3dfe73d7604ad89a47aca6ea7d58bc635f6bd3fbc8da9a1998e9ddfa8372362ccd0 324 | languageName: node 325 | linkType: hard 326 | 327 | "esprima@npm:^4.0.0, esprima@npm:^4.0.1": 328 | version: 4.0.1 329 | resolution: "esprima@npm:4.0.1" 330 | bin: 331 | esparse: ./bin/esparse.js 332 | esvalidate: ./bin/esvalidate.js 333 | checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 334 | languageName: node 335 | linkType: hard 336 | 337 | "estraverse@npm:^4.2.0": 338 | version: 4.3.0 339 | resolution: "estraverse@npm:4.3.0" 340 | checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 341 | languageName: node 342 | linkType: hard 343 | 344 | "esutils@npm:^2.0.2": 345 | version: 2.0.3 346 | resolution: "esutils@npm:2.0.3" 347 | checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 348 | languageName: node 349 | linkType: hard 350 | 351 | "fast-levenshtein@npm:~2.0.6": 352 | version: 2.0.6 353 | resolution: "fast-levenshtein@npm:2.0.6" 354 | checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c 355 | languageName: node 356 | linkType: hard 357 | 358 | "file-uri-to-path@npm:2": 359 | version: 2.0.0 360 | resolution: "file-uri-to-path@npm:2.0.0" 361 | checksum: 4a71a99ddaa6ae7ae7bffe2948c34da59982ed465d930a0af9cb59fcc10fcd93366cc356ec3337c18373fde5df7ac52afda4558f155febd1799d135552207edb 362 | languageName: node 363 | linkType: hard 364 | 365 | "fs-extra@npm:^8.1.0": 366 | version: 8.1.0 367 | resolution: "fs-extra@npm:8.1.0" 368 | dependencies: 369 | graceful-fs: ^4.2.0 370 | jsonfile: ^4.0.0 371 | universalify: ^0.1.0 372 | checksum: bf44f0e6cea59d5ce071bba4c43ca76d216f89e402dc6285c128abc0902e9b8525135aa808adad72c9d5d218e9f4bcc63962815529ff2f684ad532172a284880 373 | languageName: node 374 | linkType: hard 375 | 376 | "ftp@npm:^0.3.10": 377 | version: 0.3.10 378 | resolution: "ftp@npm:0.3.10" 379 | dependencies: 380 | readable-stream: 1.1.x 381 | xregexp: 2.0.0 382 | checksum: ddd313c1d44eb7429f3a7d77a0155dc8fe86a4c64dca58f395632333ce4b4e74c61413c6e0ef66ea3f3d32d905952fbb6d028c7117d522f793eb1fa282e17357 383 | languageName: node 384 | linkType: hard 385 | 386 | "get-caller-file@npm:^2.0.5": 387 | version: 2.0.5 388 | resolution: "get-caller-file@npm:2.0.5" 389 | checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 390 | languageName: node 391 | linkType: hard 392 | 393 | "get-stream@npm:^5.1.0": 394 | version: 5.2.0 395 | resolution: "get-stream@npm:5.2.0" 396 | dependencies: 397 | pump: ^3.0.0 398 | checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 399 | languageName: node 400 | linkType: hard 401 | 402 | "get-uri@npm:3": 403 | version: 3.0.2 404 | resolution: "get-uri@npm:3.0.2" 405 | dependencies: 406 | "@tootallnate/once": 1 407 | data-uri-to-buffer: 3 408 | debug: 4 409 | file-uri-to-path: 2 410 | fs-extra: ^8.1.0 411 | ftp: ^0.3.10 412 | checksum: 5325b2906b08ca37529ca421cf52bc50376e75c6a945e0a8064e3f76b4bb67b8ab1e316a2fc7a307c8c606ab36d030720f39a57c97b027ff1134335e12102946 413 | languageName: node 414 | linkType: hard 415 | 416 | "global@npm:^4.4.0": 417 | version: 4.4.0 418 | resolution: "global@npm:4.4.0" 419 | dependencies: 420 | min-document: ^2.19.0 421 | process: ^0.11.10 422 | checksum: 9c057557c8f5a5bcfbeb9378ba4fe2255d04679452be504608dd5f13b54edf79f7be1db1031ea06a4ec6edd3b9f5f17d2d172fb47e6c69dae57fd84b7e72b77f 423 | languageName: node 424 | linkType: hard 425 | 426 | "got@npm:^11.8.2, got@npm:^11.8.3": 427 | version: 11.8.6 428 | resolution: "got@npm:11.8.6" 429 | dependencies: 430 | "@sindresorhus/is": ^4.0.0 431 | "@szmarczak/http-timer": ^4.0.5 432 | "@types/cacheable-request": ^6.0.1 433 | "@types/responselike": ^1.0.0 434 | cacheable-lookup: ^5.0.3 435 | cacheable-request: ^7.0.2 436 | decompress-response: ^6.0.0 437 | http2-wrapper: ^1.0.0-beta.5.2 438 | lowercase-keys: ^2.0.0 439 | p-cancelable: ^2.0.0 440 | responselike: ^2.0.0 441 | checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d 442 | languageName: node 443 | linkType: hard 444 | 445 | "graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0": 446 | version: 4.2.8 447 | resolution: "graceful-fs@npm:4.2.8" 448 | checksum: 5d224c8969ad0581d551dfabdb06882706b31af2561bd5e2034b4097e67cc27d05232849b8643866585fd0a41c7af152950f8776f4dd5579e9853733f31461c6 449 | languageName: node 450 | linkType: hard 451 | 452 | "hidive-downloader-nx@workspace:.": 453 | version: 0.0.0-use.local 454 | resolution: "hidive-downloader-nx@workspace:." 455 | dependencies: 456 | got: ^11.8.2 457 | hls-download: ^2.6.10 458 | m3u8-parsed: ^1.3.0 459 | sei-helper: ^3.3.0 460 | yaml: ^2.2.1 461 | yargs: ^17.6.2 462 | languageName: unknown 463 | linkType: soft 464 | 465 | "hls-download@npm:^2.6.10": 466 | version: 2.6.10 467 | resolution: "hls-download@npm:2.6.10" 468 | dependencies: 469 | got: ^11.8.3 470 | proxy-agent: ^5.0.0 471 | sei-helper: ^3.3.0 472 | checksum: f2d66b7560c87ea989ec479862ebc5dfd3d63fde7ea40dfb7818ee36b8e1f2759d4f0093dafe5d1f0adf6276c20d5e20f02817b87ed8a966a5ebb7714f28dcc2 473 | languageName: node 474 | linkType: hard 475 | 476 | "http-cache-semantics@npm:^4.0.0": 477 | version: 4.1.0 478 | resolution: "http-cache-semantics@npm:4.1.0" 479 | checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 480 | languageName: node 481 | linkType: hard 482 | 483 | "http-errors@npm:1.7.3": 484 | version: 1.7.3 485 | resolution: "http-errors@npm:1.7.3" 486 | dependencies: 487 | depd: ~1.1.2 488 | inherits: 2.0.4 489 | setprototypeof: 1.1.1 490 | statuses: ">= 1.5.0 < 2" 491 | toidentifier: 1.0.0 492 | checksum: a59f359473f4b3ea78305beee90d186268d6075432622a46fb7483059068a2dd4c854a20ac8cd438883127e06afb78c1309168bde6cdfeed1e3700eb42487d99 493 | languageName: node 494 | linkType: hard 495 | 496 | "http-proxy-agent@npm:^4.0.0, http-proxy-agent@npm:^4.0.1": 497 | version: 4.0.1 498 | resolution: "http-proxy-agent@npm:4.0.1" 499 | dependencies: 500 | "@tootallnate/once": 1 501 | agent-base: 6 502 | debug: 4 503 | checksum: c6a5da5a1929416b6bbdf77b1aca13888013fe7eb9d59fc292e25d18e041bb154a8dfada58e223fc7b76b9b2d155a87e92e608235201f77d34aa258707963a82 504 | languageName: node 505 | linkType: hard 506 | 507 | "http2-wrapper@npm:^1.0.0-beta.5.2": 508 | version: 1.0.3 509 | resolution: "http2-wrapper@npm:1.0.3" 510 | dependencies: 511 | quick-lru: ^5.1.1 512 | resolve-alpn: ^1.0.0 513 | checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e 514 | languageName: node 515 | linkType: hard 516 | 517 | "https-proxy-agent@npm:5, https-proxy-agent@npm:^5.0.0": 518 | version: 5.0.0 519 | resolution: "https-proxy-agent@npm:5.0.0" 520 | dependencies: 521 | agent-base: 6 522 | debug: 4 523 | checksum: 165bfb090bd26d47693597661298006841ab733d0c7383a8cb2f17373387a94c903a3ac687090aa739de05e379ab6f868bae84ab4eac288ad85c328cd1ec9e53 524 | languageName: node 525 | linkType: hard 526 | 527 | "iconv-lite@npm:0.4.24": 528 | version: 0.4.24 529 | resolution: "iconv-lite@npm:0.4.24" 530 | dependencies: 531 | safer-buffer: ">= 2.1.2 < 3" 532 | checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 533 | languageName: node 534 | linkType: hard 535 | 536 | "inherits@npm:2.0.4, inherits@npm:~2.0.1": 537 | version: 2.0.4 538 | resolution: "inherits@npm:2.0.4" 539 | checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 540 | languageName: node 541 | linkType: hard 542 | 543 | "ip@npm:^1.1.5": 544 | version: 1.1.5 545 | resolution: "ip@npm:1.1.5" 546 | checksum: 30133981f082a060a32644f6a7746e9ba7ac9e2bc07ecc8bbdda3ee8ca9bec1190724c390e45a1ee7695e7edfd2a8f7dda2c104ec5f7ac5068c00648504c7e5a 547 | languageName: node 548 | linkType: hard 549 | 550 | "is-fullwidth-code-point@npm:^3.0.0": 551 | version: 3.0.0 552 | resolution: "is-fullwidth-code-point@npm:3.0.0" 553 | checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 554 | languageName: node 555 | linkType: hard 556 | 557 | "isarray@npm:0.0.1": 558 | version: 0.0.1 559 | resolution: "isarray@npm:0.0.1" 560 | checksum: 49191f1425681df4a18c2f0f93db3adb85573bcdd6a4482539d98eac9e705d8961317b01175627e860516a2fc45f8f9302db26e5a380a97a520e272e2a40a8d4 561 | languageName: node 562 | linkType: hard 563 | 564 | "json-buffer@npm:3.0.1": 565 | version: 3.0.1 566 | resolution: "json-buffer@npm:3.0.1" 567 | checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 568 | languageName: node 569 | linkType: hard 570 | 571 | "jsonfile@npm:^4.0.0": 572 | version: 4.0.0 573 | resolution: "jsonfile@npm:4.0.0" 574 | dependencies: 575 | graceful-fs: ^4.1.6 576 | dependenciesMeta: 577 | graceful-fs: 578 | optional: true 579 | checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e 580 | languageName: node 581 | linkType: hard 582 | 583 | "keyv@npm:^4.0.0": 584 | version: 4.5.2 585 | resolution: "keyv@npm:4.5.2" 586 | dependencies: 587 | json-buffer: 3.0.1 588 | checksum: 13ad58303acd2261c0d4831b4658451603fd159e61daea2121fcb15feb623e75ee328cded0572da9ca76b7b3ceaf8e614f1806c6b3af5db73c9c35a345259651 589 | languageName: node 590 | linkType: hard 591 | 592 | "levn@npm:~0.3.0": 593 | version: 0.3.0 594 | resolution: "levn@npm:0.3.0" 595 | dependencies: 596 | prelude-ls: ~1.1.2 597 | type-check: ~0.3.2 598 | checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e 599 | languageName: node 600 | linkType: hard 601 | 602 | "lowercase-keys@npm:^2.0.0": 603 | version: 2.0.0 604 | resolution: "lowercase-keys@npm:2.0.0" 605 | checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 606 | languageName: node 607 | linkType: hard 608 | 609 | "lru-cache@npm:^5.1.1": 610 | version: 5.1.1 611 | resolution: "lru-cache@npm:5.1.1" 612 | dependencies: 613 | yallist: ^3.0.2 614 | checksum: c154ae1cbb0c2206d1501a0e94df349653c92c8cbb25236d7e85190bcaf4567a03ac6eb43166fabfa36fd35623694da7233e88d9601fbf411a9a481d85dbd2cb 615 | languageName: node 616 | linkType: hard 617 | 618 | "m3u8-parsed@npm:^1.3.0": 619 | version: 1.3.0 620 | resolution: "m3u8-parsed@npm:1.3.0" 621 | dependencies: 622 | m3u8-parser: ^4.4.0 623 | checksum: 40fc8b9c3f51c295012cac330e3cb9a0222e3fc76e9c58cd8e04927757ec80bf5aee4034faefe1bfec4527b6fa0c9407f657ea2a3a416646c1926096c54837c8 624 | languageName: node 625 | linkType: hard 626 | 627 | "m3u8-parser@npm:^4.4.0": 628 | version: 4.8.0 629 | resolution: "m3u8-parser@npm:4.8.0" 630 | dependencies: 631 | "@babel/runtime": ^7.12.5 632 | "@videojs/vhs-utils": ^3.0.5 633 | global: ^4.4.0 634 | checksum: 850a8c5cacdbdc154d4fa18c79af77fdf45ef4afcb3d8a0507d04e8d9ddb5c0a9d18cb48c8e23be707d007c063038cdeab0d3de23100e5c02050a7aff6e2b2b8 635 | languageName: node 636 | linkType: hard 637 | 638 | "mimic-response@npm:^1.0.0": 639 | version: 1.0.1 640 | resolution: "mimic-response@npm:1.0.1" 641 | checksum: 034c78753b0e622bc03c983663b1cdf66d03861050e0c8606563d149bc2b02d63f62ce4d32be4ab50d0553ae0ffe647fc34d1f5281184c6e1e8cf4d85e8d9823 642 | languageName: node 643 | linkType: hard 644 | 645 | "mimic-response@npm:^3.1.0": 646 | version: 3.1.0 647 | resolution: "mimic-response@npm:3.1.0" 648 | checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 649 | languageName: node 650 | linkType: hard 651 | 652 | "min-document@npm:^2.19.0": 653 | version: 2.19.0 654 | resolution: "min-document@npm:2.19.0" 655 | dependencies: 656 | dom-walk: ^0.1.0 657 | checksum: da6437562ea2228041542a2384528e74e22d1daa1a4ec439c165abf0b9d8a63e17e3b8a6dc6e0c731845e85301198730426932a0e813d23f932ca668340c9623 658 | languageName: node 659 | linkType: hard 660 | 661 | "ms@npm:2.1.2": 662 | version: 2.1.2 663 | resolution: "ms@npm:2.1.2" 664 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f 665 | languageName: node 666 | linkType: hard 667 | 668 | "netmask@npm:^2.0.1": 669 | version: 2.0.2 670 | resolution: "netmask@npm:2.0.2" 671 | checksum: c65cb8d3f7ea5669edddb3217e4c96910a60d0d9a4b52d9847ff6b28b2d0277cd8464eee0ef85133cdee32605c57940cacdd04a9a019079b091b6bba4cb0ec22 672 | languageName: node 673 | linkType: hard 674 | 675 | "normalize-url@npm:^6.0.1": 676 | version: 6.1.0 677 | resolution: "normalize-url@npm:6.1.0" 678 | checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 679 | languageName: node 680 | linkType: hard 681 | 682 | "once@npm:^1.3.1, once@npm:^1.4.0": 683 | version: 1.4.0 684 | resolution: "once@npm:1.4.0" 685 | dependencies: 686 | wrappy: 1 687 | checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 688 | languageName: node 689 | linkType: hard 690 | 691 | "optionator@npm:^0.8.1": 692 | version: 0.8.3 693 | resolution: "optionator@npm:0.8.3" 694 | dependencies: 695 | deep-is: ~0.1.3 696 | fast-levenshtein: ~2.0.6 697 | levn: ~0.3.0 698 | prelude-ls: ~1.1.2 699 | type-check: ~0.3.2 700 | word-wrap: ~1.2.3 701 | checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 702 | languageName: node 703 | linkType: hard 704 | 705 | "p-cancelable@npm:^2.0.0": 706 | version: 2.1.1 707 | resolution: "p-cancelable@npm:2.1.1" 708 | checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf 709 | languageName: node 710 | linkType: hard 711 | 712 | "pac-proxy-agent@npm:^5.0.0": 713 | version: 5.0.0 714 | resolution: "pac-proxy-agent@npm:5.0.0" 715 | dependencies: 716 | "@tootallnate/once": 1 717 | agent-base: 6 718 | debug: 4 719 | get-uri: 3 720 | http-proxy-agent: ^4.0.1 721 | https-proxy-agent: 5 722 | pac-resolver: ^5.0.0 723 | raw-body: ^2.2.0 724 | socks-proxy-agent: 5 725 | checksum: cfd26a0e2ebfea4ca6162465018ce093bf147d26cf6c8fb3e7155bc7c184370d80d4d09a1c097e3db7676d0e3f574ea1cb56a4aa7d1d2e5cca6238935fabf010 726 | languageName: node 727 | linkType: hard 728 | 729 | "pac-resolver@npm:^5.0.0": 730 | version: 5.0.0 731 | resolution: "pac-resolver@npm:5.0.0" 732 | dependencies: 733 | degenerator: ^3.0.1 734 | ip: ^1.1.5 735 | netmask: ^2.0.1 736 | checksum: d6c0f86917bcb759136f47ded0818f14bf2b424a1c3efe6e11bdb9728e5465bfefd05c163f9808766b06605aa0d211c538583293c72dca4c499452493550f4d7 737 | languageName: node 738 | linkType: hard 739 | 740 | "prelude-ls@npm:~1.1.2": 741 | version: 1.1.2 742 | resolution: "prelude-ls@npm:1.1.2" 743 | checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 744 | languageName: node 745 | linkType: hard 746 | 747 | "process@npm:^0.11.10": 748 | version: 0.11.10 749 | resolution: "process@npm:0.11.10" 750 | checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 751 | languageName: node 752 | linkType: hard 753 | 754 | "proxy-agent@npm:^5.0.0": 755 | version: 5.0.0 756 | resolution: "proxy-agent@npm:5.0.0" 757 | dependencies: 758 | agent-base: ^6.0.0 759 | debug: 4 760 | http-proxy-agent: ^4.0.0 761 | https-proxy-agent: ^5.0.0 762 | lru-cache: ^5.1.1 763 | pac-proxy-agent: ^5.0.0 764 | proxy-from-env: ^1.0.0 765 | socks-proxy-agent: ^5.0.0 766 | checksum: 3b0bb73a4d3a07711d3cad72b2fa4320880f7a6ec1959cdcc186ac6ffb173db8137d7c4046c27fdfa6e2207b2eb75e802f3d5e14c766700586ec4d47299a5124 767 | languageName: node 768 | linkType: hard 769 | 770 | "proxy-from-env@npm:^1.0.0": 771 | version: 1.1.0 772 | resolution: "proxy-from-env@npm:1.1.0" 773 | checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 774 | languageName: node 775 | linkType: hard 776 | 777 | "pump@npm:^3.0.0": 778 | version: 3.0.0 779 | resolution: "pump@npm:3.0.0" 780 | dependencies: 781 | end-of-stream: ^1.1.0 782 | once: ^1.3.1 783 | checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 784 | languageName: node 785 | linkType: hard 786 | 787 | "quick-lru@npm:^5.1.1": 788 | version: 5.1.1 789 | resolution: "quick-lru@npm:5.1.1" 790 | checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed 791 | languageName: node 792 | linkType: hard 793 | 794 | "raw-body@npm:^2.2.0": 795 | version: 2.4.1 796 | resolution: "raw-body@npm:2.4.1" 797 | dependencies: 798 | bytes: 3.1.0 799 | http-errors: 1.7.3 800 | iconv-lite: 0.4.24 801 | unpipe: 1.0.0 802 | checksum: d5e9179d2f1f0a652cd107c080f25d165c724f546124d620c8df7fb80322df42bff547a8b310e55e1f7952556d013716a21b30162192eb0b3332d7efcba75883 803 | languageName: node 804 | linkType: hard 805 | 806 | "readable-stream@npm:1.1.x": 807 | version: 1.1.14 808 | resolution: "readable-stream@npm:1.1.14" 809 | dependencies: 810 | core-util-is: ~1.0.0 811 | inherits: ~2.0.1 812 | isarray: 0.0.1 813 | string_decoder: ~0.10.x 814 | checksum: 17dfeae3e909945a4a1abc5613ea92d03269ef54c49288599507fc98ff4615988a1c39a999dcf9aacba70233d9b7040bc11a5f2bfc947e262dedcc0a8b32b5a0 815 | languageName: node 816 | linkType: hard 817 | 818 | "regenerator-runtime@npm:^0.13.11": 819 | version: 0.13.11 820 | resolution: "regenerator-runtime@npm:0.13.11" 821 | checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 822 | languageName: node 823 | linkType: hard 824 | 825 | "require-directory@npm:^2.1.1": 826 | version: 2.1.1 827 | resolution: "require-directory@npm:2.1.1" 828 | checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 829 | languageName: node 830 | linkType: hard 831 | 832 | "resolve-alpn@npm:^1.0.0": 833 | version: 1.2.1 834 | resolution: "resolve-alpn@npm:1.2.1" 835 | checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 836 | languageName: node 837 | linkType: hard 838 | 839 | "responselike@npm:^2.0.0": 840 | version: 2.0.1 841 | resolution: "responselike@npm:2.0.1" 842 | dependencies: 843 | lowercase-keys: ^2.0.0 844 | checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a 845 | languageName: node 846 | linkType: hard 847 | 848 | "safer-buffer@npm:>= 2.1.2 < 3": 849 | version: 2.1.2 850 | resolution: "safer-buffer@npm:2.1.2" 851 | checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 852 | languageName: node 853 | linkType: hard 854 | 855 | "sei-helper@npm:^3.3.0": 856 | version: 3.3.0 857 | resolution: "sei-helper@npm:3.3.0" 858 | checksum: 0aff5f008d869c26e1cc979f18c0ff5ebb07ef2e45825b65adcf7a6beb7a0931a3e3bd20439c45142c8ab8e018c5d185a82dd755b0c2070f4428dca821d793a2 859 | languageName: node 860 | linkType: hard 861 | 862 | "setprototypeof@npm:1.1.1": 863 | version: 1.1.1 864 | resolution: "setprototypeof@npm:1.1.1" 865 | checksum: a8bee29c1c64c245d460ce53f7460af8cbd0aceac68d66e5215153992cc8b3a7a123416353e0c642060e85cc5fd4241c92d1190eec97eda0dcb97436e8fcca3b 866 | languageName: node 867 | linkType: hard 868 | 869 | "smart-buffer@npm:^4.1.0": 870 | version: 4.2.0 871 | resolution: "smart-buffer@npm:4.2.0" 872 | checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b 873 | languageName: node 874 | linkType: hard 875 | 876 | "socks-proxy-agent@npm:5, socks-proxy-agent@npm:^5.0.0": 877 | version: 5.0.1 878 | resolution: "socks-proxy-agent@npm:5.0.1" 879 | dependencies: 880 | agent-base: ^6.0.2 881 | debug: 4 882 | socks: ^2.3.3 883 | checksum: 1b60c4977b2fef783f0fc4dc619cd2758aafdb43f3cf679f1e3627cb6c6e752811cee5513ebb4157ad26786033d2f85029440f197d321e8293b38cc5aab01e06 884 | languageName: node 885 | linkType: hard 886 | 887 | "socks@npm:^2.3.3": 888 | version: 2.6.1 889 | resolution: "socks@npm:2.6.1" 890 | dependencies: 891 | ip: ^1.1.5 892 | smart-buffer: ^4.1.0 893 | checksum: 2ca9d616e424f645838ebaabb04f85d94ea999e0f8393dc07f86c435af22ed88cb83958feeabd1bb7bc537c635ed47454255635502c6808a6df61af1f41af750 894 | languageName: node 895 | linkType: hard 896 | 897 | "source-map@npm:~0.6.1": 898 | version: 0.6.1 899 | resolution: "source-map@npm:0.6.1" 900 | checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 901 | languageName: node 902 | linkType: hard 903 | 904 | "statuses@npm:>= 1.5.0 < 2": 905 | version: 1.5.0 906 | resolution: "statuses@npm:1.5.0" 907 | checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c 908 | languageName: node 909 | linkType: hard 910 | 911 | "string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": 912 | version: 4.2.3 913 | resolution: "string-width@npm:4.2.3" 914 | dependencies: 915 | emoji-regex: ^8.0.0 916 | is-fullwidth-code-point: ^3.0.0 917 | strip-ansi: ^6.0.1 918 | checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb 919 | languageName: node 920 | linkType: hard 921 | 922 | "string_decoder@npm:~0.10.x": 923 | version: 0.10.31 924 | resolution: "string_decoder@npm:0.10.31" 925 | checksum: fe00f8e303647e5db919948ccb5ce0da7dea209ab54702894dd0c664edd98e5d4df4b80d6fabf7b9e92b237359d21136c95bf068b2f7760b772ca974ba970202 926 | languageName: node 927 | linkType: hard 928 | 929 | "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 930 | version: 6.0.1 931 | resolution: "strip-ansi@npm:6.0.1" 932 | dependencies: 933 | ansi-regex: ^5.0.1 934 | checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c 935 | languageName: node 936 | linkType: hard 937 | 938 | "toidentifier@npm:1.0.0": 939 | version: 1.0.0 940 | resolution: "toidentifier@npm:1.0.0" 941 | checksum: 199e6bfca1531d49b3506cff02353d53ec987c9ee10ee272ca6484ed97f1fc10fb77c6c009079ca16d5c5be4a10378178c3cacdb41ce9ec954c3297c74c6053e 942 | languageName: node 943 | linkType: hard 944 | 945 | "tslib@npm:^2.0.1": 946 | version: 2.3.1 947 | resolution: "tslib@npm:2.3.1" 948 | checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 949 | languageName: node 950 | linkType: hard 951 | 952 | "type-check@npm:~0.3.2": 953 | version: 0.3.2 954 | resolution: "type-check@npm:0.3.2" 955 | dependencies: 956 | prelude-ls: ~1.1.2 957 | checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 958 | languageName: node 959 | linkType: hard 960 | 961 | "universalify@npm:^0.1.0": 962 | version: 0.1.2 963 | resolution: "universalify@npm:0.1.2" 964 | checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff 965 | languageName: node 966 | linkType: hard 967 | 968 | "unpipe@npm:1.0.0": 969 | version: 1.0.0 970 | resolution: "unpipe@npm:1.0.0" 971 | checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 972 | languageName: node 973 | linkType: hard 974 | 975 | "url-toolkit@npm:^2.2.1": 976 | version: 2.2.5 977 | resolution: "url-toolkit@npm:2.2.5" 978 | checksum: c784040bd4dbd78647a62218b6b8c1abd9a2f7fd8adce1851daf21dc2d98e2a5d69b78a628ec07dcfa112c16a112a182e109b7c872b6e8a1e4a1547b49b81f7b 979 | languageName: node 980 | linkType: hard 981 | 982 | "vm2@npm:^3.9.3": 983 | version: 3.9.13 984 | resolution: "vm2@npm:3.9.13" 985 | dependencies: 986 | acorn: ^8.7.0 987 | acorn-walk: ^8.2.0 988 | bin: 989 | vm2: bin/vm2 990 | checksum: ee82c130a9d1b45558fac4e95133ae022e69fafd4bec8aada44bb2f0aebe6ff8ae9b1176e7cbafceffec35267e009b518c121ad81a5565da06aa7a50ed3a09bc 991 | languageName: node 992 | linkType: hard 993 | 994 | "word-wrap@npm:~1.2.3": 995 | version: 1.2.3 996 | resolution: "word-wrap@npm:1.2.3" 997 | checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f 998 | languageName: node 999 | linkType: hard 1000 | 1001 | "wrap-ansi@npm:^7.0.0": 1002 | version: 7.0.0 1003 | resolution: "wrap-ansi@npm:7.0.0" 1004 | dependencies: 1005 | ansi-styles: ^4.0.0 1006 | string-width: ^4.1.0 1007 | strip-ansi: ^6.0.0 1008 | checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b 1009 | languageName: node 1010 | linkType: hard 1011 | 1012 | "wrappy@npm:1": 1013 | version: 1.0.2 1014 | resolution: "wrappy@npm:1.0.2" 1015 | checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 1016 | languageName: node 1017 | linkType: hard 1018 | 1019 | "xregexp@npm:2.0.0": 1020 | version: 2.0.0 1021 | resolution: "xregexp@npm:2.0.0" 1022 | checksum: de62d1f01c9f1a67c80cafe48a3dc081b324249a0e88e65dc9acae9cce6d8e63c9d91c0f97e2ad2d8c5351c856c139c04dc55ebd941e59b7d1d5c1169e164cff 1023 | languageName: node 1024 | linkType: hard 1025 | 1026 | "y18n@npm:^5.0.5": 1027 | version: 5.0.8 1028 | resolution: "y18n@npm:5.0.8" 1029 | checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 1030 | languageName: node 1031 | linkType: hard 1032 | 1033 | "yallist@npm:^3.0.2": 1034 | version: 3.1.1 1035 | resolution: "yallist@npm:3.1.1" 1036 | checksum: 48f7bb00dc19fc635a13a39fe547f527b10c9290e7b3e836b9a8f1ca04d4d342e85714416b3c2ab74949c9c66f9cebb0473e6bc353b79035356103b47641285d 1037 | languageName: node 1038 | linkType: hard 1039 | 1040 | "yaml@npm:^2.2.1": 1041 | version: 2.2.1 1042 | resolution: "yaml@npm:2.2.1" 1043 | checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 1044 | languageName: node 1045 | linkType: hard 1046 | 1047 | "yargs-parser@npm:^21.1.1": 1048 | version: 21.1.1 1049 | resolution: "yargs-parser@npm:21.1.1" 1050 | checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c 1051 | languageName: node 1052 | linkType: hard 1053 | 1054 | "yargs@npm:^17.6.2": 1055 | version: 17.6.2 1056 | resolution: "yargs@npm:17.6.2" 1057 | dependencies: 1058 | cliui: ^8.0.1 1059 | escalade: ^3.1.1 1060 | get-caller-file: ^2.0.5 1061 | require-directory: ^2.1.1 1062 | string-width: ^4.2.3 1063 | y18n: ^5.0.5 1064 | yargs-parser: ^21.1.1 1065 | checksum: 47da1b0d854fa16d45a3ded57b716b013b2179022352a5f7467409da5a04a1eef5b3b3d97a2dfc13e8bbe5f2ffc0afe3bc6a4a72f8254e60f5a4bd7947138643 1066 | languageName: node 1067 | linkType: hard 1068 | --------------------------------------------------------------------------------