const got = require('@/utils/got'); const cheerio = require('cheerio'); const { parseDate } = require('@/utils/parse-date'); const { art } = require('@/utils/render'); const path = require('path'); const config = require('@/config').value; const toSize = (raw) => { const matches = raw.match(/(\d+(\.\d+)?)(\w+)/); return matches[3] === 'GB' ? matches[1] * 1024 : matches[1]; }; const allowDomain = ['javbus.com', 'javbus.org', 'javsee.icu', 'javsee.one']; module.exports = async (ctx) => { const isWestern = /^\/western/.test(ctx.path); const domain = ctx.query.domain ?? 'javbus.com'; const westernDomain = ctx.query.western_domain ?? 'javbus.org'; const rootUrl = `https://www.${domain}`; const westernUrl = `https://www.${westernDomain}`; if (!config.feature.allow_user_supply_unsafe_domain && (!allowDomain.includes(new URL(domain).hostname) || !allowDomain.includes(new URL(westernDomain).hostname))) { ctx.throw(403, `This RSS is disabled unless 'ALLOW_USER_SUPPLY_UNSAFE_DOMAIN' is set to 'true'.`); } const currentUrl = `${isWestern ? westernUrl : rootUrl}${ctx.path.replace(/^\/western/, '').replace(/\/home/, '')}`; const response = await got({ method: 'get', url: currentUrl, }); const $ = cheerio.load(response.data); let items = $('.movie-box') .slice(0, ctx.query.limit ? parseInt(ctx.query.limit) : 50) .toArray() .map((item) => { item = $(item); return { link: item.attr('href'), guid: item.find('date').first().text(), pubDate: parseDate(item.find('date').last().text()), }; }); items = await Promise.all( items.map((item) => ctx.cache.tryGet(item.link, async () => { const detailResponse = await got({ method: 'get', url: item.link, }); const content = cheerio.load(detailResponse.data); content('.genre').last().parent().remove(); content('input[type="checkbox"], button').remove(); const stars = content('.avatar-box span') .toArray() .map((s) => content(s).text()); const cache = { author: stars.join(', '), title: content('h3').text(), category: content('.genre label') .toArray() .map((c) => content(c).text()) .concat(stars), info: content('.row.movie').html(), thumbs: content('.sample-box') .toArray() .map((i) => { const thumbSrc = content(i).attr('href'); return /^http/.test(thumbSrc) ? thumbSrc : `${rootUrl}${thumbSrc}`; }), }; let magnets, videoSrc, videoPreview; // To fetch magnets. try { const matches = detailResponse.data.match(/var gid = (\d+);[\s\S]*var uc = (\d+);[\s\S]*var img = '(.*)';/); const magnetResponse = await got({ method: 'get', url: `${rootUrl}/ajax/uncledatoolsbyajax.php`, searchParams: { gid: matches[1], lang: 'zh', img: matches[3], uc: matches[2], floor: 800, }, headers: { Referer: item.link, }, }); const content = cheerio.load(`