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,74 +269,83 @@ export default class AnimeController {
} }
} }
// @ANIMEFLV switch (options) {
// data = await requestGot( case 'monoschinos':
// `${urls.BASE_ANIMEFLV_JELU}LatestEpisodesAdded`, $ = await requestGot(`${urls.BASE_MONOSCHINOS}`, {
// { scrapy: true,
// parse: true, parse: false,
// scrapy: false, });
// }, break;
// ); default:
data = await requestGot(
$ = await requestGot(`${urls.BASE_MONOSCHINOS}`, { `${urls.BASE_ANIMEFLV_JELU}LatestEpisodesAdded`,
scrapy: true, {
parse: false, 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];
$(getLastest)
.find('.row article')
.each((index: number, element: cheerio.Element) => {
let el: cheerio.Cheerio = $(element);
let title: string | undefined = el
.find('.Title')
.html()
?.split('\t')[0];
let img: any = el.find('.Image img').attr('src');
let type: any = el.find('.Image figure span').text();
type = type.substring(1, type.length);
let nEpisode: any = el.find('.dataEpi .episode').text();
nEpisode = parseInt(nEpisode.split('\n')[1]);
let id: any = el.find('a').attr('href');
id = id.split('/')[4];
id = id.split('-');
id.splice(id.length - 2, 2);
id = `${id.join('-')}-episodio-${nEpisode}`;
let anime = {
id: `ver/${id}`,
title,
image: img,
episode: nEpisode,
};
animeList.push(anime);
});
for (const anime of animeList) { switch (options) {
episodes.push({ case 'monoschinos':
id: anime.id, let getLastest: any = $!('.container .caps .container')[0];
title: anime.title,
image: await imageUrlToBase64(anime.image), $!(getLastest)
episode: anime.episode, .find('.row article')
servers: await videoServersMonosChinos(anime.id), .each((index: number, element: cheerio.Element) => {
}); let el: cheerio.Cheerio = $(element);
let title: string | undefined = el
.find('.Title')
.html()
?.split('\t')[0];
let img: any = el.find('.Image img').attr('src');
let type: any = el.find('.Image figure span').text();
type = type.substring(1, type.length);
let nEpisode: any = el.find('.dataEpi .episode').text();
nEpisode = parseInt(nEpisode.split('\n')[1]);
let id: any = el.find('a').attr('href');
id = id.split('/')[4];
id = id.split('-');
id.splice(id.length - 2, 2);
id = `${id.join('-')}-episodio-${nEpisode}`;
let anime = {
id: `ver/${id}`,
title,
image: img,
episode: nEpisode,
};
animeList.push(anime);
});
for (const anime of animeList) {
episodes.push({
id: anime.id,
title: anime.title,
image: await imageUrlToBase64(anime.image),
episode: anime.episode,
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) {
@ -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' &&
data = await videoServersMonosChinos(id); id.split('-').indexOf('espanol') !== -1
} else { ) {
data = await videoServersJK(id); data = await videoServersMonosChinos(id);
} } else if (id.split('/')[0] === 'ver') {
data = await videoServersTioAnime(id);
} else { } else {
data = await requestGot( data = await videoServersJK(id);
`${urls.BASE_ANIMEFLV_JELU}GetAnimeServers/${id}`, }
{ parse: true, scrapy: false },
);
data = await transformUrlServer(data.servers); switch (id) {
} }
if (data) { if (data) {
@ -782,39 +791,18 @@ export default class AnimeController {
return next(err); return next(err);
} }
switch (animeQuery[0].source) { animeResult = {
case 'animeflv': title: animeQuery[0].title || null,
animeResult = { poster: animeQuery[0].poster || null,
title: animeQuery[0].title || null, synopsis: animeQuery[0].description || null,
poster: animeQuery[0].poster || null, type: animeQuery[0].type || null,
synopsis: animeQuery[0].description || null, rating: animeQuery[0].score || null,
type: animeQuery[0].type || null, genres: animeQuery[0].genres || null,
rating: animeQuery[0].score || null, moreInfo: [await animeExtraInfo(animeQuery[0].mal_id)],
genres: animeQuery[0].genres || null, promo: await getAnimeVideoPromo(animeQuery[0].mal_id),
moreInfo: [await animeExtraInfo(animeQuery[0].mal_id)], characters: await getAnimeCharacters(animeQuery[0].mal_id),
promo: await getAnimeVideoPromo(animeQuery[0].mal_id), related: await getRelatedAnimesMAL(animeQuery[0].mal_id),
characters: await getAnimeCharacters(animeQuery[0].mal_id), };
related: await getRelatedAnimesFLV(animeQuery[0].id),
};
break;
case 'jkanime':
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 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,56 +294,19 @@ export default class DirectoryController {
const extraInfo: any = await animeExtraInfo(resultQuery!.mal_id); const extraInfo: any = await animeExtraInfo(resultQuery!.mal_id);
switch (resultQuery?.source) { resultAnime = {
case 'animeflv': title: resultQuery?.title,
resultAnime = { poster: resultQuery?.poster,
title: resultQuery?.title, synopsis: resultQuery?.description,
poster: resultQuery?.poster, status: !extraInfo.aired.to ? 'En emisión' : 'Finalizado',
synopsis: resultQuery?.description, type: resultQuery?.type,
status: !extraInfo.aired.to ? 'En emisión' : 'Finalizado', rating: resultQuery?.score,
type: resultQuery?.type, genres: resultQuery?.genres,
rating: resultQuery?.score, moreInfo: [extraInfo],
genres: resultQuery?.genres, promo: await getAnimeVideoPromo(resultQuery!.mal_id),
moreInfo: [extraInfo], characters: await getAnimeCharacters(resultQuery!.mal_id),
promo: await getAnimeVideoPromo(resultQuery!.mal_id), related: await getRelatedAnimesMAL(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 = {
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;
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 {
if (order === 'asc') {
result = await AnimeModel.find({ genres: genres[genre] })
.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 { } else {
resultReq = await requestGot( return res.status(500).json({ message: 'Aruppi lost in the shell' });
`${urls.BASE_ANIMEFLV_JELU}Genres/${genre}/${order}/1`,
{ parse: true, scrapy: false },
);
} }
} }
} 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',
};
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++;
}
}
episodesList.push({ nextEpisodeDate }); 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