mirror of
https://github.com/Viren070/tmdb-addon.git
synced 2025-12-01 23:18:11 +01:00
Initial commit
This commit is contained in:
@@ -0,0 +1,2 @@
|
|||||||
|
# Auto detect text files and perform LF normalization
|
||||||
|
* text=auto
|
||||||
+104
@@ -0,0 +1,104 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Microbundle cache
|
||||||
|
.rpt2_cache/
|
||||||
|
.rts2_cache_cjs/
|
||||||
|
.rts2_cache_es/
|
||||||
|
.rts2_cache_umd/
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# Next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# Nuxt.js build / generate output
|
||||||
|
.nuxt
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Gatsby files
|
||||||
|
.cache/
|
||||||
|
# Comment in the public line in if your project uses Gatsby and *not* Next.js
|
||||||
|
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||||
|
# public
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# TernJS port file
|
||||||
|
.tern-port
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 Silas Alves
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
const express = require("express");
|
||||||
|
const { getCatalog } = require("./lib/getCatalog");
|
||||||
|
const { getSearch } = require("./lib/getSearch");
|
||||||
|
const { getGenres } = require("./lib/getGenres");
|
||||||
|
const { getManifest } = require("./lib/getManifest");
|
||||||
|
const { getMeta } = require("./lib/getMeta");
|
||||||
|
const addon = express();
|
||||||
|
|
||||||
|
var respond = function (res, data) {
|
||||||
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
||||||
|
res.setHeader('Access-Control-Allow-Headers', '*');
|
||||||
|
res.setHeader('Content-Type', 'application/json');
|
||||||
|
res.send(data);
|
||||||
|
};
|
||||||
|
|
||||||
|
addon.get("/:language/manifest.json", async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const resp = await getManifest(language)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
addon.get("/:language/catalog/:type/:id.json", async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const type = req.params.type
|
||||||
|
const resp = await getCatalog(type, language)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
addon.get("/:language/catalog/:type/:id/skip=:skip.json", async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const type = req.params.type
|
||||||
|
const page = req.params.skip / 20 + 1
|
||||||
|
const resp = await getCatalog(type, language, page)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
addon.get("/:language/catalog/:type/:id/search=:query.json", async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const type = req.params.type
|
||||||
|
const query = req.params.query
|
||||||
|
const resp = await getSearch(type, language, query)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
addon.get("/:language/catalog/:type/:id/genre=:genre.json", async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const type = req.params.type
|
||||||
|
const genre = req.params.genre
|
||||||
|
const resp = await getGenres(type, language, genre)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
addon.get('/:language/catalog/:type/:id/genre=:genre:&skip=:skip.json', async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const type = req.params.type
|
||||||
|
const genre = req.query.genre
|
||||||
|
const page = req.query.skip / 20 + 1
|
||||||
|
const resp = await getGenres(type, language, genre, page)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
addon.get("/:language/meta/:type/:id.json", async function (req, res) {
|
||||||
|
const language = req.params.language
|
||||||
|
const type = req.params.type
|
||||||
|
const [idPrefixes, tmdbId] = req.params.id.split(":");
|
||||||
|
const resp = await getMeta(type, language, tmdbId)
|
||||||
|
respond(res, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = addon;
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
const { getGenreList } = require("./getGenreList")
|
||||||
|
|
||||||
|
async function getCatalog(type, language, page) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const genre_id = await getGenreList(language, type);
|
||||||
|
const catalog = moviedb
|
||||||
|
.discoverMovie({ language: language, page: page})
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
const metas = resp.map((el) => {
|
||||||
|
const genre = el.genre_ids.map((el) => {
|
||||||
|
const gen_name = genre_id.find(x => x.id === el).name;
|
||||||
|
return gen_name.toString()
|
||||||
|
})
|
||||||
|
const year = el.release_date.substr(0, 4)
|
||||||
|
return {
|
||||||
|
id: `tmdb:${el.id}`,
|
||||||
|
name: `${el.title}`,
|
||||||
|
genre: `${genre}`,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${el.poster_path}`,
|
||||||
|
posterShape: "regular",
|
||||||
|
imdbRating: `${el.vote_average}`,
|
||||||
|
year: year,
|
||||||
|
type: `${type}`,
|
||||||
|
description: `${el.overview}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return Promise.resolve({ metas });
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const catalog = moviedb
|
||||||
|
.discoverTv({ language: language, page: page})
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
const metas = resp.map((el) => {
|
||||||
|
const year = el.first_air_date.substr(0, 4)
|
||||||
|
return {
|
||||||
|
id: `tmdb:${el.id}`,
|
||||||
|
name: `${el.name}`,
|
||||||
|
genre: ``,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${el.poster_path}`,
|
||||||
|
posterShape: "regular",
|
||||||
|
imdbRating: `${el.vote_average}`,
|
||||||
|
year: year,
|
||||||
|
type: `${type}`,
|
||||||
|
description: `${el.overview}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return Promise.resolve({ metas });
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getCatalog };
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getCredits(type, language, tmdbId) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const catalog = moviedb
|
||||||
|
.movieCredits({ language: language, id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.cast;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const catalog = moviedb
|
||||||
|
.tvCredits({ language: language, id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.cast;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getCredits };
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getDirector(type, language, tmdbId) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const catalog = moviedb
|
||||||
|
.movieCredits({ language: language, id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.crew;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const catalog = moviedb
|
||||||
|
.tvCredits({ language: language, id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.crew;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getDirector };
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getEpisodes(language, tmdbId, imdb_id, seasons) {
|
||||||
|
const episodes = seasons.map((el) => {
|
||||||
|
const season = moviedb
|
||||||
|
.seasonInfo({ language: language, id: tmdbId, season_number: el.season_number })
|
||||||
|
.then((res) => {
|
||||||
|
const meta = res.episodes.map((el) => {
|
||||||
|
return {
|
||||||
|
id: `${imdb_id}:${el.season_number}:${el.episode_number}`,
|
||||||
|
name: `${el.name}`,
|
||||||
|
season: `${el.season_number}`,
|
||||||
|
// number: `${index + 1}`,
|
||||||
|
episode: `${el.episode_number}`,
|
||||||
|
// thumbnail: `https://image.tmdb.org/t/p/original${el.still_path}`,
|
||||||
|
overview: `${el.overview}`,
|
||||||
|
description: `${el.overview}`,
|
||||||
|
rating: `${el.vote_average}`,
|
||||||
|
firstAired: new Date(Date.parse(el.air_date) + el.season_number),
|
||||||
|
released: new Date(Date.parse(el.air_date) + el.season_number),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return meta
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return season
|
||||||
|
});
|
||||||
|
return (async () => {
|
||||||
|
const resultado = await Promise.all(episodes);
|
||||||
|
return resultado
|
||||||
|
})();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getEpisodes };
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getExternal(type, tmdbId) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const catalog = moviedb
|
||||||
|
.movieExternalIdss({ id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const catalog = moviedb
|
||||||
|
.tvExternalIds({ id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getExternal };
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getGenreList(language, type) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const genre = moviedb
|
||||||
|
.genreMovieList({ language: language })
|
||||||
|
.then((res) => {
|
||||||
|
return res.genres;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return genre
|
||||||
|
} else {
|
||||||
|
const genre = moviedb
|
||||||
|
.genreTvList({ language: language })
|
||||||
|
.then((res) => {
|
||||||
|
return res.genres;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return genre
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getGenreList };
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const { getGenreList } = require("./getGenreList");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getGenres(type, language, genre, page) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const genre_id = await getGenreList(language, type);
|
||||||
|
const gen_name = genre_id.find(x => x.name === genre).id;
|
||||||
|
const catalog = moviedb
|
||||||
|
.discoverMovie({ language: language, page: page, with_genres: gen_name})
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
const metas = resp.map((el) => {
|
||||||
|
const year = el.release_date.substr(0, 4)
|
||||||
|
return {
|
||||||
|
id: `tmdb:${el.id}`,
|
||||||
|
name: `${el.title}`,
|
||||||
|
genre: `${el.genre_ids}`,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${el.poster_path}`,
|
||||||
|
posterShape: "regular",
|
||||||
|
imdbRating: `${el.vote_average}`,
|
||||||
|
year: year,
|
||||||
|
type: `${type}`,
|
||||||
|
description: `${el.overview}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return Promise.resolve({ metas });
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const genre_id = await getGenreList(language, type);
|
||||||
|
const gen_name = genre_id.find(x => x.name === genre).id;
|
||||||
|
const catalog = moviedb
|
||||||
|
.discoverTv({ language: language, page: page, with_genres: gen_name})
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
const metas = resp.map((el) => {
|
||||||
|
const year = el.first_air_date.substr(0, 4)
|
||||||
|
return {
|
||||||
|
id: `tmdb:${el.id}`,
|
||||||
|
name: `${el.name}`,
|
||||||
|
genre: `${el.genre_ids}`,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${el.poster_path}`,
|
||||||
|
posterShape: "regular",
|
||||||
|
imdbRating: `${el.vote_average}`,
|
||||||
|
year: year,
|
||||||
|
type: `${type}`,
|
||||||
|
description: `${el.overview}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return Promise.resolve({ metas });
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getGenres };
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
const axios = require("axios");
|
||||||
|
const api_key = "67713d889c4375c0a82a71085fffead6"
|
||||||
|
|
||||||
|
async function getLogo(tvdb_id, type, tmdbId) {
|
||||||
|
if (type === "movie") {
|
||||||
|
try {
|
||||||
|
var meta = await axios.get(
|
||||||
|
`http://webservice.fanart.tv/v3/movies/${tmdbId}?api_key=${api_key}`
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`The MovieDB ${error.response.status}`);
|
||||||
|
}
|
||||||
|
return meta.data.hdmovielogo;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
var meta = await axios.get(
|
||||||
|
`http://webservice.fanart.tv/v3/tv/${tvdb_id}?api_key=${api_key}`
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`The MovieDB ${error.response.status}`);
|
||||||
|
}
|
||||||
|
return meta.data.hdtvlogo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getLogo };
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getManifest(language) {
|
||||||
|
const genre = moviedb
|
||||||
|
.genreMovieList({ language: language })
|
||||||
|
.then((res) => {
|
||||||
|
return res.genres;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
const resp = await genre;
|
||||||
|
const genres_movie = resp.map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const genre_tv = moviedb
|
||||||
|
.genreTvList({ language: language })
|
||||||
|
.then((res) => {
|
||||||
|
return res.genres;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
const resp2 = await genre_tv;
|
||||||
|
const genres_series = resp2.map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const manifest = {
|
||||||
|
id: "tmdb.addon",
|
||||||
|
version: "0.0.1",
|
||||||
|
icon:
|
||||||
|
"https://pbs.twimg.com/profile_images/1243623122089041920/gVZIvphd_400x400.jpg",
|
||||||
|
name: "The Movie Database Addon",
|
||||||
|
description: "TMDB API for Stremio.",
|
||||||
|
resources: ["catalog", "meta"],
|
||||||
|
types: ["movie", "series"],
|
||||||
|
idPrefixes: ["tmdb:"],
|
||||||
|
behaviorHints: {
|
||||||
|
configurable: true,
|
||||||
|
configurationRequired: false,
|
||||||
|
},
|
||||||
|
catalogs: [
|
||||||
|
{
|
||||||
|
type: "movie",
|
||||||
|
id: "movie.top",
|
||||||
|
extraSupported: ["search", "genre", "skip"],
|
||||||
|
genres: genres_movie,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "series",
|
||||||
|
id: "series.top",
|
||||||
|
extraSupported: ["search", "genre", "skip"],
|
||||||
|
genres: genres_series,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
return manifest;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getManifest };
|
||||||
+144
@@ -0,0 +1,144 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const { getCredits } = require("./getCredits");
|
||||||
|
const { getDirector } = require("./getDirector");
|
||||||
|
const { getExternal } = require("./getExternal");
|
||||||
|
const { getVideos } = require("./getVideos");
|
||||||
|
const { getEpisodes } = require("./getEpisodes");
|
||||||
|
const { getLogo } = require("./getLogo");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getMeta(type, language, tmdbId) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const get_logo = await getLogo(type, tmdbId)
|
||||||
|
const logo = get_logo.map((el) => {
|
||||||
|
return el.url
|
||||||
|
})
|
||||||
|
const resp = await getVideos(type, language, tmdbId);
|
||||||
|
const credits = await getCredits(type, language, tmdbId);
|
||||||
|
const crew = await getDirector(type, language, tmdbId);
|
||||||
|
const cast = credits.slice(0, 4).map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const director = crew.find((x) => x.job === "Director").name;
|
||||||
|
const metas = moviedb
|
||||||
|
.movieInfo({ id: tmdbId, language: language })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
let {
|
||||||
|
title,
|
||||||
|
imdb_id,
|
||||||
|
poster_path,
|
||||||
|
genres,
|
||||||
|
overview,
|
||||||
|
vote_average,
|
||||||
|
release_date,
|
||||||
|
runtime,
|
||||||
|
backdrop_path,
|
||||||
|
} = await metas;
|
||||||
|
const genero = genres.map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const videos = resp.map((el) => {
|
||||||
|
return {
|
||||||
|
source: `${el.key}`,
|
||||||
|
type: `${el.type}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
let meta = {
|
||||||
|
id: `tmdb:${tmdbId}`,
|
||||||
|
imdb_id: `${imdb_id}`,
|
||||||
|
type: type,
|
||||||
|
name: `${title}`,
|
||||||
|
imdbRating: `${vote_average}`,
|
||||||
|
genres: genero,
|
||||||
|
cast: cast,
|
||||||
|
director: [`${director}`],
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${poster_path}`,
|
||||||
|
posterShape: "regular",
|
||||||
|
description: `${overview}`,
|
||||||
|
runtime: `${runtime} mim`,
|
||||||
|
background: `https://image.tmdb.org/t/p/original${backdrop_path}`,
|
||||||
|
logo: (logo.slice(0,1)).toString(),
|
||||||
|
releaseInfo: `${release_date.substr(0, 4)}`,
|
||||||
|
trailers: videos,
|
||||||
|
};
|
||||||
|
return Promise.resolve({ meta });
|
||||||
|
} else {
|
||||||
|
const resp = await getVideos(type, language, tmdbId);
|
||||||
|
const credits = await getCredits(type, language, tmdbId);
|
||||||
|
let { imdb_id, tvdb_id } = await getExternal(type, tmdbId);
|
||||||
|
const cast = credits.slice(0, 4).map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const metas = moviedb
|
||||||
|
.tvInfo({ id: tmdbId, language: language })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
let {
|
||||||
|
name,
|
||||||
|
poster_path,
|
||||||
|
genres,
|
||||||
|
overview,
|
||||||
|
vote_average,
|
||||||
|
first_air_date,
|
||||||
|
last_air_date,
|
||||||
|
episode_run_time,
|
||||||
|
backdrop_path,
|
||||||
|
seasons,
|
||||||
|
created_by,
|
||||||
|
status,
|
||||||
|
} = await metas;
|
||||||
|
const genero = genres.map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const writer = created_by.slice(0, 1).map((el) => {
|
||||||
|
return el.name;
|
||||||
|
});
|
||||||
|
const videos = resp.map((el) => {
|
||||||
|
return {
|
||||||
|
source: `${el.key}`,
|
||||||
|
type: `${el.type}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
function year() {
|
||||||
|
if (status === "Ended") {
|
||||||
|
return first_air_date.substr(0, 5) + last_air_date.substr(0, 4)
|
||||||
|
} else {
|
||||||
|
return first_air_date.substr(0, 5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const mapEpisodes = await getEpisodes(language, tmdbId, imdb_id, seasons);
|
||||||
|
const get_logo = await getLogo(tvdb_id, type)
|
||||||
|
const logo = get_logo.map((el) => {
|
||||||
|
return el.url
|
||||||
|
})
|
||||||
|
let meta = {
|
||||||
|
id: `tmdb:${tmdbId}`,
|
||||||
|
imdb_id: `${imdb_id}`,
|
||||||
|
type: type,
|
||||||
|
name: `${name}`,
|
||||||
|
imdbRating: `${vote_average}`,
|
||||||
|
genres: genero,
|
||||||
|
cast: cast,
|
||||||
|
writer: writer,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${poster_path}`,
|
||||||
|
posterShape: "regular",
|
||||||
|
description: `${overview}`,
|
||||||
|
runtime: `${episode_run_time.slice(0, 1)} mim`,
|
||||||
|
background: `https://image.tmdb.org/t/p/original${backdrop_path}`,
|
||||||
|
logo: (logo.slice(0,1)).toString(),
|
||||||
|
releaseInfo: year(),
|
||||||
|
trailers: videos,
|
||||||
|
videos: [].concat(...mapEpisodes),
|
||||||
|
};
|
||||||
|
return Promise.resolve({ meta });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getMeta };
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getSearch(type, language, query) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const catalog = moviedb
|
||||||
|
.searchMovie({ query: query, language: language })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
const metas = resp.map((el) => {
|
||||||
|
return {
|
||||||
|
id: `tmdb:${el.id}`,
|
||||||
|
name: `${el.title}`,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${el.poster_path}`,
|
||||||
|
type: `${type}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return Promise.resolve({ metas });
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const catalog = moviedb
|
||||||
|
.searchTv({ query: query, language: language })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
const metas = resp.map((el) => {
|
||||||
|
return {
|
||||||
|
id: `tmdb:${el.id}`,
|
||||||
|
name: `${el.name}`,
|
||||||
|
poster: `https://image.tmdb.org/t/p/original${el.poster_path}`,
|
||||||
|
type: `${type}`,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return Promise.resolve({ metas });
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getSearch };
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
const { MovieDb } = require("moviedb-promise");
|
||||||
|
const moviedb = new MovieDb("5a5366fc507321122c90b2b809b5ab20");
|
||||||
|
|
||||||
|
async function getVideos(type, language, tmdbId) {
|
||||||
|
if (type === "movie") {
|
||||||
|
const catalog = moviedb
|
||||||
|
.movieVideos({ language: language, id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
} else {
|
||||||
|
const catalog = moviedb
|
||||||
|
.tvVideos({ language: language, id: tmdbId })
|
||||||
|
.then((res) => {
|
||||||
|
const resp = res.results;
|
||||||
|
return resp;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
return catalog
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { getVideos };
|
||||||
+122
@@ -0,0 +1,122 @@
|
|||||||
|
{
|
||||||
|
"id": "tmdb.addon",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"icon": "https://pbs.twimg.com/profile_images/1243623122089041920/gVZIvphd_400x400.jpg",
|
||||||
|
"name": "The Movie Database Addon",
|
||||||
|
"description": "TMDB API for Stremio.",
|
||||||
|
"resources": ["catalog", "meta"],
|
||||||
|
"types": ["movie", "series"],
|
||||||
|
"idPrefixes": ["tmdb:"],
|
||||||
|
"behaviorHints": {
|
||||||
|
"configurable": true,
|
||||||
|
"configurationRequired": false
|
||||||
|
},
|
||||||
|
"catalogs": [
|
||||||
|
{
|
||||||
|
"type": "movie",
|
||||||
|
"id": "movie.top",
|
||||||
|
"extra": [
|
||||||
|
{
|
||||||
|
"name": "search",
|
||||||
|
"isRequired": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "skip",
|
||||||
|
"isRequired": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "genre",
|
||||||
|
"options": [
|
||||||
|
"Aventura",
|
||||||
|
"Acao",
|
||||||
|
"Comedia",
|
||||||
|
"Drama",
|
||||||
|
"Dublado",
|
||||||
|
"Ecchi",
|
||||||
|
"Escolar",
|
||||||
|
"Esporte",
|
||||||
|
"Fantasia",
|
||||||
|
"Filme",
|
||||||
|
"Harem",
|
||||||
|
"Historico",
|
||||||
|
"Jogo",
|
||||||
|
"Josei",
|
||||||
|
"Magia",
|
||||||
|
"Mecha",
|
||||||
|
"Militar",
|
||||||
|
"Misterio",
|
||||||
|
"Ova",
|
||||||
|
"Poderes",
|
||||||
|
"Psicologico",
|
||||||
|
"Romance",
|
||||||
|
"Samurai",
|
||||||
|
"Sci-fi",
|
||||||
|
"Seinen",
|
||||||
|
"Shoujo",
|
||||||
|
"Shounen",
|
||||||
|
"Slice_of_life",
|
||||||
|
"Sobrenatural",
|
||||||
|
"Suspense",
|
||||||
|
"Terror",
|
||||||
|
"Yaoi",
|
||||||
|
"Yuri"
|
||||||
|
],
|
||||||
|
"isRequired": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "series",
|
||||||
|
"id": "series.top",
|
||||||
|
"extra": [
|
||||||
|
{
|
||||||
|
"name": "search",
|
||||||
|
"isRequired": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "skip",
|
||||||
|
"isRequired": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "genre",
|
||||||
|
"options": [
|
||||||
|
"Aventura",
|
||||||
|
"Acao",
|
||||||
|
"Comedia",
|
||||||
|
"Drama",
|
||||||
|
"Dublado",
|
||||||
|
"Ecchi",
|
||||||
|
"Escolar",
|
||||||
|
"Esporte",
|
||||||
|
"Fantasia",
|
||||||
|
"Filme",
|
||||||
|
"Harem",
|
||||||
|
"Historico",
|
||||||
|
"Jogo",
|
||||||
|
"Josei",
|
||||||
|
"Magia",
|
||||||
|
"Mecha",
|
||||||
|
"Militar",
|
||||||
|
"Misterio",
|
||||||
|
"Ova",
|
||||||
|
"Poderes",
|
||||||
|
"Psicologico",
|
||||||
|
"Romance",
|
||||||
|
"Samurai",
|
||||||
|
"Sci-fi",
|
||||||
|
"Seinen",
|
||||||
|
"Shoujo",
|
||||||
|
"Shounen",
|
||||||
|
"Slice_of_life",
|
||||||
|
"Sobrenatural",
|
||||||
|
"Suspense",
|
||||||
|
"Terror",
|
||||||
|
"Yaoi",
|
||||||
|
"Yuri"
|
||||||
|
],
|
||||||
|
"isRequired": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Generated
+607
@@ -0,0 +1,607 @@
|
|||||||
|
{
|
||||||
|
"name": "tmdb.addon",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@sindresorhus/is": {
|
||||||
|
"version": "0.14.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
|
||||||
|
"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
|
||||||
|
},
|
||||||
|
"@szmarczak/http-timer": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
|
||||||
|
"requires": {
|
||||||
|
"defer-to-connect": "^1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"accepts": {
|
||||||
|
"version": "1.3.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
|
||||||
|
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
|
||||||
|
"requires": {
|
||||||
|
"mime-types": "~2.1.24",
|
||||||
|
"negotiator": "0.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"array-flatten": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||||
|
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||||
|
},
|
||||||
|
"axios": {
|
||||||
|
"version": "0.21.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
|
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
||||||
|
"requires": {
|
||||||
|
"follow-redirects": "^1.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"body-parser": {
|
||||||
|
"version": "1.19.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
|
||||||
|
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
|
||||||
|
"requires": {
|
||||||
|
"bytes": "3.1.0",
|
||||||
|
"content-type": "~1.0.4",
|
||||||
|
"debug": "2.6.9",
|
||||||
|
"depd": "~1.1.2",
|
||||||
|
"http-errors": "1.7.2",
|
||||||
|
"iconv-lite": "0.4.24",
|
||||||
|
"on-finished": "~2.3.0",
|
||||||
|
"qs": "6.7.0",
|
||||||
|
"raw-body": "2.4.0",
|
||||||
|
"type-is": "~1.6.17"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bytes": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
|
||||||
|
},
|
||||||
|
"cacheable-request": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
|
||||||
|
"requires": {
|
||||||
|
"clone-response": "^1.0.2",
|
||||||
|
"get-stream": "^5.1.0",
|
||||||
|
"http-cache-semantics": "^4.0.0",
|
||||||
|
"keyv": "^3.0.0",
|
||||||
|
"lowercase-keys": "^2.0.0",
|
||||||
|
"normalize-url": "^4.1.0",
|
||||||
|
"responselike": "^1.0.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"get-stream": {
|
||||||
|
"version": "5.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
|
||||||
|
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
|
||||||
|
"requires": {
|
||||||
|
"pump": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lowercase-keys": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"clone-response": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
|
||||||
|
"requires": {
|
||||||
|
"mimic-response": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"content-disposition": {
|
||||||
|
"version": "0.5.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
|
||||||
|
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "5.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"content-type": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
|
||||||
|
},
|
||||||
|
"cookie": {
|
||||||
|
"version": "0.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
|
||||||
|
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
|
||||||
|
},
|
||||||
|
"cookie-signature": {
|
||||||
|
"version": "1.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||||
|
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
|
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"decompress-response": {
|
||||||
|
"version": "3.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
|
||||||
|
"integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
|
||||||
|
"requires": {
|
||||||
|
"mimic-response": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defer-to-connect": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
|
||||||
|
},
|
||||||
|
"depd": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||||
|
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
|
||||||
|
},
|
||||||
|
"destroy": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||||
|
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||||
|
},
|
||||||
|
"duplexer3": {
|
||||||
|
"version": "0.1.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
|
||||||
|
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
|
||||||
|
},
|
||||||
|
"ee-first": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||||
|
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||||
|
},
|
||||||
|
"encodeurl": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
|
||||||
|
},
|
||||||
|
"end-of-stream": {
|
||||||
|
"version": "1.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
||||||
|
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
||||||
|
"requires": {
|
||||||
|
"once": "^1.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"escape-html": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||||
|
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||||
|
},
|
||||||
|
"etag": {
|
||||||
|
"version": "1.8.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||||
|
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||||
|
},
|
||||||
|
"express": {
|
||||||
|
"version": "4.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
|
||||||
|
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
|
||||||
|
"requires": {
|
||||||
|
"accepts": "~1.3.7",
|
||||||
|
"array-flatten": "1.1.1",
|
||||||
|
"body-parser": "1.19.0",
|
||||||
|
"content-disposition": "0.5.3",
|
||||||
|
"content-type": "~1.0.4",
|
||||||
|
"cookie": "0.4.0",
|
||||||
|
"cookie-signature": "1.0.6",
|
||||||
|
"debug": "2.6.9",
|
||||||
|
"depd": "~1.1.2",
|
||||||
|
"encodeurl": "~1.0.2",
|
||||||
|
"escape-html": "~1.0.3",
|
||||||
|
"etag": "~1.8.1",
|
||||||
|
"finalhandler": "~1.1.2",
|
||||||
|
"fresh": "0.5.2",
|
||||||
|
"merge-descriptors": "1.0.1",
|
||||||
|
"methods": "~1.1.2",
|
||||||
|
"on-finished": "~2.3.0",
|
||||||
|
"parseurl": "~1.3.3",
|
||||||
|
"path-to-regexp": "0.1.7",
|
||||||
|
"proxy-addr": "~2.0.5",
|
||||||
|
"qs": "6.7.0",
|
||||||
|
"range-parser": "~1.2.1",
|
||||||
|
"safe-buffer": "5.1.2",
|
||||||
|
"send": "0.17.1",
|
||||||
|
"serve-static": "1.14.1",
|
||||||
|
"setprototypeof": "1.1.1",
|
||||||
|
"statuses": "~1.5.0",
|
||||||
|
"type-is": "~1.6.18",
|
||||||
|
"utils-merge": "1.0.1",
|
||||||
|
"vary": "~1.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fanart.tv": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/fanart.tv/-/fanart.tv-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-qvDpP98J1qgHwm8G7LSDE9yH9/96KS4DAEb0vhrqUqwItepTVM3MeDoMLXLT9YNN793t0eNA/lNZ8c11+H+uNw==",
|
||||||
|
"requires": {
|
||||||
|
"got": "^9.5.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"finalhandler": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
|
||||||
|
"requires": {
|
||||||
|
"debug": "2.6.9",
|
||||||
|
"encodeurl": "~1.0.2",
|
||||||
|
"escape-html": "~1.0.3",
|
||||||
|
"on-finished": "~2.3.0",
|
||||||
|
"parseurl": "~1.3.3",
|
||||||
|
"statuses": "~1.5.0",
|
||||||
|
"unpipe": "~1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"follow-redirects": {
|
||||||
|
"version": "1.13.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz",
|
||||||
|
"integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg=="
|
||||||
|
},
|
||||||
|
"forwarded": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||||
|
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
|
||||||
|
},
|
||||||
|
"fresh": {
|
||||||
|
"version": "0.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||||
|
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
|
||||||
|
},
|
||||||
|
"get-stream": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
|
||||||
|
"requires": {
|
||||||
|
"pump": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"got": {
|
||||||
|
"version": "9.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
|
||||||
|
"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
|
||||||
|
"requires": {
|
||||||
|
"@sindresorhus/is": "^0.14.0",
|
||||||
|
"@szmarczak/http-timer": "^1.1.2",
|
||||||
|
"cacheable-request": "^6.0.0",
|
||||||
|
"decompress-response": "^3.3.0",
|
||||||
|
"duplexer3": "^0.1.4",
|
||||||
|
"get-stream": "^4.1.0",
|
||||||
|
"lowercase-keys": "^1.0.1",
|
||||||
|
"mimic-response": "^1.0.1",
|
||||||
|
"p-cancelable": "^1.0.0",
|
||||||
|
"to-readable-stream": "^1.0.0",
|
||||||
|
"url-parse-lax": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"http-cache-semantics": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
|
||||||
|
},
|
||||||
|
"http-errors": {
|
||||||
|
"version": "1.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
|
||||||
|
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
|
||||||
|
"requires": {
|
||||||
|
"depd": "~1.1.2",
|
||||||
|
"inherits": "2.0.3",
|
||||||
|
"setprototypeof": "1.1.1",
|
||||||
|
"statuses": ">= 1.5.0 < 2",
|
||||||
|
"toidentifier": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"iconv-lite": {
|
||||||
|
"version": "0.4.24",
|
||||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||||
|
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||||
|
"requires": {
|
||||||
|
"safer-buffer": ">= 2.1.2 < 3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"inherits": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||||
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||||
|
},
|
||||||
|
"ipaddr.js": {
|
||||||
|
"version": "1.9.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
||||||
|
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
|
||||||
|
},
|
||||||
|
"json-buffer": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
|
||||||
|
"integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
|
||||||
|
},
|
||||||
|
"keyv": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
|
||||||
|
"requires": {
|
||||||
|
"json-buffer": "3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lodash": {
|
||||||
|
"version": "4.17.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
|
||||||
|
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
|
||||||
|
},
|
||||||
|
"lowercase-keys": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
|
||||||
|
},
|
||||||
|
"media-typer": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||||
|
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||||
|
},
|
||||||
|
"merge-descriptors": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
|
||||||
|
},
|
||||||
|
"methods": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||||
|
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
|
||||||
|
},
|
||||||
|
"mime": {
|
||||||
|
"version": "1.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||||
|
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
|
||||||
|
},
|
||||||
|
"mime-db": {
|
||||||
|
"version": "1.45.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
|
||||||
|
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w=="
|
||||||
|
},
|
||||||
|
"mime-types": {
|
||||||
|
"version": "2.1.28",
|
||||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
|
||||||
|
"integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
|
||||||
|
"requires": {
|
||||||
|
"mime-db": "1.45.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mimic-response": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
|
||||||
|
},
|
||||||
|
"moviedb-promise": {
|
||||||
|
"version": "3.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/moviedb-promise/-/moviedb-promise-3.1.6.tgz",
|
||||||
|
"integrity": "sha512-veOK3hEmP/b011FEA36cVfCZN/IBZ8X6VOtCzM4jgoL1MgbLpCxoGGZsOs4WceXJ8oCi+OegJ82Ojkbs8I1pVg==",
|
||||||
|
"requires": {
|
||||||
|
"axios": "^0.21.1",
|
||||||
|
"lodash": "^4.17.15"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"axios": {
|
||||||
|
"version": "0.21.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
||||||
|
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
||||||
|
"requires": {
|
||||||
|
"follow-redirects": "^1.10.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||||
|
},
|
||||||
|
"negotiator": {
|
||||||
|
"version": "0.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
|
||||||
|
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
|
||||||
|
},
|
||||||
|
"normalize-url": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
|
||||||
|
"integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
|
||||||
|
},
|
||||||
|
"on-finished": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||||
|
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
|
||||||
|
"requires": {
|
||||||
|
"ee-first": "1.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"once": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||||
|
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||||
|
"requires": {
|
||||||
|
"wrappy": "1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"p-cancelable": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
|
||||||
|
},
|
||||||
|
"parseurl": {
|
||||||
|
"version": "1.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||||
|
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||||
|
},
|
||||||
|
"path-to-regexp": {
|
||||||
|
"version": "0.1.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||||
|
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||||
|
},
|
||||||
|
"prepend-http": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
|
||||||
|
},
|
||||||
|
"proxy-addr": {
|
||||||
|
"version": "2.0.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
|
||||||
|
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
|
||||||
|
"requires": {
|
||||||
|
"forwarded": "~0.1.2",
|
||||||
|
"ipaddr.js": "1.9.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pump": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
|
||||||
|
"requires": {
|
||||||
|
"end-of-stream": "^1.1.0",
|
||||||
|
"once": "^1.3.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"qs": {
|
||||||
|
"version": "6.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
|
||||||
|
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
|
||||||
|
},
|
||||||
|
"range-parser": {
|
||||||
|
"version": "1.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||||
|
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
||||||
|
},
|
||||||
|
"raw-body": {
|
||||||
|
"version": "2.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
|
||||||
|
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
|
||||||
|
"requires": {
|
||||||
|
"bytes": "3.1.0",
|
||||||
|
"http-errors": "1.7.2",
|
||||||
|
"iconv-lite": "0.4.24",
|
||||||
|
"unpipe": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"responselike": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
|
||||||
|
"requires": {
|
||||||
|
"lowercase-keys": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"safe-buffer": {
|
||||||
|
"version": "5.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||||
|
},
|
||||||
|
"safer-buffer": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||||
|
},
|
||||||
|
"send": {
|
||||||
|
"version": "0.17.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
|
||||||
|
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
|
||||||
|
"requires": {
|
||||||
|
"debug": "2.6.9",
|
||||||
|
"depd": "~1.1.2",
|
||||||
|
"destroy": "~1.0.4",
|
||||||
|
"encodeurl": "~1.0.2",
|
||||||
|
"escape-html": "~1.0.3",
|
||||||
|
"etag": "~1.8.1",
|
||||||
|
"fresh": "0.5.2",
|
||||||
|
"http-errors": "~1.7.2",
|
||||||
|
"mime": "1.6.0",
|
||||||
|
"ms": "2.1.1",
|
||||||
|
"on-finished": "~2.3.0",
|
||||||
|
"range-parser": "~1.2.1",
|
||||||
|
"statuses": "~1.5.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"serve-static": {
|
||||||
|
"version": "1.14.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
|
||||||
|
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
|
||||||
|
"requires": {
|
||||||
|
"encodeurl": "~1.0.2",
|
||||||
|
"escape-html": "~1.0.3",
|
||||||
|
"parseurl": "~1.3.3",
|
||||||
|
"send": "0.17.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"setprototypeof": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
|
||||||
|
},
|
||||||
|
"statuses": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
||||||
|
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
||||||
|
},
|
||||||
|
"to-readable-stream": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
|
||||||
|
},
|
||||||
|
"toidentifier": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
|
||||||
|
},
|
||||||
|
"type-is": {
|
||||||
|
"version": "1.6.18",
|
||||||
|
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||||
|
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||||
|
"requires": {
|
||||||
|
"media-typer": "0.3.0",
|
||||||
|
"mime-types": "~2.1.24"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"unpipe": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||||
|
},
|
||||||
|
"url-parse-lax": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
|
||||||
|
"integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
|
||||||
|
"requires": {
|
||||||
|
"prepend-http": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils-merge": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
|
||||||
|
},
|
||||||
|
"vary": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||||
|
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
|
||||||
|
},
|
||||||
|
"wrappy": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
|
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "tmdb.addon",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "TMDB API for Stremio.",
|
||||||
|
"scripts": {
|
||||||
|
"start": "node server.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "^0.21.1",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"fanart.tv": "^2.1.0",
|
||||||
|
"moviedb-promise": "^3.1.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user