RSSHub/lib/routes/bdys/index.ts

188 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { Route } from '@/types';
import { getCurrentPath } from '@/utils/helpers';
const __dirname = getCurrentPath(import.meta.url);
import cache from '@/utils/cache';
import got from '@/utils/got';
import { load } from 'cheerio';
import { parseDate } from '@/utils/parse-date';
import timezone from '@/utils/timezone';
import { art } from '@/utils/render';
import path from 'node:path';
import asyncPool from 'tiny-async-pool';
import { config } from '@/config';
import ConfigNotFoundError from '@/errors/types/config-not-found';
// Visit https://www.bdys.me for the list of domains
const allowDomains = new Set(['52bdys.com', 'bde4.icu', 'bdys01.com']);
export const route: Route = {
path: '/:caty?/:type?/:area?/:year?/:order?',
categories: ['multimedia'],
example: '/bdys',
parameters: {
caty: '影视类型,见下表,默认为 `all` 即不限',
type: '资源分类,见下表,默认为 `all` 即不限',
area: '制片地区,见下表,默认为 `all` 即不限',
year: '上映时间此处填写年份不小于2000默认为 `all` 即不限',
order: '影视排序,见下表,默认为更新时间',
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: true,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
name: '首页',
maintainers: ['nczitzk'],
handler,
description: `#### 资源分类
| 不限 | 电影 | 电视剧 |
| ---- | ---- | ------ |
| all | 0 | 1 |
#### 影视类型
| 不限 | 动作 | 爱情 | 喜剧 | 科幻 | 恐怖 |
| ---- | ------- | ------ | ---- | ------ | ------ |
| all | dongzuo | aiqing | xiju | kehuan | kongbu |
| 战争 | 武侠 | 魔幻 | 剧情 | 动画 | 惊悚 |
| --------- | ----- | ------ | ------ | ------- | -------- |
| zhanzheng | wuxia | mohuan | juqing | donghua | jingsong |
| 3D | 灾难 | 悬疑 | 警匪 | 文艺 | 青春 |
| -- | ------ | ------ | ------- | ----- | -------- |
| 3D | zainan | xuanyi | jingfei | wenyi | qingchun |
| 冒险 | 犯罪 | 纪录 | 古装 | 奇幻 | 国语 |
| ------- | ------ | ---- | -------- | ------ | ----- |
| maoxian | fanzui | jilu | guzhuang | qihuan | guoyu |
| 综艺 | 历史 | 运动 | 原创压制 |
| ------ | ----- | ------- | ---------- |
| zongyi | lishi | yundong | yuanchuang |
| 美剧 | 韩剧 | 国产电视剧 | 日剧 | 英剧 | 德剧 |
| ----- | ----- | ---------- | ---- | ------ | ---- |
| meiju | hanju | guoju | riju | yingju | deju |
| 俄剧 | 巴剧 | 加剧 | 西剧 | 意大利剧 | 泰剧 |
| ---- | ---- | ----- | ------- | -------- | ----- |
| eju | baju | jiaju | spanish | yidaliju | taiju |
| 港台剧 | 法剧 | 澳剧 |
| --------- | ---- | ---- |
| gangtaiju | faju | aoju |
#### 制片地区
| 大陆 | 中国香港 | 中国台湾 |
| ---- | -------- | -------- |
| 美国 | 英国 | 日本 | 韩国 | 法国 |
| ---- | ---- | ---- | ---- | ---- |
| 印度 | 德国 | 西班牙 | 意大利 | 澳大利亚 |
| ---- | ---- | ------ | ------ | -------- |
| 比利时 | 瑞典 | 荷兰 | 丹麦 | 加拿大 | 俄罗斯 |
| ------ | ---- | ---- | ---- | ------ | ------ |
#### 影视排序
| 更新时间 | 豆瓣评分 |
| -------- | -------- |
| 0 | 1 |`,
};
async function handler(ctx) {
const caty = ctx.req.param('caty') || 'all';
const type = ctx.req.param('type') || 'all';
const area = ctx.req.param('area') || 'all';
const year = ctx.req.param('year') || 'all';
const order = ctx.req.param('order') || '0';
const site = ctx.req.query('domain') || 'bdys01.com';
if (!config.feature.allow_user_supply_unsafe_domain && !allowDomains.has(new URL(`https://${site}`).hostname)) {
throw new ConfigNotFoundError(`This RSS is disabled unless 'ALLOW_USER_SUPPLY_UNSAFE_DOMAIN' is set to 'true'.`);
}
const rootUrl = `https://www.${site}`;
const currentUrl = `${rootUrl}/s/${caty}?${type === 'all' ? '' : '&type=' + type}${area === 'all' ? '' : '&area=' + area}${year === 'all' ? '' : '&year=' + year}&order=${order}`;
const response = await got({
method: 'get',
url: currentUrl,
});
const $ = load(response.data);
let jsessionid = '';
const list = $('.card-body .card a')
.slice(0, 15)
.toArray()
.map((item) => {
item = $(item);
const link = item.attr('href').split(';jsessionid=');
jsessionid = link[1];
const next = item.next();
return {
title: next.find('h3').text(),
link: `${rootUrl}${link[0]}`,
pubDate: parseDate(next.find('.text-muted').text()),
};
});
const headers = {
cookie: `JSESSIONID=${jsessionid}`,
};
const items = [];
for await (const data of asyncPool(1, list, (item) =>
cache.tryGet(item.link, async () => {
const detailResponse = await got({
method: 'get',
url: item.link,
headers,
});
const downloadResponse = await got({
method: 'get',
url: `${rootUrl}/downloadInfo/list?mid=${item.link.split('/')[4].split('.')[0]}`,
headers,
});
const content = load(detailResponse.data);
content('svg').remove();
const torrents = content('.download-list .list-group');
item.description = art(path.join(__dirname, 'templates/desc.art'), {
info: content('.row.mt-3').html(),
synopsis: content('#synopsis').html(),
links: downloadResponse.data,
torrents: torrents.html(),
});
item.pubDate = timezone(parseDate(content('.bg-purple-lt').text().replace('更新时间:', '')), +8);
item.guid = `${item.link}#${content('.card h1').text()}`;
item.enclosure_url = torrents.html() ? `${rootUrl}${torrents.find('a').first().attr('href')}` : downloadResponse.data.pop().url;
item.enclosure_type = 'application/x-bittorrent';
return item;
})
)) {
items.push(data);
}
return {
title: '哔嘀影视',
link: currentUrl,
item: items,
};
}