diff --git a/src/controllers/all.js b/src/controllers/all.js deleted file mode 100644 index 3c5e232..0000000 --- a/src/controllers/all.js +++ /dev/null @@ -1,23 +0,0 @@ -import { parse } from 'node-html-parser'; -import { attr, api, get } from '../config.js'; - -export async function getAnimes(req, res) { - try { - let { page = '1' } = req.params; - const { data } = await get(`${api.all(page)}`); - const html = parse(data); - res.status(200).json( - html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map((i) => { - return { - id: attr(i, 'a', 'href').split('/').pop() || null, - title: i.querySelector('.seristitles').text.trim() || null, - image: attr(i, '.animemainimg', 'src') || null, - }; - }) - ); - } catch (err) { - res.status(500).json({ - message: err.message, - }); - } -} diff --git a/src/controllers/all.ts b/src/controllers/all.ts index e69de29..db04312 100644 --- a/src/controllers/all.ts +++ b/src/controllers/all.ts @@ -0,0 +1,21 @@ +import { Controller } from '../types' +import { get, parse, attr, api } from '../api' + +export const getAll: Controller = async (req, res) => { + try { + const { page = '1' } = req.query + const { data } = await get(api.all(page)) + const html = parse(data) + res.status(200).json( + html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map(i => { + return { + id: attr(i, 'a', 'href').split('/').pop() || null, + title: i.querySelector('.seristitles')?.text.trim() || null, + image: attr(i, '.animemainimg', 'src') || null, + } + }) + ) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/anime.js b/src/controllers/anime.js deleted file mode 100644 index 0ea47f1..0000000 --- a/src/controllers/anime.js +++ /dev/null @@ -1,41 +0,0 @@ -import { attr, api, get } from '../config.js'; -import { parse } from 'node-html-parser'; - -export async function getAnime(req, res) { - try { - const url = 'https://monoschinos2.com/'; - const { id } = req.params; - const { data } = await get(api.anime(id)); - const html = parse(data); - const date = html.querySelectorAll('.breadcrumb')[1].querySelector('.breadcrumb-item').text; - res.status(200).json({ - banner: attr(html, '.herobg img', 'src'), - image: attr(html, '.chapterpic img', 'src'), - title: - html - .querySelector('.chapterdetails h1') - .text.replace(/Sub Español/gi, '') - .trim() || null, - titleAlt: html.querySelector('.alterno').text || null, - sinopsis: html.querySelector('.textComplete').text.replace('Ver menos', '') || null, - status: html.querySelector('#btninfo').text.trim() || null, - rating: html.querySelector('.chapterpic p').text || null, - genders: html.querySelectorAll('.breadcrumb .breadcrumb-item a').map((g) => g.text) || null, - date: date || null, - episodes: - html.querySelectorAll('.row.jpage.row-cols-md-6 .col-item a').map((cap) => { - const epId = cap.attributes['href'].replace(`${url}ver/`, ''); - return { - image: attr(cap, '.animeimghv', 'data-src'), - no: parseInt(epId.split('-').pop()), - id: epId, - }; - }) || null, - }); - } catch (error) { - res.status(500).json({ - id: 'intertal-server-error', - message: error.message, - }); - } -} diff --git a/src/controllers/anime.ts b/src/controllers/anime.ts new file mode 100644 index 0000000..4e599fd --- /dev/null +++ b/src/controllers/anime.ts @@ -0,0 +1,39 @@ +import { attr, api, get, parse } from '../api' + +import { Controller } from '../types.js' + +export const getAnime: Controller = async (req, res) => { + try { + const url = 'https://monoschinos2.com/' + const { id } = req.params + const { data } = await get(api.anime(id)) + const html = parse(data) + const date = html.querySelectorAll('.breadcrumb')[1].querySelector('.breadcrumb-item')?.text + res.status(200).json({ + banner: attr(html, '.herobg img', 'src'), + image: attr(html, '.chapterpic img', 'src'), + title: + html + .querySelector('.chapterdetails h1') + ?.text.replace(/Sub Español/gi, '') + .trim() || null, + titleAlt: html.querySelector('.alterno')?.text || null, + sinopsis: html.querySelector('.textComplete')?.text.replace('Ver menos', '') || null, + status: html.querySelector('#btninfo')?.text.trim() || null, + rating: html.querySelector('.chapterpic p')?.text || null, + genders: html.querySelectorAll('.breadcrumb .breadcrumb-item a').map(g => g.text) || null, + date: date || null, + episodes: + html.querySelectorAll('.row.jpage.row-cols-md-6 .col-item a').map(cap => { + const epId = cap.attributes['href'].replace(`${url}ver/`, '') + return { + image: attr(cap, '.animeimghv', 'data-src'), + no: parseInt(epId.split('-').pop() as string), + id: epId, + } + }) || null, + }) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/calendar.js b/src/controllers/calendar.js deleted file mode 100644 index a6fa2a7..0000000 --- a/src/controllers/calendar.js +++ /dev/null @@ -1,26 +0,0 @@ -import { parse } from 'node-html-parser'; -import { attr, api, get } from '../config.js'; - -export async function getCalendar(req, res) { - try { - const { data } = await get(api.calendar); - const html = parse(data); - res.status(200).json( - html.querySelectorAll('.heromain [data-dia]').map((i) => { - const day = i.getAttribute('data-dia'); - return { - day, - animes: i.querySelectorAll('.col-md-6.col-lg-4.col-sm-12.for768').map((i) => { - return { - id: attr(i, 'a', 'href').split('/').pop() || null, - title: i.querySelector('.serisdtls a h3').text.trim() || null, - image: attr(i, '.seriesimg a img') || null, - }; - }), - }; - }) - ); - } catch (error) { - res.status(500).json({ message: error.message }); - } -} diff --git a/src/controllers/calendar.ts b/src/controllers/calendar.ts new file mode 100644 index 0000000..6fe01da --- /dev/null +++ b/src/controllers/calendar.ts @@ -0,0 +1,30 @@ +import { attr, api, get, parse } from '../api' +import { Controller } from '../types' + +export const getCalendar: Controller = async (req, res) => { + try { + const { data } = await get(api.calendar) + const html = parse(data) + res.status(200).json( + html.querySelectorAll('.heromain [data-dia]').map(i => { + const day = i.getAttribute('data-dia') + return { + day, + animes: i.querySelectorAll('.col-md-6.col-lg-4.col-sm-12.for768').map(i => { + const no = i.querySelector('.serisdtls a h4')?.text.trim() + const tags = i.querySelectorAll('.serisdtls .seriesbtns a') + return { + id: attr(i, 'a', 'href').split('/').pop() || null, + title: i.querySelector('.serisdtls a h3')?.text.trim() || null, + image: attr(i, '.seriesimg a img') || null, + tags: tags.map(i => i.querySelector('button')?.text.trim() || null), + no: parseInt(no?.replace(/\w+\s/, '') as string) || null, + } + }), + } + }) + ) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/emision.js b/src/controllers/emision.js deleted file mode 100644 index 687cfc9..0000000 --- a/src/controllers/emision.js +++ /dev/null @@ -1,21 +0,0 @@ -import { attr, api, get } from '../config.js'; -import { parse } from 'node-html-parser'; - -export async function getEmision(req, res) { - try { - let { page = '1' } = req.query; - const { data } = await get(api.emision(page)); - const html = parse(data); - res.status(200).json( - html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map((i) => { - return { - id: attr(i, 'a', 'href').split('/').pop() || null, - title: i.querySelector('.seristitles').text.trim() || null, - image: attr(i, '.animemainimg') || null, - }; - }) - ); - } catch (error) { - res.status(500).json({ message: error.message }); - } -} diff --git a/src/controllers/emision.ts b/src/controllers/emision.ts new file mode 100644 index 0000000..c9523b7 --- /dev/null +++ b/src/controllers/emision.ts @@ -0,0 +1,21 @@ +import { attr, api, get, parse } from '../api' +import { Controller } from '../types' + +export const getEmision: Controller = async (req, res) => { + try { + const { page = '1' } = req.query + const { data } = await get(api.emision(page)) + const html = parse(data) + res.status(200).json( + html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map(i => { + return { + id: attr(i, 'a', 'href').split('/').pop() || null, + title: i.querySelector('.seristitles')?.text.trim() || null, + image: attr(i, '.animemainimg') || null, + } + }) + ) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/episode.js b/src/controllers/episode.js deleted file mode 100644 index 43e194f..0000000 --- a/src/controllers/episode.js +++ /dev/null @@ -1,65 +0,0 @@ -import { attr, api, get } from '../config.js'; -import { parse } from 'node-html-parser'; - -export async function getEpisode(req, res) { - try { - const { id } = req.params; - const { data } = await get(api.episode(id)); - const html = parse(data); - const ctrls = html.querySelectorAll('.controldiv2 a'); - - let nav = {}; - let mapc = ctrls.map((e, i) => { - let elem = e.querySelector('img').classList; - return !elem.contains('playlist'); - }); - if (mapc.length == 3) { - nav = { next: true, prev: true }; - } else { - if (mapc[1] == true) nav = { next: true, prev: false }; - if (mapc[1] == false) nav = { next: false, prev: true }; - } - const nextEpisodes = html.querySelectorAll('.nextplay:nth-child(1) .nextplays a').map((i) => { - return { - image: attr(i, '.nxtmainimg', 'src'), - date: i.querySelector('.nxtplaybtn p').text, - title: i.querySelector('.nxtplaybtn h5').text, - no: i.querySelector('.nxtplaybtn span').text, - }; - }); - const imgNotFound = - 'https://konachan.com/image/bbb46f65d3130526c20fcd781d6800cf/Konachan.com%20-%2041974%20fuura_kafuka%20itoshiki_nozomu%20sayonara_zetsubou_sensei%20white.png'; - res.json({ - title: html.querySelector('.heromain_h1').text.replace(/Sub\sEspañol/gi, ''), - nextEpisodes: nextEpisodes.length == 0 ? null : nextEpisodes, - ctrs: nav, - sugestions: html.querySelectorAll('.nextplay:nth-child(3) .nextplays a').map((i) => { - const image = attr(i, '.nxtmainimg', 'src'); - return { - image: image.length == 0 || !image ? imgNotFound : image, - date: i.querySelector('.nxtplaybtn p').text, - title: i.querySelector('.nxtplaybtn h5').text, - no: i.querySelector('.nxtplaybtn span').text, - }; - }), - videos: html.querySelectorAll('.dropcaps .play-video').map((i) => { - const base64 = i.attrs['data-player']; - const title = i.rawText; - return { - title, - url: Buffer.from(base64, 'base64').toString('ascii'), - }; - }), - downloads: html.querySelectorAll('.downbtns a').map((i) => { - return { - title: i.text, - url: i.attrs['href'], - }; - }), - }); - } catch (err) { - res.status(500).json({ - message: err.message, - }); - } -} diff --git a/src/controllers/episode.ts b/src/controllers/episode.ts new file mode 100644 index 0000000..e429b39 --- /dev/null +++ b/src/controllers/episode.ts @@ -0,0 +1,62 @@ +import { attr, api, get, parse } from '../api' +import { Controller } from '../types' + +export const getEpisode: Controller = async (req, res) => { + try { + const { id } = req.params + const { data } = await get(api.episode(id)) + const html = parse(data) + const ctrls = html.querySelectorAll('.controldiv2 a') + let nav = {} + let mapc = ctrls.map((e, i) => { + let elem = e.querySelector('img')?.classList + return !elem?.contains('playlist') + }) + if (mapc.length == 3) { + nav = { next: true, prev: true } + } else { + if (mapc[1] == true) nav = { next: true, prev: false } + if (mapc[1] == false) nav = { next: false, prev: true } + } + const nextEpisodes = html.querySelectorAll('.nextplay:nth-child(1) .nextplays a').map(i => { + return { + image: attr(i, '.nxtmainimg', 'src'), + date: i.querySelector('.nxtplaybtn p')?.text, + title: i.querySelector('.nxtplaybtn h5')?.text, + no: i.querySelector('.nxtplaybtn span')?.text, + } + }) + const imgNotFound = + 'https://konachan.com/image/bbb46f65d3130526c20fcd781d6800cf/Konachan.com%20-%2041974%20fuura_kafuka%20itoshiki_nozomu%20sayonara_zetsubou_sensei%20white.png' + res.json({ + title: html.querySelector('.heromain_h1')?.text.replace(/Sub\sEspañol/gi, ''), + nextEpisodes: nextEpisodes.length == 0 ? null : nextEpisodes, + ctrs: nav, + sugestions: html.querySelectorAll('.nextplay:nth-child(3) .nextplays a').map(i => { + const image = attr(i, '.nxtmainimg', 'src') + return { + image: image.length == 0 || !image ? imgNotFound : image, + date: i.querySelector('.nxtplaybtn p')?.text, + title: i.querySelector('.nxtplaybtn h5')?.text, + no: i.querySelector('.nxtplaybtn span')?.text, + } + }), + videos: html.querySelectorAll('.dropcaps .play-video').map(i => { + const base64 = i.attrs['data-player'] + const title = i.rawText + return { + title, + url: Buffer.from(base64, 'base64').toString('ascii'), + } + }), + downloads: html.querySelectorAll('.downbtns a').map(i => { + return { + title: i.text, + url: i.attrs['href'], + } + }), + }) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/filterBy.js b/src/controllers/filterBy.js deleted file mode 100644 index c796159..0000000 --- a/src/controllers/filterBy.js +++ /dev/null @@ -1,29 +0,0 @@ -import { parse } from 'node-html-parser'; -import { api, attr, get } from '../config.js'; - -export async function filterBy(req, res) { - try { - let { - categoria = 'false', - fecha = 'false', - genero = 'false', - letra = 'false', - pagina = '1', - } = req.query; - const { data } = await get(`${api.filter({ categoria, fecha, genero, letra, pagina })}`); - const html = parse(data); - res.status(200).json( - html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map((i) => { - return { - id: attr(i, 'a', 'href').split('/').pop() || null, - title: i.querySelector('.seristitles').text.trim() || null, - image: attr(i, '.animemainimg', 'src') || null, - }; - }) - ); - } catch (err) { - res.status(500).json({ - message: err.message, - }); - } -} diff --git a/src/controllers/filterBy.ts b/src/controllers/filterBy.ts new file mode 100644 index 0000000..b84e2c2 --- /dev/null +++ b/src/controllers/filterBy.ts @@ -0,0 +1,27 @@ +import { api, attr, get, parse } from '../api' +import { Controller } from '../types' + +export const filterBy: Controller = async (req, res) => { + try { + const { + categoria = 'false', + fecha = 'false', + genero = 'false', + letra = 'false', + pagina = '1', + }: { [key: string]: any } = req.query + const { data } = await get(api.filter({ categoria, fecha, genero, letra, pagina })) + const html = parse(data) + res.status(200).json( + html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map(i => { + return { + id: attr(i, 'a', 'href').split('/').pop() || null, + title: i.querySelector('.seristitles')?.text.trim() || null, + image: attr(i, '.animemainimg', 'src') || null, + } + }) + ) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/index.js b/src/controllers/index.js deleted file mode 100644 index d6f74a3..0000000 --- a/src/controllers/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export * from './all.js'; -export * from './calendar.js'; -export * from './emision.js'; -export * from './episode.js'; -export * from './filterBy.js'; -export * from './lastest.js'; -export * from './search.js'; -export * from './anime.js'; diff --git a/src/controllers/index.ts b/src/controllers/index.ts new file mode 100644 index 0000000..3d912f2 --- /dev/null +++ b/src/controllers/index.ts @@ -0,0 +1,8 @@ +export * from './all' +export * from './anime' +export * from './lastest' +export * from './calendar' +export * from './emision' +export * from './search' +export * from './episode' +export * from './filterBy' diff --git a/src/controllers/lastest.js b/src/controllers/lastest.js deleted file mode 100644 index 4e9d453..0000000 --- a/src/controllers/lastest.js +++ /dev/null @@ -1,23 +0,0 @@ -import { attr, api, get } from '../config.js'; -import { parse } from 'node-html-parser'; - -export async function getLastest(req, res) { - try { - const { data } = await get(api.home); - const html = parse(data); - res.json( - html.querySelectorAll('.row.row-cols-5 .col.col-md-6.col-lg-2.col-6').map((i) => { - const id = attr(i, 'a', 'href').split('/').pop(); - return { - id: id || null, - title: i.querySelector('.animetitles')?.text || null, - image: attr(i, '.animeimgdiv img', 'data-src') || null, - type: i.querySelector('.positioning button').text.trim() || null, - no: parseInt(i.querySelector('.positioning h5').text.trim() || '0') || null, - }; - }) - ); - } catch (error) { - res.status(500).json({ message: error.message }); - } -} diff --git a/src/controllers/lastest.ts b/src/controllers/lastest.ts new file mode 100644 index 0000000..5684d7f --- /dev/null +++ b/src/controllers/lastest.ts @@ -0,0 +1,23 @@ +import { Controller } from '../types' +import { get, parse, attr, url } from '../api' + +export const getLastest: Controller = async (req, res) => { + try { + const { data } = await get(url) + const html = parse(data) + res.json( + html.querySelectorAll('.row.row-cols-5 .col.col-md-6.col-lg-2.col-6').map(i => { + const id = attr(i, 'a', 'href').split('/').pop() + return { + id: id || null, + title: i.querySelector('.animetitles')?.text || null, + image: attr(i, '.animeimgdiv img', 'data-src') || null, + type: i.querySelector('.positioning button')?.text.trim() || null, + no: parseInt(i.querySelector('.positioning h5')?.text.trim() || '0') || null, + } + }) + ) + } catch (error) { + res.status(500).json({ error }) + } +} diff --git a/src/controllers/search.js b/src/controllers/search.js deleted file mode 100644 index 52487dc..0000000 --- a/src/controllers/search.js +++ /dev/null @@ -1,24 +0,0 @@ -import { parse } from 'node-html-parser'; -import { api, attr, get } from '../config.js'; - -export async function searchAnime(req, res) { - try { - let { id } = req.params; - let { page = '1' } = req.query; - const { data } = await get(api.search(id, page)); - const html = parse(data); - res.json( - html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map((i) => { - return { - id: attr(i, 'a', 'href').split('/').pop() || null, - title: i.querySelector('.seristitles ').text || null, - image: attr(i, '.seriesimg .animemainimg', 'src') || null, - }; - }) - ); - } catch (error) { - res.status(500).json({ - message: error.message, - }); - } -} diff --git a/src/controllers/search.ts b/src/controllers/search.ts new file mode 100644 index 0000000..197df7f --- /dev/null +++ b/src/controllers/search.ts @@ -0,0 +1,22 @@ +import { api, attr, get, parse } from '../api' +import { Controller } from '../types' + +export const searchAnime: Controller = async (req, res) => { + try { + const { id } = req.params + const { page = '1' } = req.query + const { data } = await get(api.search(id, page)) + const html = parse(data) + res.json( + html.querySelectorAll('.heromain .row .col-md-4.col-lg-2.col-6').map(i => { + return { + id: attr(i, 'a', 'href').split('/').pop() || null, + title: i.querySelector('.seristitles ')?.text || null, + image: attr(i, '.seriesimg .animemainimg', 'src') || null, + } + }) + ) + } catch (error) { + res.status(500).json({ error }) + } +}