Compare commits

..

No commits in common. 'v4' and 'v4.1.9' have entirely different histories.
v4 ... v4.1.9

@ -1,4 +1,4 @@
# **Aruppi API** (v4.2.2) # **Aruppi API** (v4.1.8)
> 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
> >

@ -1,6 +1,6 @@
{ {
"name": "aruppi", "name": "aruppi",
"version": "4.2.2", "version": "4.1.9",
"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": {
@ -54,11 +54,11 @@
"compose-middleware": "^5.0.1", "compose-middleware": "^5.0.1",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"express": "^4.17.3", "express": "^4.17.1",
"got": "^11.8.5", "got": "^11.8.5",
"helmet": "^4.5.0", "helmet": "^4.5.0",
"mongodb": "^3.6.6", "mongodb": "^3.6.6",
"mongoose": "^5.13.15", "mongoose": "^5.12.5",
"redis": "^3.1.2", "redis": "^3.1.2",
"rss-parser": "^3.12.0", "rss-parser": "^3.12.0",
"tough-cookie": "^4.0.0", "tough-cookie": "^4.0.0",

@ -81,7 +81,7 @@ interface Movie {
export default class AnimeController { export default class AnimeController {
async schedule(req: Request, res: Response, next: NextFunction) { async schedule(req: Request, res: Response, next: NextFunction) {
const { day } = req.params; const { day } = req.params;
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
@ -96,7 +96,7 @@ export default class AnimeController {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}schedules?filter=${day}`, { data = await requestGot(`${urls.BASE_JIKAN}schedule/${day}`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
}); });
@ -104,10 +104,10 @@ export default class AnimeController {
return next(err); return next(err);
} }
const animeList: Schedule[] = info.data.map((item: any) => ({ const animeList: Schedule[] = data[day].map((item: Schedule) => ({
title: item.titles.find((x: { type: string; }) => x.type === "Default").title, title: item.title,
malid: item.mal_id, malid: item.mal_id,
image: item.images.jpg.image_url, image: item.image_url,
})); }));
if (animeList.length > 0) { if (animeList.length > 0) {
@ -119,11 +119,11 @@ export default class AnimeController {
JSON.stringify({ day: animeList }), JSON.stringify({ day: animeList }),
); );
/* After 6hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expire( redisClient.expireat(
`schedule_${hashStringMd5(day)}`, `schedule_${hashStringMd5(day)}`,
+ 21600, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
} }
@ -137,7 +137,7 @@ export default class AnimeController {
async top(req: Request, res: Response, next: NextFunction) { async top(req: Request, res: Response, next: NextFunction) {
const { type, subtype, page } = req.params; const { type, subtype, page } = req.params;
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
@ -161,12 +161,12 @@ export default class AnimeController {
} }
if (subtype !== undefined) { if (subtype !== undefined) {
info = await requestGot( data = await requestGot(
`${urls.BASE_JIKAN}top/${type}?filter=${subtype}&page=${page}`, `${urls.BASE_JIKAN}top/${type}/${page}/${subtype}`,
{ parse: true, scrapy: false }, { parse: true, scrapy: false },
); );
} else { } else {
info = await requestGot(`${urls.BASE_JIKAN}top/${type}?page=${page}`, { data = await requestGot(`${urls.BASE_JIKAN}top/${type}/${page}`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
}); });
@ -175,12 +175,11 @@ export default class AnimeController {
return next(err); return next(err);
} }
const top: Top[] = info.data.map((item: any, index: number) => ({ const top: Top[] = data.top.map((item: Top) => ({
// A little hacky way to fix null ranks rank: item.rank,
rank: item.rank || index + 1 + (info.pagination.current_page-1)*info.pagination.items.per_page, title: item.title,
title: item.titles.find((x: { type: string; }) => x.type === "Default").title,
url: item.url, url: item.url,
image_url: item.images.jpg.image_url, image_url: item.image_url,
type: type, type: type,
subtype: subtype, subtype: subtype,
page: page, page: page,
@ -230,7 +229,6 @@ export default class AnimeController {
data = await requestGot(`${urls.BASE_ANIMEFLV}api/animes/list`, { data = await requestGot(`${urls.BASE_ANIMEFLV}api/animes/list`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
spoof: true,
}); });
} catch (err) { } catch (err) {
return next(err); return next(err);

@ -104,7 +104,7 @@ export default class DirectoryController {
async getSeason(req: Request, res: Response, next: NextFunction) { async getSeason(req: Request, res: Response, next: NextFunction) {
const { year, type } = req.params; const { year, type } = req.params;
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
@ -119,7 +119,7 @@ export default class DirectoryController {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}seasons/${year}/${type}`, { data = await requestGot(`${urls.BASE_JIKAN}season/${year}/${type}`, {
scrapy: false, scrapy: false,
parse: true, parse: true,
}); });
@ -127,10 +127,10 @@ export default class DirectoryController {
return next(err); return next(err);
} }
const season: TypeAnime[] = info.data.map((item: any) => { const season: TypeAnime[] = data.anime.map((item: any) => {
return { return {
title: item.titles.find((x: { type: string; }) => x.type === "Default").title, title: item.title,
image: item.images.jpg.image_url, image: item.image_url,
genres: item.genres.map((genre: any) => genre.name), genres: item.genres.map((genre: any) => genre.name),
}; };
}); });
@ -161,7 +161,7 @@ export default class DirectoryController {
} }
async allSeasons(req: Request, res: Response, next: NextFunction) { async allSeasons(req: Request, res: Response, next: NextFunction) {
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
@ -176,7 +176,7 @@ export default class DirectoryController {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}seasons`, { data = await requestGot(`${urls.BASE_JIKAN}season/archive`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
}); });
@ -184,7 +184,7 @@ export default class DirectoryController {
return next(err); return next(err);
} }
const archive: Archive[] = info.data.map((item: any) => { const archive: Archive[] = data.archive.map((item: any) => {
return { return {
year: item.year, year: item.year,
seasons: item.seasons, seasons: item.seasons,
@ -215,7 +215,7 @@ export default class DirectoryController {
} }
async laterSeasons(req: Request, res: Response, next: NextFunction) { async laterSeasons(req: Request, res: Response, next: NextFunction) {
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
@ -230,7 +230,7 @@ export default class DirectoryController {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}seasons/upcoming`, { data = await requestGot(`${urls.BASE_JIKAN}season/later`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
}); });
@ -238,10 +238,10 @@ export default class DirectoryController {
return next(err); return next(err);
} }
const future: Season[] = info.data.map((item: any) => { const future: Season[] = data.anime.map((item: any) => {
return { return {
title: item.titles.find((x: { type: string; }) => x.type === "Default").title, title: item.title,
image: item.images.jpg.image_url, image: item.image_url,
malink: item.url, malink: item.url,
}; };
}); });
@ -294,7 +294,6 @@ export default class DirectoryController {
const extraInfo: any = await animeExtraInfo(resultQuery!.mal_id); const extraInfo: any = await animeExtraInfo(resultQuery!.mal_id);
resultAnime = { resultAnime = {
//aruppi_key: hashStringMd5(title),
title: resultQuery?.title, title: resultQuery?.title,
poster: resultQuery?.poster, poster: resultQuery?.poster,
synopsis: resultQuery?.description, synopsis: resultQuery?.description,

@ -234,7 +234,7 @@ export default class UtilsController {
`${urls.BASE_QWANT}t=images&q=${encodeURIComponent( `${urls.BASE_QWANT}t=images&q=${encodeURIComponent(
title, title,
)}&count=51&locale=es_ES&safesearch=1`, )}&count=51&locale=es_ES&safesearch=1`,
{ scrapy: false, parse: true, spoof: true, }, { scrapy: false, parse: true },
); );
} catch (err) { } catch (err) {
return next(err); return next(err);
@ -243,8 +243,8 @@ export default class UtilsController {
const results: any[] = data.data.result.items.map((item: any) => { const results: any[] = data.data.result.items.map((item: any) => {
return { return {
type: item.thumb_type, type: item.thumb_type,
thumbnail: `${item.thumbnail}`, thumbnail: `https:${item.thumbnail}`,
fullsize: `${item.media_fullsize}`, fullsize: `https:${item.media_fullsize}`,
}; };
}); });
@ -637,7 +637,6 @@ export default class UtilsController {
data = await requestGot(`${urls.BASE_THEMEMOE}roulette`, { data = await requestGot(`${urls.BASE_THEMEMOE}roulette`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
spoof: true,
}); });
} catch (err) { } catch (err) {
return next(err); return next(err);

@ -26,7 +26,7 @@ routes.get('/api/v4/', (req: Request, res: Response) => {
res.json({ res.json({
message: 'Aruppi /api - 🎏', message: 'Aruppi /api - 🎏',
author: 'Jéluchu', author: 'Jéluchu',
version: '4.2.2', version: '4.1.8',
credits: 'The bitch loves /apis that offers data to Aruppi App', credits: 'The bitch loves /apis that offers data to Aruppi App',
entries: [ entries: [
{ {

@ -285,7 +285,6 @@ async function redditocall(href: string) {
const resp = await requestGot(urls.REDDIT_ANIMETHEMES + href + '.json', { const resp = await requestGot(urls.REDDIT_ANIMETHEMES + href + '.json', {
parse: true, parse: true,
scrapy: false, scrapy: false,
spoof: true,
}); });
return cheerio.load(getHTML(resp.data.content_html)); return cheerio.load(getHTML(resp.data.content_html));

@ -1,52 +1,28 @@
import got from 'got'; import got from 'got';
import cheerio from 'cheerio'; import cheerio from 'cheerio';
import { CookieJar } from 'tough-cookie'; import { CookieJar } from 'tough-cookie';
// @ts-ignore
import * as got_pjson from 'got/package.json'
const pjson = require('../../package.json');
const cookieJar = new CookieJar(); const cookieJar = new CookieJar();
const aruppi_options: any = {
cookieJar,
'headers': {
'user-agent': `Aruppi-API/${pjson.version} ${got_pjson.name}/${got_pjson.version}`,
'x-client': 'aruppi-api'
},
};
interface Options { interface Options {
scrapy?: boolean, scrapy: boolean;
parse?: boolean, parse: boolean;
spoof?: boolean
} }
export const requestGot = async ( export const requestGot = async (
url: string, url: string,
options?: Options, options?: Options,
): Promise<any> => { ): Promise<any> => {
const got_options: any = {...got.defaults.options, ...aruppi_options} if (options !== undefined) {
if (options) {
if (options.spoof != null) {
got_options.headers["user-agent"] = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/69.0";
delete got_options.headers['x-client'];
if (!options.spoof)
got_options.headers['user-agent'] = got.defaults.options.headers['user-agent'];
} else if (process.env.ALPI_KEY && (new URL(url)).hostname.match(/\.jeluchu\.xyz$/)) {
got_options.headers['x-aruppi-key'] = process.env.ALPI_KEY;
}
if (options.scrapy) { if (options.scrapy) {
const response = await got(url, got_options); const response = await got(url, { cookieJar });
return cheerio.load(response.body); return await cheerio.load(response.body);
} }
if (options.parse) { if (options.parse) {
got_options.responseType = 'json'; return await got(url, { cookieJar }).json();
const response = await got(url, got_options);
return response.body;
} }
} else {
return await got.get(url, { cookieJar });
} }
const response = await got.get(url, got_options);
return response;
}; };

@ -7,8 +7,9 @@ export default {
BASE_ANIMEFLV_JELU: 'https://aruppi.jeluchu.xyz/apis/animeflv/v1/', BASE_ANIMEFLV_JELU: 'https://aruppi.jeluchu.xyz/apis/animeflv/v1/',
BASE_YOUTUBE: 'https://aruppi.jeluchu.xyz/api/Youtube/?channelId=', BASE_YOUTUBE: 'https://aruppi.jeluchu.xyz/api/Youtube/?channelId=',
BASE_YOUTUBE_PLAYLIST: 'https://aruppi.jeluchu.xyz/api/Youtube/playlist/?playlistId=', BASE_YOUTUBE_PLAYLIST: 'https://aruppi.jeluchu.xyz/api/Youtube/playlist/?playlistId=',
BASE_JIKAN: 'https://aruppi.jeluchu.xyz/apis/jikan/v4/', BASE_JIKAN: 'https://aruppi.jeluchu.xyz/apis/jikan/v3/',
BASE_IVOOX: 'https://www.ivoox.com/podcast-anitakume_fg_f1660716_filtro_1.xml', BASE_IVOOX:
'https://www.ivoox.com/podcast-anitakume_fg_f1660716_filtro_1.xml',
BASE_KUDASAI: 'https://somoskudasai.com/feed/', BASE_KUDASAI: 'https://somoskudasai.com/feed/',
BASE_RAMENPARADOS: 'https://ramenparados.com/category/noticias/anime/feed/', BASE_RAMENPARADOS: 'https://ramenparados.com/category/noticias/anime/feed/',
BASE_CRUNCHYROLL: 'https://www.crunchyroll.com/newsrss?lang=esES', BASE_CRUNCHYROLL: 'https://www.crunchyroll.com/newsrss?lang=esES',

@ -4,7 +4,6 @@ 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);
@ -35,7 +34,7 @@ interface RelatedAnime {
} }
export const animeExtraInfo = async (mal_id: number) => { export const animeExtraInfo = async (mal_id: number) => {
let info: any; let data: any;
let broadcast: any; let broadcast: any;
const airDay: any = { const airDay: any = {
@ -69,40 +68,40 @@ export const animeExtraInfo = async (mal_id: number) => {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}`, { data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
}); });
if (info.data.airing) { if (data.broadcast) {
broadcast = info.data.broadcast.string.split('at')[0].trim().toLowerCase() || null; broadcast = data.broadcast.split('at')[0].trim().toLowerCase() || null;
} }
} catch (err) { } catch (err) {
return err; return err;
} }
if (airDay.hasOwnProperty(broadcast)) { if (airDay.hasOwnProperty(broadcast)) {
info.data.broadcast = airDay[broadcast]; data.broadcast = airDay[broadcast];
} else { } else {
info.data.broadcast = null; data.broadcast = null;
} }
const formattedObject: any = { const formattedObject: any = {
titleJapanese: info.data.titles.find((x: { type: string; }) => x.type === "Default").title, titleJapanese: data.title_japanese,
source: info.data.source, source: data.source,
totalEpisodes: info.data.episodes, totalEpisodes: data.episodes,
aired: { aired: {
from: info.data.aired.from, from: data.aired.from,
to: info.data.aired.to, to: data.aired.to,
}, },
duration: info.data.duration.split('per')[0], duration: data.duration.split('per')[0],
rank: info.data.rank, rank: data.rank,
broadcast: info.data.broadcast, broadcast: data.broadcast,
producers: info.data.producers.map((item: any) => item.name) || null, producers: data.producers.map((item: any) => item.name) || null,
licensors: info.data.licensors.map((item: any) => item.name) || null, licensors: data.licensors.map((item: any) => item.name) || null,
studios: info.data.studios.map((item: any) => item.name) || null, studios: data.studios.map((item: any) => item.name) || null,
openingThemes: info.data.opening_themes || null, openingThemes: data.opening_themes || null,
endingThemes: info.data.ending_themes || null, endingThemes: data.ending_themes || null,
}; };
if (formattedObject) { if (formattedObject) {
@ -129,12 +128,12 @@ export const animeExtraInfo = async (mal_id: number) => {
}; };
export const getAnimeVideoPromo = async (mal_id: number) => { export const getAnimeVideoPromo = async (mal_id: number) => {
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get( const resultQueryRedis: any = await redisClient.get(
`getMALpromoInfo_${mal_id}`, `promoInfo_${hashStringMd5(`${mal_id}`)}`,
); );
if (resultQueryRedis) { if (resultQueryRedis) {
@ -144,7 +143,7 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}/videos`, { data = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}/videos`, {
parse: true, parse: true,
scrapy: false, scrapy: false,
}); });
@ -152,11 +151,11 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
return err; return err;
} }
const promo: Promo[] = info.data.promo.map((item: any) => { const promo: Promo[] = data.promo.map((item: Promo) => {
return { return {
title: item.title, title: item.title,
previewImage: item.trailer.images.image_url, previewImage: item.image_url,
videoURL: item.trailer.url, videoURL: item.video_url,
}; };
}); });
@ -165,15 +164,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(
`getMALpromoInfo_${mal_id}`, `promoInfo_${hashStringMd5(`${mal_id}`)}`,
JSON.stringify(promo), JSON.stringify(promo),
); );
/* After 2hrs expire the key. */ /* After 24hrs expire the key. */
redisClient.expire( redisClient.expireat(
`getMALpromoInfo_${mal_id}`, `promoInfo_${hashStringMd5(`${mal_id}`)}`,
7200, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
} }
@ -184,7 +183,7 @@ export const getAnimeVideoPromo = async (mal_id: number) => {
}; };
export const getAnimeCharacters = async (mal_id: number) => { export const getAnimeCharacters = async (mal_id: number) => {
let info: any; let data: any;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
@ -199,19 +198,19 @@ export const getAnimeCharacters = async (mal_id: number) => {
} }
} }
info = await requestGot( data = await requestGot(
`${urls.BASE_JIKAN}anime/${mal_id}/characters`, `${urls.BASE_JIKAN}anime/${mal_id}/characters_staff`,
{parse: true, scrapy: false}, {parse: true, scrapy: false},
); );
} catch (err) { } catch (err) {
return err; return err;
} }
const characters: Character[] = info.data.map((item: any) => { const characters: Character[] = data.characters.map((item: any) => {
return { return {
id: item.character.mal_id, id: item.mal_id,
name: item.character.name, name: item.name,
image: item.character.images.jpg.image_url, image: item.image_url,
role: item.role, role: item.role,
}; };
}); });
@ -263,12 +262,12 @@ const getPosterAndType = async (
}; };
export const getRelatedAnimesMAL = async (mal_id: number) => { export const getRelatedAnimesMAL = async (mal_id: number) => {
let info: any; let $: cheerio.Root;
try { try {
if (redisClient.connected) { if (redisClient.connected) {
const resultQueryRedis: any = await redisClient.get( const resultQueryRedis: any = await redisClient.get(
`getRelatedMAL_${mal_id}`, `getRelatedMAL_${hashStringMd5(`${mal_id}`)}`,
); );
if (resultQueryRedis) { if (resultQueryRedis) {
@ -278,31 +277,41 @@ export const getRelatedAnimesMAL = async (mal_id: number) => {
} }
} }
info = await requestGot(`${urls.BASE_JIKAN}anime/${mal_id}/relations`, { $ = await requestGot(`https://myanimelist.net/anime/${mal_id}`, {
parse: true, parse: false,
scrapy: false, scrapy: true,
}); });
} catch (err) { } catch (err) {
stderr.write(`Error on getRelatedAnimesMAL http on mal_id: ${mal_id}\n`)
return err; return err;
} }
const relatedAnimes = [] let listRelated: any = {};
for (const relation_entry of info.data) { let relatedAnimes: RelatedAnime[] = [];
for (const entry of relation_entry.entry){
if (entry.type != "anime") if ($('table.anime_detail_related_anime').length > 0) {
break; $('table.anime_detail_related_anime')
const queryRes: Anime | null = await AnimeModel.findOne({ .find('tbody tr')
mal_id: {$eq: entry.mal_id} .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');
}
}); });
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: queryRes!.title, title: related,
type: queryRes?.type, type: posterUrl[1],
poster: queryRes?.poster poster: posterUrl[0],
}) });
} }
} }
@ -311,20 +320,23 @@ 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_${mal_id}`, `getRelatedMAL_${hashStringMd5(`${mal_id}`)}`,
JSON.stringify(relatedAnimes), JSON.stringify(relatedAnimes),
); );
/* After 1hr expire the key. */ /* After 24hrs expire the key. */
redisClient.expire( redisClient.expireat(
`getRelatedMAL_${mal_id}`, `getRelatedMAL_${hashStringMd5(`${mal_id}`)}`,
3600, parseInt(`${+new Date() / 1000}`, 10) + 7200,
); );
} }
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) => {
@ -594,7 +606,6 @@ 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 */
@ -774,7 +785,6 @@ 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;
@ -931,7 +941,7 @@ async function desuServerUrl(url: string) {
} }
} }
$ = await requestGot(url, {scrapy: true, parse: false, spoof: true}); $ = await requestGot(url, {scrapy: true, parse: false});
} catch (err) { } catch (err) {
return err; return err;
} }
@ -1023,7 +1033,7 @@ export function getThemes(themes: any[]) {
} }
export const imageUrlToBase64 = async (url: string) => { export const imageUrlToBase64 = async (url: string) => {
let img: any = await requestGot(url,{spoof:false}); let img: any = await requestGot(url);
return img.rawBody.toString('base64'); return img.rawBody.toString('base64');
}; };

@ -268,12 +268,12 @@
"@typescript-eslint/types" "4.33.0" "@typescript-eslint/types" "4.33.0"
eslint-visitor-keys "^2.0.0" eslint-visitor-keys "^2.0.0"
accepts@~1.3.8: accepts@~1.3.7:
version "1.3.8" version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz"
dependencies: dependencies:
mime-types "~2.1.34" mime-types "~2.1.24"
negotiator "0.6.3" negotiator "0.6.2"
acorn-jsx@^5.3.1: acorn-jsx@^5.3.1:
version "5.3.2" version "5.3.2"
@ -374,7 +374,7 @@ astral-regex@^2.0.0:
balanced-match@^1.0.0: balanced-match@^1.0.0:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
binary-extensions@^2.0.0: binary-extensions@^2.0.0:
version "2.2.0" version "2.2.0"
@ -391,20 +391,20 @@ bluebird@3.5.1:
version "3.5.1" version "3.5.1"
resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz" resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz"
body-parser@1.19.2, body-parser@^1.19.0: body-parser@1.19.0, body-parser@^1.19.0:
version "1.19.2" version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz"
dependencies: dependencies:
bytes "3.1.2" bytes "3.1.0"
content-type "~1.0.4" content-type "~1.0.4"
debug "2.6.9" debug "2.6.9"
depd "~1.1.2" depd "~1.1.2"
http-errors "1.8.1" http-errors "1.7.2"
iconv-lite "0.4.24" iconv-lite "0.4.24"
on-finished "~2.3.0" on-finished "~2.3.0"
qs "6.9.7" qs "6.7.0"
raw-body "2.4.3" raw-body "2.4.0"
type-is "~1.6.18" type-is "~1.6.17"
boolbase@^1.0.0: boolbase@^1.0.0:
version "1.0.0" version "1.0.0"
@ -412,7 +412,7 @@ boolbase@^1.0.0:
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
dependencies: dependencies:
balanced-match "^1.0.0" balanced-match "^1.0.0"
concat-map "0.0.1" concat-map "0.0.1"
@ -431,9 +431,9 @@ buffer-from@^1.0.0:
version "1.1.2" version "1.1.2"
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
bytes@3.1.2: bytes@3.1.0:
version "3.1.2" version "3.1.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz"
cacheable-lookup@^5.0.3: cacheable-lookup@^5.0.3:
version "5.0.4" version "5.0.4"
@ -549,13 +549,13 @@ compose-middleware@^5.0.1:
concat-map@0.0.1: concat-map@0.0.1:
version "0.0.1" version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
content-disposition@0.5.4: content-disposition@0.5.3:
version "0.5.4" version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz"
dependencies: dependencies:
safe-buffer "5.2.1" safe-buffer "5.1.2"
content-type@~1.0.4: content-type@~1.0.4:
version "1.0.4" version "1.0.4"
@ -565,9 +565,9 @@ cookie-signature@1.0.6:
version "1.0.6" version "1.0.6"
resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
cookie@0.4.2: cookie@0.4.0:
version "0.4.2" version "0.4.0"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz"
core-util-is@~1.0.0: core-util-is@~1.0.0:
version "1.0.3" version "1.0.3"
@ -948,16 +948,16 @@ etag@~1.8.1:
version "1.8.1" version "1.8.1"
resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
express@^4.17.3: express@^4.17.1:
version "4.17.3" version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz"
dependencies: dependencies:
accepts "~1.3.8" accepts "~1.3.7"
array-flatten "1.1.1" array-flatten "1.1.1"
body-parser "1.19.2" body-parser "1.19.0"
content-disposition "0.5.4" content-disposition "0.5.3"
content-type "~1.0.4" content-type "~1.0.4"
cookie "0.4.2" cookie "0.4.0"
cookie-signature "1.0.6" cookie-signature "1.0.6"
debug "2.6.9" debug "2.6.9"
depd "~1.1.2" depd "~1.1.2"
@ -971,13 +971,13 @@ express@^4.17.3:
on-finished "~2.3.0" on-finished "~2.3.0"
parseurl "~1.3.3" parseurl "~1.3.3"
path-to-regexp "0.1.7" path-to-regexp "0.1.7"
proxy-addr "~2.0.7" proxy-addr "~2.0.5"
qs "6.9.7" qs "6.7.0"
range-parser "~1.2.1" range-parser "~1.2.1"
safe-buffer "5.2.1" safe-buffer "5.1.2"
send "0.17.2" send "0.17.1"
serve-static "1.14.2" serve-static "1.14.1"
setprototypeof "1.2.0" setprototypeof "1.1.1"
statuses "~1.5.0" statuses "~1.5.0"
type-is "~1.6.18" type-is "~1.6.18"
utils-merge "1.0.1" utils-merge "1.0.1"
@ -1193,18 +1193,18 @@ htmlparser2@^6.1.0:
entities "^2.0.0" entities "^2.0.0"
http-cache-semantics@^4.0.0: http-cache-semantics@^4.0.0:
version "4.1.1" version "4.1.0"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
http-errors@1.8.1: http-errors@1.7.2, http-errors@~1.7.2:
version "1.8.1" version "1.7.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz"
dependencies: dependencies:
depd "~1.1.2" depd "~1.1.2"
inherits "2.0.4" inherits "2.0.3"
setprototypeof "1.2.0" setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2" statuses ">= 1.5.0 < 2"
toidentifier "1.0.1" toidentifier "1.0.0"
http2-wrapper@^1.0.0-beta.5.2: http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3" version "1.0.3"
@ -1245,14 +1245,10 @@ inflight@^1.0.4:
once "^1.3.0" once "^1.3.0"
wrappy "1" wrappy "1"
inherits@2, inherits@~2.0.3: inherits@2, inherits@2.0.3, inherits@~2.0.3:
version "2.0.3" version "2.0.3"
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
inherits@2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
internal-slot@^1.0.3: internal-slot@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz"
@ -1393,8 +1389,8 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
json5@^1.0.1: json5@^1.0.1:
version "1.0.2" version "1.0.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
dependencies: dependencies:
minimist "^1.2.0" minimist "^1.2.0"
@ -1475,22 +1471,12 @@ mime-db@1.51.0:
version "1.51.0" version "1.51.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
mime-types@~2.1.24: mime-types@~2.1.24:
version "2.1.34" version "2.1.34"
resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz"
dependencies: dependencies:
mime-db "1.51.0" mime-db "1.51.0"
mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
dependencies:
mime-db "1.52.0"
mime@1.6.0: mime@1.6.0:
version "1.6.0" version "1.6.0"
resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
@ -1504,14 +1490,14 @@ mimic-response@^3.1.0:
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"
minimatch@^3.0.4: minimatch@^3.0.4:
version "3.1.2" version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimist@^1.2.0, minimist@^1.2.5: minimist@^1.2.0, minimist@^1.2.5:
version "1.2.7" version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
mkdirp@^1.0.4: mkdirp@^1.0.4:
version "1.0.4" version "1.0.4"
@ -1533,9 +1519,9 @@ mongoose-legacy-pluralize@1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz" resolved "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz"
mongoose@^5.13.15: mongoose@^5.12.5:
version "5.13.15" version "5.13.13"
resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.13.15.tgz#ba2cd0f22c1a5dd9ae15aaf6b10f03c59a4202dd" resolved "https://registry.npmjs.org/mongoose/-/mongoose-5.13.13.tgz"
dependencies: dependencies:
"@types/bson" "1.x || 4.0.x" "@types/bson" "1.x || 4.0.x"
"@types/mongodb" "^3.5.27" "@types/mongodb" "^3.5.27"
@ -1570,21 +1556,21 @@ ms@2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
ms@2.1.1:
version "2.1.1"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz"
ms@2.1.2, ms@^2.1.1: ms@2.1.2, ms@^2.1.1:
version "2.1.2" version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
ms@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
natural-compare@^1.4.0: natural-compare@^1.4.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
negotiator@0.6.3: negotiator@0.6.2:
version "0.6.3" version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz"
normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0" version "3.0.0"
@ -1758,9 +1744,9 @@ progress@^2.0.0:
version "2.0.3" version "2.0.3"
resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
proxy-addr@~2.0.7: proxy-addr@~2.0.5:
version "2.0.7" version "2.0.7"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"
dependencies: dependencies:
forwarded "0.2.0" forwarded "0.2.0"
ipaddr.js "1.9.1" ipaddr.js "1.9.1"
@ -1780,9 +1766,9 @@ punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1" version "2.1.1"
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
qs@6.9.7: qs@6.7.0:
version "6.9.7" version "6.7.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" resolved "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz"
queue-microtask@^1.2.2: queue-microtask@^1.2.2:
version "1.2.3" version "1.2.3"
@ -1796,12 +1782,12 @@ range-parser@~1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
raw-body@2.4.3: raw-body@2.4.0:
version "2.4.3" version "2.4.0"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz"
dependencies: dependencies:
bytes "3.1.2" bytes "3.1.0"
http-errors "1.8.1" http-errors "1.7.2"
iconv-lite "0.4.24" iconv-lite "0.4.24"
unpipe "1.0.0" unpipe "1.0.0"
@ -1912,11 +1898,11 @@ run-parallel@^1.1.9:
dependencies: dependencies:
queue-microtask "^1.2.2" queue-microtask "^1.2.2"
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: safe-buffer@5.1.2, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2" version "5.1.2"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
safe-buffer@5.2.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2: safe-buffer@5.2.1:
version "5.2.1" version "5.2.1"
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
@ -1940,9 +1926,9 @@ semver@^7.2.1, semver@^7.3.5:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
send@0.17.2: send@0.17.1:
version "0.17.2" version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz"
dependencies: dependencies:
debug "2.6.9" debug "2.6.9"
depd "~1.1.2" depd "~1.1.2"
@ -1951,25 +1937,25 @@ send@0.17.2:
escape-html "~1.0.3" escape-html "~1.0.3"
etag "~1.8.1" etag "~1.8.1"
fresh "0.5.2" fresh "0.5.2"
http-errors "1.8.1" http-errors "~1.7.2"
mime "1.6.0" mime "1.6.0"
ms "2.1.3" ms "2.1.1"
on-finished "~2.3.0" on-finished "~2.3.0"
range-parser "~1.2.1" range-parser "~1.2.1"
statuses "~1.5.0" statuses "~1.5.0"
serve-static@1.14.2: serve-static@1.14.1:
version "1.14.2" version "1.14.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz"
dependencies: dependencies:
encodeurl "~1.0.2" encodeurl "~1.0.2"
escape-html "~1.0.3" escape-html "~1.0.3"
parseurl "~1.3.3" parseurl "~1.3.3"
send "0.17.2" send "0.17.1"
setprototypeof@1.2.0: setprototypeof@1.1.1:
version "1.2.0" version "1.1.1"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz"
shebang-command@^2.0.0: shebang-command@^2.0.0:
version "2.0.0" version "2.0.0"
@ -2112,9 +2098,9 @@ to-regex-range@^5.0.1:
dependencies: dependencies:
is-number "^7.0.0" is-number "^7.0.0"
toidentifier@1.0.1: toidentifier@1.0.0:
version "1.0.1" version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz"
tough-cookie@^4.0.0: tough-cookie@^4.0.0:
version "4.0.0" version "4.0.0"
@ -2196,7 +2182,7 @@ type-fest@^0.20.2:
version "0.20.2" version "0.20.2"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
type-is@~1.6.18: type-is@~1.6.17, type-is@~1.6.18:
version "1.6.18" version "1.6.18"
resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
dependencies: dependencies:

Loading…
Cancel
Save