🟨 => 🟦 migrating all controllers from js to ts
parent
f04d83a53e
commit
e304321470
@ -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,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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 });
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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 });
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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';
|
|
@ -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'
|
@ -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 });
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
@ -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,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -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 })
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue