UNPKG

contentapi.ts

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.

203 lines 9.76 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 KissAsian extends models_1.MovieParser { constructor() { super(...arguments); this.name = 'KissAsian'; this.baseUrl = 'https://kissasian.mx'; this.logo = 'https://kissasian.mx/Content/images/logo.png'; this.classPath = 'MOVIES.KissAsian'; this.supportedTypes = new Set([models_1.TvType.MOVIE, models_1.TvType.TVSERIES]); this.search = async (query, page = 1) => { try { const searchResult = { currentPage: page, hasNextPage: false, results: [], }; const response = await this.client.post(`${this.baseUrl}/Search/Drama`, `keyword=${query.replace(/[\W_]+/g, '-')}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const $ = (0, cheerio_1.load)(response.data); $('div.item-list > div.list').each((i, el) => { var _a; searchResult.results.push({ id: (_a = $(el).find('div.info > p > a').attr('href')) === null || _a === void 0 ? void 0 : _a.slice(1), title: $(el).find('div.info > p > a').text().trim(), url: `${this.baseUrl}${$(el).find('div.info > p > a').attr('href')}`, image: `${this.baseUrl}${$(el).find('div.cover > a > img').attr('src')}`, }); }); if (searchResult.results.length === 0) { searchResult.results.push({ id: response.request.res.responseUrl.replace(/https?:\/\/[^\/]*\/?/i, ''), title: $('div.content').first().find('div.heading > h3').text().trim(), url: response.request.res.responseUrl, image: `${this.baseUrl}${$('div.content').first().find('div.cover > img').attr('src')}`, }); } return searchResult; } catch (err) { throw new Error(err.message); } }; this.fetchMediaInfo = async (mediaId) => { var _a, _b; try { const realMediaId = mediaId; if (!mediaId.startsWith(this.baseUrl)) mediaId = `${this.baseUrl}/${mediaId}`; const mediaInfo = { id: '', title: '', }; const { data } = await this.client.post(mediaId, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const $ = (0, cheerio_1.load)(data); mediaInfo.id = realMediaId; mediaInfo.title = $('div.content').first().find('div.heading > h3').text().trim(); mediaInfo.image = `${this.baseUrl}${$('div.content').first().find('div.cover > img').attr('src')}`; mediaInfo.otherNames = $('span:contains(Other name:)') .siblings() .map((i, el) => $(el).text().trim()) .get(); mediaInfo.description = $('div.summary1 > p').text().trim(); mediaInfo.releaseDate = (_a = $('span:contains(Date aired:)') .parent() .text() .split('Date aired:') .pop()) === null || _a === void 0 ? void 0 : _a.replace(/\t/g, '').replace(/\n/g, '').trim(); mediaInfo.genre = $('span:contains(Genres:)') .siblings('a') .map((i, el) => $(el).text().trim()) .get(); mediaInfo.country = $('span:contains(Country:)').siblings('a').text().trim(); switch ((_b = $('span:contains(Status:)').parent().text().split('Status:').pop()) === null || _b === void 0 ? void 0 : _b.trim()) { case 'Ongoing': mediaInfo.status = models_1.MediaStatus.ONGOING; break; case 'Completed': mediaInfo.status = models_1.MediaStatus.COMPLETED; break; case 'Cancelled': mediaInfo.status = models_1.MediaStatus.CANCELLED; break; case 'Unknown': mediaInfo.status = models_1.MediaStatus.UNKNOWN; break; default: mediaInfo.status = models_1.MediaStatus.UNKNOWN; break; } mediaInfo.episodes = []; $('ul.list li.episodeSub').each((i, el) => { var _a, _b, _c, _d; (_a = mediaInfo.episodes) === null || _a === void 0 ? void 0 : _a.push({ id: (_b = $(el).find('a').attr('href')) === null || _b === void 0 ? void 0 : _b.slice(1), title: $(el).find('a').text().trim(), episode: (_d = (_c = $(el).find('a').text()) === null || _c === void 0 ? void 0 : _c.split('Episode').pop()) === null || _d === void 0 ? void 0 : _d.trim(), url: `${this.baseUrl}${$(el).find('a').attr('href')}`, }); }); mediaInfo.episodes.reverse(); return mediaInfo; } catch (err) { throw new Error(err.message); } }; this.fetchEpisodeSources = async (episodeId, server = models_1.StreamingServers.Mp4Upload) => { if (episodeId.startsWith('http')) { const serverUrl = new URL(episodeId); switch (server) { case models_1.StreamingServers.VidMoly: return { sources: await new extractors_1.VidMoly(this.proxyConfig, this.adapter).extract(serverUrl), }; case models_1.StreamingServers.StreamWish: return { ...(await new extractors_1.StreamWish(this.proxyConfig, this.adapter).extract(serverUrl)), }; case models_1.StreamingServers.Mp4Upload: return { sources: await new extractors_1.Mp4Upload(this.proxyConfig, this.adapter).extract(serverUrl), }; default: throw new Error('Server not supported'); } } try { const servers = await this.fetchEpisodeServers(episodeId); const i = servers.findIndex(s => s.name.toLowerCase() === server.toLowerCase()); if (i === -1) { throw new Error(`Server ${server} not found`); } const serverUrl = new URL(servers.filter(s => s.name.toLowerCase() === server.toLowerCase())[0].url); return await this.fetchEpisodeSources(serverUrl.href, server); } catch (err) { throw new Error(err.message); } }; } async fetchEpisodeServers(episodeId) { try { const episodeServers = []; const { data } = await this.client.post(`${this.baseUrl}/${episodeId}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const $ = (0, cheerio_1.load)(data); episodeServers.push({ name: $('ul.mirrorTab > li > a.actived').text().trim(), url: $('iframe#mVideo').attr('src'), }); await Promise.all($('ul.mirrorTab > li > a.ign').map(async (i, ele) => { const { data } = await this.client.post(`${this.baseUrl}${$(ele).attr('href')}`, { headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, }); const $$ = (0, cheerio_1.load)(data); if ($$('ul.mirrorTab > li > a.actived').text().trim()) { const url = $$('iframe#mVideo').attr('src'); episodeServers.push({ name: $$('ul.mirrorTab > li > a.actived').text().trim(), url: url.startsWith('https') ? url : url.replace('//', 'https://'), }); } })); episodeServers.map(element => { switch (element.name) { case 'VM': element.name = models_1.StreamingServers.VidMoly; break; case 'SW': element.name = models_1.StreamingServers.StreamWish; break; case 'MP': element.name = models_1.StreamingServers.Mp4Upload; break; default: break; } }); return episodeServers; } catch (err) { throw new Error(err.message); } } } exports.default = KissAsian; //# sourceMappingURL=kissasian.js.map