UNPKG

rsshub

Version:
97 lines (79 loc) 3.37 kB
import { Route } from '@/types'; import cache from '@/utils/cache'; import got from '@/utils/got'; import { load } from 'cheerio'; import { rootUrl, getItems, getItemInfo, processItems } from './util'; export const route: Route = { path: '/:id?/:downLinkType?', categories: ['multimedia'], example: '/newzmz/qEzRyY3v', parameters: { id: '剧集 id,可在剧集下载页 URL 中找到', downLinkType: '下载链接类型,默认为磁力链' }, features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportBT: false, supportPodcast: false, supportScihub: false, }, radar: [ { source: ['newzmz.com/'], target: '', }, ], name: '指定剧集', maintainers: ['nczitzk'], handler, url: 'newzmz.com/', description: `::: tip [雪国列车 (剧版)](https://nzmz.xyz/details-qEzRyY3v.html) 的下载页 URL 为 \`https://v.ys99.xyz/view/qEzRyY3v.html\`,即剧集 id 为 \`qEzRyY3v\` :::`, }; async function handler(ctx) { const { id = '1', downLinkType = '磁力链' } = ctx.req.param(); const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 50; // If the id is not composed solely of digits, // then consider it as the id of a movie or TV show; // otherwise, consider it as the id for the category. const isCategory = !Number.isNaN(id); const currentUrl = new URL(isCategory ? 'index.html' : `details-${id}.html`, rootUrl).href; const response = await cache.tryGet(currentUrl, async () => { const { data: response } = await got(currentUrl); return response; }); const $ = load(response); // If a category id is specified, // retrieve all movies and TV shows from that category // and add them to the "to be processed" array. // Otherwise, if only a specific TV show or movie ID is provided, // add that item alone to the "to be processed" array. let items = isCategory ? await getItems(cache.tryGet, currentUrl, id, 'div.rowMod', 'ul.slides li a') : [ { link: currentUrl, }, ]; items = await Promise.all(items.slice(0, limit).map((item) => getItemInfo(cache.tryGet, item.link))); // If the link of the entry is "#", // it indicates that there are currently no relevant resources available for that specific item. items = await Promise.all(items.filter((item) => item.link !== '#').map((i) => processItems(i, downLinkType, 'div.team-con-area', 'div.item-label a', 'ul.team-icons li'))); items = items.flat(); const headerTitle = isCategory ? $('div.rowMod').eq(Number.parseInt(id, 10)).find('h2.row-header-title').text() : ''; const title = `${$('title').text()}${headerTitle ? ` - ${headerTitle}` : ''}`; const icon = $('link[rel="shortcut icon"]').prop('href'); return { item: isCategory ? items : items.slice(0, limit), title, link: currentUrl, description: $('meta[name="description"]').prop('content'), language: 'zh-cn', image: $('img.logo-img').prop('src'), icon, logo: icon, subtitle: $('meta[name="keywords"]').prop('content'), author: title, allowEmpty: true, }; }