UNPKG

@tiktikimelbo7/extensions

Version:

Nodejs library that provides high-level APIs for obtaining information on various entertainment media such as books, movies, comic books, anime, manga, and so on.

177 lines 7.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const cheerio_1 = require("cheerio"); const models_1 = require("../../models"); const extractors_1 = require("../../extractors"); class AnimePahe extends models_1.AnimeParser { constructor() { super(...arguments); this.name = 'AnimePahe'; this.baseUrl = 'https://animepahe.com'; this.logo = 'https://animepahe.com/pikacon.ico'; this.classPath = 'ANIME.AnimePahe'; // private readonly sgProxy = 'https://cors.consumet.stream'; /** * @param query Search query */ this.search = async (query) => { try { const { data } = await this.client.get(`${this.baseUrl}/api?m=search&q=${encodeURIComponent(query)}`); const res = { results: data.data.map((item) => ({ id: `${item.id}/${item.session}`, title: item.title, image: item.poster, rating: item.score, releaseDate: item.year, type: item.type, })), }; return res; } catch (err) { throw new Error(err.message); } }; /** * @param id id format id/session * @param episodePage Episode page number (optional) default: -1 to get all episodes. number of episode pages can be found in the anime info object */ this.fetchAnimeInfo = async (id, episodePage = -1) => { const animeInfo = { id: id, title: '', }; try { const res = await this.client.get(`${this.baseUrl}/anime/${id.split('/')[1]}?anime_id=${id.split('/')[0]}`); const $ = (0, cheerio_1.load)(res.data); animeInfo.title = $('div.title-wrapper > h1 > span').first().text(); animeInfo.image = $('div.anime-poster a').attr('href'); animeInfo.cover = `https:${$('div.anime-cover').attr('data-src')}`; animeInfo.description = $('div.anime-summary').text(); animeInfo.genres = $('div.anime-genre ul li') .map((i, el) => $(el).find('a').attr('title')) .get(); switch ($('div.col-sm-4.anime-info p:icontains("Status:") a').text().trim()) { case 'Currently Airing': animeInfo.status = models_1.MediaStatus.ONGOING; break; case 'Finished Airing': animeInfo.status = models_1.MediaStatus.COMPLETED; break; default: animeInfo.status = models_1.MediaStatus.UNKNOWN; } animeInfo.type = $('div.col-sm-4.anime-info > p:nth-child(2) > a') .text() .trim() .toUpperCase(); animeInfo.releaseDate = $('div.col-sm-4.anime-info > p:nth-child(5)') .text() .split('to')[0] .replace('Aired:', '') .trim(); animeInfo.aired = $('div.col-sm-4.anime-info > p:nth-child(5)') .text() .replace('Aired:', '') .trim() .replace('\n', ' '); animeInfo.studios = $('div.col-sm-4.anime-info > p:nth-child(7)') .text() .replace('Studio:', '') .trim() .split('\n'); animeInfo.totalEpisodes = parseInt($('div.col-sm-4.anime-info > p:nth-child(3)').text().replace('Episodes:', '')); animeInfo.episodes = []; if (episodePage < 0) { const { data: { last_page, data }, } = await this.client.get(`${this.baseUrl}/api?m=release&id=${id.split('/')[1]}&sort=episode_asc&page=1`); animeInfo.episodePages = last_page; animeInfo.episodes.push(...data.map((item) => ({ id: `${id.split('/')[1]}/${item.session}`, number: item.episode, title: item.title, image: item.snapshot, duration: item.duration, url: `${this.baseUrl}/play/${id.split('/')[1]}/${item.session}`, }))); for (let i = 1; i < last_page; i++) { animeInfo.episodes.push(...(await this.fetchEpisodes(id.split('/')[1], i + 1))); } } else { animeInfo.episodes.push(...(await this.fetchEpisodes(id.split('/')[1], episodePage))); } return animeInfo; } catch (err) { throw new Error(err.message); } }; /** * * @param episodeId episode id */ this.fetchEpisodeSources = async (episodeId) => { try { const { data } = await this.client.get(`${this.baseUrl}/play/${episodeId}`, { headers: { Referer: `${this.baseUrl}`, }, }); const $ = (0, cheerio_1.load)(data); const links = $('div#resolutionMenu > button').map((i, el) => ({ url: $(el).attr('data-src'), quality: $(el).text(), audio: $(el).attr('data-audio'), })); const iSource = { headers: { Referer: 'https://kwik.cx/', }, sources: [], }; for (const link of links) { const res = await new extractors_1.Kwik(this.proxyConfig).extract(new URL(link.url)); res[0].quality = link.quality; res[0].isDub = link.audio === 'eng'; iSource.sources.push(res[0]); } return iSource; } catch (err) { throw new Error(err.message); } }; this.fetchEpisodes = async (session, page) => { const res = await this.client.get(`${this.baseUrl}/api?m=release&id=${session}&sort=episode_asc&page=${page}`); const epData = res.data.data; return [ ...epData.map((item) => ({ id: item.anime_id, number: item.episode, title: item.title, image: item.snapshot, duration: item.duration, url: `${this.baseUrl}/play/${session}/${item.session}`, })), ]; }; /** * @deprecated * @attention AnimePahe doesn't support this method */ this.fetchEpisodeServers = (episodeLink) => { throw new Error('Method not implemented.'); }; } } exports.default = AnimePahe; // (async () => { // const animepahe = new AnimePahe(); // // const anime = await animepahe.search('Classroom of the elite'); // const info = await animepahe.fetchAnimeInfo(anime.results[0].id); // const sources = await animepahe.fetchEpisodeSources(info.episodes![0].id); // console.log(sources); // })(); //# sourceMappingURL=animepahe.js.map