@aliceplex/core
Version:
[![License][license_badge]][license] [![Pipelines][pipelines_badge]][pipelines] [![Coverage][coverage_badge]][pipelines] [![NPM][npm_badge]][npm] [![semantic-release][semantic_release_badge]][semantic_release]
89 lines • 3.92 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const url_1 = require("url");
const moment_1 = __importDefault(require("moment"));
const lodash_1 = __importDefault(require("lodash"));
const utils_1 = require("./utils");
const fetchAuthToken = (credential) => __awaiter(void 0, void 0, void 0, function* () {
const url = "https://api.thetvdb.com/login";
const json = yield utils_1.fetchJsonMemorized(url, {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(credential)
});
const { token } = json;
if (!lodash_1.default.isString(token)) {
throw new Error("Unable to get TVDB auth token!");
}
return token;
});
const getAuthHeaders = (authToken, language) => ({
Accept: "application/json",
Authorization: `Bearer ${authToken}`,
"Accept-Language": language
});
const fetchEpisodes = (tvdbId, pageNumber, request) => __awaiter(void 0, void 0, void 0, function* () {
const url = new url_1.URL(`https://api.thetvdb.com/series/${tvdbId}/episodes`);
url.searchParams.append("page", `${pageNumber}`);
const json = yield utils_1.fetchJsonMemorized(url.href, request);
const { data, links } = json;
const { next } = links;
if (next) {
const newData = yield fetchEpisodes(tvdbId, next, request);
data.push(...newData);
}
return data;
});
const fetchEpisodesMemorized = lodash_1.default.memoize(fetchEpisodes, (tvdbId, pageNumber) => JSON.stringify({ tvdbId, pageNumber }));
const fetchEpisode = (context, options) => __awaiter(void 0, void 0, void 0, function* () {
const { tvdbId, credential, language = "ja", transformContext = (c) => c } = options;
const { episode: airedEpisodeNumber, season: airedSeason } = transformContext(context);
const authToken = yield fetchAuthToken(credential);
const headers = getAuthHeaders(authToken, language);
const episodes = yield fetchEpisodesMemorized(tvdbId, 1, { headers });
const ep = lodash_1.default.find(episodes, { airedSeason, airedEpisodeNumber });
if (!ep) {
throw new Error(`Cannot find season ${airedSeason} episode ${airedEpisodeNumber}`);
}
return ep;
});
exports.createTvdbScrapper = (options) => (context) => __awaiter(void 0, void 0, void 0, function* () {
const { fields = {} } = options;
const { title, aired, summary, thumbnail } = fields;
const episode = yield fetchEpisode(context, options);
const data = {};
const thumbnails = [];
if (title) {
data.title = [episode.episodeName];
}
if (summary) {
data.summary = episode.overview;
}
if (aired) {
const date = moment_1.default(episode.firstAired);
data.aired = date.format("YYYY-MM-DD");
}
if (thumbnail) {
const { filename } = episode;
if (filename) {
thumbnails.push(`https://www.thetvdb.com/banners/${filename}`);
}
}
return { data, thumbnails };
});
//# sourceMappingURL=tvdb.js.map