@ -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,41 +278,31 @@ 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 ] ,
} ) ;
title : queryRes ! . title ,
type : queryRes ? . type ,
poster : queryRes?.poster
} )
}
}
@ -320,23 +311,20 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
/* Set the key in the redis cache. */
redisClient . set (
` getRelatedMAL_ ${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getRelatedMAL_ ${ mal_id} ` ,
JSON . stringify ( relatedAnimes ) ,
) ;
/* After 24hrs expire the key. */
/* After 1hr expire the key. */
redisClient . expire at (
` getRelatedMAL_ ${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
parseInt ( ` ${ + new Date ( ) / 1000 } ` , 10 ) + 72 00,
redisClient . expire (
` getRelatedMAL_ ${ mal_id} ` ,
36 00,
) ;
}
return relatedAnimes ;
}
} else {
return [ ] ;
}
} ;
export const jkanimeInfo = async ( id : string | undefined , mal_id : number ) = > {
@ -471,7 +459,7 @@ export const monoschinosInfo = async (
id : string | undefined ,
mal_id : number ,
) = > {
let $: cheer io.Root ;
let inf o;
let episodeList : any [ ] = [ ] ;
let extraInfo : any ;
@ -488,9 +476,9 @@ export const monoschinosInfo = async (
}
}
$ = await requestGot ( ` ${ urls . BASE _MONOSCHINOS} anime/ ${ id } ` , {
scrapy : tru e,
parse : fals e,
info = await requestGot ( ` ${ urls . BASE _ARUPPI _MONOSCHINOS} anime/ ${ id } ` , {
scrapy : fals e,
parse : tru e,
} ) ;
/* Extra info of the anime */
@ -499,7 +487,6 @@ export const monoschinosInfo = async (
console . log ( err ) ;
}
if ( $ ! ) {
if ( extraInfo ) {
let broadCastDate = new Date ( ) ;
let dd : number , mm : string | number , yyyy : number ;
@ -554,25 +541,12 @@ export const monoschinosInfo = async (
}
}
$ ! ( '.SerieCaps a' ) . each ( ( index : number , element : cheerio.Element ) = > {
let episode : number ;
$ ( element )
. attr ( 'href' )
? . split ( '-' )
. forEach ( ( item : any ) = > {
if ( ! isNaN ( item ) ) {
episode = parseInt ( item ) ;
}
} ) ;
for ( const anime of info . episodes ) {
episodeList . push ( {
episode : episode ! ,
id : ` ${ $ ( element ) . attr ( 'href' ) ? . split ( '/' ) [ 3 ] } / ${
$ ( element ) . attr ( 'href' ) ? . split ( '/' ) [ 4 ]
} ` ,
} ) ;
episode : anime.no ,
id : ` ver/ ${ anime . id } ` ,
} ) ;
}
if ( episodeList . length > 0 ) {
if ( redisClient . connected ) {
@ -595,9 +569,7 @@ export const monoschinosInfo = async (
} else {
return undefined ;
}
} else {
return undefined ;
}
} ;
export const tioanimeInfo = async ( id : string | undefined , mal_id : number ) = > {
@ -622,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 */
@ -801,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 ;
@ -957,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 ;
}
@ -1049,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' ) ;
} ;