diff --git a/configure.html b/configure.html index bc2fd5d..b572048 100644 --- a/configure.html +++ b/configure.html @@ -222,7 +222,7 @@ />

The Movie Database Addon

-

3.0.11

+

3.0.10

Metadata provided by TMDB.

This addon has more :

diff --git a/index.js b/index.js index f2b88a9..23c8bde 100644 --- a/index.js +++ b/index.js @@ -1,19 +1,18 @@ -import express from "express"; -import urlExist from "url-exist"; -import path, { dirname } from "path"; -import { fileURLToPath } from 'url'; -import getCatalog from "./lib/getCatalog.js" -import getSearch from "./lib/getSearch.js"; -import { getManifest, DEFAULT_LANGUAGE } from "./lib/getManifest.js"; -import getMeta from "./lib/getMeta.js"; -import getTmdb from "./lib/getTmdb.js"; -import getTrending from "./lib/getTrending.js"; -import Utils from "./utils/parseProps.js"; +const express = require("express"); +const path = require("path") const addon = express(); -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +const { getCatalog } = require("./lib/getCatalog"); +const { getSearch } = require("./lib/getSearch"); +const { getManifest, DEFAULT_LANGUAGE } = require("./lib/getManifest"); +const { getMeta } = require("./lib/getMeta"); +const { getTmdb } = require("./lib/getTmdb"); +const { cacheWrapMeta } = require("./lib/getCache"); +const { getTrending } = require("./lib/getTrending"); +const { parseConfig, getRpdbPoster, checkIfExists } = require("./utils/parseProps"); + +const getCacheHeaders = function (opts) { + opts = opts || {}; -const getCacheHeaders = (opts = {}) => { if (!Object.keys(opts).length) return false; let cacheHeaders = { @@ -26,13 +25,13 @@ const getCacheHeaders = (opts = {}) => { .map((prop) => { const value = opts[prop]; if (!value) return false; - return `${cacheHeaders[prop]}=${value}`; + return cacheHeaders[prop] + "=" + value; }) .filter((val) => !!val) .join(", "); }; -const respond = (res, data, opts) => { +const respond = function (res, data, opts) { const cacheControl = getCacheHeaders(opts); if (cacheControl) res.setHeader("Cache-Control", `${cacheControl}, public`); res.setHeader("Access-Control-Allow-Origin", "*"); @@ -41,16 +40,16 @@ const respond = (res, data, opts) => { res.send(data); }; -addon.get("/", async (_, res) => { +addon.get("/", async function (_, res) { res.redirect("/configure"); }); -addon.get("/:catalogChoices?/configure", async (req, res) => { - res.sendFile(path.join(`${__dirname}/configure.html`)); +addon.get("/:catalogChoices?/configure", async function (req, res) { + res.sendFile(path.join(__dirname + "/configure.html")); }); -addon.get("/:catalogChoices?/manifest.json", async ({ params }, res) => { - const config = Utils.parseConfig(params.catalogChoices); +addon.get("/:catalogChoices?/manifest.json", async function (req, res) { + const config = parseConfig(req.params.catalogChoices); const language = config.language || DEFAULT_LANGUAGE; const manifest = await getManifest(language); const cacheOpts = { @@ -61,15 +60,15 @@ addon.get("/:catalogChoices?/manifest.json", async ({ params }, res) => { respond(res, manifest, cacheOpts); }); -addon.get("/:catalogChoices?/catalog/:type/:id/:extra?.json", async ({ params, url }, res) => { - const { catalogChoices, type, id } = params; - const config = Utils.parseConfig(catalogChoices) +addon.get("/:catalogChoices?/catalog/:type/:id/:extra?.json", async function (req, res) { + const { catalogChoices, type, id } = req.params; + const config = parseConfig(catalogChoices) const language = config.language || DEFAULT_LANGUAGE; const include_adult = config.include_adult || false const rpdbkey = config.rpdbkey - const { genre, skip, search } = params.extra + const { genre, skip, search } = req.params.extra ? Object.fromEntries( - new URLSearchParams(url.split("/").pop().split("?")[0].slice(0, -5)).entries() + new URLSearchParams(req.url.split("/").pop().split("?")[0].slice(0, -5)).entries() ) : {}; const page = Math.ceil(skip ? skip / 20 + 1 : undefined) || 1; @@ -78,8 +77,8 @@ addon.get("/:catalogChoices?/catalog/:type/:id/:extra?.json", async ({ params, u metas = search ? await getSearch(type, language, search, include_adult) : id === "tmdb.trending" - ? await getTrending(type, id, language, genre, page) - : await getCatalog(type, id, language, genre, page); + ? await getTrending(type, id, language, genre, page, include_adult) + : await getCatalog(type, id, language, genre, page, include_adult); } catch (e) { res.status(404).send((e || {}).message || "Not found"); return; @@ -97,8 +96,8 @@ addon.get("/:catalogChoices?/catalog/:type/:id/:extra?.json", async ({ params, u try { metas = JSON.parse(JSON.stringify(metas)); metas.metas = await Promise.all(metas.metas.map(async (el) => { - const rpdbPoster = Utils.getRpdbPoster(type, el.id.replace('tmdb:', ''), language, rpdbkey) - el.poster = (await urlExist(rpdbPoster)) ? rpdbPoster : el.poster; + const rpdbImage = getRpdbPoster(type, el.id.replace('tmdb:', ''), language, rpdbkey) + el.poster = await checkIfExists(rpdbImage) ? rpdbImage : el.poster; return el; })) } catch (e) { } @@ -106,15 +105,17 @@ addon.get("/:catalogChoices?/catalog/:type/:id/:extra?.json", async ({ params, u respond(res, metas, cacheOpts); }); -addon.get("/:catalogChoices?/meta/:type/:id.json", async ({ params }, res) => { - const { catalogChoices, type, id } = params; - const config = Utils.parseConfig(catalogChoices); +addon.get("/:catalogChoices?/meta/:type/:id.json", async function (req, res) { + const { catalogChoices, type, id } = req.params; + const config = parseConfig(catalogChoices); const tmdbId = id.split(":")[1]; const language = config.language || DEFAULT_LANGUAGE; - const imdbId = params.id.split(":")[0]; + const imdbId = req.params.id.split(":")[0]; - if (params.id.includes("tmdb:")) { - const resp = await getMeta(type, language, tmdbId); + if (req.params.id.includes("tmdb:")) { + const resp = await cacheWrapMeta(`${language}:${type}:${tmdbId}`, async () => { + return await getMeta(type, language, tmdbId) + }); const cacheOpts = { staleRevalidate: 20 * 24 * 60 * 60, // 20 days staleError: 30 * 24 * 60 * 60, // 30 days @@ -129,10 +130,12 @@ addon.get("/:catalogChoices?/meta/:type/:id.json", async ({ params }, res) => { } respond(res, resp, cacheOpts); } - if (params.id.includes("tt")) { + if (req.params.id.includes("tt")) { const tmdbId = await getTmdb(type, imdbId); if (tmdbId) { - const resp = await getMeta(type, language, tmdbId); + const resp = await cacheWrapMeta(`${language}:${type}:${tmdbId}`, async () => { + return await getMeta(type, language, tmdbId) + }); const cacheOpts = { staleRevalidate: 20 * 24 * 60 * 60, // 20 days staleError: 30 * 24 * 60 * 60, // 30 days @@ -152,4 +155,4 @@ addon.get("/:catalogChoices?/meta/:type/:id.json", async ({ params }, res) => { } }); -export default addon; \ No newline at end of file +module.exports = addon; \ No newline at end of file diff --git a/lib/getCache.js b/lib/getCache.js new file mode 100644 index 0000000..b4c4a86 --- /dev/null +++ b/lib/getCache.js @@ -0,0 +1,53 @@ +const cacheManager = require('cache-manager'); +const mangodbStore = require('cache-manager-mongodb'); + +const GLOBAL_KEY_PREFIX = 'tmdb-addon'; +const META_KEY_PREFIX = `${GLOBAL_KEY_PREFIX}|meta`; +const CATALOG_KEY_PREFIX = `${GLOBAL_KEY_PREFIX}|catalog`; + +const META_TTL = process.env.META_TTL || 7 * 24 * 60 * 60; // 7 day +const CATALOG_TTL = process.env.CATALOG_TTL || 15 * 24 * 60 * 60; // 15 day + +const MONGO_URI = process.env.MONGODB_URI; +const NO_CACHE = process.env.NO_CACHE || false; + +const cache = initiateCache(); + +function initiateCache() { + if (NO_CACHE) { + return null; + } else if (!NO_CACHE && MONGO_URI) { + return cacheManager.caching({ + store: mangodbStore, + uri: MONGO_URI, + options: { + collection: 'tmdb_collection', + ttl: META_TTL + }, + ttl: META_TTL, + ignoreCacheErrors: true + }); + } else { + return cacheManager.caching({ + store: 'memory', + ttl: META_TTL + }); + } +} + +function cacheWrap(key, method, options) { + if (NO_CACHE || !cache) { + return method(); + } + return cache.wrap(key, method, options); +} + +function cacheWrapCatalog(id, method) { + return cacheWrap(`${CATALOG_KEY_PREFIX}:${id}`, method, { ttl: CATALOG_TTL }); +} + +function cacheWrapMeta(id, method) { + return cacheWrap(`${META_KEY_PREFIX}:${id}`, method, { ttl: META_TTL }); +} + +module.exports = { cacheWrapCatalog, cacheWrapMeta }; \ No newline at end of file diff --git a/lib/getCatalog.js b/lib/getCatalog.js index f680386..17eb52c 100644 --- a/lib/getCatalog.js +++ b/lib/getCatalog.js @@ -1,14 +1,15 @@ -import "dotenv/config" -import { MovieDb } from "moviedb-promise"; -const moviedb = new MovieDb(process.env.tmdb_api); -import getGenreList from "./getGenreList.js"; -import getLanguages from "./getLanguages.js"; -import getMeta from "./getMeta.js"; +require("dotenv").config(); +const { MovieDb } = require("moviedb-promise"); +const moviedb = new MovieDb(process.env.TMDB_API); +const { getGenreList } = require("./getGenreList"); +const { getLanguages } = require("./getLanguages"); +const { cacheWrapMeta } = require("./getCache"); +const { getMeta } = require("./getMeta") async function getCatalog(type, id, language, genre, page, include_adult) { - const parameters = { - language, - page, + var parameters = { + language: language, + page: page, include_adult, }; const genre_id = await getGenreList(language, type); @@ -18,7 +19,7 @@ async function getCatalog(type, id, language, genre, page, include_adult) { let gen_name = false if (genre) { gen_name = genre - ? (genre_id.find(({ name }) => name === genre) || {}).id || false + ? (genre_id.find((x) => x.name === genre) || {}).id || false : genre; if (!gen_name) return Promise.reject(Error(`Could not find genre: ${genre}`)) } @@ -27,15 +28,17 @@ async function getCatalog(type, id, language, genre, page, include_adult) { parameters.primary_release_year = genre } else if (id === "tmdb.language") { parameters.with_original_language = languages - .find(({ name }) => name === genre) + .find((lang) => lang.name === genre) .iso_639_1.split("-")[0] } return await moviedb .discoverMovie(parameters) - .then(async ({ results }) => { + .then(async (res) => { const metas = await Promise.all( - results.map(async (el) => { - const meta = await getMeta(type, language, el.id); + res.results.map(async (el) => { + const meta = await cacheWrapMeta(`${language}:${type}:${el.id}`, async () => { + return await getMeta(type, language, el.id); + }); return meta.meta; }) ); @@ -49,7 +52,7 @@ async function getCatalog(type, id, language, genre, page, include_adult) { let gen_name = false if (genre) { gen_name = genre - ? (genre_id.find(({ name }) => name === genre) || {}).id || false + ? (genre_id.find((x) => x.name === genre) || {}).id || false : genre; if (!gen_name) return Promise.reject(Error(`Could not find genre: ${genre}`)) } @@ -58,15 +61,17 @@ async function getCatalog(type, id, language, genre, page, include_adult) { parameters.first_air_date_year = genre } else if (id === "tmdb.language") { parameters.with_original_language = languages - .find(({ name }) => name === genre) + .find((lang) => lang.name === genre) .iso_639_1.split("-")[0] } return await moviedb .discoverTv(parameters) - .then(async ({ results }) => { + .then(async (res) => { const metas = await Promise.all( - results.map(async (el) => { - const meta = await getMeta(type, language, el.id); + res.results.map(async (el) => { + const meta = await cacheWrapMeta(`${language}:${type}:${el.id}`, async () => { + return await getMeta(type, language, el.id); + }); return meta.meta; }) ); @@ -76,4 +81,4 @@ async function getCatalog(type, id, language, genre, page, include_adult) { } } -export default getCatalog +module.exports = { getCatalog }; diff --git a/lib/getEpisodes.js b/lib/getEpisodes.js index 2641d13..8f701c0 100644 --- a/lib/getEpisodes.js +++ b/lib/getEpisodes.js @@ -1,19 +1,21 @@ -import "dotenv/config" -import { MovieDb } from "moviedb-promise"; -const moviedb = new MovieDb(process.env.tmdb_api); -import diferentOrder from "../static/diferentOrder.json" assert { type: "json" }; -import diferentImdbId from "../static/diferentImdbId.json" assert { type: "json" }; +require("dotenv").config(); +const { MovieDb } = require("moviedb-promise"); +const moviedb = new MovieDb(process.env.TMDB_API); +const diferentOrder = require("../static/diferentOrder.json"); +const diferentImdbId = require("../static/diferentImdbId.json"); function genSeasonsString(seasons) { if (seasons.length <= 20) { return [ - seasons.map(({ season_number }) => `season/${season_number}`).join(","), + seasons.map((season) => `season/${season.season_number}`).join(","), ]; } else { const result = new Array(Math.ceil(seasons.length / 20)) .fill() .map((_) => seasons.splice(0, 20)); - return result.map(arr => arr.map(({ season_number }) => `season/${season_number}`).join(",")); + return result.map((arr) => { + return arr.map((season) => `season/${season.season_number}`).join(","); + }); } } @@ -24,28 +26,30 @@ async function getEpisodes(language, tmdbId, imdb_id, seasons) { imdb_id = !difImdbId ? imdb_id : difImdbId.imdbId; if (difOrder != undefined) { return await moviedb - .episodeGroup({ language, id: difOrder.episodeGroupId }) - .then(({ groups }) => groups - .map(({ episodes, order }) => episodes.map((episode, index) => ({ - id: difOrder.watchOrderOnly - ? `${imdb_id}:${episode.season_number}:${episode.episode_number}` - : `${imdb_id}:${order}:${index + 1}`, - name: episode.name, - season: order, - episode: index + 1, - thumbnail: `https://image.tmdb.org/t/p/w500${episode.still_path}`, - overview: episode.overview, - description: episode.overview, - rating: episode.vote_average, - firstAired: difOrder.watchOrderOnly - ? new Date(Date.parse(episodes[0].air_date) + index) - : new Date(Date.parse(episode.air_date) + index), - released: difOrder.watchOrderOnly - ? new Date(Date.parse(episodes[0].air_date) + index) - : new Date(Date.parse(episode.air_date) + index), - })) - ) - .reduce((a, b) => a.concat(b), []) + .episodeGroup({ language: language, id: difOrder.episodeGroupId }) + .then((episodeGroups) => + episodeGroups.groups + .map((group) => + group.episodes.map((episode, index) => ({ + id: difOrder.watchOrderOnly + ? `${imdb_id}:${episode.season_number}:${episode.episode_number}` + : `${imdb_id}:${group.order}:${index + 1}`, + name: episode.name, + season: group.order, + episode: index + 1, + thumbnail: `https://image.tmdb.org/t/p/w500${episode.still_path}`, + overview: episode.overview, + description: episode.overview, + rating: episode.vote_average, + firstAired: difOrder.watchOrderOnly + ? new Date(Date.parse(group.episodes[0].air_date) + index) + : new Date(Date.parse(episode.air_date) + index), + released: difOrder.watchOrderOnly + ? new Date(Date.parse(group.episodes[0].air_date) + index) + : new Date(Date.parse(episode.air_date) + index), + })) + ) + .reduce((a, b) => a.concat(b), []) ) .catch(console.error); } else { @@ -89,4 +93,4 @@ async function getEpisodes(language, tmdbId, imdb_id, seasons) { } } -export default getEpisodes; +module.exports = { getEpisodes }; diff --git a/lib/getGenreList.js b/lib/getGenreList.js index 766d507..5d7312a 100644 --- a/lib/getGenreList.js +++ b/lib/getGenreList.js @@ -1,21 +1,25 @@ -import 'dotenv/config'; -import { MovieDb } from 'moviedb-promise'; -const moviedb = new MovieDb(process.env.tmdb_api) +require('dotenv').config() +const { MovieDb } = require('moviedb-promise') +const moviedb = new MovieDb(process.env.TMDB_API) async function getGenreList(language, type) { if (type === "movie") { const genre = await moviedb - .genreMovieList({ language }) - .then(({ genres }) => genres) + .genreMovieList({language}) + .then((res) => { + return res.genres; + }) .catch(console.error); - return genre + return genre } else { const genre = await moviedb - .genreTvList({ language }) - .then(({ genres }) => genres) - .catch(console.error); + .genreTvList({language}) + .then((res) => { + return res.genres; + }) + .catch(console.error); return genre } } -export default getGenreList; +module.exports = { getGenreList }; diff --git a/lib/getLanguages.js b/lib/getLanguages.js index c6dd9bc..a12dd40 100644 --- a/lib/getLanguages.js +++ b/lib/getLanguages.js @@ -1,6 +1,6 @@ -import "dotenv/config" -import { MovieDb } from "moviedb-promise"; -const moviedb = new MovieDb(process.env.tmdb_api); +require("dotenv").config(); +const { MovieDb } = require("moviedb-promise"); +const moviedb = new MovieDb(process.env.TMDB_API); async function getLanguages() { const [primaryTranslations, languages] = await Promise.all([ @@ -9,9 +9,9 @@ async function getLanguages() { ]); return primaryTranslations.map((element) => { const [language, country] = element.split("-"); - const findLanguage = languages.find(({ iso_639_1 }) => iso_639_1 === language); - return { iso_639_1: element, name: findLanguage.english_name }; + const findLanguage = languages.find((obj) => obj.iso_639_1 === language); + return { iso_639_1: element, name: findLanguage.english_name}; }); } -export default getLanguages; +module.exports = { getLanguages }; diff --git a/lib/getLogo.js b/lib/getLogo.js index 8299863..5a9aa62 100644 --- a/lib/getLogo.js +++ b/lib/getLogo.js @@ -1,20 +1,20 @@ -import 'dotenv/config'; -import FanartTvApi from "fanart.tv-api"; -const apiKey = process.env.fanart_api; +require('dotenv').config() +const FanartTvApi = require("fanart.tv-api"); +const apiKey = process.env.FANART_API; const baseUrl = "http://webservice.fanart.tv/v3/"; const fanart = new FanartTvApi({ apiKey, baseUrl }); function pickLogo(resp, language, original_language) { if ( - resp.find(({ lang }) => lang === language.split("-")[0]) != undefined + resp.find((data) => data.lang === language.split("-")[0]) != undefined ) { - return resp.find(({ lang }) => lang === language.split("-")[0]); + return resp.find((data) => data.lang === language.split("-")[0]); } else if ( - resp.find(({ lang }) => lang === original_language) != undefined + resp.find((data) => data.lang === original_language) != undefined ) { - return resp.find(({ lang }) => lang === original_language); - } else if (resp.find(({ lang }) => lang === "en") != undefined) { - return resp.find(({ lang }) => lang === "en"); + return resp.find((data) => data.lang === original_language); + } else if (resp.find((data) => data.lang === "en") != undefined) { + return resp.find((data) => data.lang === "en"); } else { return resp[0]; } @@ -24,8 +24,8 @@ async function getLogo(tmdbId, language, original_language) { if (!tmdbId) return Promise.reject(Error(`TMDB ID Not available for Fanart: ${tmdbId}`)); const meta = fanart .getMovieImages(tmdbId) - .then(({ hdmovielogo }) => { - const resp = hdmovielogo + .then((res) => { + const resp = res.hdmovielogo if (resp !== undefined) { const { url } = pickLogo(resp, language, original_language); return url @@ -33,7 +33,9 @@ async function getLogo(tmdbId, language, original_language) { return '' } }) - .catch(err => ""); + .catch((err) => { + return "" + }); return meta; } @@ -41,8 +43,8 @@ async function getTvLogo(tvdb_id, language, original_language) { if (!tvdb_id) return Promise.reject(Error(`TVDB ID Not available for Fanart: ${tvdb_id}`)); const meta = fanart .getShowImages(tvdb_id) - .then(({ hdtvlogo }) => { - const resp = hdtvlogo; + .then((res) => { + const resp = res.hdtvlogo; if (resp !== undefined) { const { url } = pickLogo(resp, language, original_language); return url @@ -50,8 +52,10 @@ async function getTvLogo(tvdb_id, language, original_language) { return '' } }) - .catch(err => ""); + .catch((err) => { + return "" + }); return meta; } -export { getLogo, getTvLogo }; \ No newline at end of file +module.exports = { getLogo, getTvLogo }; \ No newline at end of file diff --git a/lib/getManifest.js b/lib/getManifest.js index 3ef5fab..6df42ff 100644 --- a/lib/getManifest.js +++ b/lib/getManifest.js @@ -1,7 +1,7 @@ -import "dotenv/config" -import getGenreList from "./getGenreList.js"; -import getLanguages from "./getLanguages.js"; -import packageFile from "../package.json" assert { type: "json" }; +require("dotenv").config(); +const { getGenreList } = require("./getGenreList"); +const { getLanguages } = require("./getLanguages"); +const package = require("../package.json"); const DEFAULT_LANGUAGE = "en-US"; @@ -34,15 +34,15 @@ async function getManifest(language = DEFAULT_LANGUAGE) { const descriptionSuffix = language && language !== DEFAULT_LANGUAGE ? ` with ${language} language.` : "."; return { - id: packageFile.name, - version: packageFile.version, + id: package.name, + version: package.version, favicon: "https://github.com/mrcanelas/tmdb-addon/raw/main/images/favicon.png", logo: "https://github.com/mrcanelas/tmdb-addon/raw/main/images/logo.png", background: "https://github.com/mrcanelas/tmdb-addon/raw/main/images/background.png", name: "The Movie Database Addon", - description: packageFile.description + descriptionSuffix, + description: package.description + descriptionSuffix, resources: ["catalog", "meta"], types: ["movie", "series"], idPrefixes: ["tmdb:"], @@ -159,4 +159,4 @@ async function getManifest(language = DEFAULT_LANGUAGE) { }; } -export { getManifest, DEFAULT_LANGUAGE }; \ No newline at end of file +module.exports = { getManifest, DEFAULT_LANGUAGE }; \ No newline at end of file diff --git a/lib/getMeta.js b/lib/getMeta.js index 50945ab..47f6f74 100644 --- a/lib/getMeta.js +++ b/lib/getMeta.js @@ -1,9 +1,9 @@ -import "dotenv/config" -import { MovieDb } from "moviedb-promise"; -import Utils from "../utils/parseProps.js"; -const moviedb = new MovieDb(process.env.tmdb_api); -import getEpisodes from "./getEpisodes.js"; -import { getLogo, getTvLogo } from "./getLogo.js"; +require("dotenv").config(); +const { MovieDb } = require("moviedb-promise"); +const Utils = require("../utils/parseProps"); +const moviedb = new MovieDb(process.env.TMDB_API); +const { getEpisodes } = require("./getEpisodes"); +const { getLogo, getTvLogo } = require("./getLogo"); const blacklistLogoUrls = [ @@ -14,7 +14,7 @@ const blacklistLogoUrls = [ async function getMeta(type, language, tmdbId) { if (type === "movie") { const meta = await moviedb - .movieInfo({ id: tmdbId, language, append_to_response: "videos,credits", }) + .movieInfo({id: tmdbId, language, append_to_response: "videos,credits",}) .then(async (res) => { const resp = { imdb_id: res.imdb_id, @@ -27,7 +27,7 @@ async function getMeta(type, language, tmdbId) { name: res.title, released: new Date(res.release_date), slug: Utils.parseSlug(type, res.title, res.imdb_id), - type, + type: type, writer: Utils.parseWriter(res.credits), year: res.release_date ? res.release_date.substr(0, 4) : "", trailers: Utils.parseTrailers(res.videos), @@ -60,7 +60,7 @@ async function getMeta(type, language, tmdbId) { }; try { resp.logo = await getLogo(tmdbId, language, res.original_language); - } catch (e) { + } catch(e) { console.log(`warning: logo could not be retrieved for ${tmdbId} - ${type}`); console.log((e || {}).message || "unknown error"); } @@ -73,7 +73,7 @@ async function getMeta(type, language, tmdbId) { return Promise.resolve({ meta }); } else { const meta = await moviedb - .tvInfo({ id: tmdbId, language, append_to_response: "videos,credits,external_ids", }) + .tvInfo({id: tmdbId, language, append_to_response: "videos,credits,external_ids",}) .then(async (res) => { const resp = { cast: Utils.parseCast(res.credits), @@ -87,7 +87,7 @@ async function getMeta(type, language, tmdbId) { released: new Date(res.first_air_date), runtime: Utils.parseRunTime(res.episode_run_time[0]), status: res.status, - type, + type: type, writer: Utils.parseCreatedBy(res.created_by), year: Utils.parseYear(res.status, res.first_air_date, res.last_air_date), background: `https://image.tmdb.org/t/p/original${res.backdrop_path}`, @@ -111,7 +111,7 @@ async function getMeta(type, language, tmdbId) { }; try { resp.logo = await getTvLogo(res.external_ids.tvdb_id, language, res.original_language); - } catch (e) { + } catch(e) { console.log(`warning: logo could not be retrieved for ${tmdbId} - ${type}`); console.log((e || {}).message || "unknown error"); } @@ -120,7 +120,7 @@ async function getMeta(type, language, tmdbId) { } try { resp.videos = await getEpisodes(language, tmdbId, res.external_ids.imdb_id, res.seasons); - } catch (e) { + } catch(e) { console.log(`warning: episodes could not be retrieved for ${tmdbId} - ${type}`); console.log((e || {}).message || "unknown error"); } @@ -132,4 +132,4 @@ async function getMeta(type, language, tmdbId) { } } -export default getMeta; \ No newline at end of file +module.exports = { getMeta }; \ No newline at end of file diff --git a/lib/getSearch.js b/lib/getSearch.js index 9068e64..a8615f3 100644 --- a/lib/getSearch.js +++ b/lib/getSearch.js @@ -1,14 +1,14 @@ -import "dotenv/config" -import { MovieDb } from "moviedb-promise"; -const moviedb = new MovieDb(process.env.tmdb_api); +require("dotenv").config(); +const { MovieDb } = require("moviedb-promise"); +const moviedb = new MovieDb(process.env.TMDB_API); async function getSearch(type, language, query, include_adult) { if (type === "movie") { - const searchMovie = [] + const searchMovie = [] await moviedb .searchMovie({ query, language, include_adult }) - .then(({ results }) => { - results.map((el) => { + .then((res) => { + res.results.map((el) => { searchMovie.push({ id: `tmdb:${el.id}`, name: `${el.title}`, @@ -20,13 +20,13 @@ async function getSearch(type, language, query, include_adult) { }); }) .catch(console.error); - await moviedb.searchPerson({ query, language }).then(async ({ results }) => { - if (results[0]) { + await moviedb.searchPerson({ query, language }).then(async (res) => { + if (res.results[0]) { await moviedb - .personMovieCredits({ id: results[0].id, language }) - .then(({ cast, crew }) => { - cast.map((el) => { - if (!searchMovie.find(({ id }) => id === `tmdb:${el.id}`)) { + .personMovieCredits({ id: res.results[0].id, language }) + .then((credits) => { + credits.cast.map((el) => { + if (!searchMovie.find((meta) => meta.id === `tmdb:${el.id}`)) { searchMovie.push({ id: `tmdb:${el.id}`, name: `${el.title}`, @@ -37,9 +37,9 @@ async function getSearch(type, language, query, include_adult) { }); } }); - crew.map((el) => { + credits.crew.map((el) => { if (el.job === "Director" || "Writer") { - if (!searchMovie.find(({ id }) => id === `tmdb:${el.id}`)) { + if (!searchMovie.find((meta) => meta.id === `tmdb:${el.id}`)) { searchMovie.push({ id: `tmdb:${el.id}`, name: `${el.title}`, @@ -56,13 +56,13 @@ async function getSearch(type, language, query, include_adult) { }); const sortMetas = searchMovie.sort((a, b) => b.popularity - a.popularity); - return Promise.resolve({ query, metas: sortMetas }); + return Promise.resolve({query, metas: sortMetas }); } else { - const searchTv = [] + const searchTv = [] await moviedb .searchTv({ query, language, include_adult }) - .then(({ results }) => { - results.map((el) => { + .then((res) => { + res.results.map((el) => { searchTv.push({ id: `tmdb:${el.id}`, name: `${el.name}`, @@ -74,14 +74,14 @@ async function getSearch(type, language, query, include_adult) { }); }) .catch(console.error); - await moviedb.searchPerson({ query, language }).then(async ({ results }) => { - if (results[0]) { + await moviedb.searchPerson({ query, language }).then(async (res) => { + if (res.results[0]) { await moviedb - .personTvCredits({ id: results[0].id, language }) - .then(({ cast, crew }) => { - cast.map((el) => { + .personTvCredits({ id: res.results[0].id, language }) + .then((credits) => { + credits.cast.map((el) => { if (el.episode_count >= 5) { - if (!searchTv.find(({ id }) => id === `tmdb:${el.id}`)) { + if (!searchTv.find((meta) => meta.id === `tmdb:${el.id}`)) { searchTv.push({ id: `tmdb:${el.id}`, name: `${el.name}`, @@ -93,9 +93,9 @@ async function getSearch(type, language, query, include_adult) { } } }); - crew.map((el) => { + credits.crew.map((el) => { if (el.job === "Director" || "Writer") { - if (!searchTv.find(({ id }) => id === `tmdb:${el.id}`)) { + if (!searchTv.find((meta) => meta.id === `tmdb:${el.id}`)) { searchTv.push({ id: `tmdb:${el.id}`, name: `${el.name}`, @@ -111,8 +111,8 @@ async function getSearch(type, language, query, include_adult) { } }); const sortMetas = searchTv.sort((a, b) => b.popularity - a.popularity); - return Promise.resolve({ query, metas: sortMetas }); + return Promise.resolve({query, metas: sortMetas }); } } -export default getSearch; +module.exports = { getSearch }; diff --git a/lib/getTmdb.js b/lib/getTmdb.js index 6835ec4..8a76278 100644 --- a/lib/getTmdb.js +++ b/lib/getTmdb.js @@ -1,21 +1,29 @@ -import 'dotenv/config'; -import { MovieDb } from 'moviedb-promise'; -const moviedb = new MovieDb(process.env.tmdb_api) +require('dotenv').config() +const { MovieDb } = require('moviedb-promise') +const moviedb = new MovieDb(process.env.TMDB_API) async function getTmdb(type, imdbId) { if (type === "movie") { const tmdbId = await moviedb - .find({ id: imdbId, external_source: 'imdb_id' }) - .then(({ movie_results }) => movie_results[0] ? movie_results[0].id : null) - .catch(err => null); - return tmdbId; + .find({id: imdbId, external_source: 'imdb_id'}) + .then((res) => { + return res.movie_results[0] ? res.movie_results[0].id : null; + }) + .catch(err => { + return null + }); +return tmdbId; } else { const tmdbId = await moviedb - .find({ id: imdbId, external_source: 'imdb_id' }) - .then(({ tv_results }) => tv_results[0] ? tv_results[0].id : null) - .catch(err => null); - return tmdbId; + .find({id: imdbId, external_source: 'imdb_id'}) + .then((res) => { + return res.tv_results[0] ? res.tv_results[0].id : null; + }) + .catch(err => { + return null + }); +return tmdbId; } } -export default getTmdb; +module.exports = { getTmdb }; diff --git a/lib/getTrending.js b/lib/getTrending.js index f7bbe39..74f4b26 100644 --- a/lib/getTrending.js +++ b/lib/getTrending.js @@ -1,7 +1,8 @@ -import "dotenv/config" -import { MovieDb } from "moviedb-promise"; -const moviedb = new MovieDb(process.env.tmdb_api); -import getMeta from "./getMeta.js"; +require("dotenv").config(); +const { MovieDb } = require("moviedb-promise"); +const moviedb = new MovieDb(process.env.TMDB_API); +const { cacheWrapMeta } = require("./getCache"); +const { getMeta } = require("./getMeta"); async function getTrending(type, id, language, genre, page, include_adult) { const parameters = { @@ -13,10 +14,12 @@ async function getTrending(type, id, language, genre, page, include_adult) { }; return await moviedb .trending(parameters) - .then(async ({ results }) => { + .then(async (res) => { const metas = await Promise.all( - results.map(async (el) => { - const meta = await getMeta(type, language, el.id); + res.results.map(async (el) => { + const meta = await cacheWrapMeta(`${language}:${type}:${el.id}`, async () => { + return await getMeta(type, language, el.id); + }); return meta.meta; }) ); @@ -25,4 +28,4 @@ async function getTrending(type, id, language, genre, page, include_adult) { .catch(console.error); } -export default getTrending; +module.exports = { getTrending }; diff --git a/package-lock.json b/package-lock.json index ad5ee10..e0baad2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,21 @@ { "name": "tmdb-addon", - "version": "3.0.11", + "version": "3.0.10", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tmdb-addon", - "version": "3.0.11", + "version": "3.0.10", "license": "Apache-2.0", "dependencies": { + "cache-manager": "^3.6.3", + "cache-manager-mongodb": "^0.3.0", "dotenv": "^16.3.1", "express": "^4.18.2", "fanart.tv-api": "^2.0.1", - "moviedb-promise": "^4.0.0", - "url-exist": "^3.0.1" + "moviedb-promise": "^3.4.1", + "url-exists": "^1.0.3" }, "devDependencies": { "nodemon": "^3.0.1" @@ -25,17 +27,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -48,6 +39,21 @@ "node": ">= 0.6" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -66,19 +72,51 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.8" } }, "node_modules/balanced-match": { @@ -87,6 +125,14 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -96,6 +142,15 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -141,6 +196,14 @@ "node": ">=8" } }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -149,6 +212,50 @@ "node": ">= 0.8" } }, + "node_modules/cache-manager": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-3.6.3.tgz", + "integrity": "sha512-dS4DnV6c6cQcVH5OxzIU1XZaACXwvVIiUPkFytnRmLOACuBGv3GQgRQ1RJGRRw4/9DF14ZK2RFlZu1TUgDniMg==", + "dependencies": { + "async": "3.2.3", + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "node_modules/cache-manager-mongodb": { + "version": "0.3.0", + "resolved": "git+ssh://git@github.com/openrm/node-cache-manager-mongodb.git#7fac8e64793ca99490aaad031948a620e02f7621", + "license": "MIT", + "dependencies": { + "cache-manager": "^2.9.0", + "lodash": "^4.17.15", + "mongodb": "^3.6.3" + } + }, + "node_modules/cache-manager-mongodb/node_modules/cache-manager": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", + "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", + "dependencies": { + "async": "1.5.2", + "lodash.clonedeep": "4.5.0", + "lru-cache": "4.0.0" + } + }, + "node_modules/cache-manager-mongodb/node_modules/lru-cache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", + "dependencies": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "node_modules/cache-manager/node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -161,6 +268,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -256,12 +368,20 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, "engines": { - "node": ">= 12" + "node": ">=0.10" } }, "node_modules/debug": { @@ -291,6 +411,14 @@ "node": ">=0.4.0" } }, + "node_modules/denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -324,6 +452,15 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -350,14 +487,6 @@ "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -418,6 +547,19 @@ } ] }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fanart.tv-api": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fanart.tv-api/-/fanart.tv-api-2.0.1.tgz", @@ -443,27 +585,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fill-range": { "version": "7.0.1", @@ -513,28 +643,25 @@ } } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" + "node": ">= 0.12" } }, "node_modules/forwarded": { @@ -593,6 +720,14 @@ "node": ">=4" } }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -629,6 +764,27 @@ "node": ">=4" } }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -694,6 +850,20 @@ "node": ">= 0.8" } }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -798,16 +968,20 @@ "node": ">=0.10.0" } }, - "node_modules/is-url-superb": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-6.1.0.tgz", - "integrity": "sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/isurl": { "version": "1.0.0", @@ -821,39 +995,38 @@ "node": ">= 4" } }, - "node_modules/ky": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.27.0.tgz", - "integrity": "sha512-pgaBuB6wI9DdMSOZBVh2WkcbkAdEG5AUEWuNhtThu6FLIpDbzqzC/fSMmqr/j1wwQyW3SP3KGau7EbzWNkQ/yg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, - "node_modules/ky-universal": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.10.1.tgz", - "integrity": "sha512-r8909k+ELKZAxhVA5c440x22hqw5XcMRwLRbgpPQk4JHy3/ddJnvzcnSo5Ww3HdKdNeS3Y8dBgcIYyVahMa46g==", + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { - "abort-controller": "^3.0.0", - "node-fetch": "^3.2.2" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" - }, - "peerDependencies": { - "ky": ">=0.26.0", - "web-streams-polyfill": ">=3.0.1" - }, - "peerDependenciesMeta": { - "web-streams-polyfill": { - "optional": true - } + "node": ">=0.6.0" } }, "node_modules/lodash": { @@ -861,6 +1034,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -873,7 +1051,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -884,8 +1061,7 @@ "node_modules/lru-cache/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/media-typer": { "version": "0.3.0", @@ -895,6 +1071,12 @@ "node": ">= 0.6" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -958,14 +1140,51 @@ "node": "*" } }, - "node_modules/moviedb-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/moviedb-promise/-/moviedb-promise-4.0.0.tgz", - "integrity": "sha512-WJ5csQyV+3/ex5zxxzkLDe/D9P/lf63lB5oG/LX85hXlhZ6boawIiK0AhUNe0QxSVF/X+gsJ9OwcR9sdYocaTw==", + "node_modules/mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", "dependencies": { - "axios": "^1.4.0", - "lodash": "^4.17.21", - "promise-throttle": "^1.1.2" + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/moviedb-promise": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/moviedb-promise/-/moviedb-promise-3.4.1.tgz", + "integrity": "sha512-TQe6ntr3Ws8w3wgEzk4Qb7/2nUNvbR7lfv9i58A19qfCad2G7esJoGpKV+xc0QCIDvPYslloM+e0KIpmJl3VCg==", + "dependencies": { + "axios": "^0.26.1", + "lodash": "^4.17.21" } }, "node_modules/ms": { @@ -981,41 +1200,6 @@ "node": ">= 0.6" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, "node_modules/nodemon": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", @@ -1083,6 +1267,14 @@ "node": ">=0.10.0" } }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, "node_modules/object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -1102,6 +1294,17 @@ "node": ">= 0.8" } }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -1142,6 +1345,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -1162,10 +1370,10 @@ "node": ">=0.10.0" } }, - "node_modules/promise-throttle": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/promise-throttle/-/promise-throttle-1.1.2.tgz", - "integrity": "sha512-dij7vjyXNewuuN/gyr+TX2KRjw48mbV5FEtgyXaIoJjGYAKT0au23/voNvy9eS4UNJjx2KUdEcO5Yyfc1h7vWQ==" + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -1179,10 +1387,15 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pstree.remy": { "version": "1.1.8", @@ -1190,6 +1403,14 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -1226,6 +1447,20 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1238,6 +1473,53 @@ "node": ">=8.10.0" } }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1248,6 +1530,18 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -1335,6 +1629,39 @@ "node": ">=10" } }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -1343,6 +1670,14 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1395,6 +1730,34 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1421,17 +1784,20 @@ "node": ">= 0.8" } }, - "node_modules/url-exist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/url-exist/-/url-exist-3.0.1.tgz", - "integrity": "sha512-37KEE2gj60C4hTh2mGkFeqODO2KVG9TOJWpE3sOLEeLGt/p50VxemPiJ30v4m1dcw/wDEGUpYcmBV2e8jM5/FA==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { - "is-url-superb": "^6.1.0", - "ky": "^0.27.0", - "ky-universal": "^0.10.1" - }, - "engines": { - "node": ">=14.8" + "punycode": "^2.1.0" + } + }, + "node_modules/url-exists": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/url-exists/-/url-exists-1.0.3.tgz", + "integrity": "sha512-oN3lNUMLfIR4tI9ByLtfLThGhFeYWCjWw5lfat/2PLZRA6U/v7wzKb0SbCjhZcEHGYHqi05c2JTVmeMzIAxapw==", + "dependencies": { + "request": "^2.69.0" } }, "node_modules/url-parse-lax": { @@ -1453,6 +1819,11 @@ "node": ">= 4" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -1461,6 +1832,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1469,13 +1849,23 @@ "node": ">= 0.8" } }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "engines": { - "node": ">= 8" + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" } }, "dependencies": { @@ -1485,14 +1875,6 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1502,6 +1884,17 @@ "negotiator": "0.6.3" } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -1517,19 +1910,45 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, "axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.14.8" } }, "balanced-match": { @@ -1538,12 +1957,29 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -1582,11 +2018,63 @@ "fill-range": "^7.0.1" } }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, + "cache-manager": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-3.6.3.tgz", + "integrity": "sha512-dS4DnV6c6cQcVH5OxzIU1XZaACXwvVIiUPkFytnRmLOACuBGv3GQgRQ1RJGRRw4/9DF14ZK2RFlZu1TUgDniMg==", + "requires": { + "async": "3.2.3", + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + }, + "dependencies": { + "async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + } + } + }, + "cache-manager-mongodb": { + "version": "git+ssh://git@github.com/openrm/node-cache-manager-mongodb.git#7fac8e64793ca99490aaad031948a620e02f7621", + "from": "cache-manager-mongodb@^0.3.0", + "requires": { + "cache-manager": "^2.9.0", + "lodash": "^4.17.15", + "mongodb": "^3.6.3" + }, + "dependencies": { + "cache-manager": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz", + "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==", + "requires": { + "async": "1.5.2", + "lodash.clonedeep": "4.5.0", + "lru-cache": "4.0.0" + } + }, + "lru-cache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + } + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1596,6 +2084,11 @@ "get-intrinsic": "^1.0.2" } }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1656,10 +2149,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==" + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" + } }, "debug": { "version": "2.6.9", @@ -1682,6 +2183,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1702,6 +2208,15 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1722,11 +2237,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, "express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -1772,6 +2282,16 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, "fanart.tv-api": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fanart.tv-api/-/fanart.tv-api-2.0.1.tgz", @@ -1796,14 +2316,15 @@ } } }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fill-range": { "version": "7.0.1", @@ -1833,24 +2354,21 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "requires": { - "fetch-blob": "^3.1.2" - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1888,6 +2406,14 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==" }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1918,6 +2444,20 @@ "url-to-options": "^1.0.1" } }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1962,6 +2502,16 @@ "toidentifier": "1.0.1" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2036,10 +2586,20 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" }, - "is-url-superb": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-6.1.0.tgz", - "integrity": "sha512-LXdhGlYqUPdvEyIhWPEEwYYK3yrUiPcBjmFGlZNv1u5GtIL5qQRf7ddDyPNAvsMFqdzS923FROpTQU97tLe3JQ==" + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "isurl": { "version": "1.0.0", @@ -2050,18 +2610,35 @@ "is-object": "^1.0.1" } }, - "ky": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.27.0.tgz", - "integrity": "sha512-pgaBuB6wI9DdMSOZBVh2WkcbkAdEG5AUEWuNhtThu6FLIpDbzqzC/fSMmqr/j1wwQyW3SP3KGau7EbzWNkQ/yg==" + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, - "ky-universal": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.10.1.tgz", - "integrity": "sha512-r8909k+ELKZAxhVA5c440x22hqw5XcMRwLRbgpPQk4JHy3/ddJnvzcnSo5Ww3HdKdNeS3Y8dBgcIYyVahMa46g==", + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { - "abort-controller": "^3.0.0", - "node-fetch": "^3.2.2" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" } }, "lodash": { @@ -2069,6 +2646,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -2078,7 +2660,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" }, @@ -2086,8 +2667,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -2096,6 +2676,12 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -2138,14 +2724,26 @@ "brace-expansion": "^1.1.7" } }, - "moviedb-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/moviedb-promise/-/moviedb-promise-4.0.0.tgz", - "integrity": "sha512-WJ5csQyV+3/ex5zxxzkLDe/D9P/lf63lB5oG/LX85hXlhZ6boawIiK0AhUNe0QxSVF/X+gsJ9OwcR9sdYocaTw==", + "mongodb": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz", + "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==", "requires": { - "axios": "^1.4.0", - "lodash": "^4.17.21", - "promise-throttle": "^1.1.2" + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "moviedb-promise": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/moviedb-promise/-/moviedb-promise-3.4.1.tgz", + "integrity": "sha512-TQe6ntr3Ws8w3wgEzk4Qb7/2nUNvbR7lfv9i58A19qfCad2G7esJoGpKV+xc0QCIDvPYslloM+e0KIpmJl3VCg==", + "requires": { + "axios": "^0.26.1", + "lodash": "^4.17.21" } }, "ms": { @@ -2158,21 +2756,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - }, - "node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, "nodemon": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", @@ -2223,6 +2806,11 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", @@ -2236,6 +2824,14 @@ "ee-first": "1.1.1" } }, + "optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "requires": { + "require-at": "^1.0.6" + } + }, "p-cancelable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", @@ -2264,6 +2860,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2275,10 +2876,10 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==" }, - "promise-throttle": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/promise-throttle/-/promise-throttle-1.1.2.tgz", - "integrity": "sha512-dij7vjyXNewuuN/gyr+TX2KRjw48mbV5FEtgyXaIoJjGYAKT0au23/voNvy9eS4UNJjx2KUdEcO5Yyfc1h7vWQ==" + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "proxy-addr": { "version": "2.0.7", @@ -2289,10 +2890,15 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "pstree.remy": { "version": "1.1.8", @@ -2300,6 +2906,11 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", "dev": true }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -2324,6 +2935,20 @@ "unpipe": "1.0.0" } }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2333,6 +2958,45 @@ "picomatch": "^2.2.1" } }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + } + } + }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -2343,6 +3007,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -2414,11 +3087,44 @@ "semver": "^7.5.3" } }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2456,6 +3162,28 @@ "nopt": "~1.0.10" } }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2476,14 +3204,20 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, - "url-exist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/url-exist/-/url-exist-3.0.1.tgz", - "integrity": "sha512-37KEE2gj60C4hTh2mGkFeqODO2KVG9TOJWpE3sOLEeLGt/p50VxemPiJ30v4m1dcw/wDEGUpYcmBV2e8jM5/FA==", + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { - "is-url-superb": "^6.1.0", - "ky": "^0.27.0", - "ky-universal": "^0.10.1" + "punycode": "^2.1.0" + } + }, + "url-exists": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/url-exists/-/url-exists-1.0.3.tgz", + "integrity": "sha512-oN3lNUMLfIR4tI9ByLtfLThGhFeYWCjWw5lfat/2PLZRA6U/v7wzKb0SbCjhZcEHGYHqi05c2JTVmeMzIAxapw==", + "requires": { + "request": "^2.69.0" } }, "url-parse-lax": { @@ -2499,20 +3233,40 @@ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==" }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" } } } diff --git a/package.json b/package.json index 05b82cd..50f0c9d 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,16 @@ { "name": "tmdb-addon", - "version": "3.0.11", + "version": "3.0.10", "description": "Metadata provided by TMDB", "main": "server.js", - "type": "module", "dependencies": { + "cache-manager": "^3.6.3", + "cache-manager-mongodb": "^0.3.0", "dotenv": "^16.3.1", "express": "^4.18.2", "fanart.tv-api": "^2.0.1", - "moviedb-promise": "^4.0.0", - "url-exist": "^3.0.1" + "moviedb-promise": "^3.4.1", + "url-exists": "^1.0.3" }, "scripts": { "dev": "nodemon server.js", diff --git a/server.js b/server.js index d3c3b55..122ac2d 100644 --- a/server.js +++ b/server.js @@ -1,10 +1,9 @@ // require serverless version -import addon from './index.js'; - +const addon = require('./index.js') const PORT = process.env.PORT || 7000 // create local server -addon.listen(PORT, () => { +addon.listen(PORT, function () { console.log(`Addon active on port ${PORT}.`); console.log(`http://127.0.0.1:${PORT}/`); }); \ No newline at end of file diff --git a/utils/parseProps.js b/utils/parseProps.js index 3df801f..3d9a6bd 100644 --- a/utils/parseProps.js +++ b/utils/parseProps.js @@ -1,23 +1,29 @@ -function parseCertification({results}, language) { - return results.filter( - ({iso_3166_1}) => iso_3166_1 == language.split("-")[1] +function parseCertification(release_dates, language) { + return release_dates.results.filter( + (releases) => releases.iso_3166_1 == language.split("-")[1] )[0].release_dates[0].certification; } -function parseCast({cast}) { - return cast.slice(0, 4).map(({name}) => name); +function parseCast(credits) { + return credits.cast.slice(0, 4).map((el) => { + return el.name; + }); } -function parseDirector({crew}) { - return crew - .filter(({job}) => job === "Director") - .map(({name}) => name); +function parseDirector(credits) { + return credits.crew + .filter((x) => x.job === "Director") + .map((el) => { + return el.name; + }); } -function parseWriter({crew}) { - return crew - .filter(({job}) => job === "Writer") - .map(({name}) => name); +function parseWriter(credits) { + return credits.crew + .filter((x) => x.job === "Writer") + .map((el) => { + return el.name; + }); } function parseSlug(type, title, imdb_id) { @@ -26,24 +32,28 @@ function parseSlug(type, title, imdb_id) { }`; } -function parseTrailers({results}) { - return results - .filter(({site}) => site === "YouTube") - .filter(({type}) => type === "Trailer") - .map(({key, type}) => ({ - source: `${key}`, - type: `${type}` - })); +function parseTrailers(videos) { + return videos.results + .filter((el) => el.site === "YouTube") + .filter((el) => el.type === "Trailer") + .map((el) => { + return { + source: `${el.key}`, + type: `${el.type}`, + }; + }); } -function parseTrailerStream({results}) { - return results - .filter(({site}) => site === "YouTube") - .filter(({type}) => type === "Trailer") - .map(({name, key}) => ({ - title: `${name}`, - ytId: `${key}` - })); +function parseTrailerStream(videos) { + return videos.results + .filter((el) => el.site === "YouTube") + .filter((el) => el.type === "Trailer") + .map((el) => { + return { + title: `${el.name}`, + ytId: `${el.key}`, + }; + }); } function parseImdbLink(vote_average, imdb_id) { @@ -63,43 +73,52 @@ function parseShareLink(title, imdb_id, type) { } function parseGenreLink(genres, type, language) { - return genres.map(({name}) => ({ - name, - category: "Genres", - - url: `stremio:///discover/${encodeURIComponent( - process.env.HOST_NAME - )}%2F${language}%2Fmanifest.json/${type}/tmdb.top?genre=${encodeURIComponent( - name - )}` - })); + return genres.map((genre) => { + return { + name: genre.name, + category: "Genres", + url: `stremio:///discover/${encodeURIComponent( + process.env.HOST_NAME + )}%2F${language}%2Fmanifest.json/${type}/tmdb.top?genre=${encodeURIComponent( + genre.name + )}`, + }; + }); } function parseCreditsLink(credits) { - const Cast = parseCast(credits).map(actor => ({ - name: actor, - category: "Cast", - url: `stremio:///search?search=${encodeURIComponent(actor)}` - })); - const Director = parseDirector(credits).map(director => ({ - name: director, - category: "Directors", - url: `stremio:///search?search=${encodeURIComponent(director)}` - })); - const Writer = parseWriter(credits).map(writer => ({ - name: writer, - category: "Writers", - url: `stremio:///search?search=${encodeURIComponent(writer)}` - })); + const Cast = parseCast(credits).map((actor) => { + return { + name: actor, + category: "Cast", + url: `stremio:///search?search=${encodeURIComponent(actor)}`, + }; + }); + const Director = parseDirector(credits).map((director) => { + return { + name: director, + category: "Directors", + url: `stremio:///search?search=${encodeURIComponent(director)}`, + }; + }); + const Writer = parseWriter(credits).map((writer) => { + return { + name: writer, + category: "Writers", + url: `stremio:///search?search=${encodeURIComponent(writer)}`, + }; + }); return new Array(...Cast, ...Director, ...Writer); } function parseCoutry(production_countries) { - return production_countries.map(({name}) => name).join(", "); + return production_countries.map((country) => country.name).join(", "); } function parseGenres(genres) { - return genres.map(({name}) => name); + return genres.map((el) => { + return el.name; + }); } function parseYear(status, first_air_date, last_air_date) { @@ -114,16 +133,16 @@ function parseYear(status, first_air_date, last_air_date) { function parseRunTime(runtime) { if (runtime) { - const hours = runtime / 60; - const rhours = Math.floor(hours); - const minutes = (hours - rhours) * 60; - const rminutes = Math.round(minutes); - return rhours > 0 ? `${rhours}h${rminutes}min` : `${rminutes}min`; + var hours = runtime / 60; + var rhours = Math.floor(hours); + var minutes = (hours - rhours) * 60; + var rminutes = Math.round(minutes); + return rhours > 0 ? rhours + "h" + rminutes + "min" : rminutes + "min"; } } function parseCreatedBy(created_by) { - return created_by.map(({name}) => name); + return created_by.map((el) => el.name); } function parseConfig(catalogChoices) { @@ -149,7 +168,19 @@ function getRpdbPoster(type, id, language, rpdbkey) { } } -export default { +async function checkIfExists(rpdbImage) { + return new Promise((resolve) => { + urlExists(rpdbImage, (err, exists) => { + if (exists) { + resolve(true) + } else { + resolve(false); + } + }) + }); +} + +module.exports = { parseCertification, parseCast, parseDirector, @@ -168,4 +199,5 @@ export default { parseCreatedBy, parseConfig, getRpdbPoster, + checkIfExists };