UNPKG

hentaihaven

Version:

API for accessing hentaihaven.org

120 lines 5.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HentaiHavenAPI = void 0; const tslib_1 = require("tslib"); const node_fetch_1 = tslib_1.__importDefault(require("node-fetch")); const abort_controller_1 = tslib_1.__importDefault(require("abort-controller")); const HentaiHavenVideo_1 = require("./HentaiHavenVideo"); const HentaiHavenSearch_1 = require("./HentaiHavenSearch"); const fetch = async (...args) => { const response = await node_fetch_1.default(...args); response.json = async () => JSON.parse((await response.text()).replace(/\n+/g, ' ')); return response; }; fetch.isRedirect = node_fetch_1.default.isRedirect; const build_query = (options) => '?' + Object.entries(options).map(([key, value]) => { var _a, _b; value = (_b = (_a = value === null || value === void 0 ? void 0 : value.toISOString) === null || _a === void 0 ? void 0 : _a.call(value)) !== null && _b !== void 0 ? _b : value.toString(); return `${key}=${encodeURIComponent(value)}`; }).join('&'); class HentaiHavenAPI { constructor(options) { this.options = options; this.options = { fetch_options: {}, timeout: 10000, ...options }; if (HentaiHavenAPI.tags) return; HentaiHavenAPI.tags = this.api_fetch('https://hentaihaven.org/wp-json/wp/v2/tags?per_page=100').then(async (response) => { if ('error' in response) return []; const tag_pages = new Array(response.pages - 1).map(async (page) => { const response = await this.api_fetch(`https://hentaihaven.org/wp-json/wp/v2/tags?per_page=100&page=${page + 2}`); if ('error' in response) return []; return response.data; }); return [...response.data, ...(await Promise.all(tag_pages)).flat(Infinity)]; }); } static async get_tags(include_unused = false) { if (include_unused) return this.tags; return (await this.tags).filter(({ count }) => count); } get_fetch_options(options) { var _a, _b, _c; return Object.assign({}, this.options.fetch_options, options, { headers: Object.assign({}, (_b = (_a = this.options.fetch_options) === null || _a === void 0 ? void 0 : _a.headers) !== null && _b !== void 0 ? _b : {}, (_c = options.headers) !== null && _c !== void 0 ? _c : {}) }); } async get_video(id) { let video; if (Number.isNaN(+id)) { const response = await this.api_fetch(`https://hentaihaven.org/wp-json/wp/v2/posts/?slug=${encodeURIComponent(id)}`); if ('error' in response || !response.data.length) return null; video = response.data[0]; } else { const response = await this.api_fetch(`https://hentaihaven.org/wp-json/wp/v2/posts/${id}`); if ('error' in response) return null; video = response; } return new HentaiHavenVideo_1.HentaiHavenVideo(video, await HentaiHavenAPI.get_tags()); } async get_video_series(video) { if (video instanceof HentaiHavenVideo_1.HentaiHavenVideo) video = video.id; const response = await this.api_fetch(`http://hentaihaven.org/wp-json/wp/v2/categories?post=${video}`); if ('error' in response) return null; const { _links, ...data } = response.data[0]; return data; } async get_video_image(video) { const response = await this.api_fetch(`http://hentaihaven.org/wp-json/wp/v2/media/${video.raw.featured_media}`); if ('error' in response) return null; const { _links, ...data } = response; return data; } async search(query) { if (typeof query == 'string') query = { search: query }; query = { per_page: 100, ...query }; const results = await this.api_search(query); if ('error' in results) return null; return new HentaiHavenSearch_1.HentaiHavenSearch(results, await HentaiHavenAPI.get_tags()); } async api_search(request) { return await this.api_fetch(`http://hentaihaven.org/wp-json/wp/v2/posts${build_query(request)}`); } async api_fetch(url, options) { const controller = new abort_controller_1.default(); const timeout = setTimeout(() => controller.abort(), this.options.timeout); const result = await fetch(url, this.get_fetch_options({ ...options, signal: controller.signal })); clearTimeout(timeout); const json = await result.json(); if (result.status >= 300) return { error: true, ...json }; if (Array.isArray(json)) return { data: json, total: result.headers.get('x-wp-total'), pages: result.headers.get('x-wp-totalpages') }; return json; } } exports.HentaiHavenAPI = HentaiHavenAPI; //# sourceMappingURL=HentaiHavenAPI.js.map