rsshub
Version:
Make RSS Great Again!
94 lines (84 loc) • 2.71 kB
text/typescript
import { Route } from '@/types';
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
export const route: Route = {
path: ['/search/:keyword/:preview?', '/:type?/:preview?'],
categories: ['multimedia'],
example: '/u3c3/search/新片速递',
parameters: { keyword: 'Search keyword', preview: 'Show image preview, off by default, non empty value means on' },
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: true,
supportPodcast: false,
supportScihub: false,
},
name: 'Search',
maintainers: ['storytellerF'],
handler,
};
async function handler(ctx) {
const { type, keywoard, preview } = ctx.req.param();
// should be:
// undefined
// U3C3
// Videos
// Photo
// Book
// Game
// Software
// Other
const rootURL = 'https://www.u3c3.com';
let currentURL;
let title;
if (keywoard) {
currentURL = `${rootURL}/?search=${keywoard}`;
title = `search ${keywoard} - u3c3`;
} else if (type === undefined) {
currentURL = rootURL;
title = 'home - u3c3';
} else {
currentURL = `${rootURL}/?type=${type}&p=1`;
title = `${type} - u3c3`;
}
const response = await got(currentURL);
const $ = load(response.data);
const list = $('body > div.container > div.table-responsive > table > tbody > tr')
.toArray()
.map((item) => {
item = $(item);
const title = item.find('td:nth-of-type(2) > a ').attr('title');
const guid = rootURL + item.find('td:nth-of-type(2) > a').attr('href');
const link = guid;
const pubDate = item.find('td:nth-of-type(5)').text();
const enclosure_url = item.find('td:nth-of-type(3) > a:nth-of-type(2)').attr('href');
return {
title,
guid,
link,
pubDate,
enclosure_url,
enclosure_type: 'application/x-bittorrent',
};
});
const items = preview
? await Promise.all(
list.map((item) =>
cache.tryGet(item.link, async () => {
const { data: response } = await got(item.link);
const $ = load(response);
item.description = $('div.panel-footer > img:first-child').parent().html();
return item;
})
)
)
: list;
return {
title,
description: title,
link: currentURL,
item: items,
};
}