@ -4,6 +4,7 @@ import AnimeModel, {Anime} from '../database/models/anime.model';
import crypto from 'crypto' ;
import util from 'util' ;
import { redisClient } from '../database/connection' ;
import { stderr } from 'process' ;
// @ts-ignore
redisClient . get = util . promisify ( redisClient . get ) ;
@ -34,7 +35,7 @@ interface RelatedAnime {
}
export const animeExtraInfo = async ( mal_id : number ) = > {
let data : any ;
let info : any ;
let broadcast : any ;
const airDay : any = {
@ -68,40 +69,40 @@ export const animeExtraInfo = async (mal_id: number) => {
}
}
data = await requestGot ( ` ${ urls . BASE_JIKAN } anime/ ${ mal_id } ` , {
info = await requestGot ( ` ${ urls . BASE_JIKAN } anime/ ${ mal_id } ` , {
parse : true ,
scrapy : false ,
} ) ;
if ( data. broadcast ) {
broadcast = data. broadcast . split ( 'at' ) [ 0 ] . trim ( ) . toLowerCase ( ) || null ;
if ( info. data . airing ) {
broadcast = info. data. broadcast . string . split ( 'at' ) [ 0 ] . trim ( ) . toLowerCase ( ) || null ;
}
} catch ( err ) {
return err ;
}
if ( airDay . hasOwnProperty ( broadcast ) ) {
data. broadcast = airDay [ broadcast ] ;
info. data. broadcast = airDay [ broadcast ] ;
} else {
data. broadcast = null ;
info. data. broadcast = null ;
}
const formattedObject : any = {
titleJapanese : data.title_japanes e,
source : data.source,
totalEpisodes : data.episodes,
titleJapanese : info.data.titles.find( ( x : { type : string ; } ) = > x . type === "Default" ) . titl e,
source : info. data.source,
totalEpisodes : info. data.episodes,
aired : {
from : data. aired . from ,
to : data.aired.to,
from : info. data. aired . from ,
to : info. data.aired.to,
} ,
duration : data.duration.split( 'per' ) [ 0 ] ,
rank : data.rank,
broadcast : data.broadcast,
producers : data.producers.map( ( item : any ) = > item . name ) || null ,
licensors : data.licensors.map( ( item : any ) = > item . name ) || null ,
studios : data.studios.map( ( item : any ) = > item . name ) || null ,
openingThemes : data.opening_themes || null ,
endingThemes : data.ending_themes || null ,
duration : info. data.duration.split( 'per' ) [ 0 ] ,
rank : info. data.rank,
broadcast : info. data.broadcast,
producers : info. data.producers.map( ( item : any ) = > item . name ) || null ,
licensors : info. data.licensors.map( ( item : any ) = > item . name ) || null ,
studios : info. data.studios.map( ( item : any ) = > item . name ) || null ,
openingThemes : info. data.opening_themes || null ,
endingThemes : info. data.ending_themes || null ,
} ;
if ( formattedObject ) {
@ -128,12 +129,12 @@ export const animeExtraInfo = async (mal_id: number) => {
} ;
export const getAnimeVideoPromo = async ( mal_id : number ) = > {
let data : any ;
let info : any ;
try {
if ( redisClient . connected ) {
const resultQueryRedis : any = await redisClient . get (
` promoInfo_${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getMAL promoInfo_${ mal_id} ` ,
) ;
if ( resultQueryRedis ) {
@ -143,7 +144,7 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
}
}
data = await requestGot ( ` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /videos ` , {
info = await requestGot ( ` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /videos ` , {
parse : true ,
scrapy : false ,
} ) ;
@ -151,11 +152,11 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
return err ;
}
const promo : Promo [ ] = data. promo . map ( ( item : Promo ) = > {
const promo : Promo [ ] = info. data. promo . map ( ( item : any ) = > {
return {
title : item.title ,
previewImage : item. image_url,
videoURL : item. video_ url,
previewImage : item. trailer.images. image_url,
videoURL : item. trailer. url,
} ;
} ) ;
@ -164,15 +165,15 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
/* Set the key in the redis cache. */
redisClient . set (
` promoInfo_${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getMAL promoInfo_${ mal_id} ` ,
JSON . stringify ( promo ) ,
) ;
/* After 2 4 hrs expire the key. */
/* After 2 hrs expire the key. */
redisClient . expire at (
` promoInfo_${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
parseInt ( ` ${ + new Date ( ) / 1000 } ` , 10 ) + 7200 ,
redisClient . expire (
` getMAL promoInfo_${ mal_id} ` ,
7200 ,
) ;
}
@ -183,7 +184,7 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
} ;
export const getAnimeCharacters = async ( mal_id : number ) = > {
let data : any ;
let info : any ;
try {
if ( redisClient . connected ) {
@ -198,19 +199,19 @@ export const getAnimeCharacters = async (mal_id: number) => {
}
}
data = await requestGot (
` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /characters _staff ` ,
info = await requestGot (
` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /characters ` ,
{ parse : true , scrapy : false } ,
) ;
} catch ( err ) {
return err ;
}
const characters : Character [ ] = data. characters . map ( ( item : any ) = > {
const characters : Character [ ] = info. data . map ( ( item : any ) = > {
return {
id : item. mal_id,
name : item. name,
image : item. image_url,
id : item. character. mal_id,
name : item. character. name,
image : item. character.images.jpg. image_url,
role : item.role ,
} ;
} ) ;
@ -262,12 +263,12 @@ const getPosterAndType = async (
} ;
export const getRelatedAnimesMAL = async ( mal_id : number ) = > {
let $: cheerio.Root ;
let info: any ;
try {
if ( redisClient . connected ) {
const resultQueryRedis : any = await redisClient . get (
` getRelatedMAL_ ${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getRelatedMAL_ ${ mal_id} ` ,
) ;
if ( resultQueryRedis ) {
@ -277,65 +278,52 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
}
}
$ = await requestGot ( ` https://myanimelist.net/anime/ ${ mal_id } ` , {
parse : fals e,
scrapy : tru e,
info = await requestGot ( ` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /relations ` , {
parse : tru e,
scrapy : fals e,
} ) ;
} catch ( err ) {
stderr . write ( ` Error on getRelatedAnimesMAL http on mal_id: ${ mal_id } \ n ` )
return err ;
}
let listRelated : any = { } ;
let relatedAnimes : RelatedAnime [ ] = [ ] ;
if ( $ ( 'table.anime_detail_related_anime' ) . length > 0 ) {
$ ( 'table.anime_detail_related_anime' )
. find ( 'tbody tr' )
. each ( ( index : number , element : any ) = > {
if ( $ ( element ) . find ( 'td' ) . eq ( 0 ) . text ( ) !== 'Adaptation:' ) {
listRelated [ $ ( element ) . find ( 'td' ) . eq ( 1 ) . text ( ) ] = $ ( element )
. find ( 'td' )
. children ( 'a' )
. attr ( 'href' ) ;
}
const relatedAnimes = [ ]
for ( const relation_entry of info . data ) {
for ( const entry of relation_entry . entry ) {
if ( entry . type != "anime" )
break ;
const queryRes : Anime | null = await AnimeModel . findOne ( {
mal_id : { $eq : entry.mal_id }
} ) ;
if ( queryRes == null )
break
for ( const related in listRelated ) {
let posterUrl : any = await getPosterAndType (
undefined ,
listRelated [ related ] . split ( '/' ) [ 2 ] ,
) ;
if ( posterUrl !== '' ) {
relatedAnimes . push ( {
title : related ,
type : posterUrl [ 1 ] ,
poster : posterUrl [ 0 ] ,
} ) ;
}
relatedAnimes . push ( {
title : queryRes ! . title ,
type : queryRes ? . type ,
poster : queryRes?.poster
} )
}
}
if ( relatedAnimes . length > 0 ) {
if ( redisClient . connected ) {
/* Set the key in the redis cache. */
redisClient . set (
` getRelatedMAL_ ${ hashStringMd5 ( ` ${ mal_id } ` ) } ` ,
JSON . stringify ( relatedAnimes ) ,
) ;
if ( relatedAnimes . length > 0 ) {
if ( redisClient . connected ) {
/* Set the key in the redis cache. */
/* After 24hrs expire the key. */
redisClient . set (
` getRelatedMAL_ ${ mal_id } ` ,
JSON . stringify ( relatedAnimes ) ,
) ;
redisClient . expireat (
` getRelatedMAL_ ${ hashStringMd5 ( ` ${ mal_id } ` ) } ` ,
parseInt ( ` ${ + new Date ( ) / 1000 } ` , 10 ) + 7200 ,
) ;
}
/* After 1hr expire the key. */
return relatedAnimes ;
redisClient . expire (
` getRelatedMAL_ ${ mal_id } ` ,
3600 ,
) ;
}
} else {
return [ ] ;
return relatedAnimes ;
}
} ;
@ -606,6 +594,7 @@ export const tioanimeInfo = async (id: string | undefined, mal_id: number) => {
$ = await requestGot ( ` ${ urls . BASE_TIOANIME } anime/ ${ id } ` , {
scrapy : true ,
parse : false ,
spoof : true ,
} ) ;
/* Extra info of the anime */
@ -785,6 +774,7 @@ export const videoServersTioAnime = async (id: string) => {
$ = await requestGot ( ` ${ urls . BASE_TIOANIME } ${ id } ` , {
scrapy : true ,
parse : false ,
spoof : true ,
} ) ;
} catch ( err ) {
return err ;
@ -941,7 +931,7 @@ async function desuServerUrl(url: string) {
}
}
$ = await requestGot ( url , { scrapy : true , parse : false }) ;
$ = await requestGot ( url , { scrapy : true , parse : false , spoof : true }) ;
} catch ( err ) {
return err ;
}
@ -1033,7 +1023,7 @@ export function getThemes(themes: any[]) {
}
export const imageUrlToBase64 = async ( url : string ) = > {
let img : any = await requestGot ( url );
let img : any = await requestGot ( url ,{ spoof :false } );
return img . rawBody . toString ( 'base64' ) ;
} ;