├── .gitignore ├── README.md ├── addon.js ├── beamup.json ├── deploy.sh ├── index.js ├── package-lock.json ├── package.json └── vue ├── .env ├── .env.development ├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── dist ├── apple.webp ├── assets │ ├── index.0f7d9069.js │ └── index.79bc1b06.css ├── blu.webp ├── canal-plus.webp ├── claro.webp ├── crunchyroll.webp ├── curiositystream.webp ├── discovery-plus.webp ├── disney.webp ├── favicon.ico ├── funimation.webp ├── globo.webp ├── hayu.webp ├── hbo.webp ├── hotstar.webp ├── hulu.webp ├── index.html ├── magellan.webp ├── max.webp ├── netflix.webp ├── netflixkids.webp ├── nlziet.webp ├── paramount.webp ├── peacock.webp ├── prime.webp ├── skyshowtime.webp ├── streaming-catalogs.png ├── stremio.png ├── videoland.webp ├── youtube.webp └── zee5.webp ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.cjs ├── public ├── apple.webp ├── blu.webp ├── canal-plus.webp ├── claro.webp ├── crunchyroll.webp ├── curiositystream.webp ├── discovery-plus.webp ├── disney.webp ├── favicon.ico ├── funimation.webp ├── globo.webp ├── hayu.webp ├── hbo.webp ├── hotstar.webp ├── hulu.webp ├── magellan.webp ├── max.webp ├── netflix.webp ├── netflixkids.webp ├── nlziet.webp ├── paramount.webp ├── peacock.webp ├── prime.webp ├── skyshowtime.webp ├── streaming-catalogs.png ├── stremio.png ├── videoland.webp ├── youtube.webp └── zee5.webp ├── src ├── App.vue ├── assets │ └── vue.svg ├── components │ ├── VButton.vue │ └── VInput.vue ├── main.js ├── regions-to-countries.json └── style.css ├── tailwind.config.cjs └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | vue/dist/error.log 4 | .idea 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Stremio Streaming Catalogs Addon 2 | 3 | ![image](https://user-images.githubusercontent.com/6817390/216839228-f0d09dfd-e76b-4d23-bf4f-cab09febd1ef.png) 4 | -------------------------------------------------------------------------------- /addon.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const AMOUNT = 100; 4 | const AMOUNT_TO_VERIFY = 24; 5 | const DUPES_CACHE = {}; 6 | const DELETED_CACHE = []; 7 | 8 | export default { 9 | verify: true, 10 | replaceRpdbPosters(rpdbKey, metas) { 11 | if (!rpdbKey) { 12 | return metas; 13 | } 14 | 15 | return metas.map(meta => { 16 | return {...meta, poster: `https://api.ratingposterdb.com/${rpdbKey}/imdb/poster-default/${meta.id}.jpg`}; 17 | }); 18 | }, 19 | async getLatest(type = 'MOVIE', providers = ['nfx'], country = "GB", language = 'en') { 20 | // todo 21 | }, 22 | async getMetas(type = 'MOVIE', providers = ['nfx'], country = "GB", language = 'en') { 23 | let res = null; 24 | try { 25 | res = await axios.post('https://apis.justwatch.com/graphql', { 26 | "operationName": "GetPopularTitles", 27 | "variables": { 28 | "popularTitlesSortBy": "TRENDING", 29 | "first": AMOUNT, 30 | "platform": "WEB", 31 | "sortRandomSeed": 0, 32 | "popularAfterCursor": "", 33 | "offset": null, 34 | "popularTitlesFilter": { 35 | "ageCertifications": [], 36 | "excludeGenres": [], 37 | "excludeProductionCountries": [], 38 | "genres": [], 39 | "objectTypes": [ 40 | type 41 | ], 42 | "productionCountries": [], 43 | "packages": providers, 44 | "excludeIrrelevantTitles": false, 45 | "presentationTypes": [], 46 | "monetizationTypes": [ 47 | "FREE", 48 | "FLATRATE", 49 | "ADS" 50 | ] 51 | }, 52 | "language": language, 53 | "country": country 54 | }, 55 | "query": "query GetPopularTitles(\n $country: Country!\n $popularTitlesFilter: TitleFilter\n $popularAfterCursor: String\n $popularTitlesSortBy: PopularTitlesSorting! = POPULAR\n $first: Int!\n $language: Language!\n $offset: Int = 0\n $sortRandomSeed: Int! = 0\n $profile: PosterProfile\n $backdropProfile: BackdropProfile\n $format: ImageFormat\n) {\n popularTitles(\n country: $country\n filter: $popularTitlesFilter\n offset: $offset\n after: $popularAfterCursor\n sortBy: $popularTitlesSortBy\n first: $first\n sortRandomSeed: $sortRandomSeed\n ) {\n totalCount\n pageInfo {\n startCursor\n endCursor\n hasPreviousPage\n hasNextPage\n __typename\n }\n edges {\n ...PopularTitleGraphql\n __typename\n }\n __typename\n }\n}\n\nfragment PopularTitleGraphql on PopularTitlesEdge {\n cursor\n node {\n id\n objectId\n objectType\n content(country: $country, language: $language) {\n externalIds {\n imdbId\n }\n title\n fullPath\n scoring {\n imdbScore\n __typename\n }\n posterUrl(profile: $profile, format: $format)\n ... on ShowContent {\n backdrops(profile: $backdropProfile, format: $format) {\n backdropUrl\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n}" 56 | }); 57 | } catch (e) { 58 | console.error(e.message); 59 | console.log(e.response?.data); 60 | 61 | return []; 62 | } 63 | 64 | console.log(providers.join(','), res.data.data.popularTitles.edges.length); 65 | 66 | return (await Promise.all(res.data.data.popularTitles.edges.map(async (item, index) => { 67 | let imdbId = item.node.content.externalIds.imdbId; 68 | 69 | if (!imdbId || DELETED_CACHE.includes(imdbId)) { 70 | if (imdbId) console.log('deleted cache hit'); 71 | 72 | return null; 73 | } 74 | 75 | if (DUPES_CACHE[imdbId]) { 76 | console.log('dupe cache hit'); 77 | imdbId = DUPES_CACHE[imdbId]; 78 | } else if (index < AMOUNT_TO_VERIFY && this.verify) { 79 | try { 80 | await axios.head(`https://www.imdb.com/title/${imdbId}/`, {maxRedirects: 0, headers: {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/110.0'}}); 81 | } catch(e) { 82 | if (e.response?.status === 308) { 83 | const newImdbId = e.response?.headers?.['location']?.split('/')?.[2]; 84 | console.log('DUPE imdb redirects to', newImdbId); 85 | DUPES_CACHE[imdbId] = newImdbId; 86 | imdbId = newImdbId; 87 | } else if (e.response?.status === 404) { 88 | console.log('imdb does not exist'); 89 | DELETED_CACHE.push(imdbId); 90 | return null; 91 | } else { 92 | console.error('Stop verifying, IMDB error', e.response?.status); 93 | this.verify = false; 94 | } 95 | } 96 | } 97 | 98 | const posterId = item?.node?.content?.posterUrl?.match(/\/poster\/([0-9]+)\//)?.pop(); 99 | let posterUrl; 100 | if (posterId) { 101 | posterUrl = `https://images.justwatch.com/poster/${posterId}/s332/img`; 102 | } else { 103 | posterUrl = `https://live.metahub.space/poster/medium/${imdbId}/img`; 104 | } 105 | 106 | // get better metadata from cinemeta 107 | const cinemeta = await axios.get(`https://v3-cinemeta.strem.io/meta/${type === 'MOVIE' ? 'movie' : 'series'}/${imdbId}.json`); 108 | 109 | return cinemeta.data?.meta ? { 110 | ...cinemeta.data?.meta, 111 | ...{ id: imdbId, name: item.node.content.title, poster: posterUrl, videos: undefined }, 112 | } : { 113 | id: imdbId, 114 | name: item.node.content.title, 115 | poster: posterUrl, 116 | posterShape: 'poster', 117 | type: type === 'MOVIE' ? 'movie' : 'series', 118 | } 119 | }))).filter(item => item?.id); 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /beamup.json: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "stremio-netflix-catalog-addon", 3 | "lastCommit": "9ea730e" 4 | } -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | cd vue 6 | npm run build 7 | cd ../ 8 | git add --all 9 | git commit -am "Deploy" 10 | git push origin master 11 | git push beamup master 12 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import cors from 'cors'; 3 | import Mixpanel from 'mixpanel'; 4 | import { fileURLToPath } from 'url'; 5 | import path from 'path'; 6 | import fs from 'fs'; 7 | import addon from './addon.js'; 8 | 9 | const __filename = fileURLToPath(import.meta.url); 10 | const __dirname = path.dirname(__filename); 11 | 12 | if (process.env.NODE_ENV === 'production') { 13 | const errorLog = fs.createWriteStream(path.join(__dirname, 'vue', 'dist', 'error.log')); 14 | process.stderr.write = errorLog.write.bind(errorLog); 15 | 16 | process.on('uncaughtException', function (err) { 17 | console.error((err && err.stack) ? err.stack : err); 18 | }); 19 | } 20 | 21 | const app = express(); 22 | app.set('trust proxy', true) 23 | app.use(cors()); 24 | app.use(express.static(path.join(__dirname, 'vue', 'dist'))); 25 | 26 | 27 | let mixpanel = null; 28 | if (process.env.MIXPANEL_KEY) { 29 | mixpanel = Mixpanel.init(process.env.MIXPANEL_KEY); 30 | } 31 | 32 | let movies = { 33 | 'nfx': [], 34 | 'nfk': [], 35 | 'dnp': [], 36 | 'amp': [], 37 | 'atp': [], 38 | 'pmp': [], 39 | 'hbm': [], 40 | 'hlu': [], 41 | 'pcp': [], 42 | 'cru': [], 43 | 'hst': [], 44 | 'zee': [], 45 | 'vil': [], 46 | 'blv': [], 47 | 'clv': [], 48 | 'gop': [], 49 | 'mgl': [], 50 | 'cts': [], 51 | 'sst': [], 52 | 'nlz': [], 53 | //'hay': [], 54 | 'cpd': [], 55 | //'dpe': [], 56 | }; 57 | let series = { 58 | 'nfx': [], 59 | 'nfk': [], 60 | 'dnp': [], 61 | 'amp': [], 62 | 'atp': [], 63 | 'pmp': [], 64 | 'hbm': [], 65 | 'hlu': [], 66 | 'pcp': [], 67 | 'cru': [], 68 | 'hst': [], 69 | 'zee': [], 70 | 'vil': [], 71 | 'blv': [], 72 | 'clv': [], 73 | 'gop': [], 74 | 'mgl': [], 75 | 'cts': [], 76 | 'sst': [], 77 | 'nlz': [], 78 | 'hay': [], 79 | 'cpd': [], 80 | 'dpe': [], 81 | }; 82 | async function loadNewCatalog() { 83 | console.log('loadNewCatalog'); 84 | movies.nfx = await addon.getMetas('MOVIE', ['nfx'], 'GB'); 85 | movies.nfk = await addon.getMetas('MOVIE', ['nfk'], 'US'); 86 | movies.dnp = await addon.getMetas('MOVIE', ['dnp'], 'GB'); 87 | movies.atp = await addon.getMetas('MOVIE', ['atp'], 'GB'); 88 | //movies.dpe = await addon.getMetas('MOVIE', ['dpe'], 'GB'); // 1 result 89 | //movies.hay = await addon.getMetas('MOVIE', ['hay'], 'GB'); // 0 results 90 | movies.amp = await addon.getMetas('MOVIE', ['amp'], 'US'); 91 | movies.pmp = await addon.getMetas('MOVIE', ['pmp'], 'US'); 92 | movies.hbm = await addon.getMetas('MOVIE', ['hbm'], 'NL'); 93 | movies.hlu = await addon.getMetas('MOVIE', ['hlu'], 'US'); 94 | movies.pcp = await addon.getMetas('MOVIE', ['pcp'], 'US'); 95 | movies.cts = await addon.getMetas('MOVIE', ['cts'], 'US'); 96 | movies.mgl = await addon.getMetas('MOVIE', ['mgl'], 'US'); 97 | movies.cru = await addon.getMetas('MOVIE', ['cru'], 'US'); 98 | movies.hst = await addon.getMetas('MOVIE', ['hst'], 'IN', 'in'); 99 | movies.zee = await addon.getMetas('MOVIE', ['zee'], 'IN', 'in'); 100 | movies.vil = await addon.getMetas('MOVIE', ['vil'], 'NL', 'nl'); 101 | movies.nlz = await addon.getMetas('MOVIE', ['nlz'], 'NL', 'nl'); 102 | movies.sst = await addon.getMetas('MOVIE', ['sst'], 'NL', 'nl'); 103 | movies.blv = await addon.getMetas('MOVIE', ['blv'], 'TR', 'tr'); 104 | movies.clv = await addon.getMetas('MOVIE', ['clv'], 'BR', 'br'); 105 | movies.gop = await addon.getMetas('MOVIE', ['gop'], 'BR', 'br'); 106 | movies.cpd = await addon.getMetas('MOVIE', ['cpd'], 'FR', 'fr'); 107 | 108 | series.nfx = await addon.getMetas('SHOW', ['nfx'], 'GB'); 109 | series.nfk = await addon.getMetas('SHOW', ['nfk'], 'US'); 110 | series.dnp = await addon.getMetas('SHOW', ['dnp'], 'GB'); 111 | series.atp = await addon.getMetas('SHOW', ['atp'], 'GB'); 112 | series.hay = await addon.getMetas('SHOW', ['hay'], 'GB'); 113 | series.dpe = await addon.getMetas('SHOW', ['dpe'], 'GB'); 114 | series.amp = await addon.getMetas('SHOW', ['amp'], 'US'); 115 | series.pmp = await addon.getMetas('SHOW', ['pmp'], 'US'); 116 | series.hbm = await addon.getMetas('SHOW', ['hbm'], 'NL'); 117 | series.hlu = await addon.getMetas('SHOW', ['hlu'], 'US'); 118 | series.pcp = await addon.getMetas('SHOW', ['pcp'], 'US'); 119 | series.cru = await addon.getMetas('SHOW', ['cru'], 'US'); 120 | series.cts = await addon.getMetas('SHOW', ['cts'], 'US'); 121 | series.mgl = await addon.getMetas('SHOW', ['mgl'], 'US'); 122 | series.hst = await addon.getMetas('SHOW', ['hst'], 'IN', 'in'); 123 | series.zee = await addon.getMetas('SHOW', ['zee'], 'IN', 'in'); 124 | series.vil = await addon.getMetas('SHOW', ['vil'], 'NL', 'nl'); 125 | series.nlz = await addon.getMetas('SHOW', ['nlz'], 'NL', 'nl'); 126 | series.sst = await addon.getMetas('SHOW', ['sst'], 'NL', 'nl'); 127 | series.blv = await addon.getMetas('SHOW', ['blv'], 'TR', 'tr'); 128 | series.clv = await addon.getMetas('SHOW', ['clv'], 'BR', 'br'); 129 | series.gop = await addon.getMetas('SHOW', ['gop'], 'BR', 'br'); 130 | series.cpd = await addon.getMetas('SHOW', ['cpd'], 'FR', 'fr'); 131 | console.log('done'); 132 | } 133 | 134 | 135 | app.get('/:configuration/manifest.json', (req, res) => { 136 | res.setHeader('Cache-Control', 'max-age=86400,stale-while-revalidate=86400,stale-if-error=86400,public'); 137 | res.setHeader('content-type', 'application/json'); 138 | 139 | // parse config 140 | const buffer = Buffer(req.params?.configuration || '', 'base64'); 141 | const [selectedProviders, rpdbKey, countryCode, installedAt] = buffer.toString('ascii')?.split(':'); 142 | 143 | mixpanel && mixpanel.track('install', { 144 | ip: req.ip, 145 | distinct_id: req.ip.replace(/\.|:/g, 'Z'), 146 | configuration: req.params.configuration, 147 | selectedProviders, 148 | rpdbKey, 149 | countryCode, 150 | installedAt, 151 | }); 152 | 153 | let catalogs = []; 154 | if (selectedProviders.includes('nfx')) { 155 | catalogs.push({ 156 | id: 'nfx', 157 | type: 'movie', 158 | name: 'Netflix', 159 | }); 160 | catalogs.push({ 161 | id: 'nfx', 162 | type: 'series', 163 | name: 'Netflix', 164 | }); 165 | } 166 | if (selectedProviders.includes('nfk')) { 167 | catalogs.push({ 168 | id: 'nfk', 169 | type: 'movie', 170 | name: 'Netflix Kids', 171 | }); 172 | catalogs.push({ 173 | id: 'nfk', 174 | type: 'series', 175 | name: 'Netflix Kids', 176 | }); 177 | } 178 | if (selectedProviders.includes('hbm')) { 179 | catalogs.push({ 180 | id: 'hbm', 181 | type: 'movie', 182 | name: 'HBO Max', 183 | }); 184 | catalogs.push({ 185 | id: 'hbm', 186 | type: 'series', 187 | name: 'HBO Max', 188 | }); 189 | } 190 | if (selectedProviders.includes('dnp')) { 191 | catalogs.push({ 192 | id: 'dnp', 193 | type: 'movie', 194 | name: 'Disney+', 195 | }); 196 | catalogs.push({ 197 | id: 'dnp', 198 | type: 'series', 199 | name: 'Disney+', 200 | }); 201 | } 202 | if (selectedProviders.includes('hlu')) { 203 | catalogs.push({ 204 | id: 'hlu', 205 | type: 'movie', 206 | name: 'Hulu', 207 | }); 208 | catalogs.push({ 209 | id: 'hlu', 210 | type: 'series', 211 | name: 'Hulu', 212 | }); 213 | } 214 | if (selectedProviders.includes('amp')) { 215 | catalogs.push({ 216 | id: 'amp', 217 | type: 'movie', 218 | name: 'Prime Video', 219 | }); 220 | catalogs.push({ 221 | id: 'amp', 222 | type: 'series', 223 | name: 'Prime Video', 224 | }); 225 | } 226 | if (selectedProviders.includes('pmp')) { 227 | catalogs.push({ 228 | id: 'pmp', 229 | type: 'movie', 230 | name: 'Paramount+', 231 | }); 232 | catalogs.push({ 233 | id: 'pmp', 234 | type: 'series', 235 | name: 'Paramount+', 236 | }); 237 | } 238 | if (selectedProviders.includes('atp')) { 239 | catalogs.push({ 240 | id: 'atp', 241 | type: 'movie', 242 | name: 'Apple TV+', 243 | }); 244 | catalogs.push({ 245 | id: 'atp', 246 | type: 'series', 247 | name: 'Apple TV+', 248 | }); 249 | } 250 | if (selectedProviders.includes('pct') || selectedProviders.includes('pcp')) { 251 | catalogs.push({ 252 | id: 'pcp', 253 | type: 'movie', 254 | name: 'Peacock', 255 | }); 256 | catalogs.push({ 257 | id: 'pcp', 258 | type: 'series', 259 | name: 'Peacock', 260 | }); 261 | } 262 | if (selectedProviders.includes('cru') || selectedProviders.includes('fmn')) { 263 | catalogs.push({ 264 | id: 'cru', 265 | type: 'movie', 266 | name: 'Crunchyroll', 267 | }); 268 | catalogs.push({ 269 | id: 'cru', 270 | type: 'series', 271 | name: 'Crunchyroll', 272 | }); 273 | } 274 | if (selectedProviders.includes('hst')) { 275 | catalogs.push({ 276 | id: 'hst', 277 | type: 'movie', 278 | name: 'Hotstar', 279 | }); 280 | catalogs.push({ 281 | id: 'hst', 282 | type: 'series', 283 | name: 'Hotstar', 284 | }); 285 | } 286 | if (selectedProviders.includes('zee')) { 287 | catalogs.push({ 288 | id: 'zee', 289 | type: 'movie', 290 | name: 'Zee5', 291 | }); 292 | catalogs.push({ 293 | id: 'zee', 294 | type: 'series', 295 | name: 'Zee5', 296 | }); 297 | } 298 | if (selectedProviders.includes('vil')) { 299 | catalogs.push({ 300 | id: 'vil', 301 | type: 'movie', 302 | name: 'Videoland', 303 | }); 304 | catalogs.push({ 305 | id: 'vil', 306 | type: 'series', 307 | name: 'Videoland', 308 | }); 309 | } 310 | if (selectedProviders.includes('blv')) { 311 | catalogs.push({ 312 | id: 'blv', 313 | type: 'movie', 314 | name: 'BluTV', 315 | }); 316 | catalogs.push({ 317 | id: 'blv', 318 | type: 'series', 319 | name: 'BluTV', 320 | }); 321 | } 322 | if (selectedProviders.includes('clv')) { 323 | catalogs.push({ 324 | id: 'clv', 325 | type: 'movie', 326 | name: 'Clarovideo', 327 | }); 328 | catalogs.push({ 329 | id: 'clv', 330 | type: 'series', 331 | name: 'Clarovideo', 332 | }); 333 | } 334 | if (selectedProviders.includes('gop')) { 335 | catalogs.push({ 336 | id: 'gop', 337 | type: 'movie', 338 | name: 'Globoplay', 339 | }); 340 | catalogs.push({ 341 | id: 'gop', 342 | type: 'series', 343 | name: 'Globoplay', 344 | }); 345 | } 346 | if (selectedProviders.includes('hay')) { 347 | catalogs.push({ 348 | id: 'hay', 349 | type: 'series', 350 | name: 'Hayu', 351 | }); 352 | } 353 | if (selectedProviders.includes('nlz')) { 354 | catalogs.push({ 355 | id: 'nlz', 356 | type: 'movie', 357 | name: 'NLZIET', 358 | }); 359 | catalogs.push({ 360 | id: 'nlz', 361 | type: 'series', 362 | name: 'NLZIET', 363 | }); 364 | } 365 | if (selectedProviders.includes('sst')) { 366 | catalogs.push({ 367 | id: 'sst', 368 | type: 'movie', 369 | name: 'SkyShowtime', 370 | }); 371 | catalogs.push({ 372 | id: 'sst', 373 | type: 'series', 374 | name: 'SkyShowtime', 375 | }); 376 | } 377 | if (selectedProviders.includes('mgl')) { 378 | catalogs.push({ 379 | id: 'mgl', 380 | type: 'movie', 381 | name: 'MagellanTV', 382 | }); 383 | catalogs.push({ 384 | id: 'mgl', 385 | type: 'series', 386 | name: 'MagellanTV', 387 | }); 388 | } 389 | if (selectedProviders.includes('cts')) { 390 | catalogs.push({ 391 | id: 'cts', 392 | type: 'movie', 393 | name: 'Curiosity Stream', 394 | }); 395 | catalogs.push({ 396 | id: 'cts', 397 | type: 'series', 398 | name: 'Curiosity Stream', 399 | }); 400 | } 401 | if (selectedProviders.includes('cpd')) { 402 | catalogs.push({ 403 | id: 'cpd', 404 | type: 'movie', 405 | name: 'Canal+', 406 | }); 407 | catalogs.push({ 408 | id: 'cpd', 409 | type: 'series', 410 | name: 'Canal+', 411 | }); 412 | } 413 | if (selectedProviders.includes('dpe')) { 414 | /*catalogs.push({ 415 | id: 'dpe', 416 | type: 'movie', 417 | name: 'Discovery+', 418 | });*/ 419 | catalogs.push({ 420 | id: 'dpe', 421 | type: 'series', 422 | name: 'Discovery+', 423 | }); 424 | } 425 | 426 | // show catalogs for providers 427 | res.send({ 428 | id: 'pw.ers.netflix-catalog', 429 | logo: 'https://play-lh.googleusercontent.com/TBRwjS_qfJCSj1m7zZB93FnpJM5fSpMA_wUlFDLxWAb45T9RmwBvQd5cWR5viJJOhkI', 430 | version: process.env.npm_package_version, 431 | name: 'Streaming Catalogs', 432 | description: 'Your favourite streaming services!', 433 | catalogs: catalogs, 434 | resources: ['catalog'], 435 | types: ['movie', 'series'], 436 | idPrefixes: ['tt'], 437 | behaviorHints: { 438 | configurable: true, 439 | } 440 | }); 441 | }) 442 | 443 | app.get('/:configuration?/catalog/:type/:id/:extra?.json', (req, res) => { 444 | res.setHeader('Cache-Control', 'max-age=86400,stale-while-revalidate=86400,stale-if-error=86400,public'); 445 | res.setHeader('content-type', 'application/json'); 446 | 447 | // parse config 448 | const buffer = Buffer(req.params?.configuration || '', 'base64'); 449 | let [selectedProviders, rpdbKey, countryCode, installedAt] = buffer.toString('ascii')?.split(':'); 450 | 451 | //console.log(selectedProviders, rpdbKey, countryCode, installedAt); 452 | 453 | if (String(rpdbKey || '').startsWith('16')) { 454 | installedAt = rpdbKey; 455 | rpdbKey = null; 456 | } 457 | 458 | mixpanel && mixpanel.track('catalog', { 459 | ip: req.ip, 460 | distinct_id: req.ip.replace(/\.|:/g, 'Z'), 461 | configuration: req.params?.configuration, 462 | selectedProviders, 463 | rpdbKey, 464 | countryCode, 465 | installedAt, 466 | catalog_type: req.params.type, 467 | catalog_id: req.params.id, 468 | catalog_extra: req.params?.extra, 469 | }); 470 | 471 | let id = req.params.id; 472 | // legacy addon, netflix-only catalog support 473 | if (id === 'top') { 474 | id = 'nfx'; 475 | } 476 | // mistakenly added peacock free instead of premium. remove pct when/if everyone is using pcp 477 | if (id === 'pct') { 478 | id = 'pcp'; 479 | } 480 | 481 | if (req.params.type === 'movie') { 482 | res.send({ metas: addon.replaceRpdbPosters(rpdbKey, movies[id]) }); 483 | 484 | return; 485 | } 486 | 487 | if (req.params.type === 'series') { 488 | res.send({ metas: addon.replaceRpdbPosters(rpdbKey, series[id]) }); 489 | 490 | return; 491 | } 492 | }) 493 | 494 | app.get('/manifest.json', function (req, res) { 495 | res.setHeader('Cache-Control', 'max-age=86400,stale-while-revalidate=86400,stale-if-error=86400,public'); 496 | res.setHeader('content-type', 'application/json'); 497 | 498 | mixpanel && mixpanel.track('install', { 499 | ip: req.ip, 500 | distinct_id: req.ip.replace(/\.|:/g, 'Z'), 501 | }); 502 | 503 | res.send({ 504 | id: 'pw.ers.netflix-catalog', 505 | logo: 'https://play-lh.googleusercontent.com/TBRwjS_qfJCSj1m7zZB93FnpJM5fSpMA_wUlFDLxWAb45T9RmwBvQd5cWR5viJJOhkI', 506 | version: process.env.npm_package_version, 507 | name: 'Streaming Catalogs', 508 | description: 'Trending movies and series on Netflix, HBO Max, Disney+, Apple TV+ and more. Configure to choose your favourite services.', 509 | catalogs: [ 510 | { 511 | id: 'nfx', 512 | type: 'movie', 513 | name: 'Netflix', 514 | }, { 515 | id: 'nfx', 516 | type: 'series', 517 | name: 'Netflix', 518 | }, { 519 | id: 'hbm', 520 | type: 'movie', 521 | name: 'HBO Max', 522 | }, { 523 | id: 'hbm', 524 | type: 'series', 525 | name: 'HBO Max', 526 | }, { 527 | id: 'dnp', 528 | type: 'movie', 529 | name: 'Disney+', 530 | }, { 531 | id: 'dnp', 532 | type: 'series', 533 | name: 'Disney+', 534 | }, { 535 | id: 'amp', 536 | type: 'movie', 537 | name: 'Prime Video', 538 | }, { 539 | id: 'amp', 540 | type: 'series', 541 | name: 'Prime Video', 542 | }, { 543 | id: 'atp', 544 | type: 'movie', 545 | name: 'Apple TV+', 546 | }, { 547 | id: 'atp', 548 | type: 'series', 549 | name: 'Apple TV+', 550 | }, 551 | ], 552 | resources: ['catalog'], 553 | types: ['movie', 'series'], 554 | idPrefixes: ['tt'], 555 | behaviorHints: { 556 | configurable: true, 557 | } 558 | }); 559 | }) 560 | 561 | // fallback to Vue 562 | app.get(/.*/, (req, res) => { 563 | res.setHeader('Cache-Control', 'max-age=86400,stale-while-revalidate=86400,stale-if-error=86400,public'); 564 | res.setHeader('content-type', 'text/html'); 565 | res.sendFile(path.join(__dirname, 'vue', 'dist', 'index.html')); 566 | }); 567 | 568 | loadNewCatalog(); 569 | setInterval(loadNewCatalog, process.env.REFRESH_INTERVAL || 21600000); 570 | 571 | const port = process.env.PORT || 7700; 572 | app.listen(port, () => { 573 | console.log(`http://127.0.0.1:${port}/manifest.json`); 574 | }); 575 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stremio-netflix-catalog-addon", 3 | "version": "1.0.5", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "stremio-netflix-catalog-addon", 9 | "version": "1.0.5", 10 | "license": "ISC", 11 | "dependencies": { 12 | "axios": "^0.27.2", 13 | "cors": "^2.8.5", 14 | "express": "^4.18.1", 15 | "mixpanel": "^0.17.0" 16 | }, 17 | "devDependencies": { 18 | "nodemon": "^2.0.19" 19 | } 20 | }, 21 | "node_modules/abbrev": { 22 | "version": "1.1.1", 23 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 24 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 25 | "dev": true 26 | }, 27 | "node_modules/accepts": { 28 | "version": "1.3.8", 29 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 30 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 31 | "dependencies": { 32 | "mime-types": "~2.1.34", 33 | "negotiator": "0.6.3" 34 | }, 35 | "engines": { 36 | "node": ">= 0.6" 37 | } 38 | }, 39 | "node_modules/agent-base": { 40 | "version": "6.0.2", 41 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 42 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 43 | "dependencies": { 44 | "debug": "4" 45 | }, 46 | "engines": { 47 | "node": ">= 6.0.0" 48 | } 49 | }, 50 | "node_modules/agent-base/node_modules/debug": { 51 | "version": "4.3.4", 52 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 53 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 54 | "dependencies": { 55 | "ms": "2.1.2" 56 | }, 57 | "engines": { 58 | "node": ">=6.0" 59 | }, 60 | "peerDependenciesMeta": { 61 | "supports-color": { 62 | "optional": true 63 | } 64 | } 65 | }, 66 | "node_modules/agent-base/node_modules/ms": { 67 | "version": "2.1.2", 68 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 69 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 70 | }, 71 | "node_modules/anymatch": { 72 | "version": "3.1.2", 73 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 74 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 75 | "dev": true, 76 | "dependencies": { 77 | "normalize-path": "^3.0.0", 78 | "picomatch": "^2.0.4" 79 | }, 80 | "engines": { 81 | "node": ">= 8" 82 | } 83 | }, 84 | "node_modules/array-flatten": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 87 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 88 | }, 89 | "node_modules/asynckit": { 90 | "version": "0.4.0", 91 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 92 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 93 | }, 94 | "node_modules/axios": { 95 | "version": "0.27.2", 96 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 97 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 98 | "dependencies": { 99 | "follow-redirects": "^1.14.9", 100 | "form-data": "^4.0.0" 101 | } 102 | }, 103 | "node_modules/balanced-match": { 104 | "version": "1.0.2", 105 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 106 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 107 | "dev": true 108 | }, 109 | "node_modules/binary-extensions": { 110 | "version": "2.2.0", 111 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 112 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 113 | "dev": true, 114 | "engines": { 115 | "node": ">=8" 116 | } 117 | }, 118 | "node_modules/body-parser": { 119 | "version": "1.20.0", 120 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 121 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 122 | "dependencies": { 123 | "bytes": "3.1.2", 124 | "content-type": "~1.0.4", 125 | "debug": "2.6.9", 126 | "depd": "2.0.0", 127 | "destroy": "1.2.0", 128 | "http-errors": "2.0.0", 129 | "iconv-lite": "0.4.24", 130 | "on-finished": "2.4.1", 131 | "qs": "6.10.3", 132 | "raw-body": "2.5.1", 133 | "type-is": "~1.6.18", 134 | "unpipe": "1.0.0" 135 | }, 136 | "engines": { 137 | "node": ">= 0.8", 138 | "npm": "1.2.8000 || >= 1.4.16" 139 | } 140 | }, 141 | "node_modules/body-parser/node_modules/debug": { 142 | "version": "2.6.9", 143 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 144 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 145 | "dependencies": { 146 | "ms": "2.0.0" 147 | } 148 | }, 149 | "node_modules/body-parser/node_modules/ms": { 150 | "version": "2.0.0", 151 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 152 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 153 | }, 154 | "node_modules/brace-expansion": { 155 | "version": "1.1.11", 156 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 157 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 158 | "dev": true, 159 | "dependencies": { 160 | "balanced-match": "^1.0.0", 161 | "concat-map": "0.0.1" 162 | } 163 | }, 164 | "node_modules/braces": { 165 | "version": "3.0.2", 166 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 167 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 168 | "dev": true, 169 | "dependencies": { 170 | "fill-range": "^7.0.1" 171 | }, 172 | "engines": { 173 | "node": ">=8" 174 | } 175 | }, 176 | "node_modules/bytes": { 177 | "version": "3.1.2", 178 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 179 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 180 | "engines": { 181 | "node": ">= 0.8" 182 | } 183 | }, 184 | "node_modules/call-bind": { 185 | "version": "1.0.2", 186 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 187 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 188 | "dependencies": { 189 | "function-bind": "^1.1.1", 190 | "get-intrinsic": "^1.0.2" 191 | }, 192 | "funding": { 193 | "url": "https://github.com/sponsors/ljharb" 194 | } 195 | }, 196 | "node_modules/chokidar": { 197 | "version": "3.5.3", 198 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 199 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 200 | "dev": true, 201 | "funding": [ 202 | { 203 | "type": "individual", 204 | "url": "https://paulmillr.com/funding/" 205 | } 206 | ], 207 | "dependencies": { 208 | "anymatch": "~3.1.2", 209 | "braces": "~3.0.2", 210 | "glob-parent": "~5.1.2", 211 | "is-binary-path": "~2.1.0", 212 | "is-glob": "~4.0.1", 213 | "normalize-path": "~3.0.0", 214 | "readdirp": "~3.6.0" 215 | }, 216 | "engines": { 217 | "node": ">= 8.10.0" 218 | }, 219 | "optionalDependencies": { 220 | "fsevents": "~2.3.2" 221 | } 222 | }, 223 | "node_modules/combined-stream": { 224 | "version": "1.0.8", 225 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 226 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 227 | "dependencies": { 228 | "delayed-stream": "~1.0.0" 229 | }, 230 | "engines": { 231 | "node": ">= 0.8" 232 | } 233 | }, 234 | "node_modules/concat-map": { 235 | "version": "0.0.1", 236 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 237 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 238 | "dev": true 239 | }, 240 | "node_modules/content-disposition": { 241 | "version": "0.5.4", 242 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 243 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 244 | "dependencies": { 245 | "safe-buffer": "5.2.1" 246 | }, 247 | "engines": { 248 | "node": ">= 0.6" 249 | } 250 | }, 251 | "node_modules/content-type": { 252 | "version": "1.0.4", 253 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 254 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 255 | "engines": { 256 | "node": ">= 0.6" 257 | } 258 | }, 259 | "node_modules/cookie": { 260 | "version": "0.5.0", 261 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 262 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 263 | "engines": { 264 | "node": ">= 0.6" 265 | } 266 | }, 267 | "node_modules/cookie-signature": { 268 | "version": "1.0.6", 269 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 270 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 271 | }, 272 | "node_modules/cors": { 273 | "version": "2.8.5", 274 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 275 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 276 | "dependencies": { 277 | "object-assign": "^4", 278 | "vary": "^1" 279 | }, 280 | "engines": { 281 | "node": ">= 0.10" 282 | } 283 | }, 284 | "node_modules/debug": { 285 | "version": "3.2.7", 286 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 287 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 288 | "dev": true, 289 | "dependencies": { 290 | "ms": "^2.1.1" 291 | } 292 | }, 293 | "node_modules/delayed-stream": { 294 | "version": "1.0.0", 295 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 296 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 297 | "engines": { 298 | "node": ">=0.4.0" 299 | } 300 | }, 301 | "node_modules/depd": { 302 | "version": "2.0.0", 303 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 304 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 305 | "engines": { 306 | "node": ">= 0.8" 307 | } 308 | }, 309 | "node_modules/destroy": { 310 | "version": "1.2.0", 311 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 312 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 313 | "engines": { 314 | "node": ">= 0.8", 315 | "npm": "1.2.8000 || >= 1.4.16" 316 | } 317 | }, 318 | "node_modules/ee-first": { 319 | "version": "1.1.1", 320 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 321 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 322 | }, 323 | "node_modules/encodeurl": { 324 | "version": "1.0.2", 325 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 326 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 327 | "engines": { 328 | "node": ">= 0.8" 329 | } 330 | }, 331 | "node_modules/escape-html": { 332 | "version": "1.0.3", 333 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 334 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 335 | }, 336 | "node_modules/etag": { 337 | "version": "1.8.1", 338 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 339 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 340 | "engines": { 341 | "node": ">= 0.6" 342 | } 343 | }, 344 | "node_modules/express": { 345 | "version": "4.18.1", 346 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 347 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 348 | "dependencies": { 349 | "accepts": "~1.3.8", 350 | "array-flatten": "1.1.1", 351 | "body-parser": "1.20.0", 352 | "content-disposition": "0.5.4", 353 | "content-type": "~1.0.4", 354 | "cookie": "0.5.0", 355 | "cookie-signature": "1.0.6", 356 | "debug": "2.6.9", 357 | "depd": "2.0.0", 358 | "encodeurl": "~1.0.2", 359 | "escape-html": "~1.0.3", 360 | "etag": "~1.8.1", 361 | "finalhandler": "1.2.0", 362 | "fresh": "0.5.2", 363 | "http-errors": "2.0.0", 364 | "merge-descriptors": "1.0.1", 365 | "methods": "~1.1.2", 366 | "on-finished": "2.4.1", 367 | "parseurl": "~1.3.3", 368 | "path-to-regexp": "0.1.7", 369 | "proxy-addr": "~2.0.7", 370 | "qs": "6.10.3", 371 | "range-parser": "~1.2.1", 372 | "safe-buffer": "5.2.1", 373 | "send": "0.18.0", 374 | "serve-static": "1.15.0", 375 | "setprototypeof": "1.2.0", 376 | "statuses": "2.0.1", 377 | "type-is": "~1.6.18", 378 | "utils-merge": "1.0.1", 379 | "vary": "~1.1.2" 380 | }, 381 | "engines": { 382 | "node": ">= 0.10.0" 383 | } 384 | }, 385 | "node_modules/express/node_modules/debug": { 386 | "version": "2.6.9", 387 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 388 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 389 | "dependencies": { 390 | "ms": "2.0.0" 391 | } 392 | }, 393 | "node_modules/express/node_modules/ms": { 394 | "version": "2.0.0", 395 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 396 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 397 | }, 398 | "node_modules/fill-range": { 399 | "version": "7.0.1", 400 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 401 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 402 | "dev": true, 403 | "dependencies": { 404 | "to-regex-range": "^5.0.1" 405 | }, 406 | "engines": { 407 | "node": ">=8" 408 | } 409 | }, 410 | "node_modules/finalhandler": { 411 | "version": "1.2.0", 412 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 413 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 414 | "dependencies": { 415 | "debug": "2.6.9", 416 | "encodeurl": "~1.0.2", 417 | "escape-html": "~1.0.3", 418 | "on-finished": "2.4.1", 419 | "parseurl": "~1.3.3", 420 | "statuses": "2.0.1", 421 | "unpipe": "~1.0.0" 422 | }, 423 | "engines": { 424 | "node": ">= 0.8" 425 | } 426 | }, 427 | "node_modules/finalhandler/node_modules/debug": { 428 | "version": "2.6.9", 429 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 430 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 431 | "dependencies": { 432 | "ms": "2.0.0" 433 | } 434 | }, 435 | "node_modules/finalhandler/node_modules/ms": { 436 | "version": "2.0.0", 437 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 438 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 439 | }, 440 | "node_modules/follow-redirects": { 441 | "version": "1.15.1", 442 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", 443 | "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", 444 | "funding": [ 445 | { 446 | "type": "individual", 447 | "url": "https://github.com/sponsors/RubenVerborgh" 448 | } 449 | ], 450 | "engines": { 451 | "node": ">=4.0" 452 | }, 453 | "peerDependenciesMeta": { 454 | "debug": { 455 | "optional": true 456 | } 457 | } 458 | }, 459 | "node_modules/form-data": { 460 | "version": "4.0.0", 461 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 462 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 463 | "dependencies": { 464 | "asynckit": "^0.4.0", 465 | "combined-stream": "^1.0.8", 466 | "mime-types": "^2.1.12" 467 | }, 468 | "engines": { 469 | "node": ">= 6" 470 | } 471 | }, 472 | "node_modules/forwarded": { 473 | "version": "0.2.0", 474 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 475 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 476 | "engines": { 477 | "node": ">= 0.6" 478 | } 479 | }, 480 | "node_modules/fresh": { 481 | "version": "0.5.2", 482 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 483 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 484 | "engines": { 485 | "node": ">= 0.6" 486 | } 487 | }, 488 | "node_modules/fsevents": { 489 | "version": "2.3.2", 490 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 491 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 492 | "dev": true, 493 | "hasInstallScript": true, 494 | "optional": true, 495 | "os": [ 496 | "darwin" 497 | ], 498 | "engines": { 499 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 500 | } 501 | }, 502 | "node_modules/function-bind": { 503 | "version": "1.1.1", 504 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 505 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 506 | }, 507 | "node_modules/get-intrinsic": { 508 | "version": "1.1.2", 509 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 510 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 511 | "dependencies": { 512 | "function-bind": "^1.1.1", 513 | "has": "^1.0.3", 514 | "has-symbols": "^1.0.3" 515 | }, 516 | "funding": { 517 | "url": "https://github.com/sponsors/ljharb" 518 | } 519 | }, 520 | "node_modules/glob-parent": { 521 | "version": "5.1.2", 522 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 523 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 524 | "dev": true, 525 | "dependencies": { 526 | "is-glob": "^4.0.1" 527 | }, 528 | "engines": { 529 | "node": ">= 6" 530 | } 531 | }, 532 | "node_modules/has": { 533 | "version": "1.0.3", 534 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 535 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 536 | "dependencies": { 537 | "function-bind": "^1.1.1" 538 | }, 539 | "engines": { 540 | "node": ">= 0.4.0" 541 | } 542 | }, 543 | "node_modules/has-flag": { 544 | "version": "3.0.0", 545 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 546 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 547 | "dev": true, 548 | "engines": { 549 | "node": ">=4" 550 | } 551 | }, 552 | "node_modules/has-symbols": { 553 | "version": "1.0.3", 554 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 555 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 556 | "engines": { 557 | "node": ">= 0.4" 558 | }, 559 | "funding": { 560 | "url": "https://github.com/sponsors/ljharb" 561 | } 562 | }, 563 | "node_modules/http-errors": { 564 | "version": "2.0.0", 565 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 566 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 567 | "dependencies": { 568 | "depd": "2.0.0", 569 | "inherits": "2.0.4", 570 | "setprototypeof": "1.2.0", 571 | "statuses": "2.0.1", 572 | "toidentifier": "1.0.1" 573 | }, 574 | "engines": { 575 | "node": ">= 0.8" 576 | } 577 | }, 578 | "node_modules/https-proxy-agent": { 579 | "version": "5.0.0", 580 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 581 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 582 | "dependencies": { 583 | "agent-base": "6", 584 | "debug": "4" 585 | }, 586 | "engines": { 587 | "node": ">= 6" 588 | } 589 | }, 590 | "node_modules/https-proxy-agent/node_modules/debug": { 591 | "version": "4.3.4", 592 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 593 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 594 | "dependencies": { 595 | "ms": "2.1.2" 596 | }, 597 | "engines": { 598 | "node": ">=6.0" 599 | }, 600 | "peerDependenciesMeta": { 601 | "supports-color": { 602 | "optional": true 603 | } 604 | } 605 | }, 606 | "node_modules/https-proxy-agent/node_modules/ms": { 607 | "version": "2.1.2", 608 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 609 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 610 | }, 611 | "node_modules/iconv-lite": { 612 | "version": "0.4.24", 613 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 614 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 615 | "dependencies": { 616 | "safer-buffer": ">= 2.1.2 < 3" 617 | }, 618 | "engines": { 619 | "node": ">=0.10.0" 620 | } 621 | }, 622 | "node_modules/ignore-by-default": { 623 | "version": "1.0.1", 624 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 625 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", 626 | "dev": true 627 | }, 628 | "node_modules/inherits": { 629 | "version": "2.0.4", 630 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 631 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 632 | }, 633 | "node_modules/ipaddr.js": { 634 | "version": "1.9.1", 635 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 636 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 637 | "engines": { 638 | "node": ">= 0.10" 639 | } 640 | }, 641 | "node_modules/is-binary-path": { 642 | "version": "2.1.0", 643 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 644 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 645 | "dev": true, 646 | "dependencies": { 647 | "binary-extensions": "^2.0.0" 648 | }, 649 | "engines": { 650 | "node": ">=8" 651 | } 652 | }, 653 | "node_modules/is-extglob": { 654 | "version": "2.1.1", 655 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 656 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 657 | "dev": true, 658 | "engines": { 659 | "node": ">=0.10.0" 660 | } 661 | }, 662 | "node_modules/is-glob": { 663 | "version": "4.0.3", 664 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 665 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 666 | "dev": true, 667 | "dependencies": { 668 | "is-extglob": "^2.1.1" 669 | }, 670 | "engines": { 671 | "node": ">=0.10.0" 672 | } 673 | }, 674 | "node_modules/is-number": { 675 | "version": "7.0.0", 676 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 677 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 678 | "dev": true, 679 | "engines": { 680 | "node": ">=0.12.0" 681 | } 682 | }, 683 | "node_modules/media-typer": { 684 | "version": "0.3.0", 685 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 686 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 687 | "engines": { 688 | "node": ">= 0.6" 689 | } 690 | }, 691 | "node_modules/merge-descriptors": { 692 | "version": "1.0.1", 693 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 694 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 695 | }, 696 | "node_modules/methods": { 697 | "version": "1.1.2", 698 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 699 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 700 | "engines": { 701 | "node": ">= 0.6" 702 | } 703 | }, 704 | "node_modules/mime": { 705 | "version": "1.6.0", 706 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 707 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 708 | "bin": { 709 | "mime": "cli.js" 710 | }, 711 | "engines": { 712 | "node": ">=4" 713 | } 714 | }, 715 | "node_modules/mime-db": { 716 | "version": "1.52.0", 717 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 718 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 719 | "engines": { 720 | "node": ">= 0.6" 721 | } 722 | }, 723 | "node_modules/mime-types": { 724 | "version": "2.1.35", 725 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 726 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 727 | "dependencies": { 728 | "mime-db": "1.52.0" 729 | }, 730 | "engines": { 731 | "node": ">= 0.6" 732 | } 733 | }, 734 | "node_modules/minimatch": { 735 | "version": "3.1.2", 736 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 737 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 738 | "dev": true, 739 | "dependencies": { 740 | "brace-expansion": "^1.1.7" 741 | }, 742 | "engines": { 743 | "node": "*" 744 | } 745 | }, 746 | "node_modules/mixpanel": { 747 | "version": "0.17.0", 748 | "resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.17.0.tgz", 749 | "integrity": "sha512-DY5WeOy/hmkPrNiiZugJpWR0iMuOwuj1a3u0bgwB2eUFRV6oIew/pIahhpawdbNjb+Bye4a8ID3gefeNPvL81g==", 750 | "dependencies": { 751 | "https-proxy-agent": "5.0.0" 752 | }, 753 | "engines": { 754 | "node": ">=10.0" 755 | } 756 | }, 757 | "node_modules/ms": { 758 | "version": "2.1.3", 759 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 760 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 761 | }, 762 | "node_modules/negotiator": { 763 | "version": "0.6.3", 764 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 765 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 766 | "engines": { 767 | "node": ">= 0.6" 768 | } 769 | }, 770 | "node_modules/nodemon": { 771 | "version": "2.0.19", 772 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", 773 | "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", 774 | "dev": true, 775 | "hasInstallScript": true, 776 | "dependencies": { 777 | "chokidar": "^3.5.2", 778 | "debug": "^3.2.7", 779 | "ignore-by-default": "^1.0.1", 780 | "minimatch": "^3.0.4", 781 | "pstree.remy": "^1.1.8", 782 | "semver": "^5.7.1", 783 | "simple-update-notifier": "^1.0.7", 784 | "supports-color": "^5.5.0", 785 | "touch": "^3.1.0", 786 | "undefsafe": "^2.0.5" 787 | }, 788 | "bin": { 789 | "nodemon": "bin/nodemon.js" 790 | }, 791 | "engines": { 792 | "node": ">=8.10.0" 793 | }, 794 | "funding": { 795 | "type": "opencollective", 796 | "url": "https://opencollective.com/nodemon" 797 | } 798 | }, 799 | "node_modules/nopt": { 800 | "version": "1.0.10", 801 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 802 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", 803 | "dev": true, 804 | "dependencies": { 805 | "abbrev": "1" 806 | }, 807 | "bin": { 808 | "nopt": "bin/nopt.js" 809 | }, 810 | "engines": { 811 | "node": "*" 812 | } 813 | }, 814 | "node_modules/normalize-path": { 815 | "version": "3.0.0", 816 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 817 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 818 | "dev": true, 819 | "engines": { 820 | "node": ">=0.10.0" 821 | } 822 | }, 823 | "node_modules/object-assign": { 824 | "version": "4.1.1", 825 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 826 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 827 | "engines": { 828 | "node": ">=0.10.0" 829 | } 830 | }, 831 | "node_modules/object-inspect": { 832 | "version": "1.12.2", 833 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 834 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 835 | "funding": { 836 | "url": "https://github.com/sponsors/ljharb" 837 | } 838 | }, 839 | "node_modules/on-finished": { 840 | "version": "2.4.1", 841 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 842 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 843 | "dependencies": { 844 | "ee-first": "1.1.1" 845 | }, 846 | "engines": { 847 | "node": ">= 0.8" 848 | } 849 | }, 850 | "node_modules/parseurl": { 851 | "version": "1.3.3", 852 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 853 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 854 | "engines": { 855 | "node": ">= 0.8" 856 | } 857 | }, 858 | "node_modules/path-to-regexp": { 859 | "version": "0.1.7", 860 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 861 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 862 | }, 863 | "node_modules/picomatch": { 864 | "version": "2.3.1", 865 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 866 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 867 | "dev": true, 868 | "engines": { 869 | "node": ">=8.6" 870 | }, 871 | "funding": { 872 | "url": "https://github.com/sponsors/jonschlinkert" 873 | } 874 | }, 875 | "node_modules/proxy-addr": { 876 | "version": "2.0.7", 877 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 878 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 879 | "dependencies": { 880 | "forwarded": "0.2.0", 881 | "ipaddr.js": "1.9.1" 882 | }, 883 | "engines": { 884 | "node": ">= 0.10" 885 | } 886 | }, 887 | "node_modules/pstree.remy": { 888 | "version": "1.1.8", 889 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 890 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", 891 | "dev": true 892 | }, 893 | "node_modules/qs": { 894 | "version": "6.10.3", 895 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 896 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 897 | "dependencies": { 898 | "side-channel": "^1.0.4" 899 | }, 900 | "engines": { 901 | "node": ">=0.6" 902 | }, 903 | "funding": { 904 | "url": "https://github.com/sponsors/ljharb" 905 | } 906 | }, 907 | "node_modules/range-parser": { 908 | "version": "1.2.1", 909 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 910 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 911 | "engines": { 912 | "node": ">= 0.6" 913 | } 914 | }, 915 | "node_modules/raw-body": { 916 | "version": "2.5.1", 917 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 918 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 919 | "dependencies": { 920 | "bytes": "3.1.2", 921 | "http-errors": "2.0.0", 922 | "iconv-lite": "0.4.24", 923 | "unpipe": "1.0.0" 924 | }, 925 | "engines": { 926 | "node": ">= 0.8" 927 | } 928 | }, 929 | "node_modules/readdirp": { 930 | "version": "3.6.0", 931 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 932 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 933 | "dev": true, 934 | "dependencies": { 935 | "picomatch": "^2.2.1" 936 | }, 937 | "engines": { 938 | "node": ">=8.10.0" 939 | } 940 | }, 941 | "node_modules/safe-buffer": { 942 | "version": "5.2.1", 943 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 944 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 945 | "funding": [ 946 | { 947 | "type": "github", 948 | "url": "https://github.com/sponsors/feross" 949 | }, 950 | { 951 | "type": "patreon", 952 | "url": "https://www.patreon.com/feross" 953 | }, 954 | { 955 | "type": "consulting", 956 | "url": "https://feross.org/support" 957 | } 958 | ] 959 | }, 960 | "node_modules/safer-buffer": { 961 | "version": "2.1.2", 962 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 963 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 964 | }, 965 | "node_modules/semver": { 966 | "version": "5.7.1", 967 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 968 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 969 | "dev": true, 970 | "bin": { 971 | "semver": "bin/semver" 972 | } 973 | }, 974 | "node_modules/send": { 975 | "version": "0.18.0", 976 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 977 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 978 | "dependencies": { 979 | "debug": "2.6.9", 980 | "depd": "2.0.0", 981 | "destroy": "1.2.0", 982 | "encodeurl": "~1.0.2", 983 | "escape-html": "~1.0.3", 984 | "etag": "~1.8.1", 985 | "fresh": "0.5.2", 986 | "http-errors": "2.0.0", 987 | "mime": "1.6.0", 988 | "ms": "2.1.3", 989 | "on-finished": "2.4.1", 990 | "range-parser": "~1.2.1", 991 | "statuses": "2.0.1" 992 | }, 993 | "engines": { 994 | "node": ">= 0.8.0" 995 | } 996 | }, 997 | "node_modules/send/node_modules/debug": { 998 | "version": "2.6.9", 999 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1000 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1001 | "dependencies": { 1002 | "ms": "2.0.0" 1003 | } 1004 | }, 1005 | "node_modules/send/node_modules/debug/node_modules/ms": { 1006 | "version": "2.0.0", 1007 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1008 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1009 | }, 1010 | "node_modules/serve-static": { 1011 | "version": "1.15.0", 1012 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1013 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1014 | "dependencies": { 1015 | "encodeurl": "~1.0.2", 1016 | "escape-html": "~1.0.3", 1017 | "parseurl": "~1.3.3", 1018 | "send": "0.18.0" 1019 | }, 1020 | "engines": { 1021 | "node": ">= 0.8.0" 1022 | } 1023 | }, 1024 | "node_modules/setprototypeof": { 1025 | "version": "1.2.0", 1026 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1027 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1028 | }, 1029 | "node_modules/side-channel": { 1030 | "version": "1.0.4", 1031 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1032 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1033 | "dependencies": { 1034 | "call-bind": "^1.0.0", 1035 | "get-intrinsic": "^1.0.2", 1036 | "object-inspect": "^1.9.0" 1037 | }, 1038 | "funding": { 1039 | "url": "https://github.com/sponsors/ljharb" 1040 | } 1041 | }, 1042 | "node_modules/simple-update-notifier": { 1043 | "version": "1.0.7", 1044 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", 1045 | "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", 1046 | "dev": true, 1047 | "dependencies": { 1048 | "semver": "~7.0.0" 1049 | }, 1050 | "engines": { 1051 | "node": ">=8.10.0" 1052 | } 1053 | }, 1054 | "node_modules/simple-update-notifier/node_modules/semver": { 1055 | "version": "7.0.0", 1056 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1057 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1058 | "dev": true, 1059 | "bin": { 1060 | "semver": "bin/semver.js" 1061 | } 1062 | }, 1063 | "node_modules/statuses": { 1064 | "version": "2.0.1", 1065 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1066 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1067 | "engines": { 1068 | "node": ">= 0.8" 1069 | } 1070 | }, 1071 | "node_modules/supports-color": { 1072 | "version": "5.5.0", 1073 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1074 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1075 | "dev": true, 1076 | "dependencies": { 1077 | "has-flag": "^3.0.0" 1078 | }, 1079 | "engines": { 1080 | "node": ">=4" 1081 | } 1082 | }, 1083 | "node_modules/to-regex-range": { 1084 | "version": "5.0.1", 1085 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1086 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1087 | "dev": true, 1088 | "dependencies": { 1089 | "is-number": "^7.0.0" 1090 | }, 1091 | "engines": { 1092 | "node": ">=8.0" 1093 | } 1094 | }, 1095 | "node_modules/toidentifier": { 1096 | "version": "1.0.1", 1097 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1098 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1099 | "engines": { 1100 | "node": ">=0.6" 1101 | } 1102 | }, 1103 | "node_modules/touch": { 1104 | "version": "3.1.0", 1105 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", 1106 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", 1107 | "dev": true, 1108 | "dependencies": { 1109 | "nopt": "~1.0.10" 1110 | }, 1111 | "bin": { 1112 | "nodetouch": "bin/nodetouch.js" 1113 | } 1114 | }, 1115 | "node_modules/type-is": { 1116 | "version": "1.6.18", 1117 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1118 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1119 | "dependencies": { 1120 | "media-typer": "0.3.0", 1121 | "mime-types": "~2.1.24" 1122 | }, 1123 | "engines": { 1124 | "node": ">= 0.6" 1125 | } 1126 | }, 1127 | "node_modules/undefsafe": { 1128 | "version": "2.0.5", 1129 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 1130 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", 1131 | "dev": true 1132 | }, 1133 | "node_modules/unpipe": { 1134 | "version": "1.0.0", 1135 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1136 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1137 | "engines": { 1138 | "node": ">= 0.8" 1139 | } 1140 | }, 1141 | "node_modules/utils-merge": { 1142 | "version": "1.0.1", 1143 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1144 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1145 | "engines": { 1146 | "node": ">= 0.4.0" 1147 | } 1148 | }, 1149 | "node_modules/vary": { 1150 | "version": "1.1.2", 1151 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1152 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1153 | "engines": { 1154 | "node": ">= 0.8" 1155 | } 1156 | } 1157 | } 1158 | } 1159 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "stremio-netflix-catalog-addon", 3 | "version": "1.0.9", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1", 9 | "start": "node index.js", 10 | "dev": "nodemon index.js" 11 | }, 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "nodemon": "^2.0.19" 16 | }, 17 | "dependencies": { 18 | "axios": "^0.27.2", 19 | "cors": "^2.8.5", 20 | "express": "^4.18.1", 21 | "mixpanel": "^0.17.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /vue/.env: -------------------------------------------------------------------------------- 1 | VITE_APP_URL='https://7a82163c306e-stremio-netflix-catalog-addon.baby-beamup.club' 2 | -------------------------------------------------------------------------------- /vue/.env.development: -------------------------------------------------------------------------------- 1 | VITE_APP_URL='http://127.0.0.1:7700' 2 | -------------------------------------------------------------------------------- /vue/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | *.local 12 | 13 | # Editor directories and files 14 | .vscode/* 15 | !.vscode/extensions.json 16 | .idea 17 | .DS_Store 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw? 23 | -------------------------------------------------------------------------------- /vue/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /vue/README.md: -------------------------------------------------------------------------------- 1 | # Vue 3 + Vite 2 | 3 | This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` 10 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /vue/dist/magellan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/magellan.webp -------------------------------------------------------------------------------- /vue/dist/max.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/max.webp -------------------------------------------------------------------------------- /vue/dist/netflix.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/netflix.webp -------------------------------------------------------------------------------- /vue/dist/netflixkids.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/netflixkids.webp -------------------------------------------------------------------------------- /vue/dist/nlziet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/nlziet.webp -------------------------------------------------------------------------------- /vue/dist/paramount.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/paramount.webp -------------------------------------------------------------------------------- /vue/dist/peacock.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/peacock.webp -------------------------------------------------------------------------------- /vue/dist/prime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/prime.webp -------------------------------------------------------------------------------- /vue/dist/skyshowtime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/skyshowtime.webp -------------------------------------------------------------------------------- /vue/dist/streaming-catalogs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/streaming-catalogs.png -------------------------------------------------------------------------------- /vue/dist/stremio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/stremio.png -------------------------------------------------------------------------------- /vue/dist/videoland.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/videoland.webp -------------------------------------------------------------------------------- /vue/dist/youtube.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/youtube.webp -------------------------------------------------------------------------------- /vue/dist/zee5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/dist/zee5.webp -------------------------------------------------------------------------------- /vue/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Streaming Catalogs 8 | 9 | 10 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-project", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "axios": "^0.27.2", 13 | "vue": "^3.2.37", 14 | "vue3-popper": "^1.5.0" 15 | }, 16 | "devDependencies": { 17 | "@vitejs/plugin-vue": "^3.1.0", 18 | "autoprefixer": "^10.4.8", 19 | "postcss": "^8.4.16", 20 | "tailwindcss": "^3.1.8", 21 | "vite": "^3.1.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /vue/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /vue/public/apple.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/apple.webp -------------------------------------------------------------------------------- /vue/public/blu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/blu.webp -------------------------------------------------------------------------------- /vue/public/canal-plus.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/canal-plus.webp -------------------------------------------------------------------------------- /vue/public/claro.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/claro.webp -------------------------------------------------------------------------------- /vue/public/crunchyroll.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/crunchyroll.webp -------------------------------------------------------------------------------- /vue/public/curiositystream.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/curiositystream.webp -------------------------------------------------------------------------------- /vue/public/discovery-plus.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/discovery-plus.webp -------------------------------------------------------------------------------- /vue/public/disney.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/disney.webp -------------------------------------------------------------------------------- /vue/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/favicon.ico -------------------------------------------------------------------------------- /vue/public/funimation.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/funimation.webp -------------------------------------------------------------------------------- /vue/public/globo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/globo.webp -------------------------------------------------------------------------------- /vue/public/hayu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/hayu.webp -------------------------------------------------------------------------------- /vue/public/hbo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/hbo.webp -------------------------------------------------------------------------------- /vue/public/hotstar.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/hotstar.webp -------------------------------------------------------------------------------- /vue/public/hulu.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/hulu.webp -------------------------------------------------------------------------------- /vue/public/magellan.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/magellan.webp -------------------------------------------------------------------------------- /vue/public/max.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/max.webp -------------------------------------------------------------------------------- /vue/public/netflix.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/netflix.webp -------------------------------------------------------------------------------- /vue/public/netflixkids.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/netflixkids.webp -------------------------------------------------------------------------------- /vue/public/nlziet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/nlziet.webp -------------------------------------------------------------------------------- /vue/public/paramount.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/paramount.webp -------------------------------------------------------------------------------- /vue/public/peacock.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/peacock.webp -------------------------------------------------------------------------------- /vue/public/prime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/prime.webp -------------------------------------------------------------------------------- /vue/public/skyshowtime.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/skyshowtime.webp -------------------------------------------------------------------------------- /vue/public/streaming-catalogs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/streaming-catalogs.png -------------------------------------------------------------------------------- /vue/public/stremio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/stremio.png -------------------------------------------------------------------------------- /vue/public/videoland.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/videoland.webp -------------------------------------------------------------------------------- /vue/public/youtube.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/youtube.webp -------------------------------------------------------------------------------- /vue/public/zee5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rleroi/Stremio-Streaming-Catalogs-Addon/c6bf306798fda7ec0c58210103533c25c2927cca/vue/public/zee5.webp -------------------------------------------------------------------------------- /vue/src/App.vue: -------------------------------------------------------------------------------- 1 | 169 | 170 | 385 | 386 | 390 | -------------------------------------------------------------------------------- /vue/src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue/src/components/VButton.vue: -------------------------------------------------------------------------------- 1 | 11 | 18 | -------------------------------------------------------------------------------- /vue/src/components/VInput.vue: -------------------------------------------------------------------------------- 1 | 4 | 16 | -------------------------------------------------------------------------------- /vue/src/main.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import { createApp } from 'vue' 3 | import Popper from 'vue3-popper' 4 | 5 | import './style.css' 6 | import App from './App.vue' 7 | 8 | axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 9 | 10 | createApp(App) 11 | .component("Popper", Popper) 12 | .mount('#app'); 13 | -------------------------------------------------------------------------------- /vue/src/regions-to-countries.json: -------------------------------------------------------------------------------- 1 | { 2 | "Europe/Andorra": "Andorra", 3 | "Asia/Dubai": "United Arab Emirates", 4 | "Asia/Kabul": "Afghanistan", 5 | "Europe/Tirane": "Albania", 6 | "Asia/Yerevan": "Armenia", 7 | "Antarctica/Casey": "Antarctica", 8 | "Antarctica/Davis": "Antarctica", 9 | "Antarctica/Mawson": "Antarctica", 10 | "Antarctica/Palmer": "Antarctica", 11 | "Antarctica/Rothera": "Antarctica", 12 | "Antarctica/Troll": "Antarctica", 13 | "Antarctica/Vostok": "Antarctica", 14 | "America/Argentina/Buenos_Aires": "Argentina", 15 | "America/Argentina/Cordoba": "Argentina", 16 | "America/Argentina/Salta": "Argentina", 17 | "America/Argentina/Jujuy": "Argentina", 18 | "America/Argentina/Tucuman": "Argentina", 19 | "America/Argentina/Catamarca": "Argentina", 20 | "America/Argentina/La_Rioja": "Argentina", 21 | "America/Argentina/San_Juan": "Argentina", 22 | "America/Argentina/Mendoza": "Argentina", 23 | "America/Argentina/San_Luis": "Argentina", 24 | "America/Argentina/Rio_Gallegos": "Argentina", 25 | "America/Argentina/Ushuaia": "Argentina", 26 | "Pacific/Pago_Pago": "Samoa (American)", 27 | "Europe/Vienna": "Austria", 28 | "Australia/Lord_Howe": "Australia", 29 | "Antarctica/Macquarie": "Australia", 30 | "Australia/Hobart": "Australia", 31 | "Australia/Melbourne": "Australia", 32 | "Australia/Sydney": "Australia", 33 | "Australia/Broken_Hill": "Australia", 34 | "Australia/Brisbane": "Australia", 35 | "Australia/Lindeman": "Australia", 36 | "Australia/Adelaide": "Australia", 37 | "Australia/Darwin": "Australia", 38 | "Australia/Perth": "Australia", 39 | "Australia/Eucla": "Australia", 40 | "Asia/Baku": "Azerbaijan", 41 | "America/Barbados": "Barbados", 42 | "Asia/Dhaka": "Bangladesh", 43 | "Europe/Brussels": "Belgium", 44 | "Europe/Sofia": "Bulgaria", 45 | "Atlantic/Bermuda": "Bermuda", 46 | "Asia/Brunei": "Brunei", 47 | "America/La_Paz": "Bolivia", 48 | "America/Noronha": "Brazil", 49 | "America/Belem": "Brazil", 50 | "America/Fortaleza": "Brazil", 51 | "America/Recife": "Brazil", 52 | "America/Araguaina": "Brazil", 53 | "America/Maceio": "Brazil", 54 | "America/Bahia": "Brazil", 55 | "America/Sao_Paulo": "Brazil", 56 | "America/Campo_Grande": "Brazil", 57 | "America/Cuiaba": "Brazil", 58 | "America/Santarem": "Brazil", 59 | "America/Porto_Velho": "Brazil", 60 | "America/Boa_Vista": "Brazil", 61 | "America/Manaus": "Brazil", 62 | "America/Eirunepe": "Brazil", 63 | "America/Rio_Branco": "Brazil", 64 | "Asia/Thimphu": "Bhutan", 65 | "Europe/Minsk": "Belarus", 66 | "America/Belize": "Belize", 67 | "America/St_Johns": "Canada", 68 | "America/Halifax": "Canada", 69 | "America/Glace_Bay": "Canada", 70 | "America/Moncton": "Canada", 71 | "America/Goose_Bay": "Canada", 72 | "America/Toronto": "Canada", 73 | "America/Nipigon": "Canada", 74 | "America/Thunder_Bay": "Canada", 75 | "America/Iqaluit": "Canada", 76 | "America/Pangnirtung": "Canada", 77 | "America/Winnipeg": "Canada", 78 | "America/Rainy_River": "Canada", 79 | "America/Resolute": "Canada", 80 | "America/Rankin_Inlet": "Canada", 81 | "America/Regina": "Canada", 82 | "America/Swift_Current": "Canada", 83 | "America/Edmonton": "Canada", 84 | "America/Cambridge_Bay": "Canada", 85 | "America/Yellowknife": "Canada", 86 | "America/Inuvik": "Canada", 87 | "America/Dawson_Creek": "Canada", 88 | "America/Fort_Nelson": "Canada", 89 | "America/Whitehorse": "Canada", 90 | "America/Dawson": "Canada", 91 | "America/Vancouver": "Canada", 92 | "Indian/Cocos": "Cocos (Keeling) Islands", 93 | "Europe/Zurich": "Switzerland", 94 | "Africa/Abidjan": "Côte d'Ivoire", 95 | "Pacific/Rarotonga": "Cook Islands", 96 | "America/Santiago": "Chile", 97 | "America/Punta_Arenas": "Chile", 98 | "Pacific/Easter": "Chile", 99 | "Asia/Shanghai": "China", 100 | "Asia/Urumqi": "China", 101 | "America/Bogota": "Colombia", 102 | "America/Costa_Rica": "Costa Rica", 103 | "America/Havana": "Cuba", 104 | "Atlantic/Cape_Verde": "Cape Verde", 105 | "Indian/Christmas": "Christmas Island", 106 | "Asia/Nicosia": "Cyprus", 107 | "Asia/Famagusta": "Cyprus", 108 | "Europe/Prague": "Czech Republic", 109 | "Europe/Berlin": "Germany", 110 | "Europe/Copenhagen": "Denmark", 111 | "America/Santo_Domingo": "Dominican Republic", 112 | "Africa/Algiers": "Algeria", 113 | "America/Guayaquil": "Ecuador", 114 | "Pacific/Galapagos": "Ecuador", 115 | "Europe/Tallinn": "Estonia", 116 | "Africa/Cairo": "Egypt", 117 | "Africa/El_Aaiun": "Western Sahara", 118 | "Europe/Madrid": "Spain", 119 | "Africa/Ceuta": "Spain", 120 | "Atlantic/Canary": "Spain", 121 | "Europe/Helsinki": "Finland", 122 | "Pacific/Fiji": "Fiji", 123 | "Atlantic/Stanley": "Falkland Islands", 124 | "Pacific/Chuuk": "Micronesia", 125 | "Pacific/Pohnpei": "Micronesia", 126 | "Pacific/Kosrae": "Micronesia", 127 | "Atlantic/Faroe": "Faroe Islands", 128 | "Europe/Paris": "France", 129 | "Europe/London": "Britain (UK)", 130 | "Asia/Tbilisi": "Georgia", 131 | "America/Cayenne": "French Guiana", 132 | "Europe/Gibraltar": "Gibraltar", 133 | "America/Nuuk": "Greenland", 134 | "America/Danmarkshavn": "Greenland", 135 | "America/Scoresbysund": "Greenland", 136 | "America/Thule": "Greenland", 137 | "Europe/Athens": "Greece", 138 | "Atlantic/South_Georgia": "South Georgia & the South Sandwich Islands", 139 | "America/Guatemala": "Guatemala", 140 | "Pacific/Guam": "Guam", 141 | "Africa/Bissau": "Guinea-Bissau", 142 | "America/Guyana": "Guyana", 143 | "Asia/Hong_Kong": "Hong Kong", 144 | "America/Tegucigalpa": "Honduras", 145 | "America/Port-au-Prince": "Haiti", 146 | "Europe/Budapest": "Hungary", 147 | "Asia/Jakarta": "Indonesia", 148 | "Asia/Pontianak": "Indonesia", 149 | "Asia/Makassar": "Indonesia", 150 | "Asia/Jayapura": "Indonesia", 151 | "Europe/Dublin": "Ireland", 152 | "Asia/Jerusalem": "Israel", 153 | "Asia/Kolkata": "India", 154 | "Indian/Chagos": "British Indian Ocean Territory", 155 | "Asia/Baghdad": "Iraq", 156 | "Asia/Tehran": "Iran", 157 | "Atlantic/Reykjavik": "Iceland", 158 | "Europe/Rome": "Italy", 159 | "America/Jamaica": "Jamaica", 160 | "Asia/Amman": "Jordan", 161 | "Asia/Tokyo": "Japan", 162 | "Africa/Nairobi": "Kenya", 163 | "Asia/Bishkek": "Kyrgyzstan", 164 | "Pacific/Tarawa": "Kiribati", 165 | "Pacific/Kanton": "Kiribati", 166 | "Pacific/Kiritimati": "Kiribati", 167 | "Asia/Pyongyang": "Korea (North)", 168 | "Asia/Seoul": "Korea (South)", 169 | "Asia/Almaty": "Kazakhstan", 170 | "Asia/Qyzylorda": "Kazakhstan", 171 | "Asia/Qostanay": "Kazakhstan", 172 | "Asia/Aqtobe": "Kazakhstan", 173 | "Asia/Aqtau": "Kazakhstan", 174 | "Asia/Atyrau": "Kazakhstan", 175 | "Asia/Oral": "Kazakhstan", 176 | "Asia/Beirut": "Lebanon", 177 | "Asia/Colombo": "Sri Lanka", 178 | "Africa/Monrovia": "Liberia", 179 | "Europe/Vilnius": "Lithuania", 180 | "Europe/Luxembourg": "Luxembourg", 181 | "Europe/Riga": "Latvia", 182 | "Africa/Tripoli": "Libya", 183 | "Africa/Casablanca": "Morocco", 184 | "Europe/Monaco": "Monaco", 185 | "Europe/Chisinau": "Moldova", 186 | "Pacific/Majuro": "Marshall Islands", 187 | "Pacific/Kwajalein": "Marshall Islands", 188 | "Asia/Yangon": "Myanmar (Burma)", 189 | "Asia/Ulaanbaatar": "Mongolia", 190 | "Asia/Hovd": "Mongolia", 191 | "Asia/Choibalsan": "Mongolia", 192 | "Asia/Macau": "Macau", 193 | "America/Martinique": "Martinique", 194 | "Europe/Malta": "Malta", 195 | "Indian/Mauritius": "Mauritius", 196 | "Indian/Maldives": "Maldives", 197 | "America/Mexico_City": "Mexico", 198 | "America/Cancun": "Mexico", 199 | "America/Merida": "Mexico", 200 | "America/Monterrey": "Mexico", 201 | "America/Matamoros": "Mexico", 202 | "America/Mazatlan": "Mexico", 203 | "America/Chihuahua": "Mexico", 204 | "America/Ojinaga": "Mexico", 205 | "America/Hermosillo": "Mexico", 206 | "America/Tijuana": "Mexico", 207 | "America/Bahia_Banderas": "Mexico", 208 | "Asia/Kuala_Lumpur": "Malaysia", 209 | "Asia/Kuching": "Malaysia", 210 | "Africa/Maputo": "Mozambique", 211 | "Africa/Windhoek": "Namibia", 212 | "Pacific/Noumea": "New Caledonia", 213 | "Pacific/Norfolk": "Norfolk Island", 214 | "Africa/Lagos": "Nigeria", 215 | "America/Managua": "Nicaragua", 216 | "Europe/Amsterdam": "Netherlands", 217 | "Europe/Oslo": "Norway", 218 | "Asia/Kathmandu": "Nepal", 219 | "Pacific/Nauru": "Nauru", 220 | "Pacific/Niue": "Niue", 221 | "Pacific/Auckland": "New Zealand", 222 | "Pacific/Chatham": "New Zealand", 223 | "America/Panama": "Panama", 224 | "America/Lima": "Peru", 225 | "Pacific/Tahiti": "French Polynesia", 226 | "Pacific/Marquesas": "French Polynesia", 227 | "Pacific/Gambier": "French Polynesia", 228 | "Pacific/Port_Moresby": "Papua New Guinea", 229 | "Pacific/Bougainville": "Papua New Guinea", 230 | "Asia/Manila": "Philippines", 231 | "Asia/Karachi": "Pakistan", 232 | "Europe/Warsaw": "Poland", 233 | "America/Miquelon": "St Pierre & Miquelon", 234 | "Pacific/Pitcairn": "Pitcairn", 235 | "America/Puerto_Rico": "Puerto Rico", 236 | "Asia/Gaza": "Palestine", 237 | "Asia/Hebron": "Palestine", 238 | "Europe/Lisbon": "Portugal", 239 | "Atlantic/Madeira": "Portugal", 240 | "Atlantic/Azores": "Portugal", 241 | "Pacific/Palau": "Palau", 242 | "America/Asuncion": "Paraguay", 243 | "Asia/Qatar": "Qatar", 244 | "Indian/Reunion": "Réunion", 245 | "Europe/Bucharest": "Romania", 246 | "Europe/Belgrade": "Serbia", 247 | "Europe/Kaliningrad": "Russia", 248 | "Europe/Moscow": "Russia", 249 | "Europe/Simferopol": "Russia", 250 | "Europe/Kirov": "Russia", 251 | "Europe/Volgograd": "Russia", 252 | "Europe/Astrakhan": "Russia", 253 | "Europe/Saratov": "Russia", 254 | "Europe/Ulyanovsk": "Russia", 255 | "Europe/Samara": "Russia", 256 | "Asia/Yekaterinburg": "Russia", 257 | "Asia/Omsk": "Russia", 258 | "Asia/Novosibirsk": "Russia", 259 | "Asia/Barnaul": "Russia", 260 | "Asia/Tomsk": "Russia", 261 | "Asia/Novokuznetsk": "Russia", 262 | "Asia/Krasnoyarsk": "Russia", 263 | "Asia/Irkutsk": "Russia", 264 | "Asia/Chita": "Russia", 265 | "Asia/Yakutsk": "Russia", 266 | "Asia/Khandyga": "Russia", 267 | "Asia/Vladivostok": "Russia", 268 | "Asia/Ust-Nera": "Russia", 269 | "Asia/Magadan": "Russia", 270 | "Asia/Sakhalin": "Russia", 271 | "Asia/Srednekolymsk": "Russia", 272 | "Asia/Kamchatka": "Russia", 273 | "Asia/Anadyr": "Russia", 274 | "Asia/Riyadh": "Saudi Arabia", 275 | "Pacific/Guadalcanal": "Solomon Islands", 276 | "Indian/Mahe": "Seychelles", 277 | "Africa/Khartoum": "Sudan", 278 | "Europe/Stockholm": "Sweden", 279 | "Asia/Singapore": "Singapore", 280 | "America/Paramaribo": "Suriname", 281 | "Africa/Juba": "South Sudan", 282 | "Africa/Sao_Tome": "Sao Tome & Principe", 283 | "America/El_Salvador": "El Salvador", 284 | "Asia/Damascus": "Syria", 285 | "America/Grand_Turk": "Turks & Caicos Is", 286 | "Africa/Ndjamena": "Chad", 287 | "Indian/Kerguelen": "French Southern & Antarctic Lands", 288 | "Asia/Bangkok": "Thailand", 289 | "Asia/Dushanbe": "Tajikistan", 290 | "Pacific/Fakaofo": "Tokelau", 291 | "Asia/Dili": "East Timor", 292 | "Asia/Ashgabat": "Turkmenistan", 293 | "Africa/Tunis": "Tunisia", 294 | "Pacific/Tongatapu": "Tonga", 295 | "Europe/Istanbul": "Turkey", 296 | "Pacific/Funafuti": "Tuvalu", 297 | "Asia/Taipei": "Taiwan", 298 | "Europe/Kiev": "Ukraine", 299 | "Europe/Uzhgorod": "Ukraine", 300 | "Europe/Zaporozhye": "Ukraine", 301 | "Pacific/Wake": "US minor outlying islands", 302 | "America/New_York": "United States", 303 | "America/Detroit": "United States", 304 | "America/Kentucky/Louisville": "United States", 305 | "America/Kentucky/Monticello": "United States", 306 | "America/Indiana/Indianapolis": "United States", 307 | "America/Indiana/Vincennes": "United States", 308 | "America/Indiana/Winamac": "United States", 309 | "America/Indiana/Marengo": "United States", 310 | "America/Indiana/Petersburg": "United States", 311 | "America/Indiana/Vevay": "United States", 312 | "America/Chicago": "United States", 313 | "America/Indiana/Tell_City": "United States", 314 | "America/Indiana/Knox": "United States", 315 | "America/Menominee": "United States", 316 | "America/North_Dakota/Center": "United States", 317 | "America/North_Dakota/New_Salem": "United States", 318 | "America/North_Dakota/Beulah": "United States", 319 | "America/Denver": "United States", 320 | "America/Boise": "United States", 321 | "America/Phoenix": "United States", 322 | "America/Los_Angeles": "United States", 323 | "America/Anchorage": "United States", 324 | "America/Juneau": "United States", 325 | "America/Sitka": "United States", 326 | "America/Metlakatla": "United States", 327 | "America/Yakutat": "United States", 328 | "America/Nome": "United States", 329 | "America/Adak": "United States", 330 | "Pacific/Honolulu": "United States", 331 | "America/Montevideo": "Uruguay", 332 | "Asia/Samarkand": "Uzbekistan", 333 | "Asia/Tashkent": "Uzbekistan", 334 | "America/Caracas": "Venezuela", 335 | "Asia/Ho_Chi_Minh": "Vietnam", 336 | "Pacific/Efate": "Vanuatu", 337 | "Pacific/Wallis": "Wallis & Futuna", 338 | "Pacific/Apia": "Samoa (western)", 339 | "Africa/Johannesburg": "South Africa", 340 | "America/Antigua": "Antigua & Barbuda", 341 | "America/Anguilla": "Anguilla", 342 | "Africa/Luanda": "Angola", 343 | "Antarctica/McMurdo": "Antarctica", 344 | "Antarctica/DumontDUrville": "Antarctica", 345 | "Antarctica/Syowa": "Antarctica", 346 | "America/Aruba": "Aruba", 347 | "Europe/Mariehamn": "Åland Islands", 348 | "Europe/Sarajevo": "Bosnia & Herzegovina", 349 | "Africa/Ouagadougou": "Burkina Faso", 350 | "Asia/Bahrain": "Bahrain", 351 | "Africa/Bujumbura": "Burundi", 352 | "Africa/Porto-Novo": "Benin", 353 | "America/St_Barthelemy": "St Barthelemy", 354 | "America/Kralendijk": "Caribbean NL", 355 | "America/Nassau": "Bahamas", 356 | "Africa/Gaborone": "Botswana", 357 | "America/Blanc-Sablon": "Canada", 358 | "America/Atikokan": "Canada", 359 | "America/Creston": "Canada", 360 | "Africa/Kinshasa": "Congo (Dem. Rep.)", 361 | "Africa/Lubumbashi": "Congo (Dem. Rep.)", 362 | "Africa/Bangui": "Central African Rep.", 363 | "Africa/Brazzaville": "Congo (Rep.)", 364 | "Africa/Douala": "Cameroon", 365 | "America/Curacao": "Curaçao", 366 | "Europe/Busingen": "Germany", 367 | "Africa/Djibouti": "Djibouti", 368 | "America/Dominica": "Dominica", 369 | "Africa/Asmara": "Eritrea", 370 | "Africa/Addis_Ababa": "Ethiopia", 371 | "Africa/Libreville": "Gabon", 372 | "America/Grenada": "Grenada", 373 | "Europe/Guernsey": "Guernsey", 374 | "Africa/Accra": "Ghana", 375 | "Africa/Banjul": "Gambia", 376 | "Africa/Conakry": "Guinea", 377 | "America/Guadeloupe": "Guadeloupe", 378 | "Africa/Malabo": "Equatorial Guinea", 379 | "Europe/Zagreb": "Croatia", 380 | "Europe/Isle_of_Man": "Isle of Man", 381 | "Europe/Jersey": "Jersey", 382 | "Asia/Phnom_Penh": "Cambodia", 383 | "Indian/Comoro": "Comoros", 384 | "America/St_Kitts": "St Kitts & Nevis", 385 | "Asia/Kuwait": "Kuwait", 386 | "America/Cayman": "Cayman Islands", 387 | "Asia/Vientiane": "Laos", 388 | "America/St_Lucia": "St Lucia", 389 | "Europe/Vaduz": "Liechtenstein", 390 | "Africa/Maseru": "Lesotho", 391 | "Europe/Podgorica": "Montenegro", 392 | "America/Marigot": "St Martin (French)", 393 | "Indian/Antananarivo": "Madagascar", 394 | "Europe/Skopje": "North Macedonia", 395 | "Africa/Bamako": "Mali", 396 | "Pacific/Saipan": "Northern Mariana Islands", 397 | "Africa/Nouakchott": "Mauritania", 398 | "America/Montserrat": "Montserrat", 399 | "Africa/Blantyre": "Malawi", 400 | "Africa/Niamey": "Niger", 401 | "Asia/Muscat": "Oman", 402 | "Africa/Kigali": "Rwanda", 403 | "Atlantic/St_Helena": "St Helena", 404 | "Europe/Ljubljana": "Slovenia", 405 | "Arctic/Longyearbyen": "Svalbard & Jan Mayen", 406 | "Europe/Bratislava": "Slovakia", 407 | "Africa/Freetown": "Sierra Leone", 408 | "Europe/San_Marino": "San Marino", 409 | "Africa/Dakar": "Senegal", 410 | "Africa/Mogadishu": "Somalia", 411 | "America/Lower_Princes": "St Maarten (Dutch)", 412 | "Africa/Mbabane": "Eswatini (Swaziland)", 413 | "Africa/Lome": "Togo", 414 | "America/Port_of_Spain": "Trinidad & Tobago", 415 | "Africa/Dar_es_Salaam": "Tanzania", 416 | "Africa/Kampala": "Uganda", 417 | "Pacific/Midway": "US minor outlying islands", 418 | "Europe/Vatican": "Vatican City", 419 | "America/St_Vincent": "St Vincent", 420 | "America/Tortola": "Virgin Islands (UK)", 421 | "America/St_Thomas": "Virgin Islands (US)", 422 | "Asia/Aden": "Yemen", 423 | "Indian/Mayotte": "Mayotte", 424 | "Africa/Lusaka": "Zambia", 425 | "Africa/Harare": "Zimbabwe" 426 | } -------------------------------------------------------------------------------- /vue/src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | html, body { 6 | @apply bg-purple-900; 7 | } 8 | 9 | :root { 10 | --popper-theme-background-color: rgb(17 24 39); 11 | --popper-theme-background-color-hover: rgb(17 24 39); 12 | --popper-theme-text-color: #ffffff; 13 | --popper-theme-border-width: 0px; 14 | --popper-theme-border-style: solid; 15 | --popper-theme-border-radius: 6px; 16 | --popper-theme-padding: 6px 12px; 17 | --popper-theme-box-shadow: 0 6px 30px -6px rgba(0, 0, 0, 0.25); 18 | } 19 | -------------------------------------------------------------------------------- /vue/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{vue,js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } 12 | -------------------------------------------------------------------------------- /vue/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue()] 7 | }) 8 | --------------------------------------------------------------------------------