Merge pull request #44 from aruppi/develop

🐧 Fixing genres to get them from the directory
pull/49/head
Jesús María 4 years ago committed by GitHub
commit fdef7d04e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,4 +1,4 @@
# **Aruppi API** (v4.0.4) # **Aruppi API** (v4.0.6)
> This API has everything about Japan, from anime, music, radio, images, videos ... to japanese culture > This API has everything about Japan, from anime, music, radio, images, videos ... to japanese culture
> >

@ -1,6 +1,6 @@
{ {
"name": "aruppi", "name": "aruppi",
"version": "4.0.4", "version": "4.0.6",
"description": "Aruppi is a custom API to obtain data from the Japanese culture for the mobile app", "description": "Aruppi is a custom API to obtain data from the Japanese culture for the mobile app",
"main": "./src/api/api.ts", "main": "./src/api/api.ts",
"scripts": { "scripts": {

@ -1,12 +1,13 @@
import { NextFunction, Request, Response } from 'express'; import { NextFunction, Request, Response } from 'express';
import { requestGot } from '../utils/requestCall'; import { requestGot } from '../utils/requestCall';
import { import {
animeFlvInfo,
imageUrlToBase64, imageUrlToBase64,
jkanimeInfo, jkanimeInfo,
monoschinosInfo, monoschinosInfo,
tioanimeInfo,
videoServersJK, videoServersJK,
videoServersMonosChinos, videoServersMonosChinos,
videoServersTioAnime,
} from '../utils/util'; } from '../utils/util';
import { transformUrlServer } from '../utils/transformerUrl'; import { transformUrlServer } from '../utils/transformerUrl';
import AnimeModel, { Anime as ModelA } from '../database/models/anime.model'; import AnimeModel, { Anime as ModelA } from '../database/models/anime.model';
@ -16,7 +17,6 @@ import {
animeExtraInfo, animeExtraInfo,
getAnimeVideoPromo, getAnimeVideoPromo,
getAnimeCharacters, getAnimeCharacters,
getRelatedAnimesFLV,
getRelatedAnimesMAL, getRelatedAnimesMAL,
} from '../utils/util'; } from '../utils/util';
import urls from '../utils/urls'; import urls from '../utils/urls';
@ -250,7 +250,8 @@ export default class AnimeController {
} }
async getLastEpisodes(req: Request, res: Response, next: NextFunction) { async getLastEpisodes(req: Request, res: Response, next: NextFunction) {
// let data: any; const { options } = req.params;
let data: any;
let $: cheerio.Root; let $: cheerio.Root;
let episodes: Episode[] = []; let episodes: Episode[] = [];
let animeList: any[] = []; let animeList: any[] = [];
@ -268,38 +269,32 @@ export default class AnimeController {
} }
} }
// @ANIMEFLV switch (options) {
// data = await requestGot( case 'monoschinos':
// `${urls.BASE_ANIMEFLV_JELU}LatestEpisodesAdded`,
// {
// parse: true,
// scrapy: false,
// },
// );
$ = await requestGot(`${urls.BASE_MONOSCHINOS}`, { $ = await requestGot(`${urls.BASE_MONOSCHINOS}`, {
scrapy: true, scrapy: true,
parse: false, parse: false,
}); });
break;
default:
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}LatestEpisodesAdded`,
{
parse: true,
scrapy: false,
},
);
break;
}
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
// @ANIMEFLV
// for (const episode of data.episodes) {
// const formattedEpisode: Episode = {
// id: '12345/' + episode.id,
// title: episode.title,
// image: episode.poster,
// episode: episode.episode,
// servers: await transformUrlServer(episode.servers),
// };
// episodes.push(formattedEpisode);
// }
let getLastest: any = $('.container .caps .container')[0]; switch (options) {
case 'monoschinos':
let getLastest: any = $!('.container .caps .container')[0];
$(getLastest) $!(getLastest)
.find('.row article') .find('.row article')
.each((index: number, element: cheerio.Element) => { .each((index: number, element: cheerio.Element) => {
let el: cheerio.Cheerio = $(element); let el: cheerio.Cheerio = $(element);
@ -337,6 +332,21 @@ export default class AnimeController {
servers: await videoServersMonosChinos(anime.id), servers: await videoServersMonosChinos(anime.id),
}); });
} }
break;
default:
for (const episode of data.episodes) {
const formattedEpisode: Episode = {
id: '12345/' + episode.id,
title: episode.title,
image: episode.poster,
episode: episode.episode,
servers: await transformUrlServer(episode.servers),
};
episodes.push(formattedEpisode);
}
break;
}
if (episodes.length > 0) { if (episodes.length > 0) {
if (redisClient.connected) { if (redisClient.connected) {
@ -677,15 +687,15 @@ export default class AnimeController {
} }
switch (searchAnime?.source) { switch (searchAnime?.source) {
case 'animeflv':
episodes = await animeFlvInfo(searchAnime?.id);
break;
case 'jkanime': case 'jkanime':
episodes = await jkanimeInfo(searchAnime?.id); episodes = await jkanimeInfo(searchAnime?.id, searchAnime?.mal_id);
break; break;
case 'monoschinos': case 'monoschinos':
episodes = await monoschinosInfo(searchAnime?.id, searchAnime?.mal_id); episodes = await monoschinosInfo(searchAnime?.id, searchAnime?.mal_id);
break; break;
case 'tioanime':
episodes = await tioanimeInfo(searchAnime?.id, searchAnime?.mal_id);
break;
default: default:
episodes = undefined; episodes = undefined;
break; break;
@ -731,19 +741,18 @@ export default class AnimeController {
} }
} }
if (isNaN(parseInt(id.split('/')[0]))) { if (
if (id.split('/')[0] === 'ver') { id.split('/')[0] === 'ver' &&
id.split('-').indexOf('espanol') !== -1
) {
data = await videoServersMonosChinos(id); data = await videoServersMonosChinos(id);
} else if (id.split('/')[0] === 'ver') {
data = await videoServersTioAnime(id);
} else { } else {
data = await videoServersJK(id); data = await videoServersJK(id);
} }
} else {
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}GetAnimeServers/${id}`,
{ parse: true, scrapy: false },
);
data = await transformUrlServer(data.servers); switch (id) {
} }
if (data) { if (data) {
@ -782,22 +791,6 @@ export default class AnimeController {
return next(err); return next(err);
} }
switch (animeQuery[0].source) {
case 'animeflv':
animeResult = {
title: animeQuery[0].title || null,
poster: animeQuery[0].poster || null,
synopsis: animeQuery[0].description || null,
type: animeQuery[0].type || null,
rating: animeQuery[0].score || null,
genres: animeQuery[0].genres || null,
moreInfo: [await animeExtraInfo(animeQuery[0].mal_id)],
promo: await getAnimeVideoPromo(animeQuery[0].mal_id),
characters: await getAnimeCharacters(animeQuery[0].mal_id),
related: await getRelatedAnimesFLV(animeQuery[0].id),
};
break;
case 'jkanime':
animeResult = { animeResult = {
title: animeQuery[0].title || null, title: animeQuery[0].title || null,
poster: animeQuery[0].poster || null, poster: animeQuery[0].poster || null,
@ -810,11 +803,6 @@ export default class AnimeController {
characters: await getAnimeCharacters(animeQuery[0].mal_id), characters: await getAnimeCharacters(animeQuery[0].mal_id),
related: await getRelatedAnimesMAL(animeQuery[0].mal_id), related: await getRelatedAnimesMAL(animeQuery[0].mal_id),
}; };
break;
default:
animeResult = undefined;
break;
}
if (animeResult) { if (animeResult) {
res.set('Cache-Control', 'no-store'); res.set('Cache-Control', 'no-store');

@ -8,7 +8,6 @@ import {
animeExtraInfo, animeExtraInfo,
getAnimeVideoPromo, getAnimeVideoPromo,
getAnimeCharacters, getAnimeCharacters,
getRelatedAnimesFLV,
getRelatedAnimesMAL, getRelatedAnimesMAL,
} from '../utils/util'; } from '../utils/util';
import urls from '../utils/urls'; import urls from '../utils/urls';
@ -295,38 +294,6 @@ export default class DirectoryController {
const extraInfo: any = await animeExtraInfo(resultQuery!.mal_id); const extraInfo: any = await animeExtraInfo(resultQuery!.mal_id);
switch (resultQuery?.source) {
case 'animeflv':
resultAnime = {
title: resultQuery?.title,
poster: resultQuery?.poster,
synopsis: resultQuery?.description,
status: !extraInfo.aired.to ? 'En emisión' : 'Finalizado',
type: resultQuery?.type,
rating: resultQuery?.score,
genres: resultQuery?.genres,
moreInfo: [extraInfo],
promo: await getAnimeVideoPromo(resultQuery!.mal_id),
characters: await getAnimeCharacters(resultQuery!.mal_id),
related: await getRelatedAnimesFLV(resultQuery!.id),
};
break;
case 'jkanime':
resultAnime = {
title: resultQuery?.title,
poster: resultQuery?.poster,
synopsis: resultQuery?.description,
status: !extraInfo.aired.to ? 'En emisión' : 'Finalizado',
type: resultQuery?.type,
rating: resultQuery?.score,
genres: resultQuery?.genres,
moreInfo: [extraInfo],
promo: await getAnimeVideoPromo(resultQuery!.mal_id),
characters: await getAnimeCharacters(resultQuery!.mal_id),
related: await getRelatedAnimesMAL(resultQuery!.mal_id),
};
break;
case 'monoschinos':
resultAnime = { resultAnime = {
title: resultQuery?.title, title: resultQuery?.title,
poster: resultQuery?.poster, poster: resultQuery?.poster,
@ -340,11 +307,6 @@ export default class DirectoryController {
characters: await getAnimeCharacters(resultQuery!.mal_id), characters: await getAnimeCharacters(resultQuery!.mal_id),
related: await getRelatedAnimesMAL(resultQuery!.mal_id), related: await getRelatedAnimesMAL(resultQuery!.mal_id),
}; };
break;
default:
resultAnime = undefined;
break;
}
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -402,30 +364,96 @@ export default class DirectoryController {
async getAnimeGenres(req: Request, res: Response, next: NextFunction) { async getAnimeGenres(req: Request, res: Response, next: NextFunction) {
const { genre, order, page } = req.params; const { genre, order, page } = req.params;
let data: Genre[]; let result: any;
let resultReq: any;
const genres: any = {
accion: 'Acción',
'artes-marciales': 'Artes Marciales',
aventura: 'Aventuras',
carreras: 'Carreras',
'ciencia-ficcion': 'Ciencia Ficción',
comedia: 'Comedia',
demencia: 'Demencia',
demonios: 'Demonios',
deportes: 'Deportes',
drama: 'Drama',
ecchi: 'Ecchi',
escolares: 'Escolares',
espacial: 'Espacial',
fantasia: 'Fantasía',
harem: 'Harem',
historico: 'Historico',
infantil: 'Infantil',
josei: 'Josei',
juegos: 'Juegos',
magia: 'Magia',
mecha: 'Mecha',
militar: 'Militar',
misterio: 'Misterio',
musica: 'Música',
parodia: 'Parodia',
policia: 'Policía',
psicologico: 'Psicológico',
'recuentos-de-la-vida': 'Recuentos de la vida',
romance: 'Romance',
samurai: 'Samurai',
seinen: 'Seinen',
shoujo: 'Shoujo',
shounen: 'Shounen',
sobrenatural: 'Sobrenatural',
superpoderes: 'Superpoderes',
suspenso: 'Suspenso',
terror: 'Terror',
vampiros: 'Vampiros',
yaoi: 'Yaoi',
yuri: 'Yuri',
};
try { try {
if (genre === undefined && order === undefined && page === undefined) { if (genre === undefined && order === undefined && page === undefined) {
data = await GenreModel.find(); result = await AnimeModel.aggregate([{ $sample: { size: 25 } }]);
} else { } else {
if (page !== undefined) { if (genres.hasOwnProperty(genre)) {
resultReq = await requestGot( if (page !== undefined && parseInt(page) > 1) {
`${urls.BASE_ANIMEFLV_JELU}Genres/${genre}/${order}/${page}`, if (order === 'asc') {
{ parse: true, scrapy: false }, result = await AnimeModel.find({ genres: genres[genre] })
); .limit(25)
.skip(25 * parseInt(page))
.sort({ title: 'ascending' });
} else if (order === 'desc') {
result = await AnimeModel.find({ genres: genres[genre] })
.limit(25)
.skip(25 * parseInt(page))
.sort({ title: 'descending' });
} else {
result = await AnimeModel.find({ genres: genres[genre] })
.limit(25)
.skip(25 * parseInt(page));
}
} else { } else {
resultReq = await requestGot( if (order === 'asc') {
`${urls.BASE_ANIMEFLV_JELU}Genres/${genre}/${order}/1`, result = await AnimeModel.find({ genres: genres[genre] })
{ parse: true, scrapy: false }, .limit(25)
.sort({ title: 'ascending' });
} else if (order === 'desc') {
result = await AnimeModel.find({ genres: genres[genre] })
.limit(25)
.sort({ title: 'descending' });
} else {
result = await AnimeModel.find({ genres: genres[genre] }).limit(
25,
); );
} }
} }
} else {
return res.status(500).json({ message: 'Aruppi lost in the shell' });
}
}
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
const animes: any[] = resultReq.animes.map((item: any) => { const animes: any[] = result.map((item: any) => {
return { return {
id: item.id, id: item.id,
title: item.title.trim(), title: item.title.trim(),

@ -26,7 +26,7 @@ routes.get('/api/v4/', (req: Request, res: Response) => {
res.json({ res.json({
message: 'Aruppi /api - 🎏', message: 'Aruppi /api - 🎏',
author: 'Jéluchu', author: 'Jéluchu',
version: '4.0.4', version: '4.0.6',
credits: 'The bitch loves /apis that offers data to Aruppi App', credits: 'The bitch loves /apis that offers data to Aruppi App',
entries: [ entries: [
{ {
@ -72,7 +72,7 @@ routes.get('/api/v4/', (req: Request, res: Response) => {
routes.get('/api/v4/schedule/:day', animeController.schedule); routes.get('/api/v4/schedule/:day', animeController.schedule);
routes.get('/api/v4/top/:type/:subtype?/:page', animeController.top); routes.get('/api/v4/top/:type/:subtype?/:page', animeController.top);
routes.get('/api/v4/allAnimes', animeController.getAllAnimes); routes.get('/api/v4/allAnimes', animeController.getAllAnimes);
routes.get('/api/v4/lastEpisodes', animeController.getLastEpisodes); routes.get('/api/v4/lastEpisodes/:options?', animeController.getLastEpisodes);
routes.get('/api/v4/movies/:type/:page', animeController.getContentMovie); routes.get('/api/v4/movies/:type/:page', animeController.getContentMovie);
routes.get('/api/v4/ova/:type/:page', animeController.getContentOva); routes.get('/api/v4/ova/:type/:page', animeController.getContentOva);
routes.get('/api/v4/special/:type/:page', animeController.getContentSpecial); routes.get('/api/v4/special/:type/:page', animeController.getContentSpecial);

@ -1,7 +1,8 @@
export default { export default {
BASE_ARUPPI: 'https://aruppi.jeluchu.xyz/', BASE_ARUPPI: 'https://aruppi.jeluchu.xyz/',
BASE_ANIMEFLV: 'https://animeflv.net/', BASE_ANIMEFLV: 'https://www3.animeflv.net/',
BASE_MONOSCHINOS: 'https://monoschinos2.com/', BASE_MONOSCHINOS: 'https://monoschinos2.com/',
BASE_TIOANIME: 'https://tioanime.com/',
BASE_JKANIME: 'https://jkanime.net/', BASE_JKANIME: 'https://jkanime.net/',
BASE_ANIMEFLV_JELU: 'https://aruppi.jeluchu.xyz/apis/animeflv/v1/', BASE_ANIMEFLV_JELU: 'https://aruppi.jeluchu.xyz/apis/animeflv/v1/',
BASE_YOUTUBE: 'https://aruppi.jeluchu.xyz/api/Youtube/?channelId=', BASE_YOUTUBE: 'https://aruppi.jeluchu.xyz/api/Youtube/?channelId=',

@ -259,75 +259,6 @@ const getPosterAndType = async (
return ''; return '';
}; };
export const getRelatedAnimesFLV = async (id: string) => {
let $: cheerio.Root;
try {
if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get(
`relatedFLV_${hashStringMd5(id)}`,
);
if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis;
}
}
$ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
parse: false,
scrapy: true,
});
} catch (err) {
return err;
}
let listRelated: any = {};
let relatedAnimes: RelatedAnime[] = [];
$('ul.ListAnmRel li a').each((index: number, element: any) => {
listRelated[$(element).text()] = $(element).attr('href');
});
for (const related in listRelated) {
let posterUrl: any = await getPosterAndType(
listRelated[related].split('/')[2],
undefined,
);
if (posterUrl !== '') {
relatedAnimes.push({
title: related,
type: posterUrl[1],
poster: posterUrl[0],
});
}
}
if (relatedAnimes.length > 0) {
if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set(
`relatedFLV_${hashStringMd5(id)}`,
JSON.stringify(relatedAnimes),
);
/* After 24hrs expire the key. */
redisClient.expireat(
`relatedFLV_${hashStringMd5(id)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200,
);
}
return relatedAnimes;
} else {
return [];
}
};
export const getRelatedAnimesMAL = async (mal_id: number) => { export const getRelatedAnimesMAL = async (mal_id: number) => {
let $: cheerio.Root; let $: cheerio.Root;
@ -406,94 +337,16 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
} }
}; };
export const animeFlvInfo = async (id: string | undefined) => { export const jkanimeInfo = async (id: string | undefined, mal_id: number) => {
let $: cheerio.Root; let $: cheerio.Root;
let anime_info: string[] = []; let extraInfo: any;
let anime_eps: string[] = [];
let nextEpisodeDate: string | null;
let episodes: any[] = [];
try {
if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get(
`animeflvInfo_${hashStringMd5(id!)}`,
);
if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis;
}
}
$ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
scrapy: true,
parse: false,
});
} catch (err) {
return err;
}
const scripts: cheerio.Element[] = $('script').toArray();
for (const script of scripts) {
if ($(script).html()!.includes('anime_info')) {
anime_info = JSON.parse(
$(script).html()!.split('var anime_info = ')[1].split(';\n')[0],
);
anime_eps = JSON.parse(
$(script).html()!.split('var episodes = ')[1].split(';')[0],
);
}
}
if (anime_info.length === 4) {
nextEpisodeDate = anime_info[3];
} else {
nextEpisodeDate = null;
}
episodes.push({ nextEpisodeDate });
for (const episode of anime_eps) {
episodes.push({
episode: episode[0],
id: `${episode[1]}/${id}-${episode[0]}`,
});
}
if (episodes.length > 0) {
if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set(
`animeflvInfo_${hashStringMd5(id!)}`,
JSON.stringify(episodes),
);
/* After 24hrs expire the key. */
redisClient.expireat(
`animeflvInfo_${hashStringMd5(id!)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200,
);
}
return episodes;
} else {
return null;
}
};
export const jkanimeInfo = async (id: string | undefined) => {
let $: cheerio.Root;
let nextEpisodeDate: string | null;
let imageLink: string | undefined;
let episodesList: any[] = []; let episodesList: any[] = [];
let countEpisodes: string[] = []; let countEpisodes: string[] = [];
try { try {
/* Extra info of the anime */
extraInfo = await animeExtraInfo(mal_id);
if (redisClient.connected) { if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get( const resultQueryRedis: any = await redisClient.get(
`jkanimeInfo_${hashStringMd5(id!)}`, `jkanimeInfo_${hashStringMd5(id!)}`,
@ -524,9 +377,57 @@ export const jkanimeInfo = async (id: string | undefined) => {
'-', '-',
)[1]; )[1];
nextEpisodeDate = $('div.proxep p').text() || null; let broadCastDate = new Date();
let dd: number, mm: string | number, yyyy: number;
const airDay: any = {
Lunes: 1,
Martes: 2,
Miércoles: 3,
Jueves: 4,
Viernes: 5,
Sábados: 6,
Domingos: 7,
'Sin emisión': 'default',
};
episodesList.push({ nextEpisodeDate }); if (!extraInfo.aired.to) {
if (airDay.hasOwnProperty(extraInfo.broadcast)) {
if (broadCastDate.getDay() < airDay[extraInfo.broadcast]) {
for (
let i = broadCastDate.getDay();
i < airDay[extraInfo.broadcast];
i++
) {
broadCastDate.setDate(broadCastDate.getDate() + 1);
}
} else {
let counter = broadCastDate.getDay() + 1;
/* Adding one because of the day */
broadCastDate.setDate(broadCastDate.getDate() + 1);
while (counter !== airDay[extraInfo.broadcast]) {
if (counter === 7) {
counter = 0;
}
broadCastDate.setDate(broadCastDate.getDate() + 1);
counter++;
}
}
dd = broadCastDate.getDate();
mm =
broadCastDate.getMonth() + 1 < 10
? `0${broadCastDate.getMonth() + 1}`
: broadCastDate.getMonth() + 1;
yyyy = broadCastDate.getFullYear();
episodesList.push({
nextEpisodeDate: `${yyyy}-${mm}-${dd}`,
});
}
}
for (let i = 1; i <= parseInt(episodesCount); i++) { for (let i = 1; i <= parseInt(episodesCount); i++) {
episodesList.push({ episodesList.push({
@ -685,6 +586,124 @@ export const monoschinosInfo = async (
} }
}; };
export const tioanimeInfo = async (id: string | undefined, mal_id: number) => {
let $: cheerio.Root;
let episodesList: any[] = [];
let anime_eps: string[] = [];
let extraInfo: any;
try {
/* Extra info of the anime */
extraInfo = await animeExtraInfo(mal_id);
if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get(
`tioanimeInfo_${hashStringMd5(id!)}`,
);
if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis;
}
}
$ = await requestGot(`${urls.BASE_TIOANIME}anime/${id}`, {
scrapy: true,
parse: false,
});
} catch (err) {
return err;
}
let broadCastDate = new Date();
let dd: number, mm: string | number, yyyy: number;
const airDay: any = {
Lunes: 1,
Martes: 2,
Miércoles: 3,
Jueves: 4,
Viernes: 5,
Sábados: 6,
Domingos: 7,
'Sin emisión': 'default',
};
if (!extraInfo.aired.to) {
if (airDay.hasOwnProperty(extraInfo.broadcast)) {
if (broadCastDate.getDay() < airDay[extraInfo.broadcast]) {
for (
let i = broadCastDate.getDay();
i < airDay[extraInfo.broadcast];
i++
) {
broadCastDate.setDate(broadCastDate.getDate() + 1);
}
} else {
let counter = broadCastDate.getDay() + 1;
/* Adding one because of the day */
broadCastDate.setDate(broadCastDate.getDate() + 1);
while (counter !== airDay[extraInfo.broadcast]) {
if (counter === 7) {
counter = 0;
}
broadCastDate.setDate(broadCastDate.getDate() + 1);
counter++;
}
}
dd = broadCastDate.getDate();
mm =
broadCastDate.getMonth() + 1 < 10
? `0${broadCastDate.getMonth() + 1}`
: broadCastDate.getMonth() + 1;
yyyy = broadCastDate.getFullYear();
episodesList.push({
nextEpisodeDate: `${yyyy}-${mm}-${dd}`,
});
}
}
const scripts: cheerio.Element[] = $('script').toArray();
for (const script of scripts) {
if ($(script).html()!.includes('anime_info')) {
anime_eps = JSON.parse(
$(script).html()!.split('var episodes = ')[1].split(';')[0],
);
}
}
for (const episode of anime_eps) {
episodesList.push({
episode: episode[0],
id: `ver/${id}-${episode}`,
});
}
if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set(
`tioanimeInfo_${hashStringMd5(id!)}`,
JSON.stringify(episodesList),
);
/* After 24hrs expire the key. */
redisClient.expireat(
`tioanimeInfo_${hashStringMd5(id!)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200,
);
}
return episodesList;
};
export const videoServersMonosChinos = async (id: string) => { export const videoServersMonosChinos = async (id: string) => {
let $: cheerio.Root; let $: cheerio.Root;
let videoServers: any[] = []; let videoServers: any[] = [];
@ -771,6 +790,73 @@ export const videoServersMonosChinos = async (id: string) => {
} }
}; };
export const videoServersTioAnime = async (id: string) => {
let $: cheerio.Root;
let servers: any;
let videoServers: any[] = [];
try {
if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get(
`videoServersTioAnime_${hashStringMd5(id)}`,
);
if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis;
}
}
$ = await requestGot(`${urls.BASE_TIOANIME}${id}`, {
scrapy: true,
parse: false,
});
} catch (err) {
return err;
}
const scripts: cheerio.Element[] = $('script').toArray();
for (const script of scripts) {
if ($(script).html()!.includes('var videos =')) {
servers = JSON.parse(
$(script).html()!.split('var videos = ')[1].split(';')[0],
);
}
}
for (const server of servers) {
videoServers.push({
id: server[0].toLowerCase(),
url: server[1],
direct: false,
});
}
if (videoServers.length > 0) {
if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set(
`videoServersTioAnime_${hashStringMd5(id)}`,
JSON.stringify(videoServers),
);
/* After 24hrs expire the key. */
redisClient.expireat(
`videoServersTioAnime_${hashStringMd5(id)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200,
);
}
return videoServers;
} else {
return null;
}
};
export const videoServersJK = async (id: string) => { export const videoServersJK = async (id: string) => {
let $: cheerio.Root; let $: cheerio.Root;
let servers: any = {}; let servers: any = {};
@ -803,8 +889,6 @@ export const videoServersJK = async (id: string) => {
}) })
.get(); .get();
console.log(serverNames);
$('script').each((index: number, element: cheerio.Element) => { $('script').each((index: number, element: cheerio.Element) => {
if ($(element).html()!.includes('var video = [];')) { if ($(element).html()!.includes('var video = [];')) {
script = $(element).html(); script = $(element).html();

Loading…
Cancel
Save