mirror of
https://github.com/Viren070/tmdb-addon.git
synced 2025-12-01 23:18:11 +01:00
238 lines
5.8 KiB
JavaScript
238 lines
5.8 KiB
JavaScript
const urlExists = require("url-exists");
|
|
|
|
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(credits) {
|
|
return credits.cast.slice(0, 4).map((el) => {
|
|
return el.name;
|
|
});
|
|
}
|
|
|
|
function parseDirector(credits) {
|
|
return credits.crew
|
|
.filter((x) => x.job === "Director")
|
|
.map((el) => {
|
|
return el.name;
|
|
});
|
|
}
|
|
|
|
function parseWriter(credits) {
|
|
return credits.crew
|
|
.filter((x) => x.job === "Writer")
|
|
.map((el) => {
|
|
return el.name;
|
|
});
|
|
}
|
|
|
|
function parseSlug(type, title, imdb_id) {
|
|
return `${type}/${title.toLowerCase().replace(/ /g, "-")}-${imdb_id ? imdb_id.replace("tt", "") : ""
|
|
}`;
|
|
}
|
|
|
|
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(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) {
|
|
return {
|
|
name: vote_average.toFixed(1),
|
|
category: "imdb",
|
|
url: `https://imdb.com/title/${imdb_id}`,
|
|
};
|
|
}
|
|
|
|
function parseShareLink(title, imdb_id, type) {
|
|
return {
|
|
name: title,
|
|
category: "share",
|
|
url: `https://www.strem.io/s/${parseSlug(type, title, imdb_id)}`,
|
|
};
|
|
}
|
|
|
|
function parseGenreLink(genres, type, language) {
|
|
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) => {
|
|
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((country) => country.name).join(", ");
|
|
}
|
|
|
|
function parseGenres(genres) {
|
|
return genres.map((el) => {
|
|
return el.name;
|
|
});
|
|
}
|
|
|
|
function parseYear(status, first_air_date, last_air_date) {
|
|
if (status === "Ended") {
|
|
return first_air_date && last_air_date
|
|
? first_air_date.substr(0, 5) + last_air_date.substr(0, 4)
|
|
: "";
|
|
} else {
|
|
return first_air_date ? first_air_date.substr(0, 5) : "";
|
|
}
|
|
}
|
|
|
|
function parseRunTime(runtime) {
|
|
if (runtime === 0 || !runtime) {
|
|
return "";
|
|
}
|
|
|
|
const hours = Math.floor(runtime / 60);
|
|
const minutes = runtime % 60;
|
|
|
|
if (runtime > 60) {
|
|
return hours > 0 ? `${hours}h${minutes}min` : `${minutes}min`;
|
|
} else {
|
|
return `${runtime}min`;
|
|
}
|
|
}
|
|
|
|
function parseCreatedBy(created_by) {
|
|
return created_by.map((el) => el.name);
|
|
}
|
|
|
|
function parseConfig(catalogChoices) {
|
|
let config = {}
|
|
try {
|
|
config = JSON.parse(catalogChoices);
|
|
} catch (e) {
|
|
if (catalogChoices) {
|
|
config.language = catalogChoices;
|
|
}
|
|
}
|
|
return config;
|
|
}
|
|
|
|
async function parsePoster(type, id, poster, language, rpdbkey) {
|
|
const tmdbImage = `https://image.tmdb.org/t/p/w500${poster}`
|
|
if (rpdbkey) {
|
|
const rpdbImage = getRpdbPoster(type, id, language, rpdbkey)
|
|
return await checkIfExists(rpdbImage) ? rpdbImage : tmdbImage;
|
|
}
|
|
return tmdbImage;
|
|
}
|
|
|
|
function parseMedia(el, type, genreList = []) {
|
|
const genres = Array.isArray(el.genre_ids)
|
|
? el.genre_ids.map(genre => genreList.find((x) => x.id === genre)?.name || 'Unknown')
|
|
: [];
|
|
|
|
return {
|
|
id: `tmdb:${el.id}`,
|
|
name: type === 'movie' ? el.title : el.name,
|
|
genre: genres,
|
|
poster: `https://image.tmdb.org/t/p/w500${el.poster_path}`,
|
|
background: `https://image.tmdb.org/t/p/original${el.backdrop_path}`,
|
|
posterShape: "regular",
|
|
imdbRating: el.vote_average ? el.vote_average.toFixed(1) : 'N/A',
|
|
year: type === 'movie' ? (el.release_date ? el.release_date.substr(0, 4) : "") : (el.first_air_date ? el.first_air_date.substr(0, 4) : ""),
|
|
type: type === 'movie' ? type : 'series',
|
|
description: el.overview,
|
|
};
|
|
}
|
|
function getRpdbPoster(type, id, language, rpdbkey) {
|
|
const tier = rpdbkey.split("-")[0]
|
|
const lang = language.split("-")[0]
|
|
if (tier === "t0" || tier === "t1" || lang === "en") {
|
|
return `https://api.ratingposterdb.com/${rpdbkey}/tmdb/poster-default/${type}-${id}.jpg?fallback=true`
|
|
} else {
|
|
return `https://api.ratingposterdb.com/${rpdbkey}/tmdb/poster-default/${type}-${id}.jpg?fallback=true&lang=${lang}`
|
|
}
|
|
}
|
|
|
|
async function checkIfExists(rpdbImage) {
|
|
return new Promise((resolve) => {
|
|
urlExists(rpdbImage, (err, exists) => {
|
|
if (exists) {
|
|
resolve(true)
|
|
} else {
|
|
resolve(false);
|
|
}
|
|
})
|
|
});
|
|
}
|
|
|
|
module.exports = {
|
|
parseCertification,
|
|
parseCast,
|
|
parseDirector,
|
|
parseSlug,
|
|
parseWriter,
|
|
parseTrailers,
|
|
parseTrailerStream,
|
|
parseImdbLink,
|
|
parseShareLink,
|
|
parseGenreLink,
|
|
parseCreditsLink,
|
|
parseCoutry,
|
|
parseGenres,
|
|
parseYear,
|
|
parseRunTime,
|
|
parseCreatedBy,
|
|
parseConfig,
|
|
parsePoster,
|
|
parseMedia,
|
|
getRpdbPoster,
|
|
checkIfExists
|
|
};
|