@ -1,9 +1,10 @@
import urls from './urls' ;
import urls from './urls' ;
import { requestGot } from './requestCall' ;
import { requestGot } from './requestCall' ;
import AnimeModel , { Anime } from '../database/models/anime.model' ;
import AnimeModel , { Anime } from '../database/models/anime.model' ;
import crypto from 'crypto' ;
import crypto from 'crypto' ;
import util from 'util' ;
import util from 'util' ;
import { redisClient } from '../database/connection' ;
import { redisClient } from '../database/connection' ;
import { stderr } from 'process' ;
// @ts-ignore
// @ts-ignore
redisClient . get = util . promisify ( redisClient . get ) ;
redisClient . get = util . promisify ( redisClient . get ) ;
@ -34,7 +35,7 @@ interface RelatedAnime {
}
}
export const animeExtraInfo = async ( mal_id : number ) = > {
export const animeExtraInfo = async ( mal_id : number ) = > {
let data : any ;
let info : any ;
let broadcast : any ;
let broadcast : any ;
const airDay : 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 ,
parse : true ,
scrapy : false ,
scrapy : false ,
} ) ;
} ) ;
if ( data . broadcast ) {
if ( info . data . airing ) {
broadcast = data. broadcast . split ( 'at' ) [ 0 ] . trim ( ) . toLowerCase ( ) || null ;
broadcast = info. data. broadcast . string . split ( 'at' ) [ 0 ] . trim ( ) . toLowerCase ( ) || null ;
}
}
} catch ( err ) {
} catch ( err ) {
return err ;
return err ;
}
}
if ( airDay . hasOwnProperty ( broadcast ) ) {
if ( airDay . hasOwnProperty ( broadcast ) ) {
data . broadcast = airDay [ broadcast ] ;
info . data . broadcast = airDay [ broadcast ] ;
} else {
} else {
data . broadcast = null ;
info . data . broadcast = null ;
}
}
const formattedObject : any = {
const formattedObject : any = {
titleJapanese : data.title_japanes e,
titleJapanese : info.data.titles.find ( ( x : { type : string ; } ) = > x . type === "Default" ) . titl e,
source : data.source,
source : info. data.source,
totalEpisodes : data.episodes,
totalEpisodes : info. data.episodes,
aired : {
aired : {
from : data . aired . from ,
from : info . data . aired . from ,
to : data.aired.to,
to : info. data.aired.to,
} ,
} ,
duration : data.duration.split( 'per' ) [ 0 ] ,
duration : info. data.duration.split( 'per' ) [ 0 ] ,
rank : data.rank,
rank : info. data.rank,
broadcast : data.broadcast,
broadcast : info. data.broadcast,
producers : data.producers.map( ( item : any ) = > item . name ) || null ,
producers : info. data.producers.map( ( item : any ) = > item . name ) || null ,
licensors : data.licensors.map( ( item : any ) = > item . name ) || null ,
licensors : info. data.licensors.map( ( item : any ) = > item . name ) || null ,
studios : data.studios.map( ( item : any ) = > item . name ) || null ,
studios : info. data.studios.map( ( item : any ) = > item . name ) || null ,
openingThemes : data.opening_themes || null ,
openingThemes : info. data.opening_themes || null ,
endingThemes : data.ending_themes || null ,
endingThemes : info. data.ending_themes || null ,
} ;
} ;
if ( formattedObject ) {
if ( formattedObject ) {
@ -128,12 +129,12 @@ export const animeExtraInfo = async (mal_id: number) => {
} ;
} ;
export const getAnimeVideoPromo = async ( mal_id : number ) = > {
export const getAnimeVideoPromo = async ( mal_id : number ) = > {
let data : any ;
let info : any ;
try {
try {
if ( redisClient . connected ) {
if ( redisClient . connected ) {
const resultQueryRedis : any = await redisClient . get (
const resultQueryRedis : any = await redisClient . get (
` promoInfo_${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getMAL promoInfo_${ mal_id} ` ,
) ;
) ;
if ( resultQueryRedis ) {
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 ,
parse : true ,
scrapy : false ,
scrapy : false ,
} ) ;
} ) ;
@ -151,11 +152,11 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
return err ;
return err ;
}
}
const promo : Promo [ ] = data. promo . map ( ( item : Promo ) = > {
const promo : Promo [ ] = info. data. promo . map ( ( item : any ) = > {
return {
return {
title : item.title ,
title : item.title ,
previewImage : item .image_url,
previewImage : item .trailer.images .image_url,
videoURL : item.video_ url,
videoURL : item.trailer. url,
} ;
} ;
} ) ;
} ) ;
@ -164,15 +165,15 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
/* Set the key in the redis cache. */
/* Set the key in the redis cache. */
redisClient . set (
redisClient . set (
` promoInfo_${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getMAL promoInfo_${ mal_id} ` ,
JSON . stringify ( promo ) ,
JSON . stringify ( promo ) ,
) ;
) ;
/* After 2 4 hrs expire the key. */
/* After 2 hrs expire the key. */
redisClient . expire at (
redisClient . expire (
` promoInfo_${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getMAL promoInfo_${ mal_id} ` ,
parseInt ( ` ${ + new Date ( ) / 1000 } ` , 10 ) + 7200 ,
7200 ,
) ;
) ;
}
}
@ -183,7 +184,7 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
} ;
} ;
export const getAnimeCharacters = async ( mal_id : number ) = > {
export const getAnimeCharacters = async ( mal_id : number ) = > {
let data : any ;
let info : any ;
try {
try {
if ( redisClient . connected ) {
if ( redisClient . connected ) {
@ -198,19 +199,19 @@ export const getAnimeCharacters = async (mal_id: number) => {
}
}
}
}
data = await requestGot (
info = await requestGot (
` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /characters _staff ` ,
` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /characters ` ,
{ parse : true , scrapy : false } ,
{ parse : true , scrapy : false } ,
) ;
) ;
} catch ( err ) {
} catch ( err ) {
return err ;
return err ;
}
}
const characters : Character [ ] = data. characters . map ( ( item : any ) = > {
const characters : Character [ ] = info. data . map ( ( item : any ) = > {
return {
return {
id : item .mal_id,
id : item .character .mal_id,
name : item .name,
name : item .character .name,
image : item .image_url,
image : item .character.images.jpg .image_url,
role : item.role ,
role : item.role ,
} ;
} ;
} ) ;
} ) ;
@ -244,7 +245,7 @@ const getPosterAndType = async (
) = > {
) = > {
if ( id ) {
if ( id ) {
const queryRes : Anime | null = await AnimeModel . findOne ( {
const queryRes : Anime | null = await AnimeModel . findOne ( {
id : { $eq : id } ,
id : { $eq : id } ,
} ) ;
} ) ;
return [ queryRes ? . poster , queryRes ? . type ] ;
return [ queryRes ? . poster , queryRes ? . type ] ;
@ -252,7 +253,7 @@ const getPosterAndType = async (
if ( mal_id ) {
if ( mal_id ) {
const queryRes : Anime | null = await AnimeModel . findOne ( {
const queryRes : Anime | null = await AnimeModel . findOne ( {
mal_id : { $eq : mal_id } ,
mal_id : { $eq : mal_id } ,
} ) ;
} ) ;
return [ queryRes ? . poster , queryRes ? . type ] ;
return [ queryRes ? . poster , queryRes ? . type ] ;
@ -262,12 +263,12 @@ const getPosterAndType = async (
} ;
} ;
export const getRelatedAnimesMAL = async ( mal_id : number ) = > {
export const getRelatedAnimesMAL = async ( mal_id : number ) = > {
let $ : cheerio.Root ;
let info : any ;
try {
try {
if ( redisClient . connected ) {
if ( redisClient . connected ) {
const resultQueryRedis : any = await redisClient . get (
const resultQueryRedis : any = await redisClient . get (
` getRelatedMAL_ ${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getRelatedMAL_ ${ mal_id} ` ,
) ;
) ;
if ( resultQueryRedis ) {
if ( resultQueryRedis ) {
@ -277,41 +278,31 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
}
}
}
}
$ = await requestGot ( ` https://myanimelist.net/anime/ ${ mal_id } ` , {
info = await requestGot ( ` ${ urls . BASE_JIKAN } anime/ ${ mal_id } /relations ` , {
parse : fals e,
parse : tru e,
scrapy : tru e,
scrapy : fals e,
} ) ;
} ) ;
} catch ( err ) {
} catch ( err ) {
stderr . write ( ` Error on getRelatedAnimesMAL http on mal_id: ${ mal_id } \ n ` )
return err ;
return err ;
}
}
let listRelated : any = { } ;
const relatedAnimes = [ ]
let relatedAnimes : RelatedAnime [ ] = [ ] ;
for ( const relation_entry of info . data ) {
for ( const entry of relation_entry . entry ) {
if ( $ ( 'table.anime_detail_related_anime' ) . length > 0 ) {
if ( entry . type != "anime" )
$ ( 'table.anime_detail_related_anime' )
break ;
. find ( 'tbody tr' )
const queryRes : Anime | null = await AnimeModel . findOne ( {
. each ( ( index : number , element : any ) = > {
mal_id : { $eq : entry.mal_id }
if ( $ ( element ) . find ( 'td' ) . eq ( 0 ) . text ( ) !== 'Adaptation:' ) {
listRelated [ $ ( element ) . find ( 'td' ) . eq ( 1 ) . text ( ) ] = $ ( element )
. find ( 'td' )
. children ( 'a' )
. attr ( 'href' ) ;
}
} ) ;
} ) ;
if ( queryRes == null )
break
for ( const related in listRelated ) {
let posterUrl : any = await getPosterAndType (
undefined ,
listRelated [ related ] . split ( '/' ) [ 2 ] ,
) ;
if ( posterUrl !== '' ) {
relatedAnimes . push ( {
relatedAnimes . push ( {
title : related ,
title : queryRes ! . title ,
type : posterUrl [ 1 ] ,
type : queryRes ? . type ,
poster : posterUrl[ 0 ] ,
poster : queryRes?.poster
} ) ;
} )
}
}
}
}
@ -320,23 +311,20 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
/* Set the key in the redis cache. */
/* Set the key in the redis cache. */
redisClient . set (
redisClient . set (
` getRelatedMAL_ ${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getRelatedMAL_ ${ mal_id} ` ,
JSON . stringify ( relatedAnimes ) ,
JSON . stringify ( relatedAnimes ) ,
) ;
) ;
/* After 24hrs expire the key. */
/* After 1hr expire the key. */
redisClient . expire at (
redisClient . expire (
` getRelatedMAL_ ${ hashStringMd5( ` ${ mal_id} ` ) } ` ,
` getRelatedMAL_ ${ mal_id} ` ,
parseInt ( ` ${ + new Date ( ) / 1000 } ` , 10 ) + 72 00,
36 00,
) ;
) ;
}
}
return relatedAnimes ;
return relatedAnimes ;
}
}
} else {
return [ ] ;
}
} ;
} ;
export const jkanimeInfo = async ( id : string | undefined , mal_id : number ) = > {
export const jkanimeInfo = async ( id : string | undefined , mal_id : number ) = > {
@ -471,7 +459,7 @@ export const monoschinosInfo = async (
id : string | undefined ,
id : string | undefined ,
mal_id : number ,
mal_id : number ,
) = > {
) = > {
let $: cheer io.Root ;
let inf o;
let episodeList : any [ ] = [ ] ;
let episodeList : any [ ] = [ ] ;
let extraInfo : any ;
let extraInfo : any ;
@ -488,9 +476,9 @@ export const monoschinosInfo = async (
}
}
}
}
$ = await requestGot ( ` ${ urls . BASE _MONOSCHINOS} anime/ ${ id } ` , {
info = await requestGot ( ` ${ urls . BASE _ARUPPI _MONOSCHINOS} anime/ ${ id } ` , {
scrapy : tru e,
scrapy : fals e,
parse : fals e,
parse : tru e,
} ) ;
} ) ;
/* Extra info of the anime */
/* Extra info of the anime */
@ -499,7 +487,6 @@ export const monoschinosInfo = async (
console . log ( err ) ;
console . log ( err ) ;
}
}
if ( $ ! ) {
if ( extraInfo ) {
if ( extraInfo ) {
let broadCastDate = new Date ( ) ;
let broadCastDate = new Date ( ) ;
let dd : number , mm : string | number , yyyy : number ;
let dd : number , mm : string | number , yyyy : number ;
@ -554,25 +541,12 @@ export const monoschinosInfo = async (
}
}
}
}
$ ! ( '.SerieCaps a' ) . each ( ( index : number , element : cheerio.Element ) = > {
for ( const anime of info . episodes ) {
let episode : number ;
$ ( element )
. attr ( 'href' )
? . split ( '-' )
. forEach ( ( item : any ) = > {
if ( ! isNaN ( item ) ) {
episode = parseInt ( item ) ;
}
} ) ;
episodeList . push ( {
episodeList . push ( {
episode : episode ! ,
episode : anime.no ,
id : ` ${ $ ( element ) . attr ( 'href' ) ? . split ( '/' ) [ 3 ] } / ${
id : ` ver/ ${ anime . id } ` ,
$ ( element ) . attr ( 'href' ) ? . split ( '/' ) [ 4 ]
} ` ,
} ) ;
} ) ;
} ) ;
}
if ( episodeList . length > 0 ) {
if ( episodeList . length > 0 ) {
if ( redisClient . connected ) {
if ( redisClient . connected ) {
@ -595,9 +569,7 @@ export const monoschinosInfo = async (
} else {
} else {
return undefined ;
return undefined ;
}
}
} else {
return undefined ;
}
} ;
} ;
export const tioanimeInfo = async ( id : string | undefined , mal_id : number ) = > {
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 } ` , {
$ = await requestGot ( ` ${ urls . BASE_TIOANIME } anime/ ${ id } ` , {
scrapy : true ,
scrapy : true ,
parse : false ,
parse : false ,
spoof : true ,
} ) ;
} ) ;
/* Extra info of the anime */
/* Extra info of the anime */
@ -725,7 +698,7 @@ export const tioanimeInfo = async (id: string | undefined, mal_id: number) => {
} ;
} ;
export const videoServersMonosChinos = async ( id : string ) = > {
export const videoServersMonosChinos = async ( id : string ) = > {
let $ : cheerio.Root ;
let $ ;
let videoServers : any [ ] = [ ] ;
let videoServers : any [ ] = [ ] ;
try {
try {
@ -741,51 +714,21 @@ export const videoServersMonosChinos = async (id: string) => {
}
}
}
}
$ = await requestGot ( ` ${ urls . BASE _MONOSCHINOS} ${ id } ` , {
$ = await requestGot ( ` ${ urls . BASE _ARUPPI _MONOSCHINOS} ${ id } ` , {
scrapy : tru e,
scrapy : fals e,
parse : fals e,
parse : tru e,
} ) ;
} ) ;
} catch ( err ) {
} catch ( err ) {
return err ;
return err ;
}
}
let videoNames : string [ ] = $ ( '.TPlayerNv li' )
for ( const server of $ . videos ) {
. map ( ( index : number , element : cheerio.Element ) = > {
return $ ( element ) . attr ( 'title' ) ;
} )
. get ( ) ;
videoServers . push ( {
id : videoNames [ 0 ] . toLowerCase ( ) ,
url : decodeURIComponent (
$ ( '.TPlayer div iframe' ) . attr ( 'src' ) ? . split ( 'url=' ) [ 1 ] ! ,
) . split ( '&id' ) [ 0 ] ,
direct : false ,
} ) ;
const videoContainer : any = $ ( '.TPlayer div' ) . text ( ) ;
$ ( videoContainer ) . each ( ( index : number , element : cheerio.Element ) = > {
let video : any = $ ( element ) . attr ( 'src' ) ;
if ( video ) {
video = video . split ( 'url=' ) [ 1 ] ;
video = decodeURIComponent ( video ) ;
video = video . split ( '&id' ) [ 0 ] ;
}
if ( video ) {
videoNames . forEach ( ( value : string ) = > {
if ( video . includes ( value . toLowerCase ( ) ) ) {
videoServers . push ( {
videoServers . push ( {
id : value.toLowerCase( ) ,
id : server.title ,
url : video ,
url : server.url.replace ( "https://monoschinos2.com/reproductor?url=" , "" ) ,
direct : false ,
direct : false ,
} ) ;
} ) ;
}
}
} ) ;
}
} ) ;
if ( videoServers . length > 0 ) {
if ( videoServers . length > 0 ) {
if ( redisClient . connected ) {
if ( redisClient . connected ) {
@ -831,6 +774,7 @@ export const videoServersTioAnime = async (id: string) => {
$ = await requestGot ( ` ${ urls . BASE_TIOANIME } ${ id } ` , {
$ = await requestGot ( ` ${ urls . BASE_TIOANIME } ${ id } ` , {
scrapy : true ,
scrapy : true ,
parse : false ,
parse : false ,
spoof : true ,
} ) ;
} ) ;
} catch ( err ) {
} catch ( err ) {
return err ;
return err ;
@ -987,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 ) {
} catch ( err ) {
return err ;
return err ;
}
}
@ -1079,7 +1023,7 @@ export function getThemes(themes: any[]) {
}
}
export const imageUrlToBase64 = async ( url : string ) = > {
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' ) ;
return img . rawBody . toString ( 'base64' ) ;
} ;
} ;