mirror of https://github.com/aruppi/aruppi-api.git
👾 Migrating routes and functions
parent
c0bab5e174
commit
563d0a7c4c
@ -0,0 +1,54 @@
|
|||||||
|
import urls from './urls';
|
||||||
|
|
||||||
|
export const obtainPreviewNews = (encoded: string) => {
|
||||||
|
let image: string;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (encoded.includes('src="https://img1.ak.crunchyroll.com/')) {
|
||||||
|
if (
|
||||||
|
encoded.split('https://img1.ak.crunchyroll.com/')[1].includes('.jpg')
|
||||||
|
) {
|
||||||
|
image = `https://img1.ak.crunchyroll.com/${
|
||||||
|
encoded.split('https://img1.ak.crunchyroll.com/')[1].split('.jpg')[0]
|
||||||
|
}.jpg`;
|
||||||
|
} else {
|
||||||
|
image = `https://img1.ak.crunchyroll.com/${
|
||||||
|
encoded.split('https://img1.ak.crunchyroll.com/')[1].split('.png')[0]
|
||||||
|
}.png`;
|
||||||
|
}
|
||||||
|
} else if (encoded.includes('<img title=')) {
|
||||||
|
image = encoded
|
||||||
|
.substring(encoded.indexOf('<img title="'), encoded.indexOf('" alt'))
|
||||||
|
.split('src="')[1];
|
||||||
|
} else if (encoded.includes('<img src=')) {
|
||||||
|
image = encoded
|
||||||
|
.substring(encoded.indexOf('<img src="'), encoded.indexOf('" alt'))
|
||||||
|
.substring(10)
|
||||||
|
.replace('http', 'https')
|
||||||
|
.replace('httpss', 'https');
|
||||||
|
} else if (encoded.includes('<img')) {
|
||||||
|
image = encoded
|
||||||
|
.split('src=')[1]
|
||||||
|
.split(' class=')[0]
|
||||||
|
.replace('"', '')
|
||||||
|
.replace('"', '');
|
||||||
|
} else if (encoded.includes('https://www.youtube.com/embed/')) {
|
||||||
|
let getSecondThumb = encoded
|
||||||
|
.split('https://www.youtube.com/embed/')[1]
|
||||||
|
.split('?feature')[0];
|
||||||
|
image = `https://img.youtube.com/vi/${getSecondThumb}/0.jpg`;
|
||||||
|
} else if (encoded.includes('https://www.dailymotion.com/')) {
|
||||||
|
let getDailymotionThumb = encoded
|
||||||
|
.substring(encoded.indexOf('" src="'), encoded.indexOf('" a'))
|
||||||
|
.substring(47);
|
||||||
|
image = `https://www.dailymotion.com/thumbnail/video/${getDailymotionThumb}`;
|
||||||
|
} else {
|
||||||
|
let number = Math.floor(Math.random() * 30);
|
||||||
|
image = `${urls.BASE_ARUPPI}news/${number}.png`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,22 @@
|
|||||||
|
import { requestGot } from './requestCall';
|
||||||
|
|
||||||
|
export const transformUrlServer = async (urlReal: any) => {
|
||||||
|
for (const data of urlReal) {
|
||||||
|
if (data.server === 'amus' || data.server === 'natsuki') {
|
||||||
|
let res = await requestGot(data.code.replace('embed', 'check'), {
|
||||||
|
parse: true,
|
||||||
|
scrapy: false,
|
||||||
|
});
|
||||||
|
data.code = res.file || null;
|
||||||
|
data.direct = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return urlReal.map((item: any) => {
|
||||||
|
return {
|
||||||
|
id: item.title.toLowerCase(),
|
||||||
|
url: item.code,
|
||||||
|
direct: item.direct || false,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
@ -0,0 +1,226 @@
|
|||||||
|
import urls from './urls';
|
||||||
|
import { requestGot } from './requestCall';
|
||||||
|
import AnimeModel, { Anime } from '../database/models/anime.model';
|
||||||
|
|
||||||
|
/*
|
||||||
|
Utils fuctions - functions to get information
|
||||||
|
from the pages as a parsed JSON or just scrapping
|
||||||
|
the information from the page.
|
||||||
|
*/
|
||||||
|
|
||||||
|
interface Promo {
|
||||||
|
title: string;
|
||||||
|
previewImage: string;
|
||||||
|
videoUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Character {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
image: string;
|
||||||
|
role: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RelatedAnime {
|
||||||
|
title: string;
|
||||||
|
type: string;
|
||||||
|
poster: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const animeExtraInfo = async (mal_id: number) => {
|
||||||
|
let data: any;
|
||||||
|
const airDay: any = {
|
||||||
|
mondays: 'Lunes',
|
||||||
|
monday: 'Lunes',
|
||||||
|
tuesdays: 'Martes',
|
||||||
|
tuesday: 'Martes',
|
||||||
|
wednesdays: 'Miércoles',
|
||||||
|
wednesday: 'Miércoles',
|
||||||
|
thursdays: 'Jueves',
|
||||||
|
thursday: 'Jueves',
|
||||||
|
fridays: 'Viernes',
|
||||||
|
friday: 'Viernes',
|
||||||
|
saturdays: 'Sábados',
|
||||||
|
saturday: 'Sábados',
|
||||||
|
sundays: 'Domingos',
|
||||||
|
sunday: 'Domingos',
|
||||||
|
default: 'Sin emisión',
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}`, {
|
||||||
|
parse: true,
|
||||||
|
scrapy: false,
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
airDay.hasOwnProperty(data.broadcast.split('at')[0].trim().toLowerCase())
|
||||||
|
) {
|
||||||
|
data.broadcast = airDay[data.broadcast.split('at')[0].trim().toLowerCase()];
|
||||||
|
} else {
|
||||||
|
data.broadcast = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const formattedObject: any = {
|
||||||
|
titleJapanese: data.title_japanese,
|
||||||
|
source: data.source,
|
||||||
|
totalEpisodes: data.episodes,
|
||||||
|
aired: {
|
||||||
|
from: data.aired.from,
|
||||||
|
to: 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,
|
||||||
|
};
|
||||||
|
|
||||||
|
return formattedObject;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getAnimeVideoPromo = async (mal_id: number) => {
|
||||||
|
let data: any;
|
||||||
|
|
||||||
|
try {
|
||||||
|
data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}/videos`, {
|
||||||
|
parse: true,
|
||||||
|
scrapy: false,
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
const promo: Promo[] = data.promo.map((item: Promo) => item);
|
||||||
|
|
||||||
|
return promo;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getAnimeCharacters = async (mal_id: number) => {
|
||||||
|
let data: any;
|
||||||
|
|
||||||
|
try {
|
||||||
|
data = await requestGot(
|
||||||
|
`${urls.BASE_JIKAN}anime/${mal_id}/characters_staff`,
|
||||||
|
{ parse: true, scrapy: false },
|
||||||
|
);
|
||||||
|
} catch (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
const characters: Character[] = data.characters.map((item: any) => {
|
||||||
|
return {
|
||||||
|
id: item.mal_id,
|
||||||
|
name: item.name,
|
||||||
|
image: item.image_url,
|
||||||
|
role: item.role,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return characters;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getPosterAndType = async (
|
||||||
|
id: string | undefined,
|
||||||
|
mal_id: number | undefined,
|
||||||
|
) => {
|
||||||
|
if (id) {
|
||||||
|
const queryRes: Anime | null = await AnimeModel.findOne({
|
||||||
|
id: { $eq: id },
|
||||||
|
});
|
||||||
|
|
||||||
|
return [queryRes?.poster, queryRes?.type];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mal_id) {
|
||||||
|
const queryRes: Anime | null = await AnimeModel.findOne({
|
||||||
|
mal_id: { $eq: mal_id },
|
||||||
|
});
|
||||||
|
|
||||||
|
return [queryRes?.poster, queryRes?.type];
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getRelatedAnimesFLV = async (id: string) => {
|
||||||
|
const $ = await requestGot(`${urls.BASE_ANIMEFLV}/anime/${id}`, {
|
||||||
|
parse: false,
|
||||||
|
scrapy: true,
|
||||||
|
});
|
||||||
|
let listRelated: any = {};
|
||||||
|
let relatedAnimes: RelatedAnime[] = [];
|
||||||
|
|
||||||
|
if ($('ul.ListAnmRel').length) {
|
||||||
|
$('ul.ListAnmRel li a').each((index: number, element: any) => {
|
||||||
|
listRelated[$(element).text()] = $(element).attr('href');
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const related in listRelated) {
|
||||||
|
let posterUrl: any = await getPosterAndType(
|
||||||
|
listRelated[related].split('/')[2],
|
||||||
|
undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (posterUrl !== '') {
|
||||||
|
relatedAnimes.push({
|
||||||
|
title: related,
|
||||||
|
type: posterUrl[1],
|
||||||
|
poster: posterUrl[0],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return relatedAnimes;
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getRelatedAnimesMAL = async (mal_id: number) => {
|
||||||
|
const $ = await requestGot(`https://myanimelist.net/anime/${mal_id}`, {
|
||||||
|
parse: false,
|
||||||
|
scrapy: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
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) !== 'Adaptation:') {
|
||||||
|
listRelated[$(element).find('td').eq(1).text()] = $(element)
|
||||||
|
.find('td')
|
||||||
|
.children('a')
|
||||||
|
.attr('href');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
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],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return relatedAnimes;
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue