rsshub
Version:
Make RSS Great Again!
95 lines (83 loc) • 2.59 kB
text/typescript
import { load } from 'cheerio';
import got from '@/utils/got';
import { art } from '@/utils/render';
import path from 'node:path';
const base = 'https://furstar.jp';
const langBase = (lang) => (lang ? `${base}/${lang}` : base); // en, cn, (none, for JP)
const renderAuthor = (author) => art(path.join(__dirname, 'templates/author.art'), author);
const renderDesc = (desc, pics, author) =>
art(path.join(__dirname, 'templates/description.art'), {
desc,
pics,
author: renderAuthor(author),
});
const authorDetail = (el) => {
const $ = load(el);
// if there is <a>
const a = $('a');
const result = {
name: null,
avatar: null,
link: null,
};
if (a.length > 0) {
const img = $('a img');
result.name = img.attr('alt');
result.avatar = img.attr('src');
result.link = a.attr('href');
} else {
const desc = $('img');
result.name = desc.attr('alt');
result.avatar = desc.attr('src');
}
return result;
};
const detailPage = (link, cache) =>
cache.tryGet(link, async () => {
const result = await got(link, {
https: {
rejectUnauthorized: false,
},
});
const $ = load(result.data);
const title = $('.row .panel-heading h2').text().trim(); // Get first title
const desc = $('.character-description p').text().trim();
const pics = $('.img-gallery .prettyPhoto')
.toArray()
.map((e) => {
const p = load(e);
const link = p('a').attr('href').trim();
return `${base}/${link.slice(2)}`;
});
return {
title,
pics,
desc,
author: authorDetail($('.character-description').html()),
};
});
const fetchAllCharacters = (data, base) => {
// All character page
const $ = load(data);
const characters = $('.character-article');
const info = characters.toArray().map((e) => {
const c = load(e);
const r = {
title: c('.character-headline').text().trim(),
headImage: c('.character-images img').attr('src').trim(),
detailPage: `${base}/${c('.character-images a').attr('href').trim()}`,
author: authorDetail(c('.character-description').html()),
};
return r;
});
return info;
};
export default {
BASE: base,
langBase,
fetchAllCharacters,
detailPage,
authorDetail,
renderDesc,
renderAuthor,
};