hentaihaven
Version:
API for accessing hentaihaven.org
120 lines • 5.29 kB
JavaScript
;
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