refactoring and modularize some functions, added prettier rules, change package manager to YARN

pull/1/head
carlos-burelo 4 years ago
parent fc71f89422
commit d7755d7f32

@ -0,0 +1,7 @@
{
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"printWidth": 100
}

@ -2,5 +2,5 @@
"watch": ["src"], "watch": ["src"],
"ext": "ts", "ext": "ts",
"ignore": ["src/**/.spect.ts"], "ignore": ["src/**/.spect.ts"],
"exec": "npx ts-node" "exec": "ts-node src/index.ts"
} }

3958
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,12 +1,12 @@
{ {
"name": "monoschinos-api-ts", "name": "monoschinos-api-ts",
"version": "1.0.0", "version": "1.2.0",
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "echo \"Error: no test specified\" && exit 1", "start": "node dist/index.js",
"build": "tsc ", "build": "tsc ",
"dev": "nodemon src/index.ts" "dev": "nodemon"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",

@ -1,16 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://carlos-burelo.github.io/src/css/main.css">
<title>Document</title>
</head>
<body>
<h1>Hello from my server</h1>
</body>
</html>

@ -1,14 +1,9 @@
import express from "express"; import express from 'express';
import cors from "cors"; import cors from 'cors';
import morgan from "morgan"; import morgan from 'morgan';
import routes from './routes/api.routes'; import routes from './routes/api.routes';
const app = express();
const app = express()
app.use(cors(), morgan('dev')); app.use(cors(), morgan('dev'));
// app.use('/', express.static('docs'));
app.use('/', express.static('public'));
app.use('/', routes); app.use('/', routes);
export default app; export default app;

@ -1,8 +1,8 @@
const appConfig = { const appConfig = {
host: process.env.HOST || 'localhost', host: process.env.HOST || 'localhost',
port: process.env.PORT || 8000 port: process.env.PORT || 5000,
} };
const page = "https://monoschinos2.com"; const page = 'https://monoschinos2.com';
const urls = { const urls = {
main: page, main: page,
@ -12,10 +12,7 @@ const urls = {
episode: page + '/ver', episode: page + '/ver',
gender: page + '/genero', gender: page + '/genero',
letter: page + '/letra', letter: page + '/letra',
ova: page +'/categoria/ova' ova: page + '/categoria/ova',
} };
export { export { urls, appConfig };
urls,
appConfig
}

@ -1,225 +1,114 @@
import cheerio from 'cheerio'; import cheerio from 'cheerio';
import axios from 'axios'; import axios from 'axios';
import { urls } from '../config'; import { urls } from '../config';
import { LastestAnimeI, AnimeI, SuggestionI, GenderI, AnimeSearchI, VideosI } from "../models/interfaces"; import { SuggestionI, GenderI, AnimeSearchI, EpI } from '../models/interfaces';
import { Request, Response } from 'express';
export async function getAnime(req: Request, res: Response) {
async function getLastest(req: any, res: any) { let noImage: string = 'https://monoschinos2.com/assets/img/no_image.png';
try { let defaulImage: string =
const bodyResponse = await axios.get(`${urls.main}`); 'https://image.freepik.com/free-vector/404-error-page-found_41910-364.jpg';
const $ = cheerio.load(bodyResponse.data);
const animes: any = [];
let getLastest = $('.container .caps .container')[0];
$(getLastest).find('.row article').each((i, e) => {
let el = $(e);
let title = el.find('.Title').html().split('\t')[0]
let cover = el.find('.Image img').attr('src');
let type = el.find('.Image figure span').text();
type = type.substring(1, type.length)
let episode: any = el.find('.dataEpi .episode').text();
episode = parseInt(episode.split('\n')[1])
let id: any = el.find('a').attr('href');
id = id.split('/')[4]
id = id.split('-')
id.splice(id.length - 2, 2);
id = `${id.join('-')}-episodio-${episode}`;
let anime: LastestAnimeI = {
id,
title,
cover,
episode,
type
}
animes.push(anime);
})
res.status(200)
.json(
animes
)
} catch (err) {
res.status(500)
.json({
message: err.message,
success: false
})
}
};
async function getEmision(req: any, res: any) {
try {
let { page } = req.query;
if (!page) { page = 1 }
const response = await axios.get(`${urls.emision}${page}`);
const $ = cheerio.load(response.data);
let animes: any = [];
$('.animes .container .row article').each((i, e) => {
let el = $(e);
let id = el.find('a').attr('href');
id = id.split('/')[4]
let title = el.find('.Title').text();
let img = el.find('.Image img').attr('src');
let category = el.find('.category').text();
category = category.substring(1, category.length)
let year = parseInt(el.find('.fecha').text());
const anime = {
id,
title,
img,
category,
year
}
animes.push(anime);
})
let totalPages: any = $('.pagination').children().length;
totalPages = $('.pagination').find('.page-item')[totalPages - 2];
let pages = parseInt($(totalPages).text());
res.status(200),
res.json(
animes
);
} catch (err) {
res.json({
message: err.message,
success: false
})
}
};
async function getAnime(req: any, res: any) {
try { try {
let { id } = req.params; let { id } = req.params;
const response = await axios.get(`${urls.anime}/${id}`); const response = await axios.get(`${urls.anime}/${id}`);
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
let anime: AnimeI = {}; let i = $('.TPost.Serie.Single');
let genders = [] let banner: string = i.find('.Banner img').attr('src');
let episodes = [] if (banner == noImage) {
let sugestions = [] banner = defaulImage;
// Episodes } else {
$('.SerieCaps').each((i, e) => { banner = banner;
}
let title = i
.find('h1.Title')
.text()
.replace(/Sub Español/gi, '')
.trim();
let sinopsis = i.find('.row .col-sm-9 .Description p').text();
let status = i.find('.row .col-sm-9 .Type').text().trim();
let date = i
.find('.row .col-sm-9 .after-title:nth-child(n)')
.text()
.match(/\d{4}-\d{2}-\d{2}/)[0];
let type = i
.find('.row .col-sm-9 .after-title:nth-child(n)')
.text()
.match(/\|\s\w+/gi)[0]
.replace(/\|?\s?/, '');
let cover = i.find('.Image img').attr('src');
let genders: GenderI[] = [];
i.find('.generos a').each((i, e) => {
let el = $(e); let el = $(e);
let totalEpisodes = el.children().length; let title = el.text();
let id = el.attr('href').split('/')[4];
$('.container .SerieCaps .item').each((i, e) => { genders.push({ title, id });
});
let episodes: EpI[] = [];
i.find('.container .SerieCaps .item').each((i, e) => {
let el = $(e); let el = $(e);
let episodeId = el.attr('href'); let episodeId = el.attr('href');
episodeId = episodeId.split('/')[4] episodeId = episodeId.split('/')[4];
let episode = { episodes.push({
number: totalEpisodes, number: parseInt(episodeId.split('-').pop()),
id: episodeId id: episodeId,
}
episodes.push(episode)
episodes[i] = episode;
anime.episodes = episodes
totalEpisodes--
}); });
}); });
// Genders if (!episodes || episodes.length == 0) {
$('.generos a').each((i, e) => { episodes = [];
let el = $(e);
let title = el.text();
let id = el.attr('href').split('/')[4]
let gender: GenderI = {
title,
id
} }
genders.push(gender) let sugestions: SuggestionI[] = [];
}) i.find('.container .row .col-12 .recom article').each((i, e) => {
// Suggestions
$('.container .row .col-12 .recom article').each((i, e) => {
let el = $(e); let el = $(e);
let id = el.find('a').attr('href'); let id = el.find('a').attr('href');
id = id.split('/')[4] id = id.split('/')[4];
let title = el.find('a .Title').text().replace(/ Sub Español/gi, '') let title = el
.find('a .Title')
.text()
.replace(/ Sub Español/gi, '');
let cover = el.find('a .Image img').attr('src'); let cover = el.find('a .Image img').attr('src');
let year = parseInt(el.find('.fecha').text()); let year = parseInt(el.find('.fecha').text());
sugestions.push({
let sugestionAnime: SuggestionI = {
id, id,
title, title,
cover, cover,
year year,
}
sugestions.push(sugestionAnime);
}); });
// Information });
$('.TPost.Serie.Single').each((i, e) => { res.json({
let el = $(e);
let banner = el.find('.Banner img').attr('src');
if (banner == 'https://monoschinos2.com/assets/img/no_image.png') {
banner = 'https://image.freepik.com/free-vector/404-error-page-found_41910-364.jpg'
}
let title = el.find('h1.Title').text().replace(/ Sub Español/gi, '')
let sinopsis = el.find(' .row .col-sm-9 .Description p').text();
let status = el.find(' .row .col-sm-9 .Type').text().trim();
let date1 = el.find(' .row .col-sm-9 .after-title:nth-child(n)').text();
let date = date1.replace(/ /gi, "").replace(/\n/gi, "").replace(/Finalizado/gi, '').replace(/Estreno/gi, '').slice(0, 10)
let type1 = date1.replace(/ /gi, "").replace(/\n/gi, "").replace(/Finalizado/gi, '').replace(/Estreno/gi, '').replace(`${date}`, '')
let type = type1.slice(1, type1.length)
let cover = el.find('.Image img').attr('src');
anime = {
id,
type,
title, title,
banner, banner,
cover,
sinopsis, sinopsis,
status, status,
date, date,
cover, type,
genders, genders,
episodes,
sugestions, sugestions,
episodes
}
}); });
if (!anime.episodes) {
anime.episodes = []
};
res.json(
anime
);
} catch (err) { } catch (err) {
res.json({ res.json({
message: err.message, message: err.message,
success: false success: false,
}); });
}; }
}; }
async function getAnimes(req, res) { export async function getAnimes(req: Request, res: Response) {
try { try {
let { page } = req.params; let { page } = req.params;
!page ? page = 1 : page = page !page ? (page = '1') : (page = page);
const bodyResponse = await axios.get(`${urls.main}/animes?page=${page}`); const bodyResponse = await axios.get(`${urls.main}/animes?page=${page}`);
const $ = cheerio.load(bodyResponse.data); const $ = cheerio.load(bodyResponse.data);
const animes = []; const animes = [];
$('.animes .container .row article').each((i, e) => { $('.animes .container .row article').each((i, e) => {
let el = $(e); let el = $(e);
let id = el.find('a').attr('href'); let id = el.find('a').attr('href');
id = id.split('/')[4] id = id.split('/')[4];
let title = el.find('.Title').text(); let title = el.find('.Title').text();
let img = el.find('.Image img').attr('src'); let img = el.find('.Image img').attr('src');
let category = el.find('.category').text(); let category = el.find('.category').text();
category = category.substring(1, category.length) category = category.substring(1, category.length);
let year = parseInt(el.find('.fecha').text()); let year = parseInt(el.find('.fecha').text());
const anime = { const anime = {
@ -227,32 +116,29 @@ async function getAnimes(req, res) {
title, title,
img, img,
category, category,
year year,
} };
animes.push(anime); animes.push(anime);
}) });
let totalPages: any = $('.pagination').children().length; let totalPages: any = $('.pagination').children().length;
totalPages = $('.pagination').find('.page-item')[totalPages - 2]; totalPages = $('.pagination').find('.page-item')[totalPages - 2];
let pages = parseInt($(totalPages).text()); let pages = parseInt($(totalPages).text());
let current = parseInt(page) let current = parseInt(page);
res.status(200) res.status(200).json({
.json({
current, current,
pages, pages,
animes animes,
}) });
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
}; }
async function searchAnime(req: any, res: any) { export async function searchAnime(req: Request, res: Response) {
try { try {
let { id } = req.params; let { id } = req.params;
const response = await axios.get(`${urls.search}${id}`); const response = await axios.get(`${urls.search}${id}`);
@ -260,12 +146,12 @@ async function searchAnime(req: any, res: any) {
let animes = []; let animes = [];
$('.animes .row article').each((i, e) => { $('.animes .row article').each((i, e) => {
let el = $(e); let el = $(e);
let title = el.find('h3.Title').text() let title = el.find('h3.Title').text();
let cover = el.find('div.Image .cover .img-fluid').attr('src') let cover = el.find('div.Image .cover .img-fluid').attr('src');
let id1 = el.find('a.link-anime').attr('href'); let id1 = el.find('a.link-anime').attr('href');
let id = id1.split('/')[4]; let id = id1.split('/')[4];
let category = el.find('.category').text(); let category = el.find('.category').text();
category = category.substring(1, category.length) category = category.substring(1, category.length);
let year = parseInt(el.find('.fecha').text()); let year = parseInt(el.find('.fecha').text());
let anime: AnimeSearchI = { let anime: AnimeSearchI = {
@ -273,64 +159,63 @@ async function searchAnime(req: any, res: any) {
title, title,
cover, cover,
category, category,
year year,
} };
animes.push(anime); animes.push(anime);
}) });
res.json(
animes,
)
res.json(animes);
} catch (err) { } catch (err) {
res.json({ res.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
}; }
async function getEpisode(req: any, res: any) { export async function getEpisode(req: Request, res: Response) {
try { try {
let { id } = req.params; let { id } = req.params;
const response = await axios.get(`${urls.episode}/${id}`); const response = await axios.get(`${urls.episode}/${id}`);
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
let epnum = $('.Episode .Title-epi').text(); let epnum = $('.Episode .Title-epi').text();
let title = $('.Episode .Title-epi').text().replace('Sub Español', '') let title = $('.Episode .Title-epi').text().replace('Sub Español', '').trim();
let animeId = id.split('-');
if (animeId.includes('episodio')) {
animeId = animeId.splice(0, animeId.length - 2).join('-');
} else {
animeId = animeId.splice(0, animeId.length - 1)
}
animeId = `${animeId}-sub-espanol`;
let number: any = epnum.split(' '); let number: any = epnum.split(' ');
number = parseInt(number[number.length - 3]); number = parseInt(number[number.length - 3]);
let ctrls = {
prev: false,
next: false,
};
$('.d-flex.justify-content-center.mb-4').map((i, e) => {
let el = $(e);
if (el.text().includes('Anterior')) {
ctrls.prev = true;
}
if (el.text().includes('Siguiente')) {
ctrls.next = true;
}
});
let animeId = $('a.btnWeb.green.Current')
.attr('href')
.replace('https://monoschinos2.com/anime/', '');
let videos = []; let videos = [];
let videosContainer = $('.Episode .content .row .TPlayer').text(); let videosContainer = $('.Episode .content .row .TPlayer').text();
$(videosContainer).each((i, e) => { $(videosContainer).each((i, e) => {
let el = $(e); let el = $(e);
let url = el.attr('src'); let url = el.attr('src');
if (url) { if (url) {
url = url.split('url=')[1] url = url.split('url=')[1];
url = decodeURIComponent(url) url = decodeURIComponent(url);
url = url.split('&id')[0] url = url.split('&id')[0];
let videolinks = new URL(url) let videolinks = new URL(url);
let { host } = videolinks; let { host } = videolinks;
let name = host let name = host.replace(/\.com|www\.|\.ru|repro\.|\.co|\.nz/, '');
.replace('.com', '') name = `${name.slice(0, 1).toUpperCase()}${name.slice(1)}`;
.replace('www.', '')
.replace('.ru', '')
.replace('repro.', '')
.replace('.co', '')
.replace('.nz', '')
name = `${name.slice(0, 1).toUpperCase()}${name.slice(1)}`
let servers = { let servers = {
url, url,
name name,
}
videos.push(servers);
}; };
videos.push(servers);
}
}); });
let downloads = []; let downloads = [];
let downloadsContainer = $('#downloads table tbody tr'); let downloadsContainer = $('#downloads table tbody tr');
@ -338,115 +223,103 @@ async function getEpisode(req: any, res: any) {
$(downloadsContainer).each((i, e) => { $(downloadsContainer).each((i, e) => {
let el = $(e); let el = $(e);
let link = el.find('a').attr('href') let link = el.find('a').attr('href');
let sn = link.replace('.com', '') let sn = link.replace(/\.com|www\.|\.ru|repro\.|\.co|\.nz/, '');
.replace('www.', '') let servername = sn.slice(8);
.replace('.ru', '') let svn = servername.indexOf('/');
.replace('repro.', '') let server = servername.slice(0, svn);
.replace('.co', '') server = `${server.slice(0, 1).toUpperCase()}${server.slice(1)}`;
.replace('.nz', '')
let servername = sn.slice(8)
let svn = servername.indexOf("/")
let server = servername.slice(0, svn)
server = `${server.slice(0, 1).toUpperCase()}${server.slice(1)}`
let down = { let down = {
server, server,
link link,
} };
if (down) { if (down) {
downloads.push(down) downloads.push(down);
} }
});
})
res.json({ res.json({
title, title,
animeId, animeId,
ctrls,
number, number,
videos, videos,
downloads, downloads,
}) });
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
}; }
async function getCategories(req, res) { export async function getCategories(req: Request, res: Response) {
try { try {
const response = await axios.get(`${urls.main}/animes`); const response = await axios.get(`${urls.main}/animes`);
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
let categories = [] let categories = [];
let categoriesContainer = $('.filter-container .clearfix .float-left')[0]; let categoriesContainer = $('.filter-container .clearfix .float-left')[0];
$(categoriesContainer).find('.dropdown-menu .dropdown-item') $(categoriesContainer)
.find('.dropdown-menu .dropdown-item')
.each((i, e) => { .each((i, e) => {
let el = $(e) let el = $(e);
let title = el.text(); let title = el.text();
let id = el.attr('href'); let id = el.attr('href');
id = id.split('/')[2]; id = id.split('/')[2];
let category = { let category = {
title, title,
id id,
} };
categories.push(category) categories.push(category);
}) });
res.status(200) res.status(200).json(categories);
.json(
categories,
)
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
}; }
async function getGenders(req, res) { export async function getGenders(req: Request, res: Response) {
try { try {
const response = await axios.get(`${urls.main}/animes`); const response = await axios.get(`${urls.main}/animes`);
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
let genders = [] let genders = [];
let gendersContainer = $('.filter-container .clearfix .float-left')[1]; let gendersContainer = $('.filter-container .clearfix .float-left')[1];
$(gendersContainer).find('.dropdown-menu .dropdown-item').each((i, e) => { $(gendersContainer)
let el = $(e) .find('.dropdown-menu .dropdown-item')
.each((i, e) => {
let el = $(e);
let title = el.text(); let title = el.text();
if (title.charAt(0) == ' ') { if (title.charAt(0) == ' ') {
title = title.substring(1, title.length) title = title.substring(1, title.length);
} }
let id = el.attr('href'); let id = el.attr('href');
id = id.split('/')[2]; id = id.split('/')[2];
let gender: GenderI = { let gender: GenderI = {
title, title,
id id,
} };
genders.push(gender) genders.push(gender);
}) });
res.json( res.json(genders);
genders,
)
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err, message: err,
success: false success: false,
}) });
} }
}; }
async function getGender(req:any, res:any) { export async function getGender(req: any, res: any) {
try { try {
let { gender } = req.params; let { gender } = req.params;
let { page } = req.params; let { page } = req.params;
!page ? page = 1 : page = page !page ? (page = 1) : (page = page);
const bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`); const bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`);
const $ = cheerio.load(bodyResponse.data); const $ = cheerio.load(bodyResponse.data);
const animes = []; const animes = [];
@ -455,11 +328,11 @@ async function getGender(req:any, res:any) {
let el = $(e); let el = $(e);
let id = el.find('a').attr('href'); let id = el.find('a').attr('href');
id = id.split('/')[4] id = id.split('/')[4];
let title = el.find('.Title').text(); let title = el.find('.Title').text();
let img = el.find('.Image img').attr('src'); let img = el.find('.Image img').attr('src');
let category = el.find('.category').text(); let category = el.find('.category').text();
category = category.substring(1, category.length) category = category.substring(1, category.length);
let year = parseInt(el.find('.fecha').text()); let year = parseInt(el.find('.fecha').text());
const anime = { const anime = {
@ -467,74 +340,68 @@ async function getGender(req:any, res:any) {
title, title,
img, img,
category, category,
year year,
} };
animes.push(anime); animes.push(anime);
}) });
let totalPages: any = $('.pagination').children().length; let totalPages: any = $('.pagination').children().length;
totalPages = $('.pagination').find('.page-item')[totalPages - 2]; totalPages = $('.pagination').find('.page-item')[totalPages - 2];
let pages = parseInt($(totalPages).text()); let pages = parseInt($(totalPages).text());
let current = parseInt(page) let current = parseInt(page);
res.status(200) res.status(200).json({
.json({
current, current,
pages, pages,
animes animes,
}) });
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
} }
async function getYears(req, res) { export async function getYears(req: Request, res: Response) {
try { try {
const response = await axios.get(`${urls.main}/animes`); const response = await axios.get(`${urls.main}/animes`);
const $ = cheerio.load(response.data); const $ = cheerio.load(response.data);
let years = [] let years = [];
let YearsContainer = $('.filter-container .clearfix .float-left')[2]; let YearsContainer = $('.filter-container .clearfix .float-left')[2];
$(YearsContainer).find('.dropdown-menu .dropdown-item').each((i, e) => { $(YearsContainer)
let el = $(e) .find('.dropdown-menu .dropdown-item')
.each((i, e) => {
let el = $(e);
let title = el.text(); let title = el.text();
if (title.charAt(0) == ' ') { if (title.charAt(0) == ' ') {
title = title.substring(1, title.length) title = title.substring(1, title.length);
} }
let id = el.attr('href'); let id = el.attr('href');
id = id.split('/')[2]; id = id.split('/')[2];
let year: GenderI = { let year: GenderI = {
title, title,
id id,
} };
years.push(year) years.push(year);
}) });
res.json( res.json(years);
years,
)
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err, message: err,
success: false success: false,
}) });
} }
}; }
async function getYear(req: any, res: any) { export async function getYear(req: Request, res: Response) {
try { try {
let { year } = req.params; let { year } = req.params;
let { page } = req.params; let { page } = req.params;
!page ? page = 1 : page = page !page ? (page = '1') : (page = page);
const bodyResponse = await axios.get(`${urls.main}/year/${year}?page=${page}`); const bodyResponse = await axios.get(`${urls.main}/year/${year}?page=${page}`);
const $ = cheerio.load(bodyResponse.data); const $ = cheerio.load(bodyResponse.data);
const animes = []; const animes = [];
@ -543,11 +410,11 @@ async function getYear(req: any, res: any) {
let el = $(e); let el = $(e);
let id = el.find('a').attr('href'); let id = el.find('a').attr('href');
id = id.split('/')[4] id = id.split('/')[4];
let title = el.find('.Title').text(); let title = el.find('.Title').text();
let img = el.find('.Image img').attr('src'); let img = el.find('.Image img').attr('src');
let category = el.find('.category').text(); let category = el.find('.category').text();
category = category.substring(1, category.length) category = category.substring(1, category.length);
let year = parseInt(el.find('.fecha').text()); let year = parseInt(el.find('.fecha').text());
const anime = { const anime = {
@ -555,85 +422,73 @@ async function getYear(req: any, res: any) {
title, title,
img, img,
category, category,
year year,
} };
animes.push(anime); animes.push(anime);
}) });
let totalPages: any = $('.pagination').children().length; let totalPages: any = $('.pagination').children().length;
totalPages = $('.pagination').find('.page-item')[totalPages - 2]; totalPages = $('.pagination').find('.page-item')[totalPages - 2];
let pages = parseInt($(totalPages).text()); let pages = parseInt($(totalPages).text());
let current = parseInt(page) let current = parseInt(page);
res.status(200) res.status(200).json({
.json({
current, current,
pages, pages,
animes animes,
}) });
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
}
}; export async function getLetters(req: Request, res: Response) {
async function getLetters(req, res) {
try { try {
const bodyResponse = await axios.get(`${urls.main}/animes`); const bodyResponse = await axios.get(`${urls.main}/animes`);
const $ = cheerio.load(bodyResponse.data); const $ = cheerio.load(bodyResponse.data);
const letters = [] const letters = [];
let lettersContainer = $('.filter-container .clearfix .float-left')[3]; let lettersContainer = $('.filter-container .clearfix .float-left')[3];
$(lettersContainer).find('.dropdown-menu .dropdown-item') $(lettersContainer)
.find('.dropdown-menu .dropdown-item')
.each((i, e) => { .each((i, e) => {
let el = $(e) let el = $(e);
let title = el.text(); let title = el.text();
let id = el.attr('href'); let id = el.attr('href');
id = id.split('/')[2]; id = id.split('/')[2];
let letter = { let letter = {
title, title,
id id,
} };
letters.push(letter) letters.push(letter);
}) });
res.status(200)
.json(
letters,
)
res.status(200).json(letters);
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
} }
}; }
async function getBy(req, res, multiple?) { export async function getBy(req: Request, res: Response, multiple?) {
try { try {
let { let { gender, letter, category } = req.params;
gender,
letter,
category
} = req.params;
let { let { page } = req.query;
page
} = req.query;
if (!page) { if (!page) {
page = 1 page = '1';
} }
let bodyResponse; let bodyResponse;
if (multiple) { if (multiple) {
bodyResponse = await axios.get(`${urls.main}/categoria/${category}/genero/${gender}?page=${page}`); bodyResponse = await axios.get(
`${urls.main}/categoria/${category}/genero/${gender}?page=${page}`
);
} else if (gender && !multiple) { } else if (gender && !multiple) {
bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`); bodyResponse = await axios.get(`${urls.main}/genero/${gender}?page=${page}`);
} else if (letter && !multiple) { } else if (letter && !multiple) {
@ -659,45 +514,40 @@ async function getBy(req, res, multiple?) {
img, img,
title, title,
type, type,
year year,
} };
animes.push(anime); animes.push(anime);
});
})
let totalPages: any = $('.pagination').children().length; let totalPages: any = $('.pagination').children().length;
totalPages = $('.pagination').find('.page-item')[totalPages - 2]; totalPages = $('.pagination').find('.page-item')[totalPages - 2];
let pages = parseInt($(totalPages).text()); let pages = parseInt($(totalPages).text());
res.status(200) res.status(200).json({
.json({
animes, animes,
pages, pages,
success: true success: true,
}) });
} catch (err) { } catch (err) {
res.status(500) res.status(500).json({
.json({
message: err.message, message: err.message,
success: false success: false,
}) });
}
}
export {
getLastest,
getEmision,
getAnime,
getAnimes,
searchAnime,
getEpisode,
getCategories,
getGenders,
getGender,
getYears,
getYear,
getLetters,
getBy
} }
}
// export {
// getAnime,
// getAnimes,
// searchAnime,
// getEpisode,
// getCategories,
// getGenders,
// getGender,
// getYears,
// getYear,
// getLetters,
// getBy
// };

@ -0,0 +1,34 @@
import axios from 'axios';
import cheerio from 'cheerio';
import { Request, Response } from 'express';
import { urls } from '../config';
export async function getEmision(req: Request, res: Response) {
try {
let { page = '1' } = req.query;
const { data } = await axios.get(`${urls.emision}${page}`);
const $ = cheerio.load(data);
const animes = $('.animes .container .row article')
.map((i, e) => {
let el: cheerio.Cheerio = $(e);
let category: string = el.find('.category').text();
return {
id: el.find('a').attr('href').split('/')[4],
title: el.find('.Title').text(),
img: el.find('.Image img').attr('src'),
category: el.find('.category').text().substring(1, category.length),
year: parseInt(el.find('.fecha').text()),
};
})
.toArray();
let pagesBase: string = $('.pagination').text().match(/\d/g).pop();
let pages = parseInt(pagesBase);
res.json({ animes, pages }).status(200);
} catch (err) {
res.json({
message: err.message,
success: false,
});
}
}
// 46 lines before refactoring

@ -0,0 +1,32 @@
import cheerio from 'cheerio';
import axios from 'axios';
import { urls } from '../config';
import { Response, Request } from 'express';
export async function getLastest(req: Request, res: Response) {
try {
const { data } = await axios.get(urls.main);
const $ = cheerio.load(data);
let getLastest = $('.container .caps .container')[0];
const animes: cheerio.Element[] = $(getLastest)
.find('.row article')
.map((i, e) => {
let el: cheerio.Cheerio = $(e);
let type: string = el.find('.Image figure span').text();
return {
id: el
.find('a')
.attr('href')
.replace(/https:\/\/monoschinos2\.com\/ver\//, ''),
title: el.find('.Title').html().split('\t')[0],
cover: el.find('.Image img').attr('src'),
type: type.substring(1, type.length),
episode: parseInt(el.find('.dataEpi .episode').text().split('\n')[1]),
};
})
.toArray();
return res.json(animes).status(200);
} catch (error) {
return res.json({ error: error.message }).status(500);
}
}

@ -0,0 +1,2 @@
export * from './getLastest';
export * from './getEmision';

@ -2,8 +2,9 @@ import app from './app';
import { appConfig } from './config' import { appConfig } from './config'
function init(host:any, port:any) { function init(host:any, port:any) {
app.listen(port, () => { app.listen(port, host, ( ) => {
console.info(`API Running on: ${host}:${port}`); console.clear()
console.info(`API Running on: ${host}:${port} ============================`);
}) })
} }

@ -4,13 +4,15 @@ export interface EmisionResponse{
} }
export interface EmisionI{ export interface EmisionI{
id?:string; id: string;
title: string; title: string;
cover:string; img: string;
category: string; category: string;
year:string; year: number;
} }
// const anime: {
// }
export interface LastestAnimeI { export interface LastestAnimeI {
title: string title: string
cover: string cover: string
@ -19,33 +21,33 @@ export interface LastestAnimeI {
type: string type: string
} }
export interface AnimeI{ export interface AnimeI{
id?: string; id: string;
title?: string; title: string;
banner?: string; banner: string;
type?: string; type: string;
cover?: string; cover: string;
sinopsis?: string; sinopsis: string;
status?: string; status: string;
date?: string; date: string;
genders?: Array<GenderI>; genders: GenderI[];
sugestions?: Array<SuggestionI>; sugestions: SuggestionI[];
episodes?: Array<EpI>; episodes: EpI[];
} }
export interface GenderI{ export interface GenderI{
id?:string; id:string;
title:string; title:string;
} }
export interface SuggestionI{ export interface SuggestionI{
id?:string; id:string;
title?:string; title:string;
cover?:string; cover:string;
year?:number; year:number;
} }
export interface EpI{ export interface EpI{
id?:string; id:string;
number?:string; number:number;
} }
export interface AnimeSearchI { export interface AnimeSearchI {

@ -1,8 +1,6 @@
import { Router } from 'express'; import { Router } from 'express';
const routes = Router(); const routes = Router();
import { import {
getEmision,
getLastest,
getAnime, getAnime,
getAnimes, getAnimes,
searchAnime, searchAnime,
@ -13,9 +11,10 @@ import {
getYears, getYears,
getYear, getYear,
getLetters, getLetters,
getBy getBy,
} from '../controllers/controller' } from '../controllers/controller';
import { getEmision, getLastest } from '../controllers';
routes.get('/lastest', (req, res) => { routes.get('/lastest', (req, res) => {
getLastest(req, res); getLastest(req, res);
@ -54,17 +53,17 @@ routes.get('/letters', (req, res) => {
getLetters(req, res); getLetters(req, res);
}); });
routes.get('/category/:category/gender/:gender', (req, res) => { routes.get('/category/:category/gender/:gender', (req, res) => {
getBy(req, res, true) getBy(req, res, true);
}) });
routes.get('/gender/:gender', (req, res) => { routes.get('/gender/:gender', (req, res) => {
getBy(req, res); getBy(req, res);
}) });
routes.get('/letter/:letter', (req, res) => { routes.get('/letter/:letter', (req, res) => {
getBy(req, res); getBy(req, res);
}) });
routes.get('/category/:category', (req, res) => { routes.get('/category/:category', (req, res) => {
getBy(req, res); getBy(req, res);
}) });
export default routes export default routes;

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save