UNPKG

rsshub

Version:
189 lines (170 loc) 7.29 kB
import { Route } from '@/types'; import type { BBobCoreTagNodeTree, PresetFactory } from '@bbob/types'; import got from '@/utils/got'; import { load } from 'cheerio'; import bbobHTML from '@bbob/html'; import presetHTML5 from '@bbob/preset-html5'; import { parseDate } from '@/utils/parse-date'; const swapLinebreak = (tree: BBobCoreTagNodeTree) => tree.walk((node) => { if (typeof node === 'string' && node === '\n') { return { tag: 'br', content: null, }; } return node; }); const customPreset: PresetFactory = presetHTML5.extend((tags) => ({ ...tags, url: (node) => ({ tag: 'a', attrs: { href: Object.keys(node.attrs as Record<string, string>)[0], rel: 'noopener', target: '_blank', }, content: node.content, }), video: (node, { render }) => ({ tag: 'video', attrs: { controls: '', preload: 'metadata', poster: node.attrs?.poster, }, content: render( Object.entries({ webm: 'video/webm', mp4: 'video/mp4', }).map(([key, type]) => ({ tag: 'source', attrs: { src: node.attrs?.[key], type, }, })) ), }), })); export const handler = async (ctx) => { const { category = 'all', language = 'english' } = ctx.req.param(); const limit = ctx.req.query('limit') ? Number.parseInt(ctx.req.query('limit'), 10) : 100; const rootUrl = 'https://www.counter-strike.net'; const apiRootUrl = 'https://store.steampowered.com'; const cdnRootUrl = 'https://media.st.dl.eccdnx.com'; const currentUrl = new URL(`news${category && category !== 'all' ? `/${category}` : ''}${language ? `?l=${language}` : ''}`, rootUrl).href; const apiUrl = new URL('events/ajaxgetpartnereventspageable/', apiRootUrl).href; const { data: response } = await got(apiUrl, { searchParams: { clan_accountid: 0, appid: 730, offset: 0, count: limit, l: language, }, }); const items = response.events .filter((item) => (category === 'updates' ? item.event_type === 12 : item.event_type)) .slice(0, limit) .map((item) => { const title = item.event_name; const description = bbobHTML(item.announcement_body.body, [customPreset(), swapLinebreak]); const guid = `counter-strike-news-${item.gid}`; return { title, description, pubDate: parseDate(item.announcement_body.posttime, 'X'), link: new URL(`newsentry/${item.gid}`, rootUrl).href, category: item.announcement_body.tags, guid, id: guid, content: { html: description, text: item.announcement_body.body, }, updated: parseDate(item.announcement_body.updatetime, 'X'), }; }); const { data: currentResponse } = await got(currentUrl); const $ = load(currentResponse); const author = 'Counter Strike'; const image = new URL('apps/csgo/images/dota_react//blog/default_cover.jpg', cdnRootUrl).href; return { title: `${author} - ${category === 'updates' ? 'Updates' : 'News'}`, description: $('title').text(), link: currentUrl, item: items, allowEmpty: true, image, author, language, }; }; export const route: Route = { path: '/news/:category?/:language?', name: 'News', url: 'www.counter-strike.net', maintainers: ['nczitzk'], handler, example: '/counter-strike/news', parameters: { category: 'Category, `updates` or `all`, `all` by default', language: 'Language, english by default, see below for more languages' }, description: `::: tip If you subscribe to [Updates in English](https://www.counter-strike.net/news/updates?l=english),where the URL is \`https://www.counter-strike.net/news/updates?l=english\`, extract the \`l\`, which is \`english\`, and use it as the parameter to fill in. Therefore, the route will be [\`/counter-strike/news/updates/english\`](https://rsshub.app/counter-strike/news/updates/english). ::: <details> <summary>More languages</summary> | 语言代码 | 语言名称 | | ------------------------------------------------- | ---------- | | English | english | | Español - España (Spanish - Spain) | spanish | | Français (French) | french | | Italiano (Italian) | italian | | Deutsch (German) | german | | Ελληνικά (Greek) | greek | | 한국어 (Korean) | koreana | | 简体中文 (Simplified Chinese) | schinese | | 繁體中文 (Traditional Chinese) | tchinese | | Русский (Russian) | russian | | ไทย (Thai) | thai | | 日本語 (Japanese) | japanese | | Português (Portuguese) | portuguese | | Português - Brasil (Portuguese - Brazil) | brazilian | | Polski (Polish) | polish | | Dansk (Danish) | danish | | Nederlands (Dutch) | dutch | | Suomi (Finnish) | finnish | | Norsk (Norwegian) | norwegian | | Svenska (Swedish) | swedish | | Čeština (Czech) | czech | | Magyar (Hungarian) | hungarian | | Română (Romanian) | romanian | | Български (Bulgarian) | bulgarian | | Türkçe (Turkish) | turkish | | Українська (Ukrainian) | ukrainian | | Tiếng Việt (Vietnamese) | vietnamese | | Español - Latinoamérica (Spanish - Latin America) | latam | </details> `, categories: ['game'], features: { requireConfig: false, requirePuppeteer: false, antiCrawler: false, supportRadar: true, supportBT: false, supportPodcast: false, supportScihub: false, }, radar: [ { source: ['www.counter-strike.net/news/:category'], target: (params, url) => { url = new URL(url); const category = params.category; const language = url.searchParams.get('l'); return `/news${category ? `/${category}${language ? `/${language}` : ''}` : ''}`; }, }, ], };