├── .gitignore ├── README.md ├── nodemon.json ├── package.json ├── pnpm-lock.yaml ├── src ├── .prettierrc ├── app.ts ├── extractors │ ├── rabbitstream-withToken.ts │ └── rabbitstream.ts ├── providers │ ├── 2embed.ts │ └── tmdb.ts ├── routers │ ├── api │ │ ├── details.ts │ │ ├── episodes.ts │ │ ├── get_source.ts │ │ ├── home.ts │ │ └── search.ts │ └── index.ts ├── server.ts └── utils │ ├── get_token.ts │ └── util.ts ├── tsconfig.json └── vercel.json /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /dist 3 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # 2embed-api 3 | 4 | Get HLS streams and info from 2embed.to 5 | 6 | 7 | 8 | 9 | ## Run Locally 10 | 11 | Clone the project 12 | 13 | ```bash 14 | git clone https://github.com/parnexcodes/2embed-api 15 | ``` 16 | 17 | Go to the project directory 18 | 19 | ```bash 20 | cd 2embed-api 21 | ``` 22 | 23 | Install dependencies 24 | 25 | ```bash 26 | npm install 27 | ``` 28 | 29 | Start the server 30 | 31 | ```bash 32 | cd src 33 | npm dev 34 | ``` 35 | 36 | 37 | ## API Reference 38 | 39 | #### Get tmdb details 40 | 41 | ``` 42 | GET /api/details/:type/:id 43 | ``` 44 | 45 | | Parameter | Type | Description | 46 | | :-------- | :------- | :------------------------- | 47 | | `type` | `string` | movie/tv | 48 | | `id` | `string` | tmdb id | 49 | 50 | #### Get Episodes 51 | 52 | ``` 53 | GET /api/episodes/tv/:id/seasons/:season_n_query 54 | ``` 55 | 56 | | Parameter | Type | Description | 57 | | :-------- | :------- | :-------------------------------- | 58 | | `id` | `string` | tmdb id | 59 | | `season_n_query` | `string` | season number | 60 | 61 | #### Get HLS Stream 62 | 63 | ``` 64 | GET /api/get_source/:type?id=${id}&s=${season_num}&e=${ep_num} 65 | ``` 66 | 67 | | Parameter | Type | Description | 68 | | :-------- | :------- | :-------------------------------- | 69 | | `type` | `string` | movie/tv | 70 | | `id` | `string` | tmdb id | 71 | | `s` | `string` | **Only for TV** : season number | 72 | | `e` | `string` | **Only for TV** : episode number | 73 | 74 | 75 | ## Authors 76 | 77 | - [@ernestdodz](https://www.github.com/ernestdodz) (Originally made by @ernestdodz) 78 | - [@parnexcodes](https://www.github.com/parnexcodes) (fixed it to work without rabbitstream token) -------------------------------------------------------------------------------- /nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": [ 3 | "src" 4 | ], 5 | "ext": "ts", 6 | "exec": "ts-node ./src/server.ts" 7 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "2embed-api", 3 | "version": "1.0.0", 4 | "description": "api", 5 | "main": "dist/server.js", 6 | "scripts": { 7 | "build": "tsc", 8 | "start": "tsc && node dist/server.js", 9 | "lint": "eslint . --ext .ts", 10 | "dev": "start http://localhost:8080/ && npx nodemon" 11 | }, 12 | "keywords": [], 13 | "author": "", 14 | "license": "ISC", 15 | "dependencies": { 16 | "axios": "^0.27.2", 17 | "cheerio": "^1.0.0-rc.10", 18 | "cors": "^2.8.5", 19 | "crypto-js": "^4.1.1", 20 | "express": "^4.17.1", 21 | "qs": "^6.11.0", 22 | "uri-js": "^4.4.1" 23 | }, 24 | "devDependencies": { 25 | "@types/cors": "^2.8.12", 26 | "@types/crypto-js": "^4.1.1", 27 | "@types/express": "^4.17.1", 28 | "@typescript-eslint/eslint-plugin": "^5.9.1", 29 | "@typescript-eslint/parser": "^5.9.1", 30 | "nodemon": "^2.0.19", 31 | "ts-node": "^10.8.2", 32 | "typescript": "^4.7.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@types/cors': ^2.8.12 5 | '@types/crypto-js': ^4.1.1 6 | '@types/express': ^4.17.1 7 | '@typescript-eslint/eslint-plugin': ^5.9.1 8 | '@typescript-eslint/parser': ^5.9.1 9 | axios: ^0.27.2 10 | cheerio: ^1.0.0-rc.10 11 | cors: ^2.8.5 12 | crypto-js: ^4.1.1 13 | express: ^4.17.1 14 | nodemon: ^2.0.19 15 | qs: ^6.11.0 16 | ts-node: ^10.8.2 17 | typescript: ^4.7.4 18 | uri-js: ^4.4.1 19 | 20 | dependencies: 21 | axios: 0.27.2 22 | cheerio: 1.0.0-rc.12 23 | cors: 2.8.5 24 | crypto-js: 4.1.1 25 | express: 4.18.2 26 | qs: 6.11.0 27 | uri-js: 4.4.1 28 | 29 | devDependencies: 30 | '@types/cors': 2.8.13 31 | '@types/crypto-js': 4.1.1 32 | '@types/express': 4.17.15 33 | '@typescript-eslint/eslint-plugin': 5.46.1_vsejax3imjndpzuqzew26kbdzm 34 | '@typescript-eslint/parser': 5.46.1_typescript@4.9.4 35 | nodemon: 2.0.20 36 | ts-node: 10.9.1_typescript@4.9.4 37 | typescript: 4.9.4 38 | 39 | packages: 40 | 41 | /@cspotcode/source-map-support/0.8.1: 42 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 43 | engines: {node: '>=12'} 44 | dependencies: 45 | '@jridgewell/trace-mapping': 0.3.9 46 | dev: true 47 | 48 | /@jridgewell/resolve-uri/3.1.0: 49 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 50 | engines: {node: '>=6.0.0'} 51 | dev: true 52 | 53 | /@jridgewell/sourcemap-codec/1.4.14: 54 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 55 | dev: true 56 | 57 | /@jridgewell/trace-mapping/0.3.9: 58 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 59 | dependencies: 60 | '@jridgewell/resolve-uri': 3.1.0 61 | '@jridgewell/sourcemap-codec': 1.4.14 62 | dev: true 63 | 64 | /@nodelib/fs.scandir/2.1.5: 65 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 66 | engines: {node: '>= 8'} 67 | dependencies: 68 | '@nodelib/fs.stat': 2.0.5 69 | run-parallel: 1.2.0 70 | dev: true 71 | 72 | /@nodelib/fs.stat/2.0.5: 73 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 74 | engines: {node: '>= 8'} 75 | dev: true 76 | 77 | /@nodelib/fs.walk/1.2.8: 78 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 79 | engines: {node: '>= 8'} 80 | dependencies: 81 | '@nodelib/fs.scandir': 2.1.5 82 | fastq: 1.14.0 83 | dev: true 84 | 85 | /@tsconfig/node10/1.0.9: 86 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 87 | dev: true 88 | 89 | /@tsconfig/node12/1.0.11: 90 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 91 | dev: true 92 | 93 | /@tsconfig/node14/1.0.3: 94 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 95 | dev: true 96 | 97 | /@tsconfig/node16/1.0.3: 98 | resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} 99 | dev: true 100 | 101 | /@types/body-parser/1.19.2: 102 | resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} 103 | dependencies: 104 | '@types/connect': 3.4.35 105 | '@types/node': 18.11.17 106 | dev: true 107 | 108 | /@types/connect/3.4.35: 109 | resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} 110 | dependencies: 111 | '@types/node': 18.11.17 112 | dev: true 113 | 114 | /@types/cors/2.8.13: 115 | resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} 116 | dependencies: 117 | '@types/node': 18.11.17 118 | dev: true 119 | 120 | /@types/crypto-js/4.1.1: 121 | resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} 122 | dev: true 123 | 124 | /@types/express-serve-static-core/4.17.31: 125 | resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} 126 | dependencies: 127 | '@types/node': 18.11.17 128 | '@types/qs': 6.9.7 129 | '@types/range-parser': 1.2.4 130 | dev: true 131 | 132 | /@types/express/4.17.15: 133 | resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} 134 | dependencies: 135 | '@types/body-parser': 1.19.2 136 | '@types/express-serve-static-core': 4.17.31 137 | '@types/qs': 6.9.7 138 | '@types/serve-static': 1.15.0 139 | dev: true 140 | 141 | /@types/json-schema/7.0.11: 142 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 143 | dev: true 144 | 145 | /@types/mime/3.0.1: 146 | resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} 147 | dev: true 148 | 149 | /@types/node/18.11.17: 150 | resolution: {integrity: sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==} 151 | dev: true 152 | 153 | /@types/qs/6.9.7: 154 | resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} 155 | dev: true 156 | 157 | /@types/range-parser/1.2.4: 158 | resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} 159 | dev: true 160 | 161 | /@types/semver/7.3.13: 162 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 163 | dev: true 164 | 165 | /@types/serve-static/1.15.0: 166 | resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} 167 | dependencies: 168 | '@types/mime': 3.0.1 169 | '@types/node': 18.11.17 170 | dev: true 171 | 172 | /@typescript-eslint/eslint-plugin/5.46.1_vsejax3imjndpzuqzew26kbdzm: 173 | resolution: {integrity: sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==} 174 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 175 | peerDependencies: 176 | '@typescript-eslint/parser': ^5.0.0 177 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 178 | typescript: '*' 179 | peerDependenciesMeta: 180 | typescript: 181 | optional: true 182 | dependencies: 183 | '@typescript-eslint/parser': 5.46.1_typescript@4.9.4 184 | '@typescript-eslint/scope-manager': 5.46.1 185 | '@typescript-eslint/type-utils': 5.46.1_typescript@4.9.4 186 | '@typescript-eslint/utils': 5.46.1_typescript@4.9.4 187 | debug: 4.3.4 188 | ignore: 5.2.4 189 | natural-compare-lite: 1.4.0 190 | regexpp: 3.2.0 191 | semver: 7.3.8 192 | tsutils: 3.21.0_typescript@4.9.4 193 | typescript: 4.9.4 194 | transitivePeerDependencies: 195 | - supports-color 196 | dev: true 197 | 198 | /@typescript-eslint/parser/5.46.1_typescript@4.9.4: 199 | resolution: {integrity: sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==} 200 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 201 | peerDependencies: 202 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 203 | typescript: '*' 204 | peerDependenciesMeta: 205 | typescript: 206 | optional: true 207 | dependencies: 208 | '@typescript-eslint/scope-manager': 5.46.1 209 | '@typescript-eslint/types': 5.46.1 210 | '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 211 | debug: 4.3.4 212 | typescript: 4.9.4 213 | transitivePeerDependencies: 214 | - supports-color 215 | dev: true 216 | 217 | /@typescript-eslint/scope-manager/5.46.1: 218 | resolution: {integrity: sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==} 219 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 220 | dependencies: 221 | '@typescript-eslint/types': 5.46.1 222 | '@typescript-eslint/visitor-keys': 5.46.1 223 | dev: true 224 | 225 | /@typescript-eslint/type-utils/5.46.1_typescript@4.9.4: 226 | resolution: {integrity: sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==} 227 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 228 | peerDependencies: 229 | eslint: '*' 230 | typescript: '*' 231 | peerDependenciesMeta: 232 | typescript: 233 | optional: true 234 | dependencies: 235 | '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 236 | '@typescript-eslint/utils': 5.46.1_typescript@4.9.4 237 | debug: 4.3.4 238 | tsutils: 3.21.0_typescript@4.9.4 239 | typescript: 4.9.4 240 | transitivePeerDependencies: 241 | - supports-color 242 | dev: true 243 | 244 | /@typescript-eslint/types/5.46.1: 245 | resolution: {integrity: sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==} 246 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 247 | dev: true 248 | 249 | /@typescript-eslint/typescript-estree/5.46.1_typescript@4.9.4: 250 | resolution: {integrity: sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==} 251 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 252 | peerDependencies: 253 | typescript: '*' 254 | peerDependenciesMeta: 255 | typescript: 256 | optional: true 257 | dependencies: 258 | '@typescript-eslint/types': 5.46.1 259 | '@typescript-eslint/visitor-keys': 5.46.1 260 | debug: 4.3.4 261 | globby: 11.1.0 262 | is-glob: 4.0.3 263 | semver: 7.3.8 264 | tsutils: 3.21.0_typescript@4.9.4 265 | typescript: 4.9.4 266 | transitivePeerDependencies: 267 | - supports-color 268 | dev: true 269 | 270 | /@typescript-eslint/utils/5.46.1_typescript@4.9.4: 271 | resolution: {integrity: sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==} 272 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 273 | peerDependencies: 274 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 275 | dependencies: 276 | '@types/json-schema': 7.0.11 277 | '@types/semver': 7.3.13 278 | '@typescript-eslint/scope-manager': 5.46.1 279 | '@typescript-eslint/types': 5.46.1 280 | '@typescript-eslint/typescript-estree': 5.46.1_typescript@4.9.4 281 | eslint-scope: 5.1.1 282 | eslint-utils: 3.0.0 283 | semver: 7.3.8 284 | transitivePeerDependencies: 285 | - supports-color 286 | - typescript 287 | dev: true 288 | 289 | /@typescript-eslint/visitor-keys/5.46.1: 290 | resolution: {integrity: sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==} 291 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 292 | dependencies: 293 | '@typescript-eslint/types': 5.46.1 294 | eslint-visitor-keys: 3.3.0 295 | dev: true 296 | 297 | /abbrev/1.1.1: 298 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 299 | dev: true 300 | 301 | /accepts/1.3.8: 302 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 303 | engines: {node: '>= 0.6'} 304 | dependencies: 305 | mime-types: 2.1.35 306 | negotiator: 0.6.3 307 | dev: false 308 | 309 | /acorn-walk/8.2.0: 310 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 311 | engines: {node: '>=0.4.0'} 312 | dev: true 313 | 314 | /acorn/8.8.1: 315 | resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} 316 | engines: {node: '>=0.4.0'} 317 | hasBin: true 318 | dev: true 319 | 320 | /anymatch/3.1.3: 321 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 322 | engines: {node: '>= 8'} 323 | dependencies: 324 | normalize-path: 3.0.0 325 | picomatch: 2.3.1 326 | dev: true 327 | 328 | /arg/4.1.3: 329 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 330 | dev: true 331 | 332 | /array-flatten/1.1.1: 333 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 334 | dev: false 335 | 336 | /array-union/2.1.0: 337 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 338 | engines: {node: '>=8'} 339 | dev: true 340 | 341 | /asynckit/0.4.0: 342 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 343 | dev: false 344 | 345 | /axios/0.27.2: 346 | resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} 347 | dependencies: 348 | follow-redirects: 1.15.2 349 | form-data: 4.0.0 350 | transitivePeerDependencies: 351 | - debug 352 | dev: false 353 | 354 | /balanced-match/1.0.2: 355 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 356 | dev: true 357 | 358 | /binary-extensions/2.2.0: 359 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 360 | engines: {node: '>=8'} 361 | dev: true 362 | 363 | /body-parser/1.20.1: 364 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 365 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 366 | dependencies: 367 | bytes: 3.1.2 368 | content-type: 1.0.4 369 | debug: 2.6.9 370 | depd: 2.0.0 371 | destroy: 1.2.0 372 | http-errors: 2.0.0 373 | iconv-lite: 0.4.24 374 | on-finished: 2.4.1 375 | qs: 6.11.0 376 | raw-body: 2.5.1 377 | type-is: 1.6.18 378 | unpipe: 1.0.0 379 | transitivePeerDependencies: 380 | - supports-color 381 | dev: false 382 | 383 | /boolbase/1.0.0: 384 | resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 385 | dev: false 386 | 387 | /brace-expansion/1.1.11: 388 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 389 | dependencies: 390 | balanced-match: 1.0.2 391 | concat-map: 0.0.1 392 | dev: true 393 | 394 | /braces/3.0.2: 395 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 396 | engines: {node: '>=8'} 397 | dependencies: 398 | fill-range: 7.0.1 399 | dev: true 400 | 401 | /bytes/3.1.2: 402 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 403 | engines: {node: '>= 0.8'} 404 | dev: false 405 | 406 | /call-bind/1.0.2: 407 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 408 | dependencies: 409 | function-bind: 1.1.1 410 | get-intrinsic: 1.1.3 411 | dev: false 412 | 413 | /cheerio-select/2.1.0: 414 | resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 415 | dependencies: 416 | boolbase: 1.0.0 417 | css-select: 5.1.0 418 | css-what: 6.1.0 419 | domelementtype: 2.3.0 420 | domhandler: 5.0.3 421 | domutils: 3.0.1 422 | dev: false 423 | 424 | /cheerio/1.0.0-rc.12: 425 | resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} 426 | engines: {node: '>= 6'} 427 | dependencies: 428 | cheerio-select: 2.1.0 429 | dom-serializer: 2.0.0 430 | domhandler: 5.0.3 431 | domutils: 3.0.1 432 | htmlparser2: 8.0.1 433 | parse5: 7.1.2 434 | parse5-htmlparser2-tree-adapter: 7.0.0 435 | dev: false 436 | 437 | /chokidar/3.5.3: 438 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 439 | engines: {node: '>= 8.10.0'} 440 | dependencies: 441 | anymatch: 3.1.3 442 | braces: 3.0.2 443 | glob-parent: 5.1.2 444 | is-binary-path: 2.1.0 445 | is-glob: 4.0.3 446 | normalize-path: 3.0.0 447 | readdirp: 3.6.0 448 | optionalDependencies: 449 | fsevents: 2.3.2 450 | dev: true 451 | 452 | /combined-stream/1.0.8: 453 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 454 | engines: {node: '>= 0.8'} 455 | dependencies: 456 | delayed-stream: 1.0.0 457 | dev: false 458 | 459 | /concat-map/0.0.1: 460 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 461 | dev: true 462 | 463 | /content-disposition/0.5.4: 464 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 465 | engines: {node: '>= 0.6'} 466 | dependencies: 467 | safe-buffer: 5.2.1 468 | dev: false 469 | 470 | /content-type/1.0.4: 471 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 472 | engines: {node: '>= 0.6'} 473 | dev: false 474 | 475 | /cookie-signature/1.0.6: 476 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 477 | dev: false 478 | 479 | /cookie/0.5.0: 480 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 481 | engines: {node: '>= 0.6'} 482 | dev: false 483 | 484 | /cors/2.8.5: 485 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 486 | engines: {node: '>= 0.10'} 487 | dependencies: 488 | object-assign: 4.1.1 489 | vary: 1.1.2 490 | dev: false 491 | 492 | /create-require/1.1.1: 493 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 494 | dev: true 495 | 496 | /crypto-js/4.1.1: 497 | resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} 498 | dev: false 499 | 500 | /css-select/5.1.0: 501 | resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} 502 | dependencies: 503 | boolbase: 1.0.0 504 | css-what: 6.1.0 505 | domhandler: 5.0.3 506 | domutils: 3.0.1 507 | nth-check: 2.1.1 508 | dev: false 509 | 510 | /css-what/6.1.0: 511 | resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 512 | engines: {node: '>= 6'} 513 | dev: false 514 | 515 | /debug/2.6.9: 516 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 517 | peerDependencies: 518 | supports-color: '*' 519 | peerDependenciesMeta: 520 | supports-color: 521 | optional: true 522 | dependencies: 523 | ms: 2.0.0 524 | dev: false 525 | 526 | /debug/3.2.7_supports-color@5.5.0: 527 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 528 | peerDependencies: 529 | supports-color: '*' 530 | peerDependenciesMeta: 531 | supports-color: 532 | optional: true 533 | dependencies: 534 | ms: 2.1.3 535 | supports-color: 5.5.0 536 | dev: true 537 | 538 | /debug/4.3.4: 539 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 540 | engines: {node: '>=6.0'} 541 | peerDependencies: 542 | supports-color: '*' 543 | peerDependenciesMeta: 544 | supports-color: 545 | optional: true 546 | dependencies: 547 | ms: 2.1.2 548 | dev: true 549 | 550 | /delayed-stream/1.0.0: 551 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 552 | engines: {node: '>=0.4.0'} 553 | dev: false 554 | 555 | /depd/2.0.0: 556 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 557 | engines: {node: '>= 0.8'} 558 | dev: false 559 | 560 | /destroy/1.2.0: 561 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 562 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 563 | dev: false 564 | 565 | /diff/4.0.2: 566 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 567 | engines: {node: '>=0.3.1'} 568 | dev: true 569 | 570 | /dir-glob/3.0.1: 571 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 572 | engines: {node: '>=8'} 573 | dependencies: 574 | path-type: 4.0.0 575 | dev: true 576 | 577 | /dom-serializer/2.0.0: 578 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 579 | dependencies: 580 | domelementtype: 2.3.0 581 | domhandler: 5.0.3 582 | entities: 4.4.0 583 | dev: false 584 | 585 | /domelementtype/2.3.0: 586 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 587 | dev: false 588 | 589 | /domhandler/5.0.3: 590 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 591 | engines: {node: '>= 4'} 592 | dependencies: 593 | domelementtype: 2.3.0 594 | dev: false 595 | 596 | /domutils/3.0.1: 597 | resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} 598 | dependencies: 599 | dom-serializer: 2.0.0 600 | domelementtype: 2.3.0 601 | domhandler: 5.0.3 602 | dev: false 603 | 604 | /ee-first/1.1.1: 605 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 606 | dev: false 607 | 608 | /encodeurl/1.0.2: 609 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 610 | engines: {node: '>= 0.8'} 611 | dev: false 612 | 613 | /entities/4.4.0: 614 | resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} 615 | engines: {node: '>=0.12'} 616 | dev: false 617 | 618 | /escape-html/1.0.3: 619 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 620 | dev: false 621 | 622 | /eslint-scope/5.1.1: 623 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 624 | engines: {node: '>=8.0.0'} 625 | dependencies: 626 | esrecurse: 4.3.0 627 | estraverse: 4.3.0 628 | dev: true 629 | 630 | /eslint-utils/3.0.0: 631 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 632 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 633 | peerDependencies: 634 | eslint: '>=5' 635 | dependencies: 636 | eslint-visitor-keys: 2.1.0 637 | dev: true 638 | 639 | /eslint-visitor-keys/2.1.0: 640 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 641 | engines: {node: '>=10'} 642 | dev: true 643 | 644 | /eslint-visitor-keys/3.3.0: 645 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 646 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 647 | dev: true 648 | 649 | /esrecurse/4.3.0: 650 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 651 | engines: {node: '>=4.0'} 652 | dependencies: 653 | estraverse: 5.3.0 654 | dev: true 655 | 656 | /estraverse/4.3.0: 657 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 658 | engines: {node: '>=4.0'} 659 | dev: true 660 | 661 | /estraverse/5.3.0: 662 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 663 | engines: {node: '>=4.0'} 664 | dev: true 665 | 666 | /etag/1.8.1: 667 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 668 | engines: {node: '>= 0.6'} 669 | dev: false 670 | 671 | /express/4.18.2: 672 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 673 | engines: {node: '>= 0.10.0'} 674 | dependencies: 675 | accepts: 1.3.8 676 | array-flatten: 1.1.1 677 | body-parser: 1.20.1 678 | content-disposition: 0.5.4 679 | content-type: 1.0.4 680 | cookie: 0.5.0 681 | cookie-signature: 1.0.6 682 | debug: 2.6.9 683 | depd: 2.0.0 684 | encodeurl: 1.0.2 685 | escape-html: 1.0.3 686 | etag: 1.8.1 687 | finalhandler: 1.2.0 688 | fresh: 0.5.2 689 | http-errors: 2.0.0 690 | merge-descriptors: 1.0.1 691 | methods: 1.1.2 692 | on-finished: 2.4.1 693 | parseurl: 1.3.3 694 | path-to-regexp: 0.1.7 695 | proxy-addr: 2.0.7 696 | qs: 6.11.0 697 | range-parser: 1.2.1 698 | safe-buffer: 5.2.1 699 | send: 0.18.0 700 | serve-static: 1.15.0 701 | setprototypeof: 1.2.0 702 | statuses: 2.0.1 703 | type-is: 1.6.18 704 | utils-merge: 1.0.1 705 | vary: 1.1.2 706 | transitivePeerDependencies: 707 | - supports-color 708 | dev: false 709 | 710 | /fast-glob/3.2.12: 711 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 712 | engines: {node: '>=8.6.0'} 713 | dependencies: 714 | '@nodelib/fs.stat': 2.0.5 715 | '@nodelib/fs.walk': 1.2.8 716 | glob-parent: 5.1.2 717 | merge2: 1.4.1 718 | micromatch: 4.0.5 719 | dev: true 720 | 721 | /fastq/1.14.0: 722 | resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} 723 | dependencies: 724 | reusify: 1.0.4 725 | dev: true 726 | 727 | /fill-range/7.0.1: 728 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 729 | engines: {node: '>=8'} 730 | dependencies: 731 | to-regex-range: 5.0.1 732 | dev: true 733 | 734 | /finalhandler/1.2.0: 735 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 736 | engines: {node: '>= 0.8'} 737 | dependencies: 738 | debug: 2.6.9 739 | encodeurl: 1.0.2 740 | escape-html: 1.0.3 741 | on-finished: 2.4.1 742 | parseurl: 1.3.3 743 | statuses: 2.0.1 744 | unpipe: 1.0.0 745 | transitivePeerDependencies: 746 | - supports-color 747 | dev: false 748 | 749 | /follow-redirects/1.15.2: 750 | resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} 751 | engines: {node: '>=4.0'} 752 | peerDependencies: 753 | debug: '*' 754 | peerDependenciesMeta: 755 | debug: 756 | optional: true 757 | dev: false 758 | 759 | /form-data/4.0.0: 760 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 761 | engines: {node: '>= 6'} 762 | dependencies: 763 | asynckit: 0.4.0 764 | combined-stream: 1.0.8 765 | mime-types: 2.1.35 766 | dev: false 767 | 768 | /forwarded/0.2.0: 769 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 770 | engines: {node: '>= 0.6'} 771 | dev: false 772 | 773 | /fresh/0.5.2: 774 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 775 | engines: {node: '>= 0.6'} 776 | dev: false 777 | 778 | /fsevents/2.3.2: 779 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 780 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 781 | os: [darwin] 782 | requiresBuild: true 783 | dev: true 784 | optional: true 785 | 786 | /function-bind/1.1.1: 787 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 788 | dev: false 789 | 790 | /get-intrinsic/1.1.3: 791 | resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} 792 | dependencies: 793 | function-bind: 1.1.1 794 | has: 1.0.3 795 | has-symbols: 1.0.3 796 | dev: false 797 | 798 | /glob-parent/5.1.2: 799 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 800 | engines: {node: '>= 6'} 801 | dependencies: 802 | is-glob: 4.0.3 803 | dev: true 804 | 805 | /globby/11.1.0: 806 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 807 | engines: {node: '>=10'} 808 | dependencies: 809 | array-union: 2.1.0 810 | dir-glob: 3.0.1 811 | fast-glob: 3.2.12 812 | ignore: 5.2.4 813 | merge2: 1.4.1 814 | slash: 3.0.0 815 | dev: true 816 | 817 | /has-flag/3.0.0: 818 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 819 | engines: {node: '>=4'} 820 | dev: true 821 | 822 | /has-symbols/1.0.3: 823 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 824 | engines: {node: '>= 0.4'} 825 | dev: false 826 | 827 | /has/1.0.3: 828 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 829 | engines: {node: '>= 0.4.0'} 830 | dependencies: 831 | function-bind: 1.1.1 832 | dev: false 833 | 834 | /htmlparser2/8.0.1: 835 | resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} 836 | dependencies: 837 | domelementtype: 2.3.0 838 | domhandler: 5.0.3 839 | domutils: 3.0.1 840 | entities: 4.4.0 841 | dev: false 842 | 843 | /http-errors/2.0.0: 844 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 845 | engines: {node: '>= 0.8'} 846 | dependencies: 847 | depd: 2.0.0 848 | inherits: 2.0.4 849 | setprototypeof: 1.2.0 850 | statuses: 2.0.1 851 | toidentifier: 1.0.1 852 | dev: false 853 | 854 | /iconv-lite/0.4.24: 855 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 856 | engines: {node: '>=0.10.0'} 857 | dependencies: 858 | safer-buffer: 2.1.2 859 | dev: false 860 | 861 | /ignore-by-default/1.0.1: 862 | resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} 863 | dev: true 864 | 865 | /ignore/5.2.4: 866 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 867 | engines: {node: '>= 4'} 868 | dev: true 869 | 870 | /inherits/2.0.4: 871 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 872 | dev: false 873 | 874 | /ipaddr.js/1.9.1: 875 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 876 | engines: {node: '>= 0.10'} 877 | dev: false 878 | 879 | /is-binary-path/2.1.0: 880 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 881 | engines: {node: '>=8'} 882 | dependencies: 883 | binary-extensions: 2.2.0 884 | dev: true 885 | 886 | /is-extglob/2.1.1: 887 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 888 | engines: {node: '>=0.10.0'} 889 | dev: true 890 | 891 | /is-glob/4.0.3: 892 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 893 | engines: {node: '>=0.10.0'} 894 | dependencies: 895 | is-extglob: 2.1.1 896 | dev: true 897 | 898 | /is-number/7.0.0: 899 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 900 | engines: {node: '>=0.12.0'} 901 | dev: true 902 | 903 | /lru-cache/6.0.0: 904 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 905 | engines: {node: '>=10'} 906 | dependencies: 907 | yallist: 4.0.0 908 | dev: true 909 | 910 | /make-error/1.3.6: 911 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 912 | dev: true 913 | 914 | /media-typer/0.3.0: 915 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 916 | engines: {node: '>= 0.6'} 917 | dev: false 918 | 919 | /merge-descriptors/1.0.1: 920 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 921 | dev: false 922 | 923 | /merge2/1.4.1: 924 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 925 | engines: {node: '>= 8'} 926 | dev: true 927 | 928 | /methods/1.1.2: 929 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 930 | engines: {node: '>= 0.6'} 931 | dev: false 932 | 933 | /micromatch/4.0.5: 934 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 935 | engines: {node: '>=8.6'} 936 | dependencies: 937 | braces: 3.0.2 938 | picomatch: 2.3.1 939 | dev: true 940 | 941 | /mime-db/1.52.0: 942 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 943 | engines: {node: '>= 0.6'} 944 | dev: false 945 | 946 | /mime-types/2.1.35: 947 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 948 | engines: {node: '>= 0.6'} 949 | dependencies: 950 | mime-db: 1.52.0 951 | dev: false 952 | 953 | /mime/1.6.0: 954 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 955 | engines: {node: '>=4'} 956 | hasBin: true 957 | dev: false 958 | 959 | /minimatch/3.1.2: 960 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 961 | dependencies: 962 | brace-expansion: 1.1.11 963 | dev: true 964 | 965 | /ms/2.0.0: 966 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 967 | dev: false 968 | 969 | /ms/2.1.2: 970 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 971 | dev: true 972 | 973 | /ms/2.1.3: 974 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 975 | 976 | /natural-compare-lite/1.4.0: 977 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 978 | dev: true 979 | 980 | /negotiator/0.6.3: 981 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 982 | engines: {node: '>= 0.6'} 983 | dev: false 984 | 985 | /nodemon/2.0.20: 986 | resolution: {integrity: sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==} 987 | engines: {node: '>=8.10.0'} 988 | hasBin: true 989 | dependencies: 990 | chokidar: 3.5.3 991 | debug: 3.2.7_supports-color@5.5.0 992 | ignore-by-default: 1.0.1 993 | minimatch: 3.1.2 994 | pstree.remy: 1.1.8 995 | semver: 5.7.1 996 | simple-update-notifier: 1.1.0 997 | supports-color: 5.5.0 998 | touch: 3.1.0 999 | undefsafe: 2.0.5 1000 | dev: true 1001 | 1002 | /nopt/1.0.10: 1003 | resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} 1004 | hasBin: true 1005 | dependencies: 1006 | abbrev: 1.1.1 1007 | dev: true 1008 | 1009 | /normalize-path/3.0.0: 1010 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1011 | engines: {node: '>=0.10.0'} 1012 | dev: true 1013 | 1014 | /nth-check/2.1.1: 1015 | resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1016 | dependencies: 1017 | boolbase: 1.0.0 1018 | dev: false 1019 | 1020 | /object-assign/4.1.1: 1021 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1022 | engines: {node: '>=0.10.0'} 1023 | dev: false 1024 | 1025 | /object-inspect/1.12.2: 1026 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1027 | dev: false 1028 | 1029 | /on-finished/2.4.1: 1030 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 1031 | engines: {node: '>= 0.8'} 1032 | dependencies: 1033 | ee-first: 1.1.1 1034 | dev: false 1035 | 1036 | /parse5-htmlparser2-tree-adapter/7.0.0: 1037 | resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} 1038 | dependencies: 1039 | domhandler: 5.0.3 1040 | parse5: 7.1.2 1041 | dev: false 1042 | 1043 | /parse5/7.1.2: 1044 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 1045 | dependencies: 1046 | entities: 4.4.0 1047 | dev: false 1048 | 1049 | /parseurl/1.3.3: 1050 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 1051 | engines: {node: '>= 0.8'} 1052 | dev: false 1053 | 1054 | /path-to-regexp/0.1.7: 1055 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 1056 | dev: false 1057 | 1058 | /path-type/4.0.0: 1059 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1060 | engines: {node: '>=8'} 1061 | dev: true 1062 | 1063 | /picomatch/2.3.1: 1064 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1065 | engines: {node: '>=8.6'} 1066 | dev: true 1067 | 1068 | /proxy-addr/2.0.7: 1069 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 1070 | engines: {node: '>= 0.10'} 1071 | dependencies: 1072 | forwarded: 0.2.0 1073 | ipaddr.js: 1.9.1 1074 | dev: false 1075 | 1076 | /pstree.remy/1.1.8: 1077 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 1078 | dev: true 1079 | 1080 | /punycode/2.3.0: 1081 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1082 | engines: {node: '>=6'} 1083 | dev: false 1084 | 1085 | /qs/6.11.0: 1086 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 1087 | engines: {node: '>=0.6'} 1088 | dependencies: 1089 | side-channel: 1.0.4 1090 | dev: false 1091 | 1092 | /queue-microtask/1.2.3: 1093 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1094 | dev: true 1095 | 1096 | /range-parser/1.2.1: 1097 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1098 | engines: {node: '>= 0.6'} 1099 | dev: false 1100 | 1101 | /raw-body/2.5.1: 1102 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 1103 | engines: {node: '>= 0.8'} 1104 | dependencies: 1105 | bytes: 3.1.2 1106 | http-errors: 2.0.0 1107 | iconv-lite: 0.4.24 1108 | unpipe: 1.0.0 1109 | dev: false 1110 | 1111 | /readdirp/3.6.0: 1112 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1113 | engines: {node: '>=8.10.0'} 1114 | dependencies: 1115 | picomatch: 2.3.1 1116 | dev: true 1117 | 1118 | /regexpp/3.2.0: 1119 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 1120 | engines: {node: '>=8'} 1121 | dev: true 1122 | 1123 | /reusify/1.0.4: 1124 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1125 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1126 | dev: true 1127 | 1128 | /run-parallel/1.2.0: 1129 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1130 | dependencies: 1131 | queue-microtask: 1.2.3 1132 | dev: true 1133 | 1134 | /safe-buffer/5.2.1: 1135 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1136 | dev: false 1137 | 1138 | /safer-buffer/2.1.2: 1139 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1140 | dev: false 1141 | 1142 | /semver/5.7.1: 1143 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1144 | hasBin: true 1145 | dev: true 1146 | 1147 | /semver/7.0.0: 1148 | resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} 1149 | hasBin: true 1150 | dev: true 1151 | 1152 | /semver/7.3.8: 1153 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 1154 | engines: {node: '>=10'} 1155 | hasBin: true 1156 | dependencies: 1157 | lru-cache: 6.0.0 1158 | dev: true 1159 | 1160 | /send/0.18.0: 1161 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 1162 | engines: {node: '>= 0.8.0'} 1163 | dependencies: 1164 | debug: 2.6.9 1165 | depd: 2.0.0 1166 | destroy: 1.2.0 1167 | encodeurl: 1.0.2 1168 | escape-html: 1.0.3 1169 | etag: 1.8.1 1170 | fresh: 0.5.2 1171 | http-errors: 2.0.0 1172 | mime: 1.6.0 1173 | ms: 2.1.3 1174 | on-finished: 2.4.1 1175 | range-parser: 1.2.1 1176 | statuses: 2.0.1 1177 | transitivePeerDependencies: 1178 | - supports-color 1179 | dev: false 1180 | 1181 | /serve-static/1.15.0: 1182 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 1183 | engines: {node: '>= 0.8.0'} 1184 | dependencies: 1185 | encodeurl: 1.0.2 1186 | escape-html: 1.0.3 1187 | parseurl: 1.3.3 1188 | send: 0.18.0 1189 | transitivePeerDependencies: 1190 | - supports-color 1191 | dev: false 1192 | 1193 | /setprototypeof/1.2.0: 1194 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 1195 | dev: false 1196 | 1197 | /side-channel/1.0.4: 1198 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1199 | dependencies: 1200 | call-bind: 1.0.2 1201 | get-intrinsic: 1.1.3 1202 | object-inspect: 1.12.2 1203 | dev: false 1204 | 1205 | /simple-update-notifier/1.1.0: 1206 | resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} 1207 | engines: {node: '>=8.10.0'} 1208 | dependencies: 1209 | semver: 7.0.0 1210 | dev: true 1211 | 1212 | /slash/3.0.0: 1213 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1214 | engines: {node: '>=8'} 1215 | dev: true 1216 | 1217 | /statuses/2.0.1: 1218 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 1219 | engines: {node: '>= 0.8'} 1220 | dev: false 1221 | 1222 | /supports-color/5.5.0: 1223 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1224 | engines: {node: '>=4'} 1225 | dependencies: 1226 | has-flag: 3.0.0 1227 | dev: true 1228 | 1229 | /to-regex-range/5.0.1: 1230 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1231 | engines: {node: '>=8.0'} 1232 | dependencies: 1233 | is-number: 7.0.0 1234 | dev: true 1235 | 1236 | /toidentifier/1.0.1: 1237 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1238 | engines: {node: '>=0.6'} 1239 | dev: false 1240 | 1241 | /touch/3.1.0: 1242 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1243 | hasBin: true 1244 | dependencies: 1245 | nopt: 1.0.10 1246 | dev: true 1247 | 1248 | /ts-node/10.9.1_typescript@4.9.4: 1249 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 1250 | hasBin: true 1251 | peerDependencies: 1252 | '@swc/core': '>=1.2.50' 1253 | '@swc/wasm': '>=1.2.50' 1254 | '@types/node': '*' 1255 | typescript: '>=2.7' 1256 | peerDependenciesMeta: 1257 | '@swc/core': 1258 | optional: true 1259 | '@swc/wasm': 1260 | optional: true 1261 | dependencies: 1262 | '@cspotcode/source-map-support': 0.8.1 1263 | '@tsconfig/node10': 1.0.9 1264 | '@tsconfig/node12': 1.0.11 1265 | '@tsconfig/node14': 1.0.3 1266 | '@tsconfig/node16': 1.0.3 1267 | acorn: 8.8.1 1268 | acorn-walk: 8.2.0 1269 | arg: 4.1.3 1270 | create-require: 1.1.1 1271 | diff: 4.0.2 1272 | make-error: 1.3.6 1273 | typescript: 4.9.4 1274 | v8-compile-cache-lib: 3.0.1 1275 | yn: 3.1.1 1276 | dev: true 1277 | 1278 | /tslib/1.14.1: 1279 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1280 | dev: true 1281 | 1282 | /tsutils/3.21.0_typescript@4.9.4: 1283 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 1284 | engines: {node: '>= 6'} 1285 | peerDependencies: 1286 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 1287 | dependencies: 1288 | tslib: 1.14.1 1289 | typescript: 4.9.4 1290 | dev: true 1291 | 1292 | /type-is/1.6.18: 1293 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1294 | engines: {node: '>= 0.6'} 1295 | dependencies: 1296 | media-typer: 0.3.0 1297 | mime-types: 2.1.35 1298 | dev: false 1299 | 1300 | /typescript/4.9.4: 1301 | resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} 1302 | engines: {node: '>=4.2.0'} 1303 | hasBin: true 1304 | dev: true 1305 | 1306 | /undefsafe/2.0.5: 1307 | resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} 1308 | dev: true 1309 | 1310 | /unpipe/1.0.0: 1311 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1312 | engines: {node: '>= 0.8'} 1313 | dev: false 1314 | 1315 | /uri-js/4.4.1: 1316 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1317 | dependencies: 1318 | punycode: 2.3.0 1319 | dev: false 1320 | 1321 | /utils-merge/1.0.1: 1322 | resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} 1323 | engines: {node: '>= 0.4.0'} 1324 | dev: false 1325 | 1326 | /v8-compile-cache-lib/3.0.1: 1327 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1328 | dev: true 1329 | 1330 | /vary/1.1.2: 1331 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1332 | engines: {node: '>= 0.8'} 1333 | dev: false 1334 | 1335 | /yallist/4.0.0: 1336 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1337 | dev: true 1338 | 1339 | /yn/3.1.1: 1340 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1341 | engines: {node: '>=6'} 1342 | dev: true 1343 | -------------------------------------------------------------------------------- /src/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false 4 | } 5 | -------------------------------------------------------------------------------- /src/app.ts: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import cors from 'cors'; 3 | 4 | import { initRoutes } from './routers'; 5 | 6 | class App { 7 | 8 | public app: express.Application; 9 | 10 | constructor() { 11 | this.app = express(); 12 | this.app.use(cors({ origin: true })); 13 | this.routes(); 14 | } 15 | 16 | public listen() { 17 | const PORT = process.env.PORT || 8080; 18 | this.app.listen(PORT, () => { 19 | console.log(`App listening on the port ${PORT}`); 20 | }); 21 | } 22 | 23 | private routes(): void { 24 | initRoutes(this.app); 25 | } 26 | 27 | } 28 | 29 | export default App; 30 | -------------------------------------------------------------------------------- /src/extractors/rabbitstream-withToken.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import * as cheerio from 'cheerio'; 4 | import * as Uri from "uri-js"; 5 | 6 | import { getCaptchaToken } from "../utils/get_token"; 7 | 8 | export async function rabbitstreamExtract(url: string) { 9 | 10 | const uri = Uri.parse(url); 11 | 12 | const initial_page = await axios.get(url.replace("embed-5","embed-4"), { headers: { "Referer": uri.scheme + "://" + uri.host } }).then(res => res.data); 13 | 14 | const site_key_match = initial_page.match("recaptchaSiteKey = '(.+?)'"); 15 | 16 | if(site_key_match == null) 17 | return; 18 | 19 | const number_match = initial_page.match("recaptchaNumber = '(.+?)'"); 20 | 21 | if(number_match == null) 22 | return; 23 | 24 | const token = await getCaptchaToken(url.replace("embed-5","embed-4"), site_key_match[1]); 25 | const $ = cheerio.load(initial_page); 26 | const data_id = $('#vidcloud-player').attr('data-id'); 27 | const ajax_url = uri.scheme + "://" + uri.host + '/ajax/embed-4/getSources?id=' + data_id + '&token=' + token + '&number=' + number_match[1]; 28 | 29 | return await axios.get(ajax_url, { headers: { "X-Requested-With": "XMLHttpRequest" } }).then(res => res.data); 30 | 31 | } 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/extractors/rabbitstream.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import * as cheerio from 'cheerio'; 4 | import * as Uri from "uri-js"; 5 | import CryptoJS from 'crypto-js' 6 | import { isJson, substringAfter, substringBefore } from '../utils/util' 7 | 8 | //2embed rabbitstream 9 | export async function rabbitstreamExtract(url: string) { 10 | const uri = Uri.parse(url); 11 | 12 | const initial_page = await axios.get(url.replace("embed-5","embed-4"), { headers: 13 | { "Referer": uri.scheme + "://" + uri.host } }).then(res => res.data); 14 | 15 | const $ = cheerio.load(initial_page); 16 | const data_id = $('#vidcloud-player').attr('data-id'); 17 | const ajax_url = uri.scheme + "://" + uri.host + '/ajax/embed-4/getSources?id=' + data_id; 18 | 19 | let data = await axios.get(ajax_url, { headers: { 20 | "X-Requested-With": "XMLHttpRequest" 21 | } } ).then(res => res.data); 22 | 23 | // const decryptSource = async (encryptedSource) => { 24 | // try { // Rabbitstream 25 | // let decryptionKey = (await axios.get('https://raw.githubusercontent.com/enimax-anime/key/e4/key.txt')).data 26 | // let bytes = CryptoJS.AES.decrypt(encryptedSource, decryptionKey); 27 | // return (JSON.parse(bytes.toString(CryptoJS.enc.Utf8))); 28 | // } catch (e) { 29 | // console.log("Rabbitstream key failed to decrypt source") 30 | // } 31 | // } 32 | 33 | 34 | // data.sources = await decryptSource(data.sources) 35 | 36 | if (!isJson(data.sources)) { 37 | let { data: key } = await axios.get('https://github.com/enimax-anime/key/blob/e4/key.txt'); 38 | 39 | key = substringBefore(substringAfter(key, '"blob-code blob-code-inner js-file-line">'), ''); 40 | 41 | if (!key) { 42 | key = await (await axios.get('https://raw.githubusercontent.com/enimax-anime/key/e4/key.txt')).data; 43 | } 44 | const decryptedVal = CryptoJS.AES.decrypt(data.sources, key).toString(CryptoJS.enc.Utf8) 45 | data.sources = isJson(decryptedVal) ? JSON.parse(decryptedVal) : data.sources 46 | } 47 | 48 | // let hls_url: string; for(const hls_source of data.sources) hls_url = hls_source.file; 49 | 50 | // let hls_tracks = data.tracks.map((track: any) => ( 51 | // {url: track.file, label: track.label} 52 | // )); 53 | 54 | // var source = { 55 | // hls_url: result, 56 | // tracks: hls_tracks 57 | // }; 58 | 59 | return {data}; 60 | 61 | } 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /src/providers/2embed.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import * as cheerio from "cheerio"; 4 | 5 | import { getCaptchaToken } from "../utils/get_token"; 6 | import { rabbitstreamExtract } from "../extractors/rabbitstream"; 7 | 8 | 9 | export class TwoEmbed { 10 | static url = "https://www.2embed.to"; 11 | 12 | static isSrc_available(embed_page: string) { 13 | if(embed_page !== null){ 14 | const $ = cheerio.load(embed_page); 15 | return $("title").text() !== "404 Page Not Found"; 16 | } else{ 17 | return false; 18 | } 19 | } 20 | 21 | 22 | static list_episodes(library_page: string, season_n: any) { 23 | var $ = cheerio.load(library_page); 24 | 25 | let list_episodes = []; 26 | let episode_names = []; 27 | $('.episode-item').each(function (index, element) { 28 | list_episodes[index] = $(element).attr("data-number"); 29 | episode_names[index] = $(element).text().substring($(element).text().indexOf(":") + 2); 30 | }); 31 | 32 | let sum_total_eps = 0; 33 | let prev_sum_total_eps = 0; 34 | 35 | let season_details = []; 36 | var index = 0; 37 | $(".season-item").each(function (i,el) { 38 | sum_total_eps += $(`#ss-episodes-${i+1}`).find("div > div > a").length; 39 | prev_sum_total_eps += $(`#ss-episodes-${i}`).find("div > div > a").length; 40 | 41 | let season_number = $(el).attr("data-number"); 42 | let episodes_id = list_episodes.slice(prev_sum_total_eps, sum_total_eps); 43 | let epstotal = episodes_id.length; 44 | 45 | season_details[i] = {season_number, epstotal}; 46 | 47 | let episodes = []; 48 | 49 | if (season_n == season_number) { 50 | episodes_id.forEach((episode_number, index) => { 51 | const title = episode_names[index+prev_sum_total_eps]; 52 | episodes[index] = { episode_number, title}; 53 | 54 | }); 55 | index = i; 56 | season_details[index] = { episodes, season_number, epstotal }; 57 | } 58 | 59 | }); 60 | if(season_n == "all"){ 61 | return {season_details}; 62 | } 63 | return season_details[index]; 64 | } 65 | static async extract_content(embed_page: string) { 66 | const $ = cheerio.load(embed_page); 67 | 68 | const source_id = $(".item-server").map(function(){ 69 | if ($(this).text().includes("Vidcloud")) { 70 | return $(this).attr("data-id"); 71 | } 72 | }).get().toString(); 73 | 74 | const site_key: string = $("body").attr("data-recaptcha-key"); 75 | 76 | const token = await getCaptchaToken(TwoEmbed.url, site_key); 77 | const rabbitstream_url = await axios.get(`${TwoEmbed.url}/ajax/embed/play?id= 78 | ${source_id}&_token=${token}`,{ 79 | headers: { 80 | "Referer": TwoEmbed.url 81 | } 82 | } ).then(res => res.data.link); 83 | return await rabbitstreamExtract(rabbitstream_url); 84 | 85 | } 86 | 87 | static async getEmbedPageSrc(type: string, arg: any){ 88 | try { 89 | return await axios.get( 90 | `${TwoEmbed.url}/embed/tmdb/${type}`, { 91 | params: { 92 | id: arg.params.id, 93 | s: arg.params.s, 94 | e: arg.params.e 95 | } } ).then((res) => res.data ) ; 96 | 97 | } catch (error) { 98 | return null; 99 | } 100 | } 101 | 102 | 103 | } 104 | -------------------------------------------------------------------------------- /src/providers/tmdb.ts: -------------------------------------------------------------------------------- 1 | export const tmdb = { 2 | url: "https://api.themoviedb.org", 3 | key: "8d12775adaf4e75ea96c81ec66ddd3fe" 4 | } 5 | -------------------------------------------------------------------------------- /src/routers/api/details.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | 3 | import axios from "axios"; 4 | 5 | import { TwoEmbed } from "../../providers/2embed"; 6 | import { tmdb } from "../../providers/tmdb"; 7 | 8 | const router = Router(); 9 | 10 | router.get("/details/:type/:id", async (req, res) => { 11 | 12 | try { 13 | const details = await axios.get( 14 | `${tmdb.url}/3/${req.params.type}/${req.params.id}?api_key=${tmdb.key}&append_to_response=credits,videos` 15 | ).then((res) => res.data); 16 | 17 | delete details.seasons; 18 | 19 | const query = { 20 | params: { 21 | id: req.params.id, 22 | s: 'null', 23 | e: 'null' 24 | } 25 | } 26 | const data = await TwoEmbed.getEmbedPageSrc(req.params.type, query); 27 | 28 | if (TwoEmbed.isSrc_available(data)) { 29 | return res.status(200).json({ details , is_src_available: true }); 30 | } else { 31 | return res.status(200).json({ details , is_src_available: false }); 32 | } 33 | } catch (err) { 34 | return res.status(404).json({ error: "incorrect request." }); 35 | } 36 | }); 37 | 38 | export default router; 39 | -------------------------------------------------------------------------------- /src/routers/api/episodes.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import axios from "axios"; 3 | 4 | import { TwoEmbed } from "../../providers/2embed"; 5 | 6 | const router = Router(); 7 | 8 | router.get("/episodes/tv/:id/seasons/:season_n_query", async (req, res) => { 9 | try { 10 | const library_page = await axios.get( 11 | `${TwoEmbed.url}/library/tv/${req.params.id}`, 12 | { timeout: 3500 }).then((res) => res.data); 13 | 14 | const season_n_query = req.params.season_n_query; 15 | 16 | const episodes = TwoEmbed.list_episodes(library_page, season_n_query); 17 | 18 | return res.status(200).json(episodes); 19 | } catch (err) { 20 | return res.status(404).json({ error: "No media source found." }); 21 | } 22 | }); 23 | 24 | export default router; 25 | -------------------------------------------------------------------------------- /src/routers/api/get_source.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import { TwoEmbed } from "../../providers/2embed"; 3 | 4 | const router = Router(); 5 | 6 | //ex. host/api/get_source/tv?id=37854&s=1&e=1 7 | router.get("/get_source/:type", async (req, res) => { 8 | 9 | try { 10 | const query = { 11 | params: { 12 | id: req.query.id, 13 | s: req.query.s, 14 | e: req.query.e 15 | } 16 | } 17 | const embed_page = await TwoEmbed.getEmbedPageSrc(req.params.type, query); 18 | 19 | const source = await TwoEmbed.extract_content(embed_page); 20 | 21 | return res.status(200).json(source); 22 | } catch(err){ 23 | return res.status(404).json({ error: "there is no sources available." }); 24 | } 25 | 26 | }); 27 | 28 | export default router; 29 | -------------------------------------------------------------------------------- /src/routers/api/home.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import axios from "axios"; 3 | 4 | import { tmdb } from "../../providers/tmdb"; 5 | 6 | const router = Router(); 7 | 8 | router.get("/home", async (_req, res) => { 9 | try { 10 | const trending_movies = await axios.get( 11 | `${tmdb.url}/3/trending/all/day?api_key=${tmdb.key}` 12 | ).then((res) => res.data.results); 13 | 14 | const trending_tv = await axios.get( 15 | `${tmdb.url}/3/trending/all/day?api_key=${tmdb.key}` 16 | ).then((res) => res.data.results); 17 | 18 | const popular_movies = await axios.get( 19 | `${tmdb.url}/3/movie/popular?api_key=${tmdb.key}` 20 | ).then((res) => res.data.results); 21 | 22 | const popular_tv = await axios.get( 23 | `${tmdb.url}/3/tv/popular?api_key=${tmdb.key}` 24 | ).then((res) => res.data.results); 25 | 26 | const top_movies = await axios.get( 27 | `${tmdb.url}/3/tv/popular?api_key=${tmdb.key}` 28 | ).then((res) => res.data.results); 29 | 30 | const top_tv = await axios.get( 31 | `${tmdb.url}/3/tv/popular?api_key=${tmdb.key}` 32 | ).then((res) => res.data.results); 33 | 34 | return res.status(200).json({trending_movies, trending_tv , 35 | popular_movies, popular_tv, top_movies, top_tv}); 36 | 37 | } catch (err) { 38 | return res.status(404).json({ error: "incorrect api parameter" }); 39 | } 40 | }); 41 | 42 | export default router; 43 | -------------------------------------------------------------------------------- /src/routers/api/search.ts: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import axios from "axios"; 3 | 4 | import { tmdb } from "../../providers/tmdb"; 5 | 6 | const router = Router(); 7 | 8 | //ex. /api/search/tv?query=one%20piece 9 | router.get("/search/:type", async (req, res) => { 10 | try { 11 | const results = await axios.get( 12 | `${tmdb.url}/3/search/${req.params.type}`, { 13 | params: { 14 | api_key: tmdb.key, 15 | query: req.query.query, 16 | } } ).then((res) => res.data.results); 17 | 18 | return res.status(404).json({ results, available: false }); 19 | 20 | } catch (err) { 21 | return res.status(404).json({ error: "incorrect request" }); 22 | } 23 | }); 24 | 25 | export default router; 26 | -------------------------------------------------------------------------------- /src/routers/index.ts: -------------------------------------------------------------------------------- 1 | import * as Express from 'express'; 2 | 3 | import home from "./api/home"; 4 | import details from "./api/details"; 5 | import search from "./api/search"; 6 | import episodes from "./api/episodes"; 7 | import getSource from "./api/get_source"; 8 | 9 | export const initRoutes = (app: Express.Application) => { 10 | app.use("/api", home); 11 | app.use("/api", details); 12 | app.use("/api", search); 13 | app.use("/api", episodes); 14 | app.use("/api", getSource); 15 | }; 16 | 17 | -------------------------------------------------------------------------------- /src/server.ts: -------------------------------------------------------------------------------- 1 | import App from './app'; 2 | 3 | const app = new App(); 4 | 5 | app.listen(); -------------------------------------------------------------------------------- /src/utils/get_token.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import Base64 from 'crypto-js/enc-base64'; 3 | import Utf8 from 'crypto-js/enc-utf8'; 4 | import qs from 'qs'; 5 | 6 | import * as cheerio from 'cheerio'; 7 | import * as Uri from "uri-js"; 8 | 9 | export async function getCaptchaToken(url: string, key: string) { 10 | const uri = Uri.parse(url); 11 | 12 | const domain: string = Base64.stringify(Utf8.parse(uri.scheme + "://" + uri.host + ":443")).replace(/=/g, "."); 13 | 14 | const recaptcha_out: string = await axios.get( "https://www.google.com/recaptcha/api.js?render=" + key).then(res => res.data); 15 | 16 | const v_token = recaptcha_out.substring(recaptcha_out.indexOf("/releases/") + 10 ,recaptcha_out.indexOf("/recaptcha__en.js")); 17 | 18 | const anchor_out = await axios.get(`https://www.google.com/recaptcha/api2/anchor?ar=1&hl=en&size=invisible&cb=flicklax&k=${key}&co=${domain}&v=${v_token}`).then(res => res.data); 19 | 20 | const $ = cheerio.load(anchor_out); 21 | 22 | const recaptcha_token = $("#recaptcha-token").attr("value"); 23 | 24 | const data = { 25 | v: v_token, 26 | reason: "q", 27 | k: key, 28 | c: recaptcha_token, 29 | sa: "", 30 | co: domain, 31 | }; 32 | 33 | const token_out = await axios.post(`https://www.google.com/recaptcha/api2/reload?k=${key}`, qs.stringify(data) 34 | , { headers: {"referer": "https://www.google.com/recaptcha/api2/"} } 35 | ).then(res => res.data); 36 | 37 | var token = token_out.match('rresp","(.+?)"') 38 | 39 | return token[1]; 40 | 41 | } 42 | 43 | -------------------------------------------------------------------------------- /src/utils/util.ts: -------------------------------------------------------------------------------- 1 | export const isJson = (str: string) => { 2 | try { 3 | JSON.parse(str); 4 | } catch (e) { 5 | return false; 6 | } 7 | return true; 8 | }; 9 | 10 | export const substringAfter = (str: string, toFind: string) => { 11 | const index = str.indexOf(toFind); 12 | return index == -1 ? "" : str.substring(index + toFind.length); 13 | }; 14 | 15 | export const substringBefore = (str: string, toFind: string) => { 16 | const index = str.indexOf(toFind); 17 | return index == -1 ? "" : str.substring(0, index); 18 | }; 19 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "target": "es6", 6 | "moduleResolution": "node", 7 | "sourceMap": true, 8 | "outDir": "dist" 9 | }, 10 | "lib": ["es2015"] 11 | } -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { 5 | "src": "/src/server.ts", 6 | "use": "@vercel/node" 7 | } 8 | ], 9 | "routes": [ 10 | { 11 | "src": "/(.*)", 12 | "dest": "/src/server.ts" 13 | } 14 | ] 15 | } --------------------------------------------------------------------------------