├── .gitignore
├── LICENSE
├── Procfile
├── README.md
├── beamup.json
├── config.js
├── configure.html
├── index.js
├── lib
├── catalogHandler.js
├── dataHandler.js
├── debridLinkResolver.js
├── debridLookup.js
├── editors.js
├── getMovieCachedDebridLinks.js
├── getMovieTorrents.js
├── getPublicIP.js
├── getSeriesCachedDebridLinks.js
├── getSeriesTorrents.js
├── kitsuHandler.js
├── manifest.js
└── userStatus.js
├── package-lock.json
├── package.json
└── videos
├── download-started.mp4
├── error-general.mp4
└── error.mp4
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .env
3 | test
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 gorlev
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: node index.js
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # orion-stremio-addon
2 | Orion Stremio Addon, allows Orion-indexed torrent, usenet and hoster links to be played on Stremio. Cached links can be played with RealDebrid, Premiumize or Offcloud. Torrents can be stream without using any Debrid service. Multiple Debrid services also can be used at the same time. Orion API key is required to use this addon. Get it from [https://panel.orionoid.com](https://panel.orionoid.com)
3 |
4 | ### Attention
5 | Please be careful while setting the "Link Limit per Search" section. Link limit is the maximum number of streams to return. If not specified, all available links are returned. Make sure to specify a limit (default is 5), since without one you might use up the entire daily limit with one query.
6 |
7 | ## Installation
8 |
9 | ### Remote
10 | Click on [https://5a0d1888fa64-orion.baby-beamup.club](https://5a0d1888fa64-orion.baby-beamup.club) and make your adjustments. Then, click install.
11 |
12 | ### Local
13 | Unfortunately, local usage is not possible because you will need the app API key.
14 |
15 | ## Todo
16 | Features I would like to implement and stuff needed to be done:
17 | - [x] Documentation
18 | - [x] Configuration page
19 | - [x] More configuration options that Orion already supports
20 | - [x] Debrid support with Orion's natively supported Debrid services (Real-Debrid, Premiumize.me, Offcloud)
21 |
22 | ## Contributions
23 | Great thanks to:
24 | * Orion Team for their great support.
25 | * [tmdb-addon](https://github.com/mrcanelas/tmdb-addon), [torrentio-addon](https://github.com/TheBeastLT/torrentio-scraper) and [deflix-stremio](https://github.com/doingodswork/deflix-stremio) for the idea of preparing the configuration page.
26 |
--------------------------------------------------------------------------------
/beamup.json:
--------------------------------------------------------------------------------
1 | {
2 | "projectName": "orion",
3 | "lastCommit": "aaf4f95"
4 | }
--------------------------------------------------------------------------------
/config.js:
--------------------------------------------------------------------------------
1 | var env = process.env.NODE_ENV ? 'beamup':'local';
2 |
3 | var config = {
4 | orionURL: 'www.orionoid.com',
5 | }
6 |
7 | switch (env) {
8 | //Public server build.
9 | case 'beamup':
10 | config.port = process.env.PORT
11 | config.local = "https://5a0d1888fa64-orion.baby-beamup.club"
12 | break;
13 |
14 | //Local sever build.
15 | case 'local':
16 | config.port = 3634
17 | config.local = "http://127.0.0.1:" + config.port;
18 | break;
19 | }
20 |
21 | module.exports = config;
--------------------------------------------------------------------------------
/configure.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Orion - Stremio Addon
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
<%=MANIFEST.name%>
219 |
220 |
<%=MANIFEST.version%>
221 |
Orion Stremio Addon, allows Orion-indexed torrent, usenet and hoster links to be played on Stremio. Cached links can be played with RealDebrid, AllDebrid, Debrid-Link, Premiumize or Offcloud. Torrents can be streamed without using any Debrid service. Orion API key is required to use this addon. Get it from panel.orionoid.com
222 |
223 |
224 |
This addon has more :
225 |
228 |
230 |
231 |
232 |
233 |
Orion API Key:
234 |
235 |
236 |
Link Limit per Search:
237 |
238 |
239 |
Sorting:
240 |
241 | No Sorting
242 | Random Shuffle
243 | Sort By Best
244 | Sort By User Popularity
245 | Sort By Update Time
246 | Sort By file Size
247 | Sort By Torrent Seeds
248 | Sort By Video Quality
249 | Sort By Audio Channels
250 |
251 |
252 |
Video Quality:
253 |
254 | 8K (HD)
255 | 6K (HD)
256 | 4K (HD)
257 | 2K (HD)
258 | 1080p (HD)
259 | 720p (HD)
260 | SD
261 | 1080p (SCR)
262 | 720p (SCR)
263 | SCR
264 | 1080p (CAM)
265 | 720p (CAM)
266 | CAM
267 |
268 |
269 |
Audio Quality:
270 |
271 | 1 Channel (Mono)
272 | 2 Channels (Stereo)
273 | 5.1 (Surround)
274 | 7.1 (Surround)
275 |
276 |
277 |
Audio Language Preference:
278 |
279 | Default, search for all available languages
280 | Specific, search for selected languages only
281 |
282 |
283 |
284 |
Preferred languages:
285 |
286 | Afrikaans
287 | Arabic
288 | Armenian
289 | Albanian
290 | Azerbaijani
291 | Belarusian
292 | Bulgarian
293 | Bosnian
294 | Catalan
295 | Croatian
296 | Chinese
297 | Czech
298 | Danish
299 | Dutch
300 | English
301 | Estonian
302 | Finnsih
303 | French
304 | German
305 | Greek
306 | Georgian
307 | Hebrew
308 | Hindi
309 | Hungarian
310 | Irish
311 | Indonesian
312 | Icelandic
313 | Italian
314 | Japanese
315 | Kazakh
316 | Korean
317 | Kyrgyz
318 | Lithuanian
319 | Latvian
320 | Macedonian
321 | Norwegian
322 | Polish
323 | Persian
324 | Portuguese
325 | Romanian
326 | Russian
327 | Spanish
328 | Slovak
329 | Slovene
330 | Serbian
331 | Swedish
332 | Thai
333 | Turkmen
334 | Turkish
335 | Ukrainian
336 | Vietnamese
337 |
338 |
❗ If there are no results in the language you selected, you will NOT see any results❗
339 |
340 |
341 |
Listing Option:
342 |
343 | Show only torrent streams
344 | Show only cached debrid streams (Requires Debrid Account)
345 | Show both (Requires Debrid Account)
346 |
347 |
348 |
349 |
Authorized Debrid Services: (Authorize here )
350 |
351 | Real Debrid
352 | Premiumize
353 | Offcloud
354 | AllDebrid
355 | DebridLink
356 |
357 |
❗❗ Tick if you only have a Premium Debrid Account ❗❗
358 |
Watching a video using the Debrid provider will deduct your Daily Container Limit❗
359 |
360 |
361 |
Additional Parameters: (Optional)
362 |
363 |
Any additional parameters as specified in the API documentation .
364 |
365 |
366 |
367 |
368 | INSTALL
369 |
370 |
371 |
372 |
373 |
374 |
ℹ️ If the installation button doesn't work, you can just paste the generated URL into the Stremio addon search bar: (Tutorial)
375 | 📋
376 |
377 |
378 |
379 |
380 |
- If you are reinstalling this addon, please uninstall the previous version from the Stremio addons section.
381 |
- Please DO NOT check the Authorized Debrid Services checkboxes if you don't have a premium debrid account.
382 |
- Added Anime Kitsu support.
383 |
- Auto next episode feature has been added.
384 |
- Audio language selection feature has been implemented.
385 |
- Added support for AllDebrid and DebridLink.
386 |
- Added "Additional Parameters" support.
387 |
- Added catalog support.
388 |
389 |
390 |
If you encounter any bugs and have a feature request, please email to gorlevdev@gmail.com.
391 |
392 |
393 |
394 |
395 |
485 |
486 |
487 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | require('dotenv').config({ path: `${__dirname}/.env`});
3 | const dataHandler = require('./lib/dataHandler');
4 | const requestIp = require('request-ip');
5 | const getPublicIP = require("./lib/getPublicIP");
6 | const debridLinkResolver = require("./lib/debridLinkResolver");
7 | const config = require("./config.js");
8 | const kitsuHandler = require("./lib/kitsuHandler");
9 | const MANIFEST = require("./lib/manifest")
10 | const { catalogHandler, searchCatalogHandler } = require("./lib/catalogHandler");
11 |
12 | const { v5: uuidv5 } = require('uuid');
13 | const addon = express();
14 | addon.set('trust proxy', Number(process.env.TRUST_PROXY_NUMBER) || 1)
15 |
16 | var respond = function (res, data) {
17 | res.setHeader('Access-Control-Allow-Origin', '*');
18 | res.setHeader('Access-Control-Allow-Headers', '*');
19 | res.setHeader('Content-Type', 'application/json');
20 | res.send(data);
21 | };
22 |
23 | const CACHE_MAX_AGE = 4 * 60 * 60; // 4 hours in seconds
24 | const STALE_REVALIDATE_AGE = 4 * 60 * 60; // 4 hours
25 | const STALE_ERROR_AGE = 7 * 24 * 60 * 60; // 7 days
26 |
27 | addon.engine('html', require('ejs').renderFile);
28 | // addon.set('view engine', 'html');
29 | addon.set('views', __dirname);
30 |
31 | addon.get("/", function (req, res) {
32 | res.redirect("/configure")
33 | });
34 |
35 | addon.get("/:userConf?/configure", function (req, res) {
36 | const newManifest = { ...{MANIFEST} };
37 | res.render('configure.html',newManifest);
38 | // res.render('configure.html',{MANIFEST});
39 | });
40 |
41 | addon.get('/manifest.json', function (req, res) {
42 | const newManifest = { ...MANIFEST };
43 | newManifest.behaviorHints.configurationRequired = true;
44 | respond(res, newManifest);
45 | }
46 | );
47 |
48 | addon.get('/:userConf/manifest.json', function (req, res) {
49 | const newManifest = { ...MANIFEST };
50 | if (!((req || {}).params || {}).userConf) {
51 | newManifest.behaviorHints.configurationRequired = true;
52 | respond(res, newManifest);
53 | } else {
54 | newManifest.behaviorHints.configurationRequired = false;
55 | respond(res, newManifest);
56 | }
57 | });
58 |
59 | addon.get('/:userConf/stream/:type/:id.json', async function (req, res) {
60 | let {userConf,type,id} = req.params
61 | let videoId = id.split(":")[0]
62 | let season = id.split(":")[1]
63 | let episode = id.split(":")[2]
64 | let clientIp = requestIp.getClientIp(req);
65 |
66 | if (clientIp.includes("::ffff:")) {
67 | clientIp = await getPublicIP();
68 | } //Only for local testing.
69 |
70 | if (id.includes("kitsu")) {
71 |
72 | let kitsuID = id.split(":")[1]
73 | let responseKitsuHandler = await kitsuHandler(kitsuID)
74 |
75 | if(responseKitsuHandler !== undefined){
76 | videoId = responseKitsuHandler.imdbID
77 | season = responseKitsuHandler.season || 1
78 | }
79 | }
80 |
81 | // const userAPI = JSON.parse(Buffer.from(userConf, 'base64').toString()).api
82 |
83 | let userAgent = req.headers['user-agent'] || ""
84 |
85 | // const client = {
86 | // apiKey: userAPI,
87 | // headers: req.headers,
88 | // userIP: clientIp
89 | // }
90 |
91 | const stream = await dataHandler(userConf, videoId, type, season, episode, clientIp, userAgent)
92 | return respond(res, { streams: stream, cacheMaxAge: stream.length > 0 ? CACHE_MAX_AGE : 5 * 60 , staleRevalidate: STALE_REVALIDATE_AGE, staleError: STALE_ERROR_AGE });
93 |
94 | });
95 |
96 |
97 | addon.get('/:userConf/catalog/:type/:id/:extra?.json', async function (req, res) {
98 | let {userConf,type,id,extra} = req.params
99 | let extraObj, userConfiguration
100 |
101 | try {
102 | userConfiguration = JSON.parse(Buffer.from(userConf, 'base64').toString())
103 | } catch (error) {
104 | console.log(error)
105 | return []
106 | }
107 |
108 | if(extra){
109 | try {
110 | extraObj = JSON.parse('{"' + decodeURI(extra.replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}')
111 | } catch (error) {
112 | console.log(error)
113 | return []
114 | }
115 | }
116 |
117 | if(extraObj && extraObj.genre && extraObj.genre.includes("+")){
118 | extraObj.genre = extraObj.genre.replace(/\+/g,' ')
119 | }
120 |
121 | let pagination
122 | if(extraObj && extraObj.skip){
123 | pagination = extra.skip || 1
124 | pagination = Math.round((Number(extraObj.skip) / 16) + 1 )
125 | }
126 |
127 | let metas = []
128 | metas = await catalogHandler(extraObj.genre,userConfiguration.api,pagination,type)
129 |
130 | if(extraObj && extraObj.search){
131 | metas = await searchCatalogHandler(extraObj.search,userConfiguration.api,pagination,type)
132 | }
133 |
134 | respond(res, {metas: metas, cacheMaxAge: metas.length > 0 ? CACHE_MAX_AGE : 5 * 60 , staleRevalidate: STALE_REVALIDATE_AGE, staleError: STALE_ERROR_AGE})
135 | });
136 |
137 | addon.get('/download/:keyuser/:service/:iditem/:idstream/:episodenumber?',async function (req, res) {
138 | let {keyuser,service,iditem,idstream,episodenumber} = req.params
139 | let clientIp = requestIp.getClientIp(req);
140 |
141 | if (clientIp.includes("::ffff:")) {
142 | clientIp = await getPublicIP();
143 | } //Only for local testing.
144 |
145 | let debridLink = await debridLinkResolver(keyuser,service,iditem,idstream,clientIp,episodenumber)
146 | if(debridLink === "error" || "" || undefined){
147 | const video = `${__dirname}/videos/error.mp4`;
148 | res.download(video);
149 | }
150 | else if (debridLink === "busy"){
151 | const video = `${__dirname}/videos/download-started.mp4`;
152 | res.download(video);
153 | }else{
154 | res.redirect(debridLink)
155 | }
156 | });
157 |
158 |
159 | addon.get('/serverip', async function (req, res) {
160 | const publicIP = await getPublicIP();
161 | res.send(publicIP);
162 | res.end()
163 | });
164 |
165 | addon.get('*', function(req, res){
166 | res.redirect("/")
167 | });
168 |
169 | if (module.parent) {
170 | module.exports = addon,MANIFEST;
171 | } else {
172 | addon.listen( config.port, function () {
173 | console.log(config)
174 | });
175 | }
--------------------------------------------------------------------------------
/lib/catalogHandler.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios').default;
2 | axios.defaults.headers.get["content-type"] = "application/json";
3 | axios.defaults.baseURL = "https://api.orionoid.com";
4 | axios.defaults.timeout = 10000
5 | axios.defaults.method = "GET"
6 |
7 | require('dotenv').config({path : '../.env' })
8 | const keyapp = process.env.APP_API_KEY
9 |
10 | function genreNameEditor(name){
11 | switch (name) {
12 | case "New Releases":
13 | res = {category:"list", query:"new"};
14 | break;
15 | case "Disc Releases":
16 | res = {category:"list", query:"disc"};
17 | break;
18 | case "Top Rated":
19 | res = {category:"list", query:"rated"};
20 | break;
21 | case "Must Watch":
22 | res = {category:"list", query:"best"};
23 | break;
24 | case "Award Winner":
25 | res = {category:"list", query:"award"};
26 | break;
27 | case "Most Popular":
28 | res = {category:"popular", query:""};
29 | break;
30 | case "Now Trending":
31 | res = {category:"trending", query:""};
32 | break;
33 | case "Box Office":
34 | res = {category:"boxoffice", query:""};
35 | break;
36 | case "New Seasons":
37 | res = {category:"releases", query:""};
38 | break;
39 | case "New Episodes":
40 | res = {category:"calendar", query:""};
41 | break;
42 | default:
43 | res = "Error";
44 | }
45 | return res
46 | }
47 |
48 | async function catalogHandler(tag,keyuser,page,type,requestType,query) {
49 |
50 | let orionType = type
51 | if(type == "series"){orionType = "show"}
52 |
53 | let params
54 |
55 | let searchParameters = genreNameEditor(tag)
56 |
57 | params = {
58 | action:"search",
59 | category:searchParameters.category,
60 | keyapp,
61 | keyuser,
62 | mode: "stream",
63 | page,
64 | query:searchParameters.query,
65 | type:orionType
66 | }
67 |
68 | let responseOrionRequest
69 |
70 | try {
71 | responseOrionRequest = await axios({params})
72 | } catch (error) {
73 | console.log(error)
74 | return []
75 | }
76 |
77 | let catalog = []
78 | if (responseOrionRequest.data && responseOrionRequest.data.result && responseOrionRequest.data.result.status && responseOrionRequest.data.result.status === "success") {
79 |
80 | responseOrionRequest.data.data.forEach(i => {
81 |
82 | let id = "tt" + i.id.imdb
83 | let name = i.meta.title
84 | let poster = i.image.poster + "/small/background"
85 | let genres = i.meta.genres
86 | let releaseInfo = String(i.meta.year)
87 | let description = i.meta.overview
88 |
89 | catalog.push({id,type,name,poster,genres,releaseInfo,description})
90 | });
91 | }
92 |
93 | return catalog
94 | }
95 |
96 | async function searchCatalogHandler(query,keyuser,page,type) {
97 |
98 | let orionType = type
99 | if(type == "series"){orionType = "show"}
100 |
101 | let params = {
102 | action:"search",
103 | category:"search",
104 | keyapp,
105 | keyuser,
106 | mode: "stream",
107 | page,
108 | query,
109 | type:"movie,show,episode"
110 | }
111 |
112 | let responseOrionRequest
113 |
114 | try {
115 | responseOrionRequest = await axios({params})
116 | } catch (error) {
117 | console.log(error)
118 | return []
119 | }
120 |
121 | let catalog = []
122 | if (responseOrionRequest.data && responseOrionRequest.data.result && responseOrionRequest.data.result.status && responseOrionRequest.data.result.status === "success") {
123 |
124 | responseOrionRequest.data.data.forEach(i => {
125 |
126 | if(orionType === i.type){
127 |
128 | let id = "tt" + i.id.imdb
129 | let name = i.meta.title
130 | let poster = i.image.poster + "/small/background"
131 | let genres = i.meta.genres
132 | let releaseInfo = String(i.meta.year)
133 | let description = i.meta.overview
134 |
135 | catalog.push({id,type,name,poster,genres,releaseInfo,description})
136 | }
137 | });
138 |
139 | return catalog
140 | }
141 | }
142 | module.exports = {catalogHandler,searchCatalogHandler}
--------------------------------------------------------------------------------
/lib/dataHandler.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config({path : '../.env' })
2 | const getMovieCachedDebridLinks = require('./getMovieCachedDebridLinks');
3 | const getMovieTorrents = require('./getMovieTorrents');
4 | const getSeriesCachedDebridLinks = require('./getSeriesCachedDebridLinks');
5 | const getSeriesTorrents = require('./getSeriesTorrents');
6 |
7 | const NodeCache = require( "node-cache" );
8 | const orionCache = new NodeCache({ stdTTL: 15*60, checkperiod: 5*60 });
9 |
10 | async function dataHandler(userConf, videoId, type, season, episode, clientIp, userAgent){
11 |
12 | const userConfiguration = JSON.parse(Buffer.from(userConf, 'base64').toString())
13 |
14 | //API KEYS
15 | const keyapp = process.env.APP_API_KEY.trim()
16 | const keyuser = userConfiguration.api
17 |
18 | //Listing Option Handling
19 | const listOpt = userConfiguration.listOpt.trim()
20 |
21 | //NUMBER OF LINKS TO RETRIEVE
22 | let limitcount = Number(userConfiguration.linkLimit.trim())
23 |
24 | if(listOpt !== "debrid"){
25 | limitcount = Math.trunc(limitcount / (1 + userConfiguration.debridservices.length))
26 | }
27 |
28 | if(limitcount === 0) {
29 | limitcount = 1
30 | }
31 |
32 | //HANDLES WITH THE VIDEO QUALITY PARAMETERS FOR THE DESIRED FORMAT
33 | const videoquality = userConfiguration.videoquality.trim()
34 |
35 | //HANDLES WITH THE SORTING OPTION
36 | const sortvalue = userConfiguration.sortValue.trim()
37 |
38 | //HANDLES WITH THE AUDIO CHANNELS FOR THE DESIRED FORMAT
39 | const audiochannels = userConfiguration.audiochannels.trim()
40 |
41 | //Converts the IMDB ID for Orion
42 | const idimdb = videoId.substring(2)
43 |
44 | //Converts the season and episode datas for Orion.
45 | let numberseason = Number(season)
46 | let numberepisode = Number(episode)
47 |
48 | let stremioElements = []
49 | let allMovieDebridLinks = []
50 | let allSeriesDebridLinks = []
51 | let movieTorrentStreams, seriesTorrentStreams, movieDebridLinks, seriesDebridLinks
52 |
53 |
54 | //Handles with audio languages
55 | let audiolanguages = userConfiguration.audiolanguages.join(",") || null
56 |
57 | // Gets the additional parameters as an object.
58 | let additionalParameters = {}
59 |
60 | try {
61 | if(userConfiguration && userConfiguration.additionalParameters && userConfiguration.additionalParameters.trim().length > 0){
62 | additionalParameters = JSON.parse('{"' + decodeURI(userConfiguration.additionalParameters.trim().replace(/&/g, "\",\"").replace(/=/g,"\":\"")) + '"}') || {}
63 | }
64 | } catch (error) {
65 | console.log(error)
66 | }
67 |
68 | if (listOpt === "both") {
69 |
70 | if (type === "movie") {
71 |
72 | for (let debridprovider of userConfiguration.debridservices) {
73 | movieDebridLinks = await getMovieCachedDebridLinks(keyuser,keyapp,idimdb,limitcount,videoquality, audiochannels,sortvalue, debridprovider, clientIp, audiolanguages,additionalParameters,orionCache, userAgent)
74 | allMovieDebridLinks = allMovieDebridLinks.concat(movieDebridLinks)
75 | }
76 | movieTorrentStreams = await getMovieTorrents(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,audiolanguages,additionalParameters,orionCache)
77 | stremioElements = stremioElements.concat(allMovieDebridLinks, movieTorrentStreams)
78 |
79 | return stremioElements
80 |
81 | } else if (type === "series") {
82 |
83 | for (let debridprovider of userConfiguration.debridservices) {
84 | seriesDebridLinks = await getSeriesCachedDebridLinks(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,numberseason,numberepisode,debridprovider,clientIp,audiolanguages,additionalParameters,orionCache, userAgent)
85 | allSeriesDebridLinks = allSeriesDebridLinks.concat(seriesDebridLinks)
86 | }
87 |
88 | seriesTorrentStreams = await getSeriesTorrents(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,numberseason,numberepisode,audiolanguages,additionalParameters,orionCache)
89 | stremioElements = stremioElements.concat(allSeriesDebridLinks, seriesTorrentStreams)
90 |
91 | return stremioElements
92 | }
93 | } else if (listOpt === "torrent") {
94 |
95 | if (type === "movie") {
96 |
97 | movieTorrentStreams = await getMovieTorrents(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,audiolanguages,additionalParameters,orionCache)
98 |
99 | return movieTorrentStreams
100 |
101 | } else if (type === "series") {
102 |
103 | seriesTorrentStreams = await getSeriesTorrents(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,numberseason,numberepisode,audiolanguages,additionalParameters,orionCache)
104 |
105 | return seriesTorrentStreams
106 | }
107 |
108 | } else if (listOpt === "debrid") {
109 |
110 | if (type === "movie") {
111 |
112 | for (let debridprovider of userConfiguration.debridservices) {
113 | movieDebridLinks = await getMovieCachedDebridLinks(keyuser,keyapp,idimdb,limitcount,videoquality, audiochannels,sortvalue, debridprovider, clientIp,audiolanguages,additionalParameters,orionCache,userAgent)
114 | allMovieDebridLinks = allMovieDebridLinks.concat(movieDebridLinks)
115 | }
116 |
117 | return allMovieDebridLinks
118 |
119 | } else if (type === "series") {
120 |
121 | for (let debridprovider of userConfiguration.debridservices) {
122 | seriesDebridLinks = await getSeriesCachedDebridLinks(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,numberseason,numberepisode,debridprovider,clientIp,audiolanguages,additionalParameters,orionCache,userAgent)
123 | allSeriesDebridLinks = allSeriesDebridLinks.concat(seriesDebridLinks)
124 | }
125 |
126 | return allSeriesDebridLinks
127 | }
128 | }
129 |
130 | }
131 |
132 | module.exports = dataHandler;
--------------------------------------------------------------------------------
/lib/debridLinkResolver.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config({path : '../.env' })
2 |
3 | const axios = require('axios').default;
4 | axios.defaults.headers.get["content-type"] = "application/json";
5 | axios.defaults.baseURL = "https://api.orionoid.com";
6 | axios.defaults.timeout = 10000
7 | axios.defaults.method = "GET"
8 |
9 |
10 | async function debridLinkResolver(keyuser,service,iditem,idstream,clientip,episode) {
11 |
12 | const keyapp = process.env.APP_API_KEY
13 |
14 |
15 | let links = []
16 | let debridlink, originalLink, responseRequest
17 | const episodeNumber = Number(episode)
18 |
19 | let params = {
20 | keyuser,
21 | keyapp,
22 | mode: "debrid",
23 | action: "resolve",
24 | type: service,
25 | iditem,
26 | idstream,
27 | file: "original",
28 | output: "list"
29 | }
30 | if (service === "premiumize") {params.ip = clientip}
31 |
32 | try{
33 | responseRequest = await axios({params})
34 | responseRequest = responseRequest.data
35 | }catch(e){
36 | console.log(e)
37 | }
38 |
39 | if(responseRequest && responseRequest.result && responseRequest.result.status === "success" && responseRequest.result.type === "debridbusy"){
40 | return originalLink = "busy"
41 | }
42 |
43 | responseRequest.data.files.forEach(element => {
44 | if(element.original.category === "video") {
45 | debridlink = element.original.link
46 | links.push(debridlink)
47 | }
48 | })
49 |
50 | if(links.length > 0 && episodeNumber <= links.length){
51 |
52 | return originalLink = await links[episodeNumber-1]
53 |
54 | } else if(links.length > episodeNumber){
55 |
56 | return originalLink = "error"
57 |
58 | }
59 |
60 | }
61 | module.exports = debridLinkResolver
--------------------------------------------------------------------------------
/lib/debridLookup.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config({path : '../.env' })
2 |
3 | const axios = require('axios').default;
4 | axios.defaults.headers.get["content-type"] = "application/json";
5 | axios.defaults.baseURL = "https://api.orionoid.com";
6 | axios.defaults.timeout = 10000
7 | axios.defaults.method = "GET"
8 |
9 | async function debridLookup(keyuser,service,iditem,idstream) {
10 |
11 | const keyapp = process.env.APP_API_KEY
12 |
13 | let params = {
14 | keyuser,
15 | keyapp,
16 | mode: "debrid",
17 | action: "lookup",
18 | type: service,
19 | iditem,
20 | idstream,
21 | refresh: true
22 | }
23 | try{
24 |
25 | const responseDebridRequest = await axios({params})
26 | const jsonDebridRequest = responseDebridRequest.data
27 |
28 | if(jsonDebridRequest && jsonDebridRequest.result){
29 | return jsonDebridRequest.result
30 | }else{
31 | return {}
32 | }
33 |
34 | }catch(e){
35 | console.log(e)
36 | return {}
37 | }
38 | }
39 |
40 | module.exports = debridLookup
--------------------------------------------------------------------------------
/lib/editors.js:
--------------------------------------------------------------------------------
1 | function resNameEditor(name){
2 | switch (name) {
3 | case "hd8k":
4 | res = "8K";
5 | break;
6 | case "hd6k":
7 | res = "6K";
8 | break;
9 | case "hd4k":
10 | res = "4K";
11 | break;
12 | case "hd2k":
13 | res = "2K";
14 | break;
15 | case "hd1080":
16 | res = "1080P";
17 | break;
18 | case "hd720":
19 | res = "720P";
20 | break;
21 | case "sd":
22 | res = "SD";
23 | break;
24 | case "scr1080":
25 | res = "1080P (SCR)";
26 | break;
27 | case "scr720":
28 | res = "720P (SCR)";
29 | break;
30 | case "scr":
31 | res = "SCR";
32 | break;
33 | case "cam1080":
34 | res = "1080P (CAM)";
35 | break;
36 | case "cam720":
37 | res = "720P (CAM)";
38 | break;
39 | case "cam":
40 | res = "CAM";
41 | break;
42 | default:
43 | res = "Error";
44 | }
45 | return res
46 | }
47 | function humanFileSize(size) {
48 | var i = Math.floor( Math.log(size) / Math.log(1024) );
49 | return ( size / Math.pow(1024, i) ).toFixed(2) * 1 + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
50 | }
51 | function debridNameEditor(name){
52 | switch (name) {
53 | case "premiumize":
54 | res = "Premiumize";
55 | break;
56 | case "realdebrid":
57 | res = "Real-Debrid";
58 | break;
59 | case "offcloud":
60 | res = "Offcloud";
61 | break;
62 | case "alldebrid":
63 | res = "AllDebrid";
64 | break;
65 | case "debridlink":
66 | res = "DebridLink";
67 | break;
68 | default:
69 | res = "Error";
70 | }
71 | return res
72 | }
73 | function audioChannelsNameEditor(name){
74 | switch (name) {
75 | case 1:
76 | audio = "Mono";
77 | break;
78 | case 2:
79 | audio = "Stereo";
80 | break;
81 | case 6:
82 | audio = "5.1";
83 | break;
84 | case 8:
85 | audio = "7.1";
86 | break;
87 | case 10:
88 | audio = "9.1";
89 | break;
90 | default:
91 | audio = "unknown";
92 | }
93 | return audio
94 | }
95 |
96 | module.exports = {resNameEditor,humanFileSize,debridNameEditor,audioChannelsNameEditor}
--------------------------------------------------------------------------------
/lib/getMovieCachedDebridLinks.js:
--------------------------------------------------------------------------------
1 | const config = require('../config');
2 | const { resNameEditor,humanFileSize,audioChannelsNameEditor,debridNameEditor } = require('./editors');
3 | const userStatus = require('./userStatus');
4 | const axios = require('axios').default;
5 | axios.defaults.headers.get["content-type"] = "application/json";
6 | axios.defaults.baseURL = "https://api.orionoid.com";
7 | axios.defaults.timeout = 10000
8 | axios.defaults.method = "GET"
9 |
10 | async function getMovieCachedDebridLinks(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue, debrid, clientIp, audiolanguages, additionalParameters, orionCache,userAgent){
11 |
12 | const userType = await userStatus(keyapp,keyuser)
13 |
14 | let debridName = userType === "free" ? null : debrid
15 |
16 | let params = {
17 | keyuser,
18 | keyapp,
19 | mode: "stream",
20 | action: "retrieve",
21 | type: "movie",
22 | streamtype: "usenet,hoster,torrent",
23 | idimdb,
24 | limitcount,
25 | videoquality,
26 | audiochannels,
27 | audiolanguages,
28 | sortvalue,
29 | access: `${debridName},${debridName}torrent,${debridName}usenet,${debridName}hoster`,
30 | debridlookup: debridName,
31 | debridresolve: `${debridName},original`,
32 | deviceIP: clientIp,
33 | deviceAgent: encodeURIComponent(userAgent)
34 | }
35 |
36 | if (debridName === "premiumize") {params.debridresolve = `${debridName},${clientIp},original`}
37 |
38 | if(params !== {}){params = {...params,...additionalParameters}}
39 |
40 | let cacheParams = {...params}
41 | delete cacheParams.keyapp
42 |
43 | if(orionCache.has(JSON.stringify(cacheParams))){
44 | return orionCache.get(JSON.stringify(cacheParams))
45 | }else{
46 |
47 | let responseOrionRequest,jsonOrionRequest
48 |
49 | try{
50 | responseOrionRequest = await axios({params})
51 | jsonOrionRequest = responseOrionRequest.data
52 | }catch(e){
53 | console.log(e)
54 | return []
55 | }
56 |
57 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "error") {
58 | return [{
59 | name: `🚀 ORION`,
60 | title: `⚠️ ERROR! \n${jsonOrionRequest.result.description||""}\n${jsonOrionRequest.result.message||""}`,
61 | url: "https://github.com/gorlev/orion-stremio-addon/blob/main/videos/error.mp4?raw=true",
62 | }]
63 | }
64 |
65 | let mediaDatas = []
66 |
67 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "success") {
68 |
69 | let orionID = jsonOrionRequest.data.movie.id.orion
70 |
71 | for (let element of jsonOrionRequest.data.streams) {
72 |
73 | const mediaName = element.file.name
74 | const mediaSize = humanFileSize(element.file.size)
75 | const mediaSource = element.stream.source
76 |
77 | const videoquality = resNameEditor(element.video.quality)
78 |
79 | //const mediaType = element.stream.type
80 | //const streamID = element.id
81 |
82 | const debridType = debridNameEditor(debrid)
83 |
84 | const debridURL = element.debrid
85 |
86 | // let audioLang = "[" + element.audio.languages.join(" ").toUpperCase() + "]"
87 | // if (audioLang === "[EN]") { audioLang = ""}
88 |
89 | let audioLang = element.audio.languages.join(" ").toUpperCase()
90 |
91 | const videoCodec = element.video.codec
92 | let audioCh = element.audio.channels
93 | audioCh = audioChannelsNameEditor(audioCh)
94 |
95 | mediaDatas.push({
96 | name: `🚀 ORION\n[${debridType}]`,
97 | title: `${mediaName}\n📺${videoquality} 💾${mediaSize} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
98 | url: debridURL,
99 | //'url': `${config.local}/download/${keyuser}/${debrid}/${orionID}/${streamID}`
100 | behaviorHints:{notWebReady:true}
101 | })
102 | }
103 | }
104 |
105 | if(mediaDatas.length > 0 && jsonOrionRequest.result.status !== "error"){
106 | orionCache.set(JSON.stringify(cacheParams), mediaDatas, 5*60) // 5 mins
107 | }
108 |
109 | return mediaDatas
110 | }
111 | }
112 |
113 | module.exports = getMovieCachedDebridLinks
--------------------------------------------------------------------------------
/lib/getMovieTorrents.js:
--------------------------------------------------------------------------------
1 | const { resNameEditor,humanFileSize,audioChannelsNameEditor } = require('./editors');
2 | const config = require('../config');
3 | const axios = require('axios').default;
4 | axios.defaults.headers.get["content-type"] = "application/json";
5 | axios.defaults.baseURL = "https://api.orionoid.com";
6 | axios.defaults.timeout = 10000
7 | axios.defaults.method = "GET"
8 |
9 | async function getMovieTorrents(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,audiolanguages,additionalParameters,orionCache){
10 |
11 | let params = {
12 | keyuser,
13 | keyapp,
14 | mode: "stream",
15 | action: "retrieve",
16 | type: "movie",
17 | idimdb,
18 | limitcount,
19 | videoquality,
20 | audiochannels,
21 | audiolanguages,
22 | streamtype: "torrent",
23 | protocoltorrent: "magnet",
24 | sortvalue
25 | }
26 |
27 | if(params !== {}){params = {...params,...additionalParameters}}
28 |
29 | let cacheParams = {...params}
30 | delete cacheParams.keyapp
31 |
32 | if(orionCache.has(JSON.stringify(cacheParams))){
33 | return orionCache.get(JSON.stringify(cacheParams))
34 | }else{
35 |
36 | let responseOrionRequest,jsonOrionRequest
37 | try{
38 | responseOrionRequest = await axios({params})
39 | jsonOrionRequest = responseOrionRequest.data
40 | }catch(e){
41 | console.log(e)
42 | }
43 |
44 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "error") {
45 | return [{
46 | name: `🪐 ORION`,
47 | title: `⚠️ ERROR! \n${jsonOrionRequest.result.description||""}\n${jsonOrionRequest.result.message||""}`,
48 | url: "https://github.com/gorlev/orion-stremio-addon/blob/main/videos/error-general.mp4?raw=true",
49 | }]
50 | }
51 |
52 | let mediaDatas = []
53 |
54 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "success") {
55 |
56 | for (let element of jsonOrionRequest.data.streams) {
57 |
58 | let fileHash = element.file.hash
59 | const mediaName = element.file.name
60 | const mediaSize = humanFileSize(element.file.size)
61 | const mediaSource = element.stream.source
62 |
63 | const seederAmount = element.stream.seeds
64 |
65 | const videoquality = resNameEditor(element.video.quality)
66 |
67 | let audioLang = element.audio.languages.join(" ").toUpperCase() || null
68 | // if (audioLang === "EN") { audioLang = ""}
69 | // else {audioLang === `${audioLang}`}
70 |
71 | const mediaLink = element.links[0]
72 |
73 | if (fileHash !== null) {
74 |
75 | const videoCodec = element.video.codec
76 | let audioCh = element.audio.channels
77 | audioCh = audioChannelsNameEditor(audioCh)
78 |
79 | mediaDatas.push({
80 | name: `🪐 ORION 📺 ${videoquality}`,
81 | title: `${mediaName}\n💾${mediaSize} 👤${seederAmount} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
82 | infoHash: fileHash,
83 | })
84 | }
85 | }
86 | }
87 |
88 | if(mediaDatas.length > 0 && jsonOrionRequest.result.status !== "error"){
89 | orionCache.set(JSON.stringify(cacheParams), mediaDatas, 15*60) // 15 mins
90 | }
91 |
92 | return mediaDatas
93 | }
94 | }
95 |
96 | module.exports = getMovieTorrents
--------------------------------------------------------------------------------
/lib/getPublicIP.js:
--------------------------------------------------------------------------------
1 | const { default: axios } = require('axios');
2 | module.exports = async function getPublicIP() {
3 |
4 | //Only required for local testing.
5 | try {
6 | const response = await axios({url:"https://api.myip.com/",method:"GET", timeout:10000})
7 | return response.data.ip
8 | // const response = await axios({url:"https://icanhazip.com/",method:"GET", timeout:10000})
9 | // return response.data.trim();
10 | }catch(e){
11 | console.log(e)
12 | return "0.0.0.0"
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/lib/getSeriesCachedDebridLinks.js:
--------------------------------------------------------------------------------
1 | const config = require('../config');
2 | const userStatus = require('./userStatus');
3 | const { resNameEditor,humanFileSize,audioChannelsNameEditor,debridNameEditor } = require('./editors');
4 | const axios = require('axios').default;
5 | axios.defaults.headers.get["content-type"] = "application/json";
6 | axios.defaults.baseURL = "https://api.orionoid.com";
7 | axios.defaults.timeout = 10000
8 | axios.defaults.method = "GET"
9 |
10 | async function getSeriesCachedDebridLinks(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,numberseason,numberepisode,debrid,clientIp,audiolanguages,additionalParameters,orionCache,userAgent){
11 |
12 | const userType = await userStatus(keyapp,keyuser)
13 |
14 | let debridName = userType === "free" ? null : debrid
15 |
16 | let params = {
17 | keyuser,
18 | keyapp,
19 | mode: "stream",
20 | action: "retrieve",
21 | type: "show",
22 | streamtype: "usenet,hoster,torrent",
23 | idimdb,
24 | limitcount,
25 | videoquality,
26 | audiochannels,
27 | audiolanguages,
28 | sortvalue,
29 | numberseason,
30 | numberepisode,
31 | access: `${debrid},${debrid}torrent,${debrid}usenet,${debrid}hoster`,
32 | debridlookup: debridName,
33 | debridresolve: `${debrid},original`,
34 | deviceIP: clientIp,
35 | deviceAgent: encodeURIComponent(userAgent)
36 | }
37 |
38 | if (debridName === "premiumize") {params.debridresolve = `${debridName},${clientIp},original`}
39 |
40 | if(params !== {}){params = {...params,...additionalParameters}}
41 |
42 | let cacheParams = {...params}
43 | delete cacheParams.keyapp
44 |
45 | if(orionCache.has(JSON.stringify(cacheParams))){
46 | return orionCache.get(JSON.stringify(cacheParams))
47 | }else{
48 |
49 | let responseOrionRequest,jsonOrionRequest
50 |
51 | try{
52 | responseOrionRequest = await axios({params})
53 | jsonOrionRequest = responseOrionRequest.data
54 | }catch(e){
55 | console.log(e)
56 | return []
57 | }
58 |
59 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "error") {
60 | return [{
61 | name: `🚀 ORION`,
62 | title: `⚠️ ERROR! \n${jsonOrionRequest.result.description||""}\n${jsonOrionRequest.result.message||""}`,
63 | url: "https://github.com/gorlev/orion-stremio-addon/blob/main/videos/error-general.mp4?raw=true",
64 | }]
65 | }
66 |
67 | let mediaDatas = []
68 |
69 | if (jsonOrionRequest && jsonOrionRequest.data && jsonOrionRequest.data.count && jsonOrionRequest.data.count.retrieved > 0 ) {
70 |
71 | //let orionID = jsonOrionRequest.data.episode.id.orion
72 |
73 | for (let element of jsonOrionRequest.data.streams) {
74 |
75 | const mediaName = element.file.name
76 | const mediaSize = humanFileSize(element.file.size)
77 | const mediaSource = element.stream.source
78 |
79 | const videoquality = resNameEditor(element.video.quality)
80 |
81 | //const streamID = element.id
82 | //const mediaType = element.stream.type
83 |
84 | const debridURL = element.debrid
85 | const debridType = debridNameEditor(debrid)
86 |
87 |
88 | let audioLang = element.audio.languages.join(" ").toUpperCase()
89 |
90 | const videoCodec = element.video.codec
91 | let audioCh = element.audio.channels
92 | audioCh = audioChannelsNameEditor(audioCh)
93 |
94 | mediaDatas.push({
95 | name: `🚀 ORION\n [${debridType}]`,
96 | title: `${mediaName}\n📺${videoquality} 💾${mediaSize} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
97 | url: `${debridURL}`,
98 | behaviorHints: {
99 | bingeGroup: `orion-${videoquality}-${debridType}`,
100 | notWebReady:true
101 | }
102 | })
103 | }
104 | } else if (jsonOrionRequest && jsonOrionRequest.data && jsonOrionRequest.data.count && jsonOrionRequest.data.count.retrieved === 0 ){
105 | // || jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status === "error" && jsonOrionRequest.result.type === "streammissing"
106 |
107 | params.filepack = true
108 |
109 | try{
110 | responseOrionRequest = await axios({params})
111 | jsonOrionRequest = responseOrionRequest.data
112 | }catch(e){
113 | console.log(e)
114 | }
115 |
116 | if (jsonOrionRequest && jsonOrionRequest.data && jsonOrionRequest.data.episode && jsonOrionRequest.data.episode.id && jsonOrionRequest.data.episode.id.orion && jsonOrionRequest.data.streams !== undefined){
117 | let orionID = jsonOrionRequest.data.episode.id.orion
118 |
119 | for (let element of jsonOrionRequest.data.streams) {
120 |
121 | const mediaName = element.file.name
122 | const mediaSize = humanFileSize(element.file.size)
123 | const mediaSource = element.stream.source
124 |
125 | const videoquality = resNameEditor(element.video.quality)
126 |
127 | const streamID = element.id
128 | //const mediaType = element.stream.type
129 |
130 | const debridType = debridNameEditor(debrid)
131 |
132 | let audioLang = element.audio.languages.join(" ").toUpperCase()
133 |
134 | const videoCodec = element.video.codec
135 | let audioCh = element.audio.channels
136 | audioCh = audioChannelsNameEditor(audioCh)
137 |
138 | mediaDatas.push({
139 | name: `🚀 ORION\n[${debridType}]`,
140 | title: `${mediaName}\n📺${videoquality} 💾${mediaSize} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
141 | url: `${config.local}/download/${keyuser}/${debrid}/${orionID}/${streamID}/${numberepisode}`,
142 | behaviorHints: {
143 | bingeGroup: `orion-${videoquality}-${debridType}`,
144 | notWebReady:true
145 | }
146 | })
147 | }
148 | }
149 | } else {
150 | mediaDatas = []
151 | }
152 |
153 | if(mediaDatas.length > 0 && jsonOrionRequest.result.status !== "error"){
154 | orionCache.set(JSON.stringify(cacheParams), mediaDatas, 5*60) // 5 mins
155 | }
156 |
157 | return mediaDatas
158 | }
159 | }
160 |
161 | module.exports = getSeriesCachedDebridLinks
--------------------------------------------------------------------------------
/lib/getSeriesTorrents.js:
--------------------------------------------------------------------------------
1 | const { resNameEditor,humanFileSize,audioChannelsNameEditor } = require('./editors');
2 | const axios = require('axios').default;
3 | axios.defaults.headers.get["content-type"] = "application/json";
4 | axios.defaults.baseURL = "https://api.orionoid.com";
5 | axios.defaults.timeout = 10000
6 | axios.defaults.method = "GET"
7 | const config = require('../config');
8 |
9 | async function getSeriesTorrents(keyuser,keyapp,idimdb,limitcount,videoquality,audiochannels,sortvalue,numberseason,numberepisode,audiolanguages,additionalParameters,orionCache){
10 |
11 | let params = {
12 | keyuser,
13 | keyapp,
14 | mode: "stream",
15 | action: "retrieve",
16 | type: "show",
17 | idimdb,
18 | limitcount,
19 | videoquality,
20 | audiochannels,
21 | audiolanguages,
22 | streamtype: "torrent",
23 | protocoltorrent: "magnet",
24 | sortvalue,
25 | numberseason,
26 | numberepisode
27 | }
28 |
29 | if(params !== {}){params = {...params,...additionalParameters}}
30 |
31 | let cacheParams = {...params}
32 | delete cacheParams.keyapp
33 |
34 | if(orionCache.has(JSON.stringify(cacheParams))){
35 | return orionCache.get(JSON.stringify(cacheParams))
36 | }else{
37 |
38 | let responseOrionRequest,jsonOrionRequest
39 |
40 | try{
41 | responseOrionRequest = await axios({params})
42 | jsonOrionRequest = responseOrionRequest.data
43 | }catch(e){
44 | console.log(e)
45 | }
46 |
47 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "error") {
48 | return [{
49 | name: `🪐 ORION`,
50 | title: `⚠️ ERROR! \n${jsonOrionRequest.result.description||""}\n${jsonOrionRequest.result.message||""}`,
51 | url: "https://github.com/gorlev/orion-stremio-addon/blob/main/videos/error-general.mp4?raw=true",
52 | }]
53 | }
54 |
55 | let mediaDatas = []
56 |
57 | if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status && jsonOrionRequest.result.status === "success") {
58 |
59 | for (let element of jsonOrionRequest.data.streams) {
60 |
61 | let fileHash = element.file.hash
62 | const mediaName = element.file.name
63 | const mediaSize = humanFileSize(element.file.size)
64 | const packStatus = element.file.pack
65 | const mediaSource = element.stream.source
66 |
67 | const seederAmount = element.stream.seeds
68 |
69 | const videoquality = resNameEditor(element.video.quality)
70 |
71 | let audioLang = element.audio.languages.join(" ").toUpperCase()
72 | // if (audioLang === "EN") { audioLang = ""}
73 |
74 | const mediaLink = element.links[0]
75 |
76 | const videoCodec = element.video.codec
77 | let audioCh = element.audio.channels
78 | audioCh = audioChannelsNameEditor(audioCh)
79 |
80 | if(fileHash !== null){
81 |
82 | if (packStatus === false) {
83 | mediaDatas.push({
84 | name: `🪐 ORION 📺 ${videoquality}`,
85 | title: `${mediaName}\n💾${mediaSize} 👤${seederAmount} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
86 | infoHash: fileHash,
87 | behaviorHints: {
88 | bingeGroup: `orion-torrent-${videoquality}`
89 | }
90 | })
91 | } else if (packStatus === true) {
92 | mediaDatas.push({
93 | name: `🪐 ORION 📺 ${videoquality}`,
94 | title: `${mediaName}\n💾${mediaSize} 👤${seederAmount} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
95 | infoHash: fileHash,
96 | fileIdx: numberepisode-1,
97 | behaviorHints: {
98 | bingeGroup: `orion-torrent-${videoquality}`
99 | }
100 | })
101 | }
102 | }
103 | }
104 | } else if (jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status === "error" && jsonOrionRequest.result.type === "streammissing"){
105 |
106 | params.filepack = true
107 |
108 | try{
109 | responseOrionRequest = await axios({params})
110 | jsonOrionRequest = responseOrionRequest.data
111 | }catch(e){
112 | console.log(e)
113 | }
114 |
115 | if (jsonOrionRequest && jsonOrionRequest.data && jsonOrionRequest.data.streams !== undefined){
116 |
117 | for (let element of jsonOrionRequest.data.streams) {
118 |
119 | let fileHash = element.file.hash
120 | const mediaName = element.file.name
121 | const mediaSize = humanFileSize(element.file.size)
122 | const packStatus = element.file.pack
123 | const mediaSource = element.stream.source
124 |
125 | const seederAmount = element.stream.seeds
126 |
127 | const videoquality = resNameEditor(element.video.quality)
128 |
129 | let audioLang = element.audio.languages.join(" ").toUpperCase() || null
130 | // if (audioLang === "EN") { audioLang = ""}
131 |
132 | const mediaLink = element.links[0]
133 |
134 | const videoCodec = element.video.codec
135 | let audioCh = element.audio.channels
136 | audioCh = audioChannelsNameEditor(audioCh)
137 |
138 | if(fileHash !== null){
139 |
140 | if (packStatus === true) {
141 | mediaDatas.push({
142 | name: `🪐 ORION 📺 ${videoquality}`,
143 | title: `${mediaName}\n💾${mediaSize} 👤${seederAmount} 🎥${videoCodec} 🔊${audioCh}\n👂${audioLang} ☁️${mediaSource}`,
144 | infoHash: fileHash,
145 | fileIdx: numberepisode-1,
146 | behaviorHints: {
147 | bingeGroup: `orion-torrent-${videoquality}`
148 | }
149 | })
150 | }
151 | }
152 | }
153 | }
154 | }
155 |
156 | if(mediaDatas.length > 0 && jsonOrionRequest.result.status !== "error"){
157 | orionCache.set(JSON.stringify(cacheParams), mediaDatas, 15*60) // 15 mins
158 | }
159 |
160 | return mediaDatas
161 | }
162 | }
163 |
164 | module.exports = getSeriesTorrents
--------------------------------------------------------------------------------
/lib/kitsuHandler.js:
--------------------------------------------------------------------------------
1 | const { default: axios } = require('axios');
2 |
3 | async function kitsuHandler(kitsuID){
4 |
5 | const kitsuToIMDBurl = "https://raw.githubusercontent.com/TheBeastLT/stremio-kitsu-anime/master/static/data/imdb_mapping.json"
6 |
7 | let response,responseJSON,imdbResponse,imdbResponseJSON
8 | try{
9 | response = await axios.get(kitsuToIMDBurl)
10 | responseJSON = response.data
11 | }catch(e){
12 | console.log(e)
13 | }
14 |
15 | if (responseJSON[kitsuID] !== undefined){
16 |
17 | const imdbID = responseJSON[kitsuID].imdb_id
18 |
19 | try{
20 | imdbResponse = await axios.get(`https://v2.sg.media-imdb.com/suggestion/t/${imdbID}.json`)
21 | imdbResponseJSON = imdbResponse.data
22 | }catch(e){
23 | console.log(e)
24 | }
25 |
26 | if(imdbResponseJSON.d[0].q === "TV series") {
27 |
28 | const season = responseJSON[kitsuID].fromSeason
29 | const episode = responseJSON[kitsuID].fromEpisode
30 |
31 | return {imdbID, season, episode}
32 |
33 | } else {
34 |
35 | return {imdbID}
36 |
37 | }
38 | }
39 | }
40 |
41 | module.exports = kitsuHandler
--------------------------------------------------------------------------------
/lib/manifest.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | id: "org.community.orion",
3 | version: "1.5.2",
4 | name: "Orion",
5 | logo: "https://orionoid.com/web/images/logo/logo256.png",
6 | background: "https://orionoid.com/web/images/background/banner.jpg",
7 | description: "Orion Stremio Addon, allows Orion-indexed torrent, usenet and hoster links to be played on Stremio. Cached links can be played with RealDebrid, AllDebrid, Debrid-Link, Premiumize or Offcloud. Torrents can be streamed without using any Debrid service. Orion API key is required to use this addon. Get it from panel.orionoid.com",
8 | types: ["movie", "series"],
9 | resources: [
10 | "stream",
11 | "catalog"
12 | ],
13 | catalogs: [
14 | {
15 | id: "orion.movies",
16 | name: "Orion",
17 | type: "movie",
18 | extra: [
19 | {
20 | name: "genre",
21 | options: [
22 | "New Releases",
23 | "Disc Releases",
24 | "Top Rated",
25 | "Must Watch",
26 | "Award Winner",
27 | "Most Popular",
28 | "Now Trending",
29 | "Box Office"
30 | ],
31 | optionsLimit: 16,
32 | isRequired: true
33 | }
34 | ]
35 | },
36 | {
37 | id: "orion.movies-search",
38 | name: "Orion - Movie - Search",
39 | type: "movie",
40 | extra:[
41 | {
42 | name:"search",
43 | optionsLimit: 24,
44 | isRequired: true
45 | }
46 | ]
47 |
48 | },
49 | {
50 | id: "orion.series",
51 | name: "Orion",
52 | type: "series",
53 | extra: [
54 | {
55 | name: "genre",
56 | options: [
57 | "New Seasons",
58 | "New Episodes",
59 | "Top Rated",
60 | "Must Watch",
61 | "Award Winner",
62 | "Most Popular",
63 | "Now Trending",
64 | ],
65 | optionsLimit: 16,
66 | isRequired: true
67 | }
68 | ]
69 | },
70 | {
71 | id: "orion.series-search",
72 | name: "Orion - Series - Search",
73 | type: "series",
74 | extra:[
75 | {
76 | name:"search",
77 | optionsLimit: 24,
78 | isRequired: true
79 | }
80 | ]
81 |
82 | }
83 | ],
84 | idPrefixes: ["tt", "kitsu"],
85 | behaviorHints: {configurable : true, configurationRequired: true }
86 | };
--------------------------------------------------------------------------------
/lib/userStatus.js:
--------------------------------------------------------------------------------
1 | const axios = require('axios').default;
2 | axios.defaults.headers.get["content-type"] = "application/json";
3 | axios.defaults.baseURL = "https://api.orionoid.com";
4 | axios.defaults.timeout = 10000
5 | axios.defaults.method = "GET"
6 |
7 | async function userStatus(keyapp,keyuser){
8 |
9 | const params = {
10 | mode: "user",
11 | action: "retrieve",
12 | keyapp,
13 | keyuser
14 | }
15 |
16 | try{
17 |
18 | const responseOrionRequest = await axios({params})
19 | const jsonOrionRequest = responseOrionRequest.data
20 |
21 | if(jsonOrionRequest && jsonOrionRequest.result && jsonOrionRequest.result.status === "success") {
22 | return jsonOrionRequest.data.subscription.package.type
23 | }
24 |
25 | }catch(e){
26 | console.log(e)
27 | return "free"
28 | }
29 |
30 | }
31 | module.exports = userStatus
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "orion",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "orion",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "axios": "^0.27.2",
13 | "dotenv": "^8.6.0",
14 | "ejs": "^3.1.6",
15 | "express": "^4.17.1",
16 | "node-cache": "^5.1.2",
17 | "path": "^0.12.7",
18 | "request-ip": "^2.1.3",
19 | "uuid": "^9.0.0"
20 | },
21 | "engines": {
22 | "node": "14.16.0",
23 | "npm": "7.21.1"
24 | }
25 | },
26 | "node_modules/accepts": {
27 | "version": "1.3.8",
28 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
29 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
30 | "dependencies": {
31 | "mime-types": "~2.1.34",
32 | "negotiator": "0.6.3"
33 | },
34 | "engines": {
35 | "node": ">= 0.6"
36 | }
37 | },
38 | "node_modules/ansi-styles": {
39 | "version": "4.3.0",
40 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
41 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
42 | "dependencies": {
43 | "color-convert": "^2.0.1"
44 | },
45 | "engines": {
46 | "node": ">=8"
47 | },
48 | "funding": {
49 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
50 | }
51 | },
52 | "node_modules/array-flatten": {
53 | "version": "1.1.1",
54 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
55 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
56 | },
57 | "node_modules/async": {
58 | "version": "3.2.4",
59 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
60 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
61 | },
62 | "node_modules/asynckit": {
63 | "version": "0.4.0",
64 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
65 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
66 | },
67 | "node_modules/axios": {
68 | "version": "0.27.2",
69 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
70 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
71 | "dependencies": {
72 | "follow-redirects": "^1.14.9",
73 | "form-data": "^4.0.0"
74 | }
75 | },
76 | "node_modules/balanced-match": {
77 | "version": "1.0.2",
78 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
79 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
80 | },
81 | "node_modules/body-parser": {
82 | "version": "1.20.1",
83 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
84 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
85 | "dependencies": {
86 | "bytes": "3.1.2",
87 | "content-type": "~1.0.4",
88 | "debug": "2.6.9",
89 | "depd": "2.0.0",
90 | "destroy": "1.2.0",
91 | "http-errors": "2.0.0",
92 | "iconv-lite": "0.4.24",
93 | "on-finished": "2.4.1",
94 | "qs": "6.11.0",
95 | "raw-body": "2.5.1",
96 | "type-is": "~1.6.18",
97 | "unpipe": "1.0.0"
98 | },
99 | "engines": {
100 | "node": ">= 0.8",
101 | "npm": "1.2.8000 || >= 1.4.16"
102 | }
103 | },
104 | "node_modules/brace-expansion": {
105 | "version": "1.1.11",
106 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
107 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
108 | "dependencies": {
109 | "balanced-match": "^1.0.0",
110 | "concat-map": "0.0.1"
111 | }
112 | },
113 | "node_modules/bytes": {
114 | "version": "3.1.2",
115 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
116 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
117 | "engines": {
118 | "node": ">= 0.8"
119 | }
120 | },
121 | "node_modules/call-bind": {
122 | "version": "1.0.2",
123 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
124 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
125 | "dependencies": {
126 | "function-bind": "^1.1.1",
127 | "get-intrinsic": "^1.0.2"
128 | },
129 | "funding": {
130 | "url": "https://github.com/sponsors/ljharb"
131 | }
132 | },
133 | "node_modules/chalk": {
134 | "version": "4.1.2",
135 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
136 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
137 | "dependencies": {
138 | "ansi-styles": "^4.1.0",
139 | "supports-color": "^7.1.0"
140 | },
141 | "engines": {
142 | "node": ">=10"
143 | },
144 | "funding": {
145 | "url": "https://github.com/chalk/chalk?sponsor=1"
146 | }
147 | },
148 | "node_modules/clone": {
149 | "version": "2.1.2",
150 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
151 | "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
152 | "engines": {
153 | "node": ">=0.8"
154 | }
155 | },
156 | "node_modules/color-convert": {
157 | "version": "2.0.1",
158 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
159 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
160 | "dependencies": {
161 | "color-name": "~1.1.4"
162 | },
163 | "engines": {
164 | "node": ">=7.0.0"
165 | }
166 | },
167 | "node_modules/color-name": {
168 | "version": "1.1.4",
169 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
170 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
171 | },
172 | "node_modules/combined-stream": {
173 | "version": "1.0.8",
174 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
175 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
176 | "dependencies": {
177 | "delayed-stream": "~1.0.0"
178 | },
179 | "engines": {
180 | "node": ">= 0.8"
181 | }
182 | },
183 | "node_modules/concat-map": {
184 | "version": "0.0.1",
185 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
186 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
187 | },
188 | "node_modules/content-disposition": {
189 | "version": "0.5.4",
190 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
191 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
192 | "dependencies": {
193 | "safe-buffer": "5.2.1"
194 | },
195 | "engines": {
196 | "node": ">= 0.6"
197 | }
198 | },
199 | "node_modules/content-type": {
200 | "version": "1.0.4",
201 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
202 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
203 | "engines": {
204 | "node": ">= 0.6"
205 | }
206 | },
207 | "node_modules/cookie": {
208 | "version": "0.5.0",
209 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
210 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
211 | "engines": {
212 | "node": ">= 0.6"
213 | }
214 | },
215 | "node_modules/cookie-signature": {
216 | "version": "1.0.6",
217 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
218 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
219 | },
220 | "node_modules/debug": {
221 | "version": "2.6.9",
222 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
223 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
224 | "dependencies": {
225 | "ms": "2.0.0"
226 | }
227 | },
228 | "node_modules/delayed-stream": {
229 | "version": "1.0.0",
230 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
231 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
232 | "engines": {
233 | "node": ">=0.4.0"
234 | }
235 | },
236 | "node_modules/depd": {
237 | "version": "2.0.0",
238 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
239 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
240 | "engines": {
241 | "node": ">= 0.8"
242 | }
243 | },
244 | "node_modules/destroy": {
245 | "version": "1.2.0",
246 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
247 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
248 | "engines": {
249 | "node": ">= 0.8",
250 | "npm": "1.2.8000 || >= 1.4.16"
251 | }
252 | },
253 | "node_modules/dotenv": {
254 | "version": "8.6.0",
255 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
256 | "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
257 | "engines": {
258 | "node": ">=10"
259 | }
260 | },
261 | "node_modules/ee-first": {
262 | "version": "1.1.1",
263 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
264 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
265 | },
266 | "node_modules/ejs": {
267 | "version": "3.1.8",
268 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
269 | "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
270 | "dependencies": {
271 | "jake": "^10.8.5"
272 | },
273 | "bin": {
274 | "ejs": "bin/cli.js"
275 | },
276 | "engines": {
277 | "node": ">=0.10.0"
278 | }
279 | },
280 | "node_modules/encodeurl": {
281 | "version": "1.0.2",
282 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
283 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
284 | "engines": {
285 | "node": ">= 0.8"
286 | }
287 | },
288 | "node_modules/escape-html": {
289 | "version": "1.0.3",
290 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
291 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
292 | },
293 | "node_modules/etag": {
294 | "version": "1.8.1",
295 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
296 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
297 | "engines": {
298 | "node": ">= 0.6"
299 | }
300 | },
301 | "node_modules/express": {
302 | "version": "4.18.2",
303 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
304 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
305 | "dependencies": {
306 | "accepts": "~1.3.8",
307 | "array-flatten": "1.1.1",
308 | "body-parser": "1.20.1",
309 | "content-disposition": "0.5.4",
310 | "content-type": "~1.0.4",
311 | "cookie": "0.5.0",
312 | "cookie-signature": "1.0.6",
313 | "debug": "2.6.9",
314 | "depd": "2.0.0",
315 | "encodeurl": "~1.0.2",
316 | "escape-html": "~1.0.3",
317 | "etag": "~1.8.1",
318 | "finalhandler": "1.2.0",
319 | "fresh": "0.5.2",
320 | "http-errors": "2.0.0",
321 | "merge-descriptors": "1.0.1",
322 | "methods": "~1.1.2",
323 | "on-finished": "2.4.1",
324 | "parseurl": "~1.3.3",
325 | "path-to-regexp": "0.1.7",
326 | "proxy-addr": "~2.0.7",
327 | "qs": "6.11.0",
328 | "range-parser": "~1.2.1",
329 | "safe-buffer": "5.2.1",
330 | "send": "0.18.0",
331 | "serve-static": "1.15.0",
332 | "setprototypeof": "1.2.0",
333 | "statuses": "2.0.1",
334 | "type-is": "~1.6.18",
335 | "utils-merge": "1.0.1",
336 | "vary": "~1.1.2"
337 | },
338 | "engines": {
339 | "node": ">= 0.10.0"
340 | }
341 | },
342 | "node_modules/filelist": {
343 | "version": "1.0.4",
344 | "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
345 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
346 | "dependencies": {
347 | "minimatch": "^5.0.1"
348 | }
349 | },
350 | "node_modules/filelist/node_modules/brace-expansion": {
351 | "version": "2.0.1",
352 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
353 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
354 | "dependencies": {
355 | "balanced-match": "^1.0.0"
356 | }
357 | },
358 | "node_modules/filelist/node_modules/minimatch": {
359 | "version": "5.1.2",
360 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
361 | "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
362 | "dependencies": {
363 | "brace-expansion": "^2.0.1"
364 | },
365 | "engines": {
366 | "node": ">=10"
367 | }
368 | },
369 | "node_modules/finalhandler": {
370 | "version": "1.2.0",
371 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
372 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
373 | "dependencies": {
374 | "debug": "2.6.9",
375 | "encodeurl": "~1.0.2",
376 | "escape-html": "~1.0.3",
377 | "on-finished": "2.4.1",
378 | "parseurl": "~1.3.3",
379 | "statuses": "2.0.1",
380 | "unpipe": "~1.0.0"
381 | },
382 | "engines": {
383 | "node": ">= 0.8"
384 | }
385 | },
386 | "node_modules/follow-redirects": {
387 | "version": "1.15.2",
388 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
389 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
390 | "funding": [
391 | {
392 | "type": "individual",
393 | "url": "https://github.com/sponsors/RubenVerborgh"
394 | }
395 | ],
396 | "engines": {
397 | "node": ">=4.0"
398 | },
399 | "peerDependenciesMeta": {
400 | "debug": {
401 | "optional": true
402 | }
403 | }
404 | },
405 | "node_modules/form-data": {
406 | "version": "4.0.0",
407 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
408 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
409 | "dependencies": {
410 | "asynckit": "^0.4.0",
411 | "combined-stream": "^1.0.8",
412 | "mime-types": "^2.1.12"
413 | },
414 | "engines": {
415 | "node": ">= 6"
416 | }
417 | },
418 | "node_modules/forwarded": {
419 | "version": "0.2.0",
420 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
421 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
422 | "engines": {
423 | "node": ">= 0.6"
424 | }
425 | },
426 | "node_modules/fresh": {
427 | "version": "0.5.2",
428 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
429 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
430 | "engines": {
431 | "node": ">= 0.6"
432 | }
433 | },
434 | "node_modules/function-bind": {
435 | "version": "1.1.1",
436 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
437 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
438 | },
439 | "node_modules/get-intrinsic": {
440 | "version": "1.1.3",
441 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
442 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
443 | "dependencies": {
444 | "function-bind": "^1.1.1",
445 | "has": "^1.0.3",
446 | "has-symbols": "^1.0.3"
447 | },
448 | "funding": {
449 | "url": "https://github.com/sponsors/ljharb"
450 | }
451 | },
452 | "node_modules/has": {
453 | "version": "1.0.3",
454 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
455 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
456 | "dependencies": {
457 | "function-bind": "^1.1.1"
458 | },
459 | "engines": {
460 | "node": ">= 0.4.0"
461 | }
462 | },
463 | "node_modules/has-flag": {
464 | "version": "4.0.0",
465 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
466 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
467 | "engines": {
468 | "node": ">=8"
469 | }
470 | },
471 | "node_modules/has-symbols": {
472 | "version": "1.0.3",
473 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
474 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
475 | "engines": {
476 | "node": ">= 0.4"
477 | },
478 | "funding": {
479 | "url": "https://github.com/sponsors/ljharb"
480 | }
481 | },
482 | "node_modules/http-errors": {
483 | "version": "2.0.0",
484 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
485 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
486 | "dependencies": {
487 | "depd": "2.0.0",
488 | "inherits": "2.0.4",
489 | "setprototypeof": "1.2.0",
490 | "statuses": "2.0.1",
491 | "toidentifier": "1.0.1"
492 | },
493 | "engines": {
494 | "node": ">= 0.8"
495 | }
496 | },
497 | "node_modules/iconv-lite": {
498 | "version": "0.4.24",
499 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
500 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
501 | "dependencies": {
502 | "safer-buffer": ">= 2.1.2 < 3"
503 | },
504 | "engines": {
505 | "node": ">=0.10.0"
506 | }
507 | },
508 | "node_modules/inherits": {
509 | "version": "2.0.4",
510 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
511 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
512 | },
513 | "node_modules/ipaddr.js": {
514 | "version": "1.9.1",
515 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
516 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
517 | "engines": {
518 | "node": ">= 0.10"
519 | }
520 | },
521 | "node_modules/is_js": {
522 | "version": "0.9.0",
523 | "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz",
524 | "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg=="
525 | },
526 | "node_modules/jake": {
527 | "version": "10.8.5",
528 | "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
529 | "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
530 | "dependencies": {
531 | "async": "^3.2.3",
532 | "chalk": "^4.0.2",
533 | "filelist": "^1.0.1",
534 | "minimatch": "^3.0.4"
535 | },
536 | "bin": {
537 | "jake": "bin/cli.js"
538 | },
539 | "engines": {
540 | "node": ">=10"
541 | }
542 | },
543 | "node_modules/media-typer": {
544 | "version": "0.3.0",
545 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
546 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
547 | "engines": {
548 | "node": ">= 0.6"
549 | }
550 | },
551 | "node_modules/merge-descriptors": {
552 | "version": "1.0.1",
553 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
554 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
555 | },
556 | "node_modules/methods": {
557 | "version": "1.1.2",
558 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
559 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
560 | "engines": {
561 | "node": ">= 0.6"
562 | }
563 | },
564 | "node_modules/mime": {
565 | "version": "1.6.0",
566 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
567 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
568 | "bin": {
569 | "mime": "cli.js"
570 | },
571 | "engines": {
572 | "node": ">=4"
573 | }
574 | },
575 | "node_modules/mime-db": {
576 | "version": "1.52.0",
577 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
578 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
579 | "engines": {
580 | "node": ">= 0.6"
581 | }
582 | },
583 | "node_modules/mime-types": {
584 | "version": "2.1.35",
585 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
586 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
587 | "dependencies": {
588 | "mime-db": "1.52.0"
589 | },
590 | "engines": {
591 | "node": ">= 0.6"
592 | }
593 | },
594 | "node_modules/minimatch": {
595 | "version": "3.1.2",
596 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
597 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
598 | "dependencies": {
599 | "brace-expansion": "^1.1.7"
600 | },
601 | "engines": {
602 | "node": "*"
603 | }
604 | },
605 | "node_modules/ms": {
606 | "version": "2.0.0",
607 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
608 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
609 | },
610 | "node_modules/negotiator": {
611 | "version": "0.6.3",
612 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
613 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
614 | "engines": {
615 | "node": ">= 0.6"
616 | }
617 | },
618 | "node_modules/node-cache": {
619 | "version": "5.1.2",
620 | "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
621 | "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
622 | "dependencies": {
623 | "clone": "2.x"
624 | },
625 | "engines": {
626 | "node": ">= 8.0.0"
627 | }
628 | },
629 | "node_modules/object-inspect": {
630 | "version": "1.12.2",
631 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
632 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
633 | "funding": {
634 | "url": "https://github.com/sponsors/ljharb"
635 | }
636 | },
637 | "node_modules/on-finished": {
638 | "version": "2.4.1",
639 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
640 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
641 | "dependencies": {
642 | "ee-first": "1.1.1"
643 | },
644 | "engines": {
645 | "node": ">= 0.8"
646 | }
647 | },
648 | "node_modules/parseurl": {
649 | "version": "1.3.3",
650 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
651 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
652 | "engines": {
653 | "node": ">= 0.8"
654 | }
655 | },
656 | "node_modules/path": {
657 | "version": "0.12.7",
658 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
659 | "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==",
660 | "dependencies": {
661 | "process": "^0.11.1",
662 | "util": "^0.10.3"
663 | }
664 | },
665 | "node_modules/path-to-regexp": {
666 | "version": "0.1.7",
667 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
668 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
669 | },
670 | "node_modules/process": {
671 | "version": "0.11.10",
672 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
673 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
674 | "engines": {
675 | "node": ">= 0.6.0"
676 | }
677 | },
678 | "node_modules/proxy-addr": {
679 | "version": "2.0.7",
680 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
681 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
682 | "dependencies": {
683 | "forwarded": "0.2.0",
684 | "ipaddr.js": "1.9.1"
685 | },
686 | "engines": {
687 | "node": ">= 0.10"
688 | }
689 | },
690 | "node_modules/qs": {
691 | "version": "6.11.0",
692 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
693 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
694 | "dependencies": {
695 | "side-channel": "^1.0.4"
696 | },
697 | "engines": {
698 | "node": ">=0.6"
699 | },
700 | "funding": {
701 | "url": "https://github.com/sponsors/ljharb"
702 | }
703 | },
704 | "node_modules/range-parser": {
705 | "version": "1.2.1",
706 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
707 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
708 | "engines": {
709 | "node": ">= 0.6"
710 | }
711 | },
712 | "node_modules/raw-body": {
713 | "version": "2.5.1",
714 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
715 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
716 | "dependencies": {
717 | "bytes": "3.1.2",
718 | "http-errors": "2.0.0",
719 | "iconv-lite": "0.4.24",
720 | "unpipe": "1.0.0"
721 | },
722 | "engines": {
723 | "node": ">= 0.8"
724 | }
725 | },
726 | "node_modules/request-ip": {
727 | "version": "2.2.0",
728 | "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-2.2.0.tgz",
729 | "integrity": "sha512-Hn4zUAr+XHbUs2RrfHur62t7+UhvtevqK32ordFewguEfNHUkhSdYgbG7PDGmXZEzqEXll9bei0+VMe6gkmuUQ==",
730 | "dependencies": {
731 | "is_js": "^0.9.0"
732 | }
733 | },
734 | "node_modules/safe-buffer": {
735 | "version": "5.2.1",
736 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
737 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
738 | "funding": [
739 | {
740 | "type": "github",
741 | "url": "https://github.com/sponsors/feross"
742 | },
743 | {
744 | "type": "patreon",
745 | "url": "https://www.patreon.com/feross"
746 | },
747 | {
748 | "type": "consulting",
749 | "url": "https://feross.org/support"
750 | }
751 | ]
752 | },
753 | "node_modules/safer-buffer": {
754 | "version": "2.1.2",
755 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
756 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
757 | },
758 | "node_modules/send": {
759 | "version": "0.18.0",
760 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
761 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
762 | "dependencies": {
763 | "debug": "2.6.9",
764 | "depd": "2.0.0",
765 | "destroy": "1.2.0",
766 | "encodeurl": "~1.0.2",
767 | "escape-html": "~1.0.3",
768 | "etag": "~1.8.1",
769 | "fresh": "0.5.2",
770 | "http-errors": "2.0.0",
771 | "mime": "1.6.0",
772 | "ms": "2.1.3",
773 | "on-finished": "2.4.1",
774 | "range-parser": "~1.2.1",
775 | "statuses": "2.0.1"
776 | },
777 | "engines": {
778 | "node": ">= 0.8.0"
779 | }
780 | },
781 | "node_modules/send/node_modules/ms": {
782 | "version": "2.1.3",
783 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
784 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
785 | },
786 | "node_modules/serve-static": {
787 | "version": "1.15.0",
788 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
789 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
790 | "dependencies": {
791 | "encodeurl": "~1.0.2",
792 | "escape-html": "~1.0.3",
793 | "parseurl": "~1.3.3",
794 | "send": "0.18.0"
795 | },
796 | "engines": {
797 | "node": ">= 0.8.0"
798 | }
799 | },
800 | "node_modules/setprototypeof": {
801 | "version": "1.2.0",
802 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
803 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
804 | },
805 | "node_modules/side-channel": {
806 | "version": "1.0.4",
807 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
808 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
809 | "dependencies": {
810 | "call-bind": "^1.0.0",
811 | "get-intrinsic": "^1.0.2",
812 | "object-inspect": "^1.9.0"
813 | },
814 | "funding": {
815 | "url": "https://github.com/sponsors/ljharb"
816 | }
817 | },
818 | "node_modules/statuses": {
819 | "version": "2.0.1",
820 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
821 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
822 | "engines": {
823 | "node": ">= 0.8"
824 | }
825 | },
826 | "node_modules/supports-color": {
827 | "version": "7.2.0",
828 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
829 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
830 | "dependencies": {
831 | "has-flag": "^4.0.0"
832 | },
833 | "engines": {
834 | "node": ">=8"
835 | }
836 | },
837 | "node_modules/toidentifier": {
838 | "version": "1.0.1",
839 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
840 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
841 | "engines": {
842 | "node": ">=0.6"
843 | }
844 | },
845 | "node_modules/type-is": {
846 | "version": "1.6.18",
847 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
848 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
849 | "dependencies": {
850 | "media-typer": "0.3.0",
851 | "mime-types": "~2.1.24"
852 | },
853 | "engines": {
854 | "node": ">= 0.6"
855 | }
856 | },
857 | "node_modules/unpipe": {
858 | "version": "1.0.0",
859 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
860 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
861 | "engines": {
862 | "node": ">= 0.8"
863 | }
864 | },
865 | "node_modules/util": {
866 | "version": "0.10.4",
867 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
868 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
869 | "dependencies": {
870 | "inherits": "2.0.3"
871 | }
872 | },
873 | "node_modules/util/node_modules/inherits": {
874 | "version": "2.0.3",
875 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
876 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
877 | },
878 | "node_modules/utils-merge": {
879 | "version": "1.0.1",
880 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
881 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
882 | "engines": {
883 | "node": ">= 0.4.0"
884 | }
885 | },
886 | "node_modules/uuid": {
887 | "version": "9.0.0",
888 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
889 | "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
890 | "bin": {
891 | "uuid": "dist/bin/uuid"
892 | }
893 | },
894 | "node_modules/vary": {
895 | "version": "1.1.2",
896 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
897 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
898 | "engines": {
899 | "node": ">= 0.8"
900 | }
901 | }
902 | },
903 | "dependencies": {
904 | "accepts": {
905 | "version": "1.3.8",
906 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
907 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
908 | "requires": {
909 | "mime-types": "~2.1.34",
910 | "negotiator": "0.6.3"
911 | }
912 | },
913 | "ansi-styles": {
914 | "version": "4.3.0",
915 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
916 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
917 | "requires": {
918 | "color-convert": "^2.0.1"
919 | }
920 | },
921 | "array-flatten": {
922 | "version": "1.1.1",
923 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
924 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
925 | },
926 | "async": {
927 | "version": "3.2.4",
928 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
929 | "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
930 | },
931 | "asynckit": {
932 | "version": "0.4.0",
933 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
934 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
935 | },
936 | "axios": {
937 | "version": "0.27.2",
938 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
939 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
940 | "requires": {
941 | "follow-redirects": "^1.14.9",
942 | "form-data": "^4.0.0"
943 | }
944 | },
945 | "balanced-match": {
946 | "version": "1.0.2",
947 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
948 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
949 | },
950 | "body-parser": {
951 | "version": "1.20.1",
952 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
953 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
954 | "requires": {
955 | "bytes": "3.1.2",
956 | "content-type": "~1.0.4",
957 | "debug": "2.6.9",
958 | "depd": "2.0.0",
959 | "destroy": "1.2.0",
960 | "http-errors": "2.0.0",
961 | "iconv-lite": "0.4.24",
962 | "on-finished": "2.4.1",
963 | "qs": "6.11.0",
964 | "raw-body": "2.5.1",
965 | "type-is": "~1.6.18",
966 | "unpipe": "1.0.0"
967 | }
968 | },
969 | "brace-expansion": {
970 | "version": "1.1.11",
971 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
972 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
973 | "requires": {
974 | "balanced-match": "^1.0.0",
975 | "concat-map": "0.0.1"
976 | }
977 | },
978 | "bytes": {
979 | "version": "3.1.2",
980 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
981 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
982 | },
983 | "call-bind": {
984 | "version": "1.0.2",
985 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
986 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
987 | "requires": {
988 | "function-bind": "^1.1.1",
989 | "get-intrinsic": "^1.0.2"
990 | }
991 | },
992 | "chalk": {
993 | "version": "4.1.2",
994 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
995 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
996 | "requires": {
997 | "ansi-styles": "^4.1.0",
998 | "supports-color": "^7.1.0"
999 | }
1000 | },
1001 | "clone": {
1002 | "version": "2.1.2",
1003 | "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
1004 | "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
1005 | },
1006 | "color-convert": {
1007 | "version": "2.0.1",
1008 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1009 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1010 | "requires": {
1011 | "color-name": "~1.1.4"
1012 | }
1013 | },
1014 | "color-name": {
1015 | "version": "1.1.4",
1016 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1017 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
1018 | },
1019 | "combined-stream": {
1020 | "version": "1.0.8",
1021 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1022 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1023 | "requires": {
1024 | "delayed-stream": "~1.0.0"
1025 | }
1026 | },
1027 | "concat-map": {
1028 | "version": "0.0.1",
1029 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1030 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
1031 | },
1032 | "content-disposition": {
1033 | "version": "0.5.4",
1034 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
1035 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
1036 | "requires": {
1037 | "safe-buffer": "5.2.1"
1038 | }
1039 | },
1040 | "content-type": {
1041 | "version": "1.0.4",
1042 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1043 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
1044 | },
1045 | "cookie": {
1046 | "version": "0.5.0",
1047 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1048 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
1049 | },
1050 | "cookie-signature": {
1051 | "version": "1.0.6",
1052 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1053 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
1054 | },
1055 | "debug": {
1056 | "version": "2.6.9",
1057 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1058 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1059 | "requires": {
1060 | "ms": "2.0.0"
1061 | }
1062 | },
1063 | "delayed-stream": {
1064 | "version": "1.0.0",
1065 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1066 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
1067 | },
1068 | "depd": {
1069 | "version": "2.0.0",
1070 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1071 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1072 | },
1073 | "destroy": {
1074 | "version": "1.2.0",
1075 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
1076 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
1077 | },
1078 | "dotenv": {
1079 | "version": "8.6.0",
1080 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
1081 | "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="
1082 | },
1083 | "ee-first": {
1084 | "version": "1.1.1",
1085 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1086 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
1087 | },
1088 | "ejs": {
1089 | "version": "3.1.8",
1090 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
1091 | "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
1092 | "requires": {
1093 | "jake": "^10.8.5"
1094 | }
1095 | },
1096 | "encodeurl": {
1097 | "version": "1.0.2",
1098 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1099 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
1100 | },
1101 | "escape-html": {
1102 | "version": "1.0.3",
1103 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1104 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1105 | },
1106 | "etag": {
1107 | "version": "1.8.1",
1108 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1109 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
1110 | },
1111 | "express": {
1112 | "version": "4.18.2",
1113 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
1114 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
1115 | "requires": {
1116 | "accepts": "~1.3.8",
1117 | "array-flatten": "1.1.1",
1118 | "body-parser": "1.20.1",
1119 | "content-disposition": "0.5.4",
1120 | "content-type": "~1.0.4",
1121 | "cookie": "0.5.0",
1122 | "cookie-signature": "1.0.6",
1123 | "debug": "2.6.9",
1124 | "depd": "2.0.0",
1125 | "encodeurl": "~1.0.2",
1126 | "escape-html": "~1.0.3",
1127 | "etag": "~1.8.1",
1128 | "finalhandler": "1.2.0",
1129 | "fresh": "0.5.2",
1130 | "http-errors": "2.0.0",
1131 | "merge-descriptors": "1.0.1",
1132 | "methods": "~1.1.2",
1133 | "on-finished": "2.4.1",
1134 | "parseurl": "~1.3.3",
1135 | "path-to-regexp": "0.1.7",
1136 | "proxy-addr": "~2.0.7",
1137 | "qs": "6.11.0",
1138 | "range-parser": "~1.2.1",
1139 | "safe-buffer": "5.2.1",
1140 | "send": "0.18.0",
1141 | "serve-static": "1.15.0",
1142 | "setprototypeof": "1.2.0",
1143 | "statuses": "2.0.1",
1144 | "type-is": "~1.6.18",
1145 | "utils-merge": "1.0.1",
1146 | "vary": "~1.1.2"
1147 | }
1148 | },
1149 | "filelist": {
1150 | "version": "1.0.4",
1151 | "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
1152 | "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
1153 | "requires": {
1154 | "minimatch": "^5.0.1"
1155 | },
1156 | "dependencies": {
1157 | "brace-expansion": {
1158 | "version": "2.0.1",
1159 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1160 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1161 | "requires": {
1162 | "balanced-match": "^1.0.0"
1163 | }
1164 | },
1165 | "minimatch": {
1166 | "version": "5.1.2",
1167 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
1168 | "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
1169 | "requires": {
1170 | "brace-expansion": "^2.0.1"
1171 | }
1172 | }
1173 | }
1174 | },
1175 | "finalhandler": {
1176 | "version": "1.2.0",
1177 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
1178 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1179 | "requires": {
1180 | "debug": "2.6.9",
1181 | "encodeurl": "~1.0.2",
1182 | "escape-html": "~1.0.3",
1183 | "on-finished": "2.4.1",
1184 | "parseurl": "~1.3.3",
1185 | "statuses": "2.0.1",
1186 | "unpipe": "~1.0.0"
1187 | }
1188 | },
1189 | "follow-redirects": {
1190 | "version": "1.15.2",
1191 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
1192 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
1193 | },
1194 | "form-data": {
1195 | "version": "4.0.0",
1196 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
1197 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
1198 | "requires": {
1199 | "asynckit": "^0.4.0",
1200 | "combined-stream": "^1.0.8",
1201 | "mime-types": "^2.1.12"
1202 | }
1203 | },
1204 | "forwarded": {
1205 | "version": "0.2.0",
1206 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1207 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1208 | },
1209 | "fresh": {
1210 | "version": "0.5.2",
1211 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1212 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1213 | },
1214 | "function-bind": {
1215 | "version": "1.1.1",
1216 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1217 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1218 | },
1219 | "get-intrinsic": {
1220 | "version": "1.1.3",
1221 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
1222 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
1223 | "requires": {
1224 | "function-bind": "^1.1.1",
1225 | "has": "^1.0.3",
1226 | "has-symbols": "^1.0.3"
1227 | }
1228 | },
1229 | "has": {
1230 | "version": "1.0.3",
1231 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1232 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1233 | "requires": {
1234 | "function-bind": "^1.1.1"
1235 | }
1236 | },
1237 | "has-flag": {
1238 | "version": "4.0.0",
1239 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1240 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
1241 | },
1242 | "has-symbols": {
1243 | "version": "1.0.3",
1244 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1245 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1246 | },
1247 | "http-errors": {
1248 | "version": "2.0.0",
1249 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1250 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1251 | "requires": {
1252 | "depd": "2.0.0",
1253 | "inherits": "2.0.4",
1254 | "setprototypeof": "1.2.0",
1255 | "statuses": "2.0.1",
1256 | "toidentifier": "1.0.1"
1257 | }
1258 | },
1259 | "iconv-lite": {
1260 | "version": "0.4.24",
1261 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1262 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1263 | "requires": {
1264 | "safer-buffer": ">= 2.1.2 < 3"
1265 | }
1266 | },
1267 | "inherits": {
1268 | "version": "2.0.4",
1269 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1270 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1271 | },
1272 | "ipaddr.js": {
1273 | "version": "1.9.1",
1274 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1275 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1276 | },
1277 | "is_js": {
1278 | "version": "0.9.0",
1279 | "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz",
1280 | "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg=="
1281 | },
1282 | "jake": {
1283 | "version": "10.8.5",
1284 | "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
1285 | "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
1286 | "requires": {
1287 | "async": "^3.2.3",
1288 | "chalk": "^4.0.2",
1289 | "filelist": "^1.0.1",
1290 | "minimatch": "^3.0.4"
1291 | }
1292 | },
1293 | "media-typer": {
1294 | "version": "0.3.0",
1295 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1296 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1297 | },
1298 | "merge-descriptors": {
1299 | "version": "1.0.1",
1300 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1301 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
1302 | },
1303 | "methods": {
1304 | "version": "1.1.2",
1305 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1306 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
1307 | },
1308 | "mime": {
1309 | "version": "1.6.0",
1310 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1311 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1312 | },
1313 | "mime-db": {
1314 | "version": "1.52.0",
1315 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1316 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1317 | },
1318 | "mime-types": {
1319 | "version": "2.1.35",
1320 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1321 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1322 | "requires": {
1323 | "mime-db": "1.52.0"
1324 | }
1325 | },
1326 | "minimatch": {
1327 | "version": "3.1.2",
1328 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1329 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1330 | "requires": {
1331 | "brace-expansion": "^1.1.7"
1332 | }
1333 | },
1334 | "ms": {
1335 | "version": "2.0.0",
1336 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1337 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1338 | },
1339 | "negotiator": {
1340 | "version": "0.6.3",
1341 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1342 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1343 | },
1344 | "node-cache": {
1345 | "version": "5.1.2",
1346 | "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
1347 | "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
1348 | "requires": {
1349 | "clone": "2.x"
1350 | }
1351 | },
1352 | "object-inspect": {
1353 | "version": "1.12.2",
1354 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1355 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1356 | },
1357 | "on-finished": {
1358 | "version": "2.4.1",
1359 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1360 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1361 | "requires": {
1362 | "ee-first": "1.1.1"
1363 | }
1364 | },
1365 | "parseurl": {
1366 | "version": "1.3.3",
1367 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1368 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1369 | },
1370 | "path": {
1371 | "version": "0.12.7",
1372 | "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
1373 | "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==",
1374 | "requires": {
1375 | "process": "^0.11.1",
1376 | "util": "^0.10.3"
1377 | }
1378 | },
1379 | "path-to-regexp": {
1380 | "version": "0.1.7",
1381 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1382 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1383 | },
1384 | "process": {
1385 | "version": "0.11.10",
1386 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
1387 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
1388 | },
1389 | "proxy-addr": {
1390 | "version": "2.0.7",
1391 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1392 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1393 | "requires": {
1394 | "forwarded": "0.2.0",
1395 | "ipaddr.js": "1.9.1"
1396 | }
1397 | },
1398 | "qs": {
1399 | "version": "6.11.0",
1400 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1401 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1402 | "requires": {
1403 | "side-channel": "^1.0.4"
1404 | }
1405 | },
1406 | "range-parser": {
1407 | "version": "1.2.1",
1408 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1409 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1410 | },
1411 | "raw-body": {
1412 | "version": "2.5.1",
1413 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1414 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1415 | "requires": {
1416 | "bytes": "3.1.2",
1417 | "http-errors": "2.0.0",
1418 | "iconv-lite": "0.4.24",
1419 | "unpipe": "1.0.0"
1420 | }
1421 | },
1422 | "request-ip": {
1423 | "version": "2.2.0",
1424 | "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-2.2.0.tgz",
1425 | "integrity": "sha512-Hn4zUAr+XHbUs2RrfHur62t7+UhvtevqK32ordFewguEfNHUkhSdYgbG7PDGmXZEzqEXll9bei0+VMe6gkmuUQ==",
1426 | "requires": {
1427 | "is_js": "^0.9.0"
1428 | }
1429 | },
1430 | "safe-buffer": {
1431 | "version": "5.2.1",
1432 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1433 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1434 | },
1435 | "safer-buffer": {
1436 | "version": "2.1.2",
1437 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1438 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1439 | },
1440 | "send": {
1441 | "version": "0.18.0",
1442 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1443 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1444 | "requires": {
1445 | "debug": "2.6.9",
1446 | "depd": "2.0.0",
1447 | "destroy": "1.2.0",
1448 | "encodeurl": "~1.0.2",
1449 | "escape-html": "~1.0.3",
1450 | "etag": "~1.8.1",
1451 | "fresh": "0.5.2",
1452 | "http-errors": "2.0.0",
1453 | "mime": "1.6.0",
1454 | "ms": "2.1.3",
1455 | "on-finished": "2.4.1",
1456 | "range-parser": "~1.2.1",
1457 | "statuses": "2.0.1"
1458 | },
1459 | "dependencies": {
1460 | "ms": {
1461 | "version": "2.1.3",
1462 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1463 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1464 | }
1465 | }
1466 | },
1467 | "serve-static": {
1468 | "version": "1.15.0",
1469 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1470 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1471 | "requires": {
1472 | "encodeurl": "~1.0.2",
1473 | "escape-html": "~1.0.3",
1474 | "parseurl": "~1.3.3",
1475 | "send": "0.18.0"
1476 | }
1477 | },
1478 | "setprototypeof": {
1479 | "version": "1.2.0",
1480 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1481 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1482 | },
1483 | "side-channel": {
1484 | "version": "1.0.4",
1485 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1486 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1487 | "requires": {
1488 | "call-bind": "^1.0.0",
1489 | "get-intrinsic": "^1.0.2",
1490 | "object-inspect": "^1.9.0"
1491 | }
1492 | },
1493 | "statuses": {
1494 | "version": "2.0.1",
1495 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1496 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1497 | },
1498 | "supports-color": {
1499 | "version": "7.2.0",
1500 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1501 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1502 | "requires": {
1503 | "has-flag": "^4.0.0"
1504 | }
1505 | },
1506 | "toidentifier": {
1507 | "version": "1.0.1",
1508 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1509 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1510 | },
1511 | "type-is": {
1512 | "version": "1.6.18",
1513 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1514 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1515 | "requires": {
1516 | "media-typer": "0.3.0",
1517 | "mime-types": "~2.1.24"
1518 | }
1519 | },
1520 | "unpipe": {
1521 | "version": "1.0.0",
1522 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1523 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
1524 | },
1525 | "util": {
1526 | "version": "0.10.4",
1527 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
1528 | "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
1529 | "requires": {
1530 | "inherits": "2.0.3"
1531 | },
1532 | "dependencies": {
1533 | "inherits": {
1534 | "version": "2.0.3",
1535 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1536 | "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
1537 | }
1538 | }
1539 | },
1540 | "utils-merge": {
1541 | "version": "1.0.1",
1542 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1543 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
1544 | },
1545 | "uuid": {
1546 | "version": "9.0.0",
1547 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
1548 | "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
1549 | },
1550 | "vary": {
1551 | "version": "1.1.2",
1552 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1553 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
1554 | }
1555 | }
1556 | }
1557 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "orion",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "directories": {
7 | "lib": "lib",
8 | "videos": "videos"
9 | },
10 | "scripts": {
11 | "start": "node index.js"
12 | },
13 | "engines": {
14 | "node": "14.16.0",
15 | "npm": "7.21.1"
16 | },
17 | "author": "",
18 | "license": "ISC",
19 | "dependencies": {
20 | "axios": "^0.27.2",
21 | "dotenv": "^8.6.0",
22 | "ejs": "^3.1.6",
23 | "express": "^4.17.1",
24 | "node-cache": "^5.1.2",
25 | "path": "^0.12.7",
26 | "request-ip": "^2.1.3",
27 | "uuid": "^9.0.0"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/videos/download-started.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gorlev/orion-stremio-addon/e678e3c37e69f8f5b29b82c69c2c9261ccdc01ba/videos/download-started.mp4
--------------------------------------------------------------------------------
/videos/error-general.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gorlev/orion-stremio-addon/e678e3c37e69f8f5b29b82c69c2c9261ccdc01ba/videos/error-general.mp4
--------------------------------------------------------------------------------
/videos/error.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gorlev/orion-stremio-addon/e678e3c37e69f8f5b29b82c69c2c9261ccdc01ba/videos/error.mp4
--------------------------------------------------------------------------------