├── .editorconfig ├── .github └── example_output.png ├── .gitignore ├── LICENSE.md ├── README.md ├── Twitch Stream Recorder.cmd ├── Twitch Stream Recorder.sh ├── config.json ├── index.js ├── package-lock.json └── package.json /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,json}] 2 | end_of_line = lf 3 | indent_style = space 4 | indent_size = 2 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | -------------------------------------------------------------------------------- /.github/example_output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmd430/twitch-stream-recorder/fbff4aa32e34a5824ab2511a15094c0b86b57fba/.github/example_output.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | *.notes 3 | *.dump 4 | *.log 5 | /*recordings/ 6 | config.*.js* 7 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 cmd430 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Twitch Stream Recorder 2 | 3 | > Automatically record live streams from Twitch 4 | 5 | --- 6 | 7 | ![](./.github/example_output.png) 8 | > Example of application output 9 | --- 10 | 11 | ## Table of Contents 12 | - [Prerequisites](#prerequisites) 13 | - [Installation](#installation) 14 | - [Features](#features) 15 | - [License](#license) 16 | 17 | --- 18 | 19 | # Prerequisites 20 | - [Node `version >= 14`](https://nodejs.org/en/download/current/) 21 | - [Git](https://git-scm.com/downloads) 22 | - A small amount of command line knowledge 23 | 24 | --- 25 | 26 | # Installation 27 | > *It is Recommended to begin in the directory you will be keeing the application* 28 | 29 | #### Clone 30 | ```bash 31 | $ git clone https://github.com/cmd430/twitch-stream-recorder 32 | ``` 33 | 34 | 35 | #### Setup 36 | > Change into the newly created directory and install dependencies 37 | ```bash 38 | $ cd twitch-stream-recorder 39 | $ npm i --only=prod 40 | ``` 41 | - Edit `config.json` with your desired preferences 42 | > For most use cases only the `channel` and `timezone` needs to be changed 43 | 44 | #### Run the Program 45 | > *Any of the following methods may be used* 46 | ```bash 47 | $ node index [cmd args] 48 | $ npm run start 49 | or just run the `Twitch Stream Recorder.[cmd|sh]` file 50 | ``` 51 | - You can use `node index --help` to see all cmd args and their default values 52 | > cmd args will override settings specified in the `config.json` 53 | 54 | --- 55 | 56 | # Features 57 | - Monitor streamer and automatically record to disk when live 58 | - streams are saved by default with the name following naming format: 59 | `./recordings/:shortYear.:month.:day :period -- :channel.mp4` 60 | - `config.json` to save settings 61 | - Command line args to override settings on a per run basis 62 | 63 | --- 64 | 65 | # License 66 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 67 | 68 | [Full MIT License](LICENSE.md) 69 | -------------------------------------------------------------------------------- /Twitch Stream Recorder.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | title Twitch Stream Recorder 3 | cls 4 | node index 5 | @echo on 6 | -------------------------------------------------------------------------------- /Twitch Stream Recorder.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -x 2 | clear 3 | node index 4 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "channel": "TwitchUser", 3 | "recorder": { 4 | "auth": null, 5 | "quality": "best", 6 | "template": ":shortYear.:month.:day :period -- :channel", 7 | "outputDir": "recordings" 8 | }, 9 | "time": { 10 | "timezone": "Europe/London", 11 | "format": "en-GB" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | require('twitch-recorder')() 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitch-stream-recorder", 3 | "version": "2.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "2.1.0", 9 | "license": "MIT", 10 | "dependencies": { 11 | "twitch-recorder": "github:cmd430/twitch-recorder" 12 | } 13 | }, 14 | "node_modules/@babel/runtime": { 15 | "version": "7.14.8", 16 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", 17 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", 18 | "dependencies": { 19 | "regenerator-runtime": "^0.13.4" 20 | }, 21 | "engines": { 22 | "node": ">=6.9.0" 23 | } 24 | }, 25 | "node_modules/@videojs/vhs-utils": { 26 | "version": "3.0.3", 27 | "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.3.tgz", 28 | "integrity": "sha512-bU7daxDHhzcTDbmty1cXjzsTYvx2cBGbA8hG5H2Gvpuk4sdfuvkZtMCwtCqL59p6dsleMPspyaNS+7tWXx2Y0A==", 29 | "dependencies": { 30 | "@babel/runtime": "^7.12.5", 31 | "global": "^4.4.0", 32 | "url-toolkit": "^2.2.1" 33 | }, 34 | "engines": { 35 | "node": ">=8", 36 | "npm": ">=5" 37 | } 38 | }, 39 | "node_modules/ansi-regex": { 40 | "version": "5.0.0", 41 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 42 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 43 | "engines": { 44 | "node": ">=8" 45 | } 46 | }, 47 | "node_modules/ansi-styles": { 48 | "version": "4.3.0", 49 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 50 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 51 | "dependencies": { 52 | "color-convert": "^2.0.1" 53 | }, 54 | "engines": { 55 | "node": ">=8" 56 | }, 57 | "funding": { 58 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 59 | } 60 | }, 61 | "node_modules/chalk": { 62 | "version": "4.1.2", 63 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 64 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 65 | "dependencies": { 66 | "ansi-styles": "^4.1.0", 67 | "supports-color": "^7.1.0" 68 | }, 69 | "engines": { 70 | "node": ">=10" 71 | }, 72 | "funding": { 73 | "url": "https://github.com/chalk/chalk?sponsor=1" 74 | } 75 | }, 76 | "node_modules/color-convert": { 77 | "version": "2.0.1", 78 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 79 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 80 | "dependencies": { 81 | "color-name": "~1.1.4" 82 | }, 83 | "engines": { 84 | "node": ">=7.0.0" 85 | } 86 | }, 87 | "node_modules/color-name": { 88 | "version": "1.1.4", 89 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 90 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 91 | }, 92 | "node_modules/dom-walk": { 93 | "version": "0.1.2", 94 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 95 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" 96 | }, 97 | "node_modules/eventemitter3": { 98 | "version": "4.0.7", 99 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 100 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 101 | }, 102 | "node_modules/global": { 103 | "version": "4.4.0", 104 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 105 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 106 | "dependencies": { 107 | "min-document": "^2.19.0", 108 | "process": "^0.11.10" 109 | } 110 | }, 111 | "node_modules/has-flag": { 112 | "version": "4.0.0", 113 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 114 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 115 | "engines": { 116 | "node": ">=8" 117 | } 118 | }, 119 | "node_modules/hls-reader": { 120 | "version": "0.2.4", 121 | "resolved": "git+ssh://git@github.com/cmd430/hls-reader.git#d71d59957c7a1454e620e13b3c878b9bdc48af64", 122 | "license": "ISC", 123 | "dependencies": { 124 | "m3u8-parser": "^4.7.0", 125 | "miniget": "^4.2.1" 126 | } 127 | }, 128 | "node_modules/lodash.merge": { 129 | "version": "4.6.2", 130 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 131 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 132 | }, 133 | "node_modules/m3u8-parser": { 134 | "version": "4.7.0", 135 | "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.7.0.tgz", 136 | "integrity": "sha512-48l/OwRyjBm+QhNNigEEcRcgbRvnUjL7rxs597HmW9QSNbyNvt+RcZ9T/d9vxi9A9z7EZrB1POtZYhdRlwYQkQ==", 137 | "dependencies": { 138 | "@babel/runtime": "^7.12.5", 139 | "@videojs/vhs-utils": "^3.0.0", 140 | "global": "^4.4.0" 141 | } 142 | }, 143 | "node_modules/min-document": { 144 | "version": "2.19.0", 145 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 146 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 147 | "dependencies": { 148 | "dom-walk": "^0.1.0" 149 | } 150 | }, 151 | "node_modules/miniget": { 152 | "version": "4.2.1", 153 | "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.1.tgz", 154 | "integrity": "sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ==", 155 | "engines": { 156 | "node": ">=10" 157 | } 158 | }, 159 | "node_modules/minimist": { 160 | "version": "1.2.5", 161 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 162 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 163 | }, 164 | "node_modules/nanoid": { 165 | "version": "2.1.11", 166 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", 167 | "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" 168 | }, 169 | "node_modules/node-fetch": { 170 | "version": "2.6.1", 171 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 172 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", 173 | "engines": { 174 | "node": "4.x || >=6.0.0" 175 | } 176 | }, 177 | "node_modules/p-queue": { 178 | "version": "7.1.0", 179 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.1.0.tgz", 180 | "integrity": "sha512-V+0vPJbhYkBqknPp0qnaz+dWcj8cNepfXZcsVIVEHPbFQXMPwrzCNIiM4FoxGtwHXtPzVCPHDvqCr1YrOJX2Gw==", 181 | "dependencies": { 182 | "eventemitter3": "^4.0.7", 183 | "p-timeout": "^5.0.0" 184 | }, 185 | "engines": { 186 | "node": ">=12" 187 | }, 188 | "funding": { 189 | "url": "https://github.com/sponsors/sindresorhus" 190 | } 191 | }, 192 | "node_modules/p-timeout": { 193 | "version": "5.0.0", 194 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.0.0.tgz", 195 | "integrity": "sha512-z+bU/N7L1SABsqKnQzvAnINgPX7NHdzwUV+gHyJE7VGNDZSr03rhcPODCZSWiiT9k+gf74QPmzcZzqJRvxYZow==", 196 | "engines": { 197 | "node": ">=12" 198 | }, 199 | "funding": { 200 | "url": "https://github.com/sponsors/sindresorhus" 201 | } 202 | }, 203 | "node_modules/process": { 204 | "version": "0.11.10", 205 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 206 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 207 | "engines": { 208 | "node": ">= 0.6.0" 209 | } 210 | }, 211 | "node_modules/regenerator-runtime": { 212 | "version": "0.13.9", 213 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 214 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 215 | }, 216 | "node_modules/shortid": { 217 | "version": "2.2.16", 218 | "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", 219 | "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", 220 | "dependencies": { 221 | "nanoid": "^2.1.0" 222 | } 223 | }, 224 | "node_modules/strip-ansi": { 225 | "version": "6.0.0", 226 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 227 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 228 | "dependencies": { 229 | "ansi-regex": "^5.0.0" 230 | }, 231 | "engines": { 232 | "node": ">=8" 233 | } 234 | }, 235 | "node_modules/supports-color": { 236 | "version": "7.2.0", 237 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 238 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 239 | "dependencies": { 240 | "has-flag": "^4.0.0" 241 | }, 242 | "engines": { 243 | "node": ">=8" 244 | } 245 | }, 246 | "node_modules/twitch-realtime": { 247 | "version": "0.7.1", 248 | "resolved": "git+ssh://git@github.com/cmd430/twitch-realtime.git#314d8a8c7d2361517c64726eccfc5d70d2a7c8de", 249 | "license": "MIT", 250 | "dependencies": { 251 | "shortid": "^2.2.15", 252 | "ws": "^7.2.1" 253 | }, 254 | "engines": { 255 | "node": ">=11.0.0" 256 | } 257 | }, 258 | "node_modules/twitch-recorder": { 259 | "version": "0.4.3", 260 | "resolved": "git+ssh://git@github.com/cmd430/twitch-recorder.git#40a14cfcfda991f3991cd54a336ab0fbfc478ad2", 261 | "license": "ISC", 262 | "dependencies": { 263 | "chalk": "^4.1.1", 264 | "hls-reader": "github:cmd430/hls-reader", 265 | "lodash.merge": "^4.6.2", 266 | "minimist": "^1.2.5", 267 | "node-fetch": "^2.6.1", 268 | "p-queue": "^7.1.0", 269 | "strip-ansi": "^6.0.0", 270 | "twitch-realtime": "github:cmd430/twitch-realtime" 271 | } 272 | }, 273 | "node_modules/url-toolkit": { 274 | "version": "2.2.3", 275 | "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz", 276 | "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==" 277 | }, 278 | "node_modules/ws": { 279 | "version": "7.5.3", 280 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", 281 | "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", 282 | "engines": { 283 | "node": ">=8.3.0" 284 | }, 285 | "peerDependencies": { 286 | "bufferutil": "^4.0.1", 287 | "utf-8-validate": "^5.0.2" 288 | }, 289 | "peerDependenciesMeta": { 290 | "bufferutil": { 291 | "optional": true 292 | }, 293 | "utf-8-validate": { 294 | "optional": true 295 | } 296 | } 297 | } 298 | }, 299 | "dependencies": { 300 | "@babel/runtime": { 301 | "version": "7.14.8", 302 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", 303 | "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", 304 | "requires": { 305 | "regenerator-runtime": "^0.13.4" 306 | } 307 | }, 308 | "@videojs/vhs-utils": { 309 | "version": "3.0.3", 310 | "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.3.tgz", 311 | "integrity": "sha512-bU7daxDHhzcTDbmty1cXjzsTYvx2cBGbA8hG5H2Gvpuk4sdfuvkZtMCwtCqL59p6dsleMPspyaNS+7tWXx2Y0A==", 312 | "requires": { 313 | "@babel/runtime": "^7.12.5", 314 | "global": "^4.4.0", 315 | "url-toolkit": "^2.2.1" 316 | } 317 | }, 318 | "ansi-regex": { 319 | "version": "5.0.0", 320 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 321 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 322 | }, 323 | "ansi-styles": { 324 | "version": "4.3.0", 325 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 326 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 327 | "requires": { 328 | "color-convert": "^2.0.1" 329 | } 330 | }, 331 | "chalk": { 332 | "version": "4.1.2", 333 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 334 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 335 | "requires": { 336 | "ansi-styles": "^4.1.0", 337 | "supports-color": "^7.1.0" 338 | } 339 | }, 340 | "color-convert": { 341 | "version": "2.0.1", 342 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 343 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 344 | "requires": { 345 | "color-name": "~1.1.4" 346 | } 347 | }, 348 | "color-name": { 349 | "version": "1.1.4", 350 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 351 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 352 | }, 353 | "dom-walk": { 354 | "version": "0.1.2", 355 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 356 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" 357 | }, 358 | "eventemitter3": { 359 | "version": "4.0.7", 360 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 361 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 362 | }, 363 | "global": { 364 | "version": "4.4.0", 365 | "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", 366 | "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", 367 | "requires": { 368 | "min-document": "^2.19.0", 369 | "process": "^0.11.10" 370 | } 371 | }, 372 | "has-flag": { 373 | "version": "4.0.0", 374 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 375 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 376 | }, 377 | "hls-reader": { 378 | "version": "git+ssh://git@github.com/cmd430/hls-reader.git#d71d59957c7a1454e620e13b3c878b9bdc48af64", 379 | "from": "hls-reader@github:cmd430/hls-reader", 380 | "requires": { 381 | "m3u8-parser": "^4.7.0", 382 | "miniget": "^4.2.1" 383 | } 384 | }, 385 | "lodash.merge": { 386 | "version": "4.6.2", 387 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 388 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" 389 | }, 390 | "m3u8-parser": { 391 | "version": "4.7.0", 392 | "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.7.0.tgz", 393 | "integrity": "sha512-48l/OwRyjBm+QhNNigEEcRcgbRvnUjL7rxs597HmW9QSNbyNvt+RcZ9T/d9vxi9A9z7EZrB1POtZYhdRlwYQkQ==", 394 | "requires": { 395 | "@babel/runtime": "^7.12.5", 396 | "@videojs/vhs-utils": "^3.0.0", 397 | "global": "^4.4.0" 398 | } 399 | }, 400 | "min-document": { 401 | "version": "2.19.0", 402 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 403 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 404 | "requires": { 405 | "dom-walk": "^0.1.0" 406 | } 407 | }, 408 | "miniget": { 409 | "version": "4.2.1", 410 | "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.1.tgz", 411 | "integrity": "sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ==" 412 | }, 413 | "minimist": { 414 | "version": "1.2.5", 415 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 416 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 417 | }, 418 | "nanoid": { 419 | "version": "2.1.11", 420 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", 421 | "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" 422 | }, 423 | "node-fetch": { 424 | "version": "2.6.1", 425 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", 426 | "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" 427 | }, 428 | "p-queue": { 429 | "version": "7.1.0", 430 | "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.1.0.tgz", 431 | "integrity": "sha512-V+0vPJbhYkBqknPp0qnaz+dWcj8cNepfXZcsVIVEHPbFQXMPwrzCNIiM4FoxGtwHXtPzVCPHDvqCr1YrOJX2Gw==", 432 | "requires": { 433 | "eventemitter3": "^4.0.7", 434 | "p-timeout": "^5.0.0" 435 | } 436 | }, 437 | "p-timeout": { 438 | "version": "5.0.0", 439 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.0.0.tgz", 440 | "integrity": "sha512-z+bU/N7L1SABsqKnQzvAnINgPX7NHdzwUV+gHyJE7VGNDZSr03rhcPODCZSWiiT9k+gf74QPmzcZzqJRvxYZow==" 441 | }, 442 | "process": { 443 | "version": "0.11.10", 444 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 445 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" 446 | }, 447 | "regenerator-runtime": { 448 | "version": "0.13.9", 449 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 450 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" 451 | }, 452 | "shortid": { 453 | "version": "2.2.16", 454 | "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.16.tgz", 455 | "integrity": "sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==", 456 | "requires": { 457 | "nanoid": "^2.1.0" 458 | } 459 | }, 460 | "strip-ansi": { 461 | "version": "6.0.0", 462 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 463 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 464 | "requires": { 465 | "ansi-regex": "^5.0.0" 466 | } 467 | }, 468 | "supports-color": { 469 | "version": "7.2.0", 470 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 471 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 472 | "requires": { 473 | "has-flag": "^4.0.0" 474 | } 475 | }, 476 | "twitch-realtime": { 477 | "version": "git+ssh://git@github.com/cmd430/twitch-realtime.git#314d8a8c7d2361517c64726eccfc5d70d2a7c8de", 478 | "from": "twitch-realtime@github:cmd430/twitch-realtime", 479 | "requires": { 480 | "shortid": "^2.2.15", 481 | "ws": "^7.2.1" 482 | } 483 | }, 484 | "twitch-recorder": { 485 | "version": "git+ssh://git@github.com/cmd430/twitch-recorder.git#40a14cfcfda991f3991cd54a336ab0fbfc478ad2", 486 | "from": "twitch-recorder@github:cmd430/twitch-recorder", 487 | "requires": { 488 | "chalk": "^4.1.1", 489 | "hls-reader": "github:cmd430/hls-reader", 490 | "lodash.merge": "^4.6.2", 491 | "minimist": "^1.2.5", 492 | "node-fetch": "^2.6.1", 493 | "p-queue": "^7.1.0", 494 | "strip-ansi": "^6.0.0", 495 | "twitch-realtime": "github:cmd430/twitch-realtime" 496 | } 497 | }, 498 | "url-toolkit": { 499 | "version": "2.2.3", 500 | "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz", 501 | "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==" 502 | }, 503 | "ws": { 504 | "version": "7.5.3", 505 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", 506 | "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", 507 | "requires": {} 508 | } 509 | } 510 | } 511 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "twitch-stream-recorder", 3 | "version": "2.1.0", 4 | "description": "Record Twitch streams automatically", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index", 8 | "debug": "node index --debug" 9 | }, 10 | "author": "cmd430/Bred", 11 | "license": "MIT", 12 | "dependencies": { 13 | "twitch-recorder": "github:cmd430/twitch-recorder" 14 | } 15 | } 16 | --------------------------------------------------------------------------------