Merge pull request #42 from aruppi/develop

Adding the anime state and the nextEpisodeDate
pull/49/head
Jesús María 4 years ago committed by GitHub
commit 893a9e7386
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,4 +1,4 @@
# **Aruppi API** (v4.0.2) # **Aruppi API** (v4.0.4)
> 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
> >
@ -59,10 +59,10 @@ In order to install the project and all dependencies, enter in the project folde
### Start the project ### Start the project
```bash ```bash
npm start npm start
``` ```
```bash ```bash
yarn start yarn start
``` ```
@ -72,6 +72,7 @@ yarn start
```bash ```bash
npm build npm build
``` ```
```bash ```bash
yarn build yarn build
``` ```

@ -1,6 +1,6 @@
{ {
"name": "aruppi", "name": "aruppi",
"version": "4.0.2", "version": "4.0.4",
"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": {

@ -84,20 +84,22 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`schedule_${hashStringMd5(day)}`, const resultQueryRedis: any = await redisClient.get(
); `schedule_${hashStringMd5(day)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(`${urls.BASE_JIKAN}schedule/${day}`, {
parse: true,
scrapy: false,
});
} }
data = await requestGot(`${urls.BASE_JIKAN}schedule/${day}`, {
parse: true,
scrapy: false,
});
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -109,19 +111,21 @@ export default class AnimeController {
})); }));
if (animeList.length > 0) { if (animeList.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`schedule_${hashStringMd5(day)}`, `schedule_${hashStringMd5(day)}`,
JSON.stringify({ day: animeList }), JSON.stringify({ day: animeList }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`schedule_${hashStringMd5(day)}`, `schedule_${hashStringMd5(day)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ res.status(200).json({
day: animeList, day: animeList,
@ -136,35 +140,37 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
let resultQueryRedis: any; if (redisClient.connected) {
let resultQueryRedis: any;
if (subtype) {
resultQueryRedis = await redisClient.get(
`top_${hashStringMd5(`${type}:${subtype}:${page}`)}`,
);
} else {
resultQueryRedis = await redisClient.get(
`top_${hashStringMd5(`${type}:${page}`)}`,
);
}
if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); if (subtype) {
} else { resultQueryRedis = await redisClient.get(
if (subtype !== undefined) { `top_${hashStringMd5(`${type}:${subtype}:${page}`)}`,
data = await requestGot(
`${urls.BASE_JIKAN}top/${type}/${page}/${subtype}`,
{ parse: true, scrapy: false },
); );
} else { } else {
data = await requestGot(`${urls.BASE_JIKAN}top/${type}/${page}`, { resultQueryRedis = await redisClient.get(
parse: true, `top_${hashStringMd5(`${type}:${page}`)}`,
scrapy: false, );
}); }
if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis);
} }
} }
if (subtype !== undefined) {
data = await requestGot(
`${urls.BASE_JIKAN}top/${type}/${page}/${subtype}`,
{ parse: true, scrapy: false },
);
} else {
data = await requestGot(`${urls.BASE_JIKAN}top/${type}/${page}`, {
parse: true,
scrapy: false,
});
}
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -181,31 +187,33 @@ export default class AnimeController {
})); }));
if (top.length > 0) { if (top.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
if (subtype) { /* Set the key in the redis cache. */
redisClient.set( if (subtype) {
`top_${hashStringMd5(`${type}:${subtype}:${page}`)}`, redisClient.set(
JSON.stringify({ top }), `top_${hashStringMd5(`${type}:${subtype}:${page}`)}`,
); JSON.stringify({ top }),
} else { );
redisClient.set( } else {
`top_${hashStringMd5(`${type}:${page}`)}`, redisClient.set(
JSON.stringify({ top }), `top_${hashStringMd5(`${type}:${page}`)}`,
); JSON.stringify({ top }),
} );
}
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
if (subtype) { if (subtype) {
redisClient.expireat( redisClient.expireat(
`top_${hashStringMd5(`${type}:${subtype}:${page}`)}`, `top_${hashStringMd5(`${type}:${subtype}:${page}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
} else { } else {
redisClient.expireat( redisClient.expireat(
`top_${hashStringMd5(`${type}:${page}`)}`, `top_${hashStringMd5(`${type}:${page}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
} }
return res.status(200).json({ top }); return res.status(200).json({ top });
@ -248,29 +256,31 @@ export default class AnimeController {
let animeList: any[] = []; let animeList: any[] = [];
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`lastEpisodes_${hashStringMd5('lastEpisodes')}`, const resultQueryRedis: any = await redisClient.get(
); `lastEpisodes_${hashStringMd5('lastEpisodes')}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
// @ANIMEFLV
// data = await requestGot(
// `${urls.BASE_ANIMEFLV_JELU}LatestEpisodesAdded`,
// {
// parse: true,
// scrapy: false,
// },
// );
$ = await requestGot(`${urls.BASE_MONOSCHINOS}`, {
scrapy: true,
parse: false,
});
} }
// @ANIMEFLV
// data = await requestGot(
// `${urls.BASE_ANIMEFLV_JELU}LatestEpisodesAdded`,
// {
// parse: true,
// scrapy: false,
// },
// );
$ = await requestGot(`${urls.BASE_MONOSCHINOS}`, {
scrapy: true,
parse: false,
});
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -329,19 +339,21 @@ export default class AnimeController {
} }
if (episodes.length > 0) { if (episodes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`lastEpisodes_${hashStringMd5('lastEpisodes')}`, `lastEpisodes_${hashStringMd5('lastEpisodes')}`,
JSON.stringify({ episodes }), JSON.stringify({ episodes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`lastEpisodes_${hashStringMd5('lastEpisodes')}`, `lastEpisodes_${hashStringMd5('lastEpisodes')}`,
parseInt(`${+new Date() / 1000}`, 10) + 1800, parseInt(`${+new Date() / 1000}`, 10) + 1800,
); );
}
res.status(200).json({ res.status(200).json({
episodes, episodes,
@ -357,25 +369,27 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`contentTv_${hashStringMd5(`${type}:${page}`)}`, const resultQueryRedis: any = await redisClient.get(
); `contentTv_${hashStringMd5(`${type}:${page}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -397,19 +411,21 @@ export default class AnimeController {
}); });
if (animes.length > 0) { if (animes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`contentTv_${hashStringMd5(`${type}:${page}`)}`, `contentTv_${hashStringMd5(`${type}:${page}`)}`,
JSON.stringify({ animes }), JSON.stringify({ animes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`contentTv_${hashStringMd5(`${type}:${page}`)}`, `contentTv_${hashStringMd5(`${type}:${page}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ res.status(200).json({
animes, animes,
@ -425,25 +441,27 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`contentSpecial_${hashStringMd5(`${type}:${page}`)}`, const resultQueryRedis: any = await redisClient.get(
); `contentSpecial_${hashStringMd5(`${type}:${page}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -465,19 +483,21 @@ export default class AnimeController {
}); });
if (animes.length > 0) { if (animes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`contentSpecial_${hashStringMd5(`${type}:${page}`)}`, `contentSpecial_${hashStringMd5(`${type}:${page}`)}`,
JSON.stringify({ animes }), JSON.stringify({ animes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`contentSpecial_${hashStringMd5(`${type}:${page}`)}`, `contentSpecial_${hashStringMd5(`${type}:${page}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ res.status(200).json({
animes, animes,
@ -493,25 +513,27 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`contentOva_${hashStringMd5(`${type}:${page}`)}`, const resultQueryRedis: any = await redisClient.get(
); `contentOva_${hashStringMd5(`${type}:${page}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -533,19 +555,21 @@ export default class AnimeController {
}); });
if (animes.length > 0) { if (animes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`contentOva_${hashStringMd5(`${type}:${page}`)}`, `contentOva_${hashStringMd5(`${type}:${page}`)}`,
JSON.stringify({ animes }), JSON.stringify({ animes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`contentOva_${hashStringMd5(`${type}:${page}`)}`, `contentOva_${hashStringMd5(`${type}:${page}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ res.status(200).json({
animes, animes,
@ -561,25 +585,27 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`contentMovie_${hashStringMd5(`${type}:${page}`)}`, const resultQueryRedis: any = await redisClient.get(
); `contentMovie_${hashStringMd5(`${type}:${page}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} }
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}${
url.charAt(0).toUpperCase() + url.slice(1)
}/${type}/${page}`,
{
parse: true,
scrapy: false,
},
);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -601,19 +627,21 @@ export default class AnimeController {
}); });
if (animes.length > 0) { if (animes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`contentMovie_${hashStringMd5(`${type}:${page}`)}`, `contentMovie_${hashStringMd5(`${type}:${page}`)}`,
JSON.stringify({ animes }), JSON.stringify({ animes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`contentMovie_${hashStringMd5(`${type}:${page}`)}`, `contentMovie_${hashStringMd5(`${type}:${page}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ res.status(200).json({
animes, animes,
@ -629,19 +657,21 @@ export default class AnimeController {
let episodes: any; let episodes: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`episodes_${hashStringMd5(title)}`, const resultQueryRedis: any = await redisClient.get(
); `episodes_${hashStringMd5(title)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
searchAnime = await AnimeModel.findOne({
$or: [{ title: { $eq: title } }, { title: { $eq: `${title} (TV)` } }],
});
} }
searchAnime = await AnimeModel.findOne({
$or: [{ title: { $eq: title } }, { title: { $eq: `${title} (TV)` } }],
});
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -654,7 +684,7 @@ export default class AnimeController {
episodes = await jkanimeInfo(searchAnime?.id); episodes = await jkanimeInfo(searchAnime?.id);
break; break;
case 'monoschinos': case 'monoschinos':
episodes = await monoschinosInfo(searchAnime?.id); episodes = await monoschinosInfo(searchAnime?.id, searchAnime?.mal_id);
break; break;
default: default:
episodes = undefined; episodes = undefined;
@ -662,19 +692,21 @@ export default class AnimeController {
} }
if (episodes) { if (episodes) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`episodes_${hashStringMd5(title)}`, `episodes_${hashStringMd5(title)}`,
JSON.stringify({ episodes }), JSON.stringify({ episodes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`episodes_${hashStringMd5(title)}`, `episodes_${hashStringMd5(title)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ episodes }); res.status(200).json({ episodes });
} else { } else {
@ -687,31 +719,35 @@ export default class AnimeController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`servers_${hashStringMd5(id)}`, const resultQueryRedis: any = await redisClient.get(
); `servers_${hashStringMd5(id)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
if (isNaN(parseInt(id.split('/')[0]))) { }
if (id.split('/')[0] === 'ver') {
data = await videoServersMonosChinos(id);
} else {
data = await videoServersJK(id);
}
} else {
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}GetAnimeServers/${id}`,
{ parse: true, scrapy: false },
);
data = await transformUrlServer(data.servers); if (isNaN(parseInt(id.split('/')[0]))) {
if (id.split('/')[0] === 'ver') {
data = await videoServersMonosChinos(id);
} else {
data = await videoServersJK(id);
} }
} else {
data = await requestGot(
`${urls.BASE_ANIMEFLV_JELU}GetAnimeServers/${id}`,
{ parse: true, scrapy: false },
);
if (data) { data = await transformUrlServer(data.servers);
}
if (data) {
if (redisClient.connected) {
/* Set the key in the redis cache. */ /* Set the key in the redis cache. */
redisClient.set( redisClient.set(
@ -725,11 +761,11 @@ export default class AnimeController {
`servers_${hashStringMd5(id)}`, `servers_${hashStringMd5(id)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
res.status(200).json({ servers: data });
} else {
res.status(500).json({ message: 'Aruppi lost in the shell' });
} }
res.status(200).json({ servers: data });
} else {
res.status(500).json({ message: 'Aruppi lost in the shell' });
} }
} catch (err) { } catch (err) {
return next(err); return next(err);
@ -752,7 +788,6 @@ export default class AnimeController {
title: animeQuery[0].title || null, title: animeQuery[0].title || null,
poster: animeQuery[0].poster || null, poster: animeQuery[0].poster || null,
synopsis: animeQuery[0].description || null, synopsis: animeQuery[0].description || null,
status: animeQuery[0].state || null,
type: animeQuery[0].type || null, type: animeQuery[0].type || null,
rating: animeQuery[0].score || null, rating: animeQuery[0].score || null,
genres: animeQuery[0].genres || null, genres: animeQuery[0].genres || null,
@ -767,7 +802,6 @@ export default class AnimeController {
title: animeQuery[0].title || null, title: animeQuery[0].title || null,
poster: animeQuery[0].poster || null, poster: animeQuery[0].poster || null,
synopsis: animeQuery[0].description || null, synopsis: animeQuery[0].description || null,
status: animeQuery[0].state || null,
type: animeQuery[0].type || null, type: animeQuery[0].type || null,
rating: animeQuery[0].score || null, rating: animeQuery[0].score || null,
genres: animeQuery[0].genres || null, genres: animeQuery[0].genres || null,

@ -61,7 +61,6 @@ export default class DirectoryController {
poster: item.poster, poster: item.poster,
type: item.type, type: item.type,
genres: item.genres, genres: item.genres,
state: item.state,
score: item.score, score: item.score,
source: item.source, source: item.source,
description: item.description, description: item.description,
@ -87,7 +86,6 @@ export default class DirectoryController {
poster: item.poster, poster: item.poster,
type: item.type, type: item.type,
genres: item.genres, genres: item.genres,
state: item.state,
score: item.score, score: item.score,
source: item.source, source: item.source,
description: item.description, description: item.description,
@ -111,20 +109,22 @@ export default class DirectoryController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`season_${hashStringMd5(`${year}:${type}`)}`, const resultQueryRedis: any = await redisClient.get(
); `season_${hashStringMd5(`${year}:${type}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(`${urls.BASE_JIKAN}season/${year}/${type}`, {
scrapy: false,
parse: true,
});
} }
data = await requestGot(`${urls.BASE_JIKAN}season/${year}/${type}`, {
scrapy: false,
parse: true,
});
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -138,19 +138,21 @@ export default class DirectoryController {
}); });
if (season.length > 0) { if (season.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`season_${hashStringMd5(`${year}:${type}`)}`, `season_${hashStringMd5(`${year}:${type}`)}`,
JSON.stringify({ season }), JSON.stringify({ season }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`season_${hashStringMd5(`${year}:${type}`)}`, `season_${hashStringMd5(`${year}:${type}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ res.status(200).json({
season, season,
@ -164,20 +166,22 @@ export default class DirectoryController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`allSeasons_${hashStringMd5('allSeasons')}`, const resultQueryRedis: any = await redisClient.get(
); `allSeasons_${hashStringMd5('allSeasons')}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(`${urls.BASE_JIKAN}season/archive`, {
parse: true,
scrapy: false,
});
} }
data = await requestGot(`${urls.BASE_JIKAN}season/archive`, {
parse: true,
scrapy: false,
});
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -190,19 +194,21 @@ export default class DirectoryController {
}); });
if (archive.length > 0) { if (archive.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`allSeasons_${hashStringMd5('allSeasons')}`, `allSeasons_${hashStringMd5('allSeasons')}`,
JSON.stringify({ archive }), JSON.stringify({ archive }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`allSeasons_${hashStringMd5('allSeasons')}`, `allSeasons_${hashStringMd5('allSeasons')}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ archive }); res.status(200).json({ archive });
} else { } else {
@ -214,20 +220,22 @@ export default class DirectoryController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`laterSeasons_${hashStringMd5('laterSeasons')}`, const resultQueryRedis: any = await redisClient.get(
); `laterSeasons_${hashStringMd5('laterSeasons')}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(`${urls.BASE_JIKAN}season/later`, {
parse: true,
scrapy: false,
});
} }
data = await requestGot(`${urls.BASE_JIKAN}season/later`, {
parse: true,
scrapy: false,
});
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -241,19 +249,21 @@ export default class DirectoryController {
}); });
if (future.length > 0) { if (future.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`laterSeasons_${hashStringMd5('laterSeasons')}`, `laterSeasons_${hashStringMd5('laterSeasons')}`,
JSON.stringify({ future }), JSON.stringify({ future }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`laterSeasons_${hashStringMd5('laterSeasons')}`, `laterSeasons_${hashStringMd5('laterSeasons')}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ future }); res.status(200).json({ future });
} else { } else {
@ -267,88 +277,94 @@ export default class DirectoryController {
let resultAnime: any; let resultAnime: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`moreInfo_${hashStringMd5(title)}`, const resultQueryRedis: any = await redisClient.get(
); `moreInfo_${hashStringMd5(title)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else {
resultQuery = await AnimeModel.findOne({
$or: [{ title: { $eq: title } }, { title: { $eq: `${title} (TV)` } }],
});
switch (resultQuery?.source) {
case 'animeflv':
resultAnime = {
title: resultQuery?.title,
poster: resultQuery?.poster,
synopsis: resultQuery?.description,
status: resultQuery?.state,
type: resultQuery?.type,
rating: resultQuery?.score,
genres: resultQuery?.genres,
moreInfo: [await animeExtraInfo(resultQuery!.mal_id)],
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: resultQuery?.state,
type: resultQuery?.type,
rating: resultQuery?.score,
genres: resultQuery?.genres,
moreInfo: [await animeExtraInfo(resultQuery!.mal_id)],
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: resultQuery?.state,
type: resultQuery?.type,
rating: resultQuery?.score,
genres: resultQuery?.genres,
moreInfo: [await animeExtraInfo(resultQuery!.mal_id)],
promo: await getAnimeVideoPromo(resultQuery!.mal_id),
characters: await getAnimeCharacters(resultQuery!.mal_id),
related: await getRelatedAnimesMAL(resultQuery!.mal_id),
};
break;
default:
resultAnime = undefined;
break;
} }
} }
resultQuery = await AnimeModel.findOne({
$or: [{ title: { $eq: title } }, { title: { $eq: `${title} (TV)` } }],
});
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 = {
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);
} }
if (resultAnime) { if (resultAnime) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`moreInfo_${hashStringMd5(title)}`, `moreInfo_${hashStringMd5(title)}`,
JSON.stringify(resultAnime), JSON.stringify(resultAnime),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`moreInfo_${hashStringMd5(title)}`, `moreInfo_${hashStringMd5(title)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json(resultAnime); res.status(200).json(resultAnime);
} else { } else {

@ -69,17 +69,19 @@ export default class UtilsController {
let feed: CustomFeed & Parser.Output<CustomItem>; let feed: CustomFeed & Parser.Output<CustomItem>;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`anitakume_${hashStringMd5('anitakume')}`, const resultQueryRedis: any = await redisClient.get(
); `anitakume_${hashStringMd5('anitakume')}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
feed = await parser.parseURL(urls.BASE_IVOOX);
} }
feed = await parser.parseURL(urls.BASE_IVOOX);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -116,19 +118,21 @@ export default class UtilsController {
}); });
if (podcast.length > 0) { if (podcast.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`anitakume_${hashStringMd5('anitakume')}`, `anitakume_${hashStringMd5('anitakume')}`,
JSON.stringify({ podcast }), JSON.stringify({ podcast }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`anitakume_${hashStringMd5('anitakume')}`, `anitakume_${hashStringMd5('anitakume')}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ podcast }); res.status(200).json({ podcast });
} else { } else {
@ -153,51 +157,55 @@ export default class UtilsController {
]; ];
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`news_${hashStringMd5('news')}`, const resultQueryRedis: any = await redisClient.get(
); `news_${hashStringMd5('news')}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else {
for (const rssPage of pagesRss) {
const feed = await parser.parseURL(rssPage.url);
feed.items.forEach((item: any) => {
const formattedObject: News = {
title: item.title,
url: item.link,
author: feed.title?.includes('Crunchyroll')
? 'Crunchyroll'
: feed.title,
thumbnail: obtainPreviewNews(item['content:encoded']),
content: item['content:encoded'],
};
news.push(formattedObject);
});
} }
} }
for (const rssPage of pagesRss) {
const feed = await parser.parseURL(rssPage.url);
feed.items.forEach((item: any) => {
const formattedObject: News = {
title: item.title,
url: item.link,
author: feed.title?.includes('Crunchyroll')
? 'Crunchyroll'
: feed.title,
thumbnail: obtainPreviewNews(item['content:encoded']),
content: item['content:encoded'],
};
news.push(formattedObject);
});
}
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
if (news.length > 0) { if (news.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`news_${hashStringMd5('news')}`, `news_${hashStringMd5('news')}`,
JSON.stringify({ news }), JSON.stringify({ news }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`news_${hashStringMd5('news')}`, `news_${hashStringMd5('news')}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ news }); res.status(200).json({ news });
} else { } else {
@ -210,20 +218,22 @@ export default class UtilsController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`images_${hashStringMd5(title)}`, const resultQueryRedis: any = await redisClient.get(
); `images_${hashStringMd5(title)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(
`${urls.BASE_QWANT}count=51&q=${title}&t=images&safesearch=1&locale=es_ES&uiv=4`,
{ scrapy: false, parse: true },
);
} }
data = await requestGot(
`${urls.BASE_QWANT}count=51&q=${title}&t=images&safesearch=1&locale=es_ES&uiv=4`,
{ scrapy: false, parse: true },
);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -237,19 +247,21 @@ export default class UtilsController {
}); });
if (results.length > 0) { if (results.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`images_${hashStringMd5(title)}`, `images_${hashStringMd5(title)}`,
JSON.stringify({ images: results }), JSON.stringify({ images: results }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`images_${hashStringMd5(title)}`, `images_${hashStringMd5(title)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ images: results }); res.status(200).json({ images: results });
} else { } else {
@ -262,20 +274,22 @@ export default class UtilsController {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`videos_${hashStringMd5(channelId)}`, const resultQueryRedis: any = await redisClient.get(
); `videos_${hashStringMd5(channelId)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
data = await requestGot(
`${urls.BASE_YOUTUBE}${channelId}&part=snippet,id&order=date&maxResults=50`,
{ scrapy: false, parse: true },
);
} }
data = await requestGot(
`${urls.BASE_YOUTUBE}${channelId}&part=snippet,id&order=date&maxResults=50`,
{ scrapy: false, parse: true },
);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
@ -291,19 +305,21 @@ export default class UtilsController {
}); });
if (results.length > 0) { if (results.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`videos_${hashStringMd5(channelId)}`, `videos_${hashStringMd5(channelId)}`,
JSON.stringify({ videos: results }), JSON.stringify({ videos: results }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`videos_${hashStringMd5(channelId)}`, `videos_${hashStringMd5(channelId)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ videos: results }); res.status(200).json({ videos: results });
} else { } else {
@ -442,35 +458,39 @@ export default class UtilsController {
let themes: any; let themes: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`oped_${hashStringMd5(title)}`, const resultQueryRedis: any = await redisClient.get(
); `oped_${hashStringMd5(title)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else { }
themes = await structureThemes(await themeParser.serie(title), true);
} }
themes = await structureThemes(await themeParser.serie(title), true);
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
if (themes) { if (themes) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`oped_${hashStringMd5(title)}`, `oped_${hashStringMd5(title)}`,
JSON.stringify({ themes }), JSON.stringify({ themes }),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`oped_${hashStringMd5(title)}`, `oped_${hashStringMd5(title)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
res.status(200).json({ themes }); res.status(200).json({ themes });
} else { } else {
@ -484,58 +504,62 @@ export default class UtilsController {
let resultQueryRedis: any; let resultQueryRedis: any;
try { try {
if (year) { if (redisClient.connected) {
resultQueryRedis = await redisClient.get( if (year) {
`themesyear_${hashStringMd5(year)}`, resultQueryRedis = await redisClient.get(
); `themesyear_${hashStringMd5(year)}`,
} else { );
resultQueryRedis = await redisClient.get( } else {
`themesyear_${hashStringMd5('allYear')}`, resultQueryRedis = await redisClient.get(
); `themesyear_${hashStringMd5('allYear')}`,
} );
}
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return res.status(200).json(resultRedis); return res.status(200).json(resultRedis);
} else {
if (year === undefined) {
themes = await themeParser.allYears();
} else {
themes = await structureThemes(await themeParser.year(year), false);
} }
} }
if (year === undefined) {
themes = await themeParser.allYears();
} else {
themes = await structureThemes(await themeParser.year(year), false);
}
} catch (err) { } catch (err) {
return next(err); return next(err);
} }
if (themes.length > 0) { if (themes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
if (year) {
redisClient.set( if (year) {
`themesyear_${hashStringMd5(year)}`, redisClient.set(
JSON.stringify({ themes }), `themesyear_${hashStringMd5(year)}`,
); JSON.stringify({ themes }),
} else { );
redisClient.set( } else {
`themesyear_${hashStringMd5('allYear')}`, redisClient.set(
JSON.stringify({ themes }), `themesyear_${hashStringMd5('allYear')}`,
); JSON.stringify({ themes }),
} );
}
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
if (year) { if (year) {
redisClient.expireat( redisClient.expireat(
`themesyear_${hashStringMd5(year)}`, `themesyear_${hashStringMd5(year)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
} else { } else {
redisClient.expireat( redisClient.expireat(
`themesyear_${hashStringMd5('allYear')}`, `themesyear_${hashStringMd5('allYear')}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
} }
res.status(200).json({ themes }); res.status(200).json({ themes });

@ -40,8 +40,30 @@ export const redisClient: RedisClient = redis.createClient({
host: process.env.REDIS_HOST, host: process.env.REDIS_HOST,
port: parseInt(process.env.REDIS_PORT!), port: parseInt(process.env.REDIS_PORT!),
password: process.env.REDIS_PASSWORD, password: process.env.REDIS_PASSWORD,
retry_strategy: function (options) {
if (options.error && options.error.code === 'ECONNREFUSED') {
// End reconnecting on a specific error and flush all commands with
// a individual error
return new Error('The server refused the connection');
}
if (options.total_retry_time > 1000 * 60 * 60) {
// End reconnecting after a specific timeout and flush all commands
// with a individual error
return new Error('Retry time exhausted');
}
if (options.attempt > 10) {
// End reconnecting with built in error
return undefined;
}
// reconnect after
return Math.min(options.attempt * 100, 3000);
},
}); });
redisClient.on('connect', () => { redisClient.on('connect', () => {
console.log('Redis connected: redis.'); console.log('Redis connected: redis.');
}); });
redisClient.on('error', function (err) {
console.log('Redis error: ' + err);
});

@ -12,7 +12,6 @@ export interface Anime extends Document {
poster: string; poster: string;
type: string; type: string;
genres: Types.Array<string>; genres: Types.Array<string>;
state: string;
score: string; score: string;
source: string; source: string;
description: string; description: string;
@ -26,7 +25,6 @@ const AnimeSchema: Schema = new Schema({
poster: { type: String }, poster: { type: String },
type: { type: String }, type: { type: String },
genres: [{ type: String }], genres: [{ type: String }],
state: { type: String },
score: { type: String }, score: { type: String },
source: { type: String }, source: { type: String },
description: { type: String }, description: { type: String },

@ -56,22 +56,24 @@ export const animeExtraInfo = async (mal_id: number) => {
}; };
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`extraInfo_${hashStringMd5(`${mal_id}`)}`, const resultQueryRedis: any = await redisClient.get(
); `extraInfo_${hashStringMd5(`${mal_id}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}`, {
parse: true,
scrapy: false,
});
broadcast = data.broadcast.split('at')[0].trim().toLowerCase() || null;
} }
data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}`, {
parse: true,
scrapy: false,
});
broadcast = data.broadcast.split('at')[0].trim().toLowerCase() || null;
} catch (err) { } catch (err) {
return err; return err;
} }
@ -101,19 +103,21 @@ export const animeExtraInfo = async (mal_id: number) => {
}; };
if (formattedObject) { if (formattedObject) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`extraInfo_${hashStringMd5(`${mal_id}`)}`, `extraInfo_${hashStringMd5(`${mal_id}`)}`,
JSON.stringify(formattedObject), JSON.stringify(formattedObject),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`extraInfo_${hashStringMd5(`${mal_id}`)}`, `extraInfo_${hashStringMd5(`${mal_id}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return formattedObject; return formattedObject;
} else { } else {
@ -125,20 +129,22 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`promoInfo_${hashStringMd5(`${mal_id}`)}`, const resultQueryRedis: any = await redisClient.get(
); `promoInfo_${hashStringMd5(`${mal_id}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}/videos`, {
parse: true,
scrapy: false,
});
} }
data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}/videos`, {
parse: true,
scrapy: false,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -152,19 +158,21 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
}); });
if (promo.length > 0) { if (promo.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`promoInfo_${hashStringMd5(`${mal_id}`)}`, `promoInfo_${hashStringMd5(`${mal_id}`)}`,
JSON.stringify(promo), JSON.stringify(promo),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`promoInfo_${hashStringMd5(`${mal_id}`)}`, `promoInfo_${hashStringMd5(`${mal_id}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return promo; return promo;
} else { } else {
@ -176,20 +184,22 @@ export const getAnimeCharacters = async (mal_id: number) => {
let data: any; let data: any;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`charactersInfo_${hashStringMd5(`${mal_id}`)}`, const resultQueryRedis: any = await redisClient.get(
); `charactersInfo_${hashStringMd5(`${mal_id}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
data = await requestGot(
`${urls.BASE_JIKAN}anime/${mal_id}/characters_staff`,
{ parse: true, scrapy: false },
);
} }
data = await requestGot(
`${urls.BASE_JIKAN}anime/${mal_id}/characters_staff`,
{ parse: true, scrapy: false },
);
} catch (err) { } catch (err) {
return err; return err;
} }
@ -204,19 +214,21 @@ export const getAnimeCharacters = async (mal_id: number) => {
}); });
if (characters.length > 0) { if (characters.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`charactersInfo_${hashStringMd5(`${mal_id}`)}`, `charactersInfo_${hashStringMd5(`${mal_id}`)}`,
JSON.stringify(characters), JSON.stringify(characters),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`charactersInfo_${hashStringMd5(`${mal_id}`)}`, `charactersInfo_${hashStringMd5(`${mal_id}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return characters; return characters;
} else { } else {
@ -251,20 +263,22 @@ export const getRelatedAnimesFLV = async (id: string) => {
let $: cheerio.Root; let $: cheerio.Root;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`relatedFLV_${hashStringMd5(id)}`, const resultQueryRedis: any = await redisClient.get(
); `relatedFLV_${hashStringMd5(id)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
parse: false,
scrapy: true,
});
} }
$ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
parse: false,
scrapy: true,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -292,19 +306,21 @@ export const getRelatedAnimesFLV = async (id: string) => {
} }
if (relatedAnimes.length > 0) { if (relatedAnimes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`relatedFLV_${hashStringMd5(id)}`, `relatedFLV_${hashStringMd5(id)}`,
JSON.stringify(relatedAnimes), JSON.stringify(relatedAnimes),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`relatedFLV_${hashStringMd5(id)}`, `relatedFLV_${hashStringMd5(id)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return relatedAnimes; return relatedAnimes;
} else { } else {
@ -316,20 +332,22 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
let $: cheerio.Root; let $: cheerio.Root;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`getRelatedMAL_${hashStringMd5(`${mal_id}`)}`, const resultQueryRedis: any = await redisClient.get(
); `getRelatedMAL_${hashStringMd5(`${mal_id}`)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`https://myanimelist.net/anime/${mal_id}`, {
parse: false,
scrapy: true,
});
} }
$ = await requestGot(`https://myanimelist.net/anime/${mal_id}`, {
parse: false,
scrapy: true,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -365,19 +383,21 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
} }
if (relatedAnimes.length > 0) { if (relatedAnimes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`getRelatedMAL_${hashStringMd5(`${mal_id}`)}`, `getRelatedMAL_${hashStringMd5(`${mal_id}`)}`,
JSON.stringify(relatedAnimes), JSON.stringify(relatedAnimes),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`getRelatedMAL_${hashStringMd5(`${mal_id}`)}`, `getRelatedMAL_${hashStringMd5(`${mal_id}`)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return relatedAnimes; return relatedAnimes;
} }
@ -394,20 +414,22 @@ export const animeFlvInfo = async (id: string | undefined) => {
let episodes: any[] = []; let episodes: any[] = [];
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`animeflvInfo_${hashStringMd5(id!)}`, const resultQueryRedis: any = await redisClient.get(
); `animeflvInfo_${hashStringMd5(id!)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
scrapy: true,
parse: false,
});
} }
$ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
scrapy: true,
parse: false,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -442,19 +464,21 @@ export const animeFlvInfo = async (id: string | undefined) => {
} }
if (episodes.length > 0) { if (episodes.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`animeflvInfo_${hashStringMd5(id!)}`, `animeflvInfo_${hashStringMd5(id!)}`,
JSON.stringify(episodes), JSON.stringify(episodes),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`animeflvInfo_${hashStringMd5(id!)}`, `animeflvInfo_${hashStringMd5(id!)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return episodes; return episodes;
} else { } else {
@ -470,20 +494,22 @@ export const jkanimeInfo = async (id: string | undefined) => {
let countEpisodes: string[] = []; let countEpisodes: string[] = [];
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`jkanimeInfo_${hashStringMd5(id!)}`, const resultQueryRedis: any = await redisClient.get(
); `jkanimeInfo_${hashStringMd5(id!)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`${urls.BASE_JKANIME}${id}`, {
scrapy: true,
parse: false,
});
} }
$ = await requestGot(`${urls.BASE_JKANIME}${id}`, {
scrapy: true,
parse: false,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -510,19 +536,21 @@ export const jkanimeInfo = async (id: string | undefined) => {
} }
if (episodesList.length > 0) { if (episodesList.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`jkanimeInfo_${hashStringMd5(id!)}`, `jkanimeInfo_${hashStringMd5(id!)}`,
JSON.stringify(episodesList), JSON.stringify(episodesList),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`jkanimeInfo_${hashStringMd5(id!)}`, `jkanimeInfo_${hashStringMd5(id!)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return episodesList; return episodesList;
} else { } else {
@ -530,29 +558,90 @@ export const jkanimeInfo = async (id: string | undefined) => {
} }
}; };
export const monoschinosInfo = async (id: string | undefined) => { export const monoschinosInfo = async (
id: string | undefined,
mal_id: number,
) => {
let $: cheerio.Root; let $: cheerio.Root;
let episodeList: any[] = []; let episodeList: any[] = [];
let extraInfo: any;
try { try {
const resultQueryRedis: any = await redisClient.get( /* Extra info of the anime */
`monoschinosInfo_${hashStringMd5(id!)}`, extraInfo = await animeExtraInfo(mal_id);
);
if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get(
`monoschinosInfo_${hashStringMd5(id!)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`${urls.BASE_MONOSCHINOS}anime/${id}`, {
scrapy: true,
parse: false,
});
} }
$ = await requestGot(`${urls.BASE_MONOSCHINOS}anime/${id}`, {
scrapy: true,
parse: false,
});
} catch (err) { } catch (err) {
return 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();
episodeList.push({
nextEpisodeDate: `${yyyy}-${mm}-${dd}`,
});
}
}
$('.SerieCaps a').each((index: number, element: cheerio.Element) => { $('.SerieCaps a').each((index: number, element: cheerio.Element) => {
let episode: number; let episode: number;
@ -574,19 +663,21 @@ export const monoschinosInfo = async (id: string | undefined) => {
}); });
if (episodeList.length > 0) { if (episodeList.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`monoschinosInfo_${hashStringMd5(id!)}`, `monoschinosInfo_${hashStringMd5(id!)}`,
JSON.stringify(episodeList), JSON.stringify(episodeList),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`monoschinosInfo_${hashStringMd5(id!)}`, `monoschinosInfo_${hashStringMd5(id!)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return episodeList; return episodeList;
} else { } else {
@ -599,20 +690,22 @@ export const videoServersMonosChinos = async (id: string) => {
let videoServers: any[] = []; let videoServers: any[] = [];
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`videoServersMonosChinos_${hashStringMd5(id)}`, const resultQueryRedis: any = await redisClient.get(
); `videoServersMonosChinos_${hashStringMd5(id)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`${urls.BASE_MONOSCHINOS}${id}`, {
scrapy: true,
parse: false,
});
} }
$ = await requestGot(`${urls.BASE_MONOSCHINOS}${id}`, {
scrapy: true,
parse: false,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -656,19 +749,21 @@ export const videoServersMonosChinos = async (id: string) => {
}); });
if (videoServers.length > 0) { if (videoServers.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`videoServersMonosChinos_${hashStringMd5(id)}`, `videoServersMonosChinos_${hashStringMd5(id)}`,
JSON.stringify(videoServers), JSON.stringify(videoServers),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`videoServersMonosChinos_${hashStringMd5(id)}`, `videoServersMonosChinos_${hashStringMd5(id)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return videoServers; return videoServers;
} else { } else {
@ -682,20 +777,22 @@ export const videoServersJK = async (id: string) => {
let script: string | null = ''; let script: string | null = '';
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`videoServersJK_${hashStringMd5(id)}`, const resultQueryRedis: any = await redisClient.get(
); `videoServersJK_${hashStringMd5(id)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(`${urls.BASE_JKANIME}${id}`, {
scrapy: true,
parse: false,
});
} }
$ = await requestGot(`${urls.BASE_JKANIME}${id}`, {
scrapy: true,
parse: false,
});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -748,19 +845,21 @@ export const videoServersJK = async (id: string) => {
serverList = serverList.filter(x => x.id !== 'xtreme s' && x.id !== 'desuka'); serverList = serverList.filter(x => x.id !== 'xtreme s' && x.id !== 'desuka');
if (serverList.length > 0) { if (serverList.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`videoServersJK_${hashStringMd5(id!)}`, `videoServersJK_${hashStringMd5(id!)}`,
JSON.stringify(serverList), JSON.stringify(serverList),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`videoServersJK_${hashStringMd5(id!)}`, `videoServersJK_${hashStringMd5(id!)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return serverList; return serverList;
} else { } else {
@ -772,17 +871,19 @@ async function desuServerUrl(url: string) {
let $: cheerio.Root; let $: cheerio.Root;
try { try {
const resultQueryRedis: any = await redisClient.get( if (redisClient.connected) {
`desuServerUrl_${hashStringMd5(url)}`, const resultQueryRedis: any = await redisClient.get(
); `desuServerUrl_${hashStringMd5(url)}`,
);
if (resultQueryRedis) { if (resultQueryRedis) {
const resultRedis: any = JSON.parse(resultQueryRedis); const resultRedis: any = JSON.parse(resultQueryRedis);
return resultRedis; return resultRedis;
} else { }
$ = await requestGot(url, { scrapy: true, parse: false });
} }
$ = await requestGot(url, { scrapy: true, parse: false });
} catch (err) { } catch (err) {
return err; return err;
} }
@ -805,19 +906,21 @@ async function desuServerUrl(url: string) {
.split("'")[1]; .split("'")[1];
if (result.length > 0) { if (result.length > 0) {
/* Set the key in the redis cache. */ if (redisClient.connected) {
/* Set the key in the redis cache. */
redisClient.set( redisClient.set(
`desuServerUrl_${hashStringMd5(url)}`, `desuServerUrl_${hashStringMd5(url)}`,
JSON.stringify(result), JSON.stringify(result),
); );
/* After 24hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expireat( redisClient.expireat(
`desuServerUrl_${hashStringMd5(url)}`, `desuServerUrl_${hashStringMd5(url)}`,
parseInt(`${+new Date() / 1000}`, 10) + 7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
}
return result; return result;
} else { } else {

Loading…
Cancel
Save