diff --git a/lib/routes/lrepacks/index.ts b/lib/routes/lrepacks/index.ts new file mode 100644 index 000000000..6a16c3c7f --- /dev/null +++ b/lib/routes/lrepacks/index.ts @@ -0,0 +1,201 @@ +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 { art } from '@/utils/render'; +import path from 'node:path'; + +export const handler = async (ctx) => { + const { category = '' } = ctx.req.param(); + const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 12; + + const rootUrl = 'https://lrepacks.net'; + const currentUrl = new URL(category, rootUrl).href; + + const { data: response } = await got(currentUrl); + + const $ = load(response); + + const language = $('html').prop('lang'); + + let items = $('#main article') + .slice(0, limit) + .toArray() + .map((item) => { + item = $(item); + + const title = item.find('h3.entry-title').text(); + const description = art(path.join(__dirname, 'templates/description.art'), { + intro: item.find('div.entry-content').text(), + }); + + return { + title, + description, + link: item.find('h3.entry-title a').prop('href'), + category: item + .find('span.cat-links') + .toArray() + .map((c) => $(c).text()), + language, + }; + }); + + items = await Promise.all( + items.map((item) => + cache.tryGet(item.link, async () => { + const { data: detailResponse } = await got(item.link); + + const $$ = load(detailResponse); + + const data = JSON.parse($$('script[type="application/ld+json"]').first().text())['@graph']?.[0] ?? undefined; + + $$('div.entry-content a.highslide[href]').each((_, el) => { + el = $$(el); + + el.parent().replaceWith( + art(path.join(__dirname, 'templates/description.art'), { + images: [ + { + src: el.prop('href'), + alt: el.prop('title'), + }, + ], + }) + ); + }); + + const title = $$('h2.entry-title').text(); + const description = + item.description + + art(path.join(__dirname, 'templates/description.art'), { + description: $$('div.entry-content').html(), + }); + const image = $$('meta[property="og:image"]').prop('content'); + + item.title = title; + item.description = description; + item.pubDate = data ? parseDate(data.datePublished) : undefined; + item.author = data?.author?.name ?? undefined; + item.content = { + html: description, + text: $$('div.entry-content').text(), + }; + item.image = image; + item.banner = image; + item.updated = data ? parseDate(data.dateModified) : undefined; + item.language = language; + + return item; + }) + ) + ); + + const image = new URL($('div.logo img').prop('src'), rootUrl).href; + + return { + title: $('title').text(), + description: $('meta[name="description"]').prop('content'), + link: currentUrl, + item: items, + allowEmpty: true, + image, + author: $('meta[property="og:site_name"]').prop('content'), + language, + }; +}; + +export const route: Route = { + path: '/:category?', + name: 'REPACK скачать', + url: 'lrepacks.net', + maintainers: ['nczitzk'], + handler, + example: '/lrepacks', + parameters: { category: 'Category, Homepage by default' }, + description: `:::tip + If you subscribe to [Системные программы](https://lrepacks.net/repaki-sistemnyh-programm/),where the URL is \`https://lrepacks.net/repaki-sistemnyh-programm/\`, extract the part \`https://lrepacks.net/\` to the end, which is \`repaki-sistemnyh-programm\`, and use it as the parameter to fill in. Therefore, the route will be [\`/lrepacks/repaki-sistemnyh-programm\`](https://rsshub.app/lrepacks/repaki-sistemnyh-programm). + + | Category | ID | + | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | + | [Новые репаки на сегодня](https://lrepacks.net/novye-repaki-elchupacabra/) | [novye-repaki-elchupacabra](https://rsshub.app/lrepacks/novye-repaki-elchupacabra) | + | [Системные программы](https://lrepacks.net/repaki-sistemnyh-programm/) | [repaki-sistemnyh-programm](https://rsshub.app/lrepacks/repaki-sistemnyh-programm) | + | [Программы для графики](https://lrepacks.net/repaki-programm-dlya-grafiki/) | [repaki-programm-dlya-grafiki](https://rsshub.app/lrepacks/repaki-programm-dlya-grafiki) | + | [Программы для интернета](https://lrepacks.net/repaki-programm-dlya-interneta/) | [repaki-programm-dlya-interneta](https://rsshub.app/lrepacks/repaki-programm-dlya-interneta) | + | [Мультимедиа программы](https://lrepacks.net/repaki-multimedia-programm/) | [repaki-multimedia-programm](https://rsshub.app/lrepacks/repaki-multimedia-programm) | + | [Программы для офиса](https://lrepacks.net/repaki-programm-dlya-ofisa/) | [repaki-programm-dlya-ofisa](https://rsshub.app/lrepacks/repaki-programm-dlya-ofisa) | + | [Разные программы](https://lrepacks.net/repaki-raznyh-programm/) | [repaki-raznyh-programm](https://rsshub.app/lrepacks/repaki-raznyh-programm) | + | [Системные библиотеки](https://lrepacks.net/sistemnye-biblioteki/) | [sistemnye-biblioteki](https://rsshub.app/lrepacks/sistemnye-biblioteki) | + | [Важная информация](https://lrepacks.net/informaciya/) | [informaciya](https://rsshub.app/lrepacks/informaciya) | + :::`, + categories: ['program-update'], + + features: { + requireConfig: false, + requirePuppeteer: false, + antiCrawler: false, + supportRadar: true, + supportBT: false, + supportPodcast: false, + supportScihub: false, + }, + radar: [ + { + source: ['lrepacks.net/:category'], + target: (params) => { + const category = params.category; + + return `/lrepacks${category ? `/${category}` : ''}`; + }, + }, + { + title: 'Новые репаки на сегодня', + source: ['lrepacks.net/novye-repaki-elchupacabra/'], + target: '/novye-repaki-elchupacabra', + }, + { + title: 'Системные программы', + source: ['lrepacks.net/repaki-sistemnyh-programm/'], + target: '/repaki-sistemnyh-programm', + }, + { + title: 'Программы для графики', + source: ['lrepacks.net/repaki-programm-dlya-grafiki/'], + target: '/repaki-programm-dlya-grafiki', + }, + { + title: 'Программы для интернета', + source: ['lrepacks.net/repaki-programm-dlya-interneta/'], + target: '/repaki-programm-dlya-interneta', + }, + { + title: 'Мультимедиа программы', + source: ['lrepacks.net/repaki-multimedia-programm/'], + target: '/repaki-multimedia-programm', + }, + { + title: 'Программы для офиса', + source: ['lrepacks.net/repaki-programm-dlya-ofisa/'], + target: '/repaki-programm-dlya-ofisa', + }, + { + title: 'Разные программы', + source: ['lrepacks.net/repaki-raznyh-programm/'], + target: '/repaki-raznyh-programm', + }, + { + title: 'Системные библиотеки', + source: ['lrepacks.net/sistemnye-biblioteki/'], + target: '/sistemnye-biblioteki', + }, + { + title: 'Важная информация', + source: ['lrepacks.net/informaciya/'], + target: '/informaciya', + }, + ], +}; diff --git a/lib/routes/lrepacks/namespace.ts b/lib/routes/lrepacks/namespace.ts new file mode 100644 index 000000000..760214504 --- /dev/null +++ b/lib/routes/lrepacks/namespace.ts @@ -0,0 +1,8 @@ +import type { Namespace } from '@/types'; + +export const namespace: Namespace = { + name: 'REPACK скачать', + url: 'lrepacks.net', + categories: ['program-update'], + description: '', +}; diff --git a/lib/routes/lrepacks/templates/description.art b/lib/routes/lrepacks/templates/description.art new file mode 100644 index 000000000..249654e7e --- /dev/null +++ b/lib/routes/lrepacks/templates/description.art @@ -0,0 +1,21 @@ +{{ if images }} + {{ each images image }} + {{ if image?.src }} +
+ {{ image.alt }} +
+ {{ /if }} + {{ /each }} +{{ /if }} + +{{ if intro }} +
{{ intro }}
+{{ /if }} + +{{ if description }} + {{@ description }} +{{ /if }} \ No newline at end of file