-
Notifications
You must be signed in to change notification settings - Fork 9.8k
feat(route): add Fars News showcase #21999
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 2 commits
dc8dea6
057e044
8fa7840
297f8fb
61aa8d3
63c631c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import type { Namespace } from '@/types'; | ||
|
|
||
| export const namespace: Namespace = { | ||
| name: 'Fars News', | ||
| url: 'farsnews.ir', | ||
| lang: 'fa', | ||
| }; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,84 @@ | ||
| import { load } from 'cheerio'; | ||
Check failureCode scanning / oxlint simple-import-sort(imports) Error
Run autofix to sort these imports!
|
||
|
github-advanced-security[bot] marked this conversation as resolved.
Fixed
|
||
| import type { Route } from '@/types'; | ||
|
|
||
| import cache from '@/utils/cache'; | ||
| import got from '@/utils/got'; | ||
| import { parseDate } from '@/utils/parse-date'; | ||
|
|
||
| export const route: Route = { | ||
| path: '/showcase/:category?', | ||
| categories: ['traditional-media'], | ||
| example: '/farsnews/showcase', | ||
| parameters: { category: 'Category slug from farsnews.ir/showcase URL' }, | ||
| features: { | ||
| requireConfig: false, | ||
| requirePuppeteer: false, | ||
| antiCrawler: true, | ||
| supportBT: false, | ||
| supportPodcast: false, | ||
| supportScihub: false, | ||
| }, | ||
| radar: [{ | ||
| source: ['farsnews.ir/showcase'], | ||
| target: '/showcase', | ||
| }], | ||
| name: 'Showcase', | ||
| maintainers: [], | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing maintainer GitHub ID. |
||
| handler, | ||
| description: 'Fars News showcase articles. Persian news agency.', | ||
| }; | ||
|
|
||
| async function handler(ctx) { | ||
| const category = ctx.req.param('category') ?? ''; | ||
| const baseUrl = 'https://farsnews.ir'; | ||
| const currentUrl = category ? `${baseUrl}/showcase/${category}` : `${baseUrl}/showcase`; | ||
|
|
||
| const response = await got({ method: 'get', url: currentUrl }); | ||
| const $ = load(response.data); | ||
|
|
||
| const items = $('a[href^="/"]') | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a textbook example of the first anti-pattern listed. |
||
| .toArray() | ||
| .map((item) => { | ||
| item = $(item); | ||
| const href = item.attr('href'); | ||
| const title = item.find('h2, h3').first().text().trim() || item.text().trim(); | ||
|
|
||
| if (!href || !title || !/^\/[^/]+\/\d+\//.test(href)) { | ||
| return null; | ||
| } | ||
|
|
||
| return { | ||
| title, | ||
| link: `${baseUrl}${href}`, | ||
| }; | ||
| }) | ||
| .filter((item) => item !== null) | ||
| .filter((item, index, self) => self.findIndex((i) => i.link === item.link) === index); | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use the embeded data from |
||
|
|
||
| const processedItems = await Promise.all( | ||
| items.map((item) => | ||
| cache.tryGet(item.link, async () => { | ||
| try { | ||
| const detailResponse = await got({ method: 'get', url: item.link }); | ||
| const detail$ = load(detailResponse.data); | ||
|
|
||
| const desc = detail$('meta[name="description"]').attr('content') || ''; | ||
| item.description = desc; | ||
|
|
||
| const timeText = detail$('time').attr('datetime') || detail$('.text-gray-400').first().text(); | ||
| if (timeText) { | ||
| item.pubDate = parseDate(timeText); | ||
| } | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Use the embeded data from |
||
| } catch { | ||
| // Silently continue if detail fetch fails | ||
|
github-advanced-security[bot] marked this conversation as resolved.
Fixed
github-advanced-security[bot] marked this conversation as resolved.
Fixed
github-advanced-security[bot] marked this conversation as resolved.
Fixed
|
||
| } | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see no error emitted from all 127 requests. Provide the URL that throws an error which requires using try-catch. |
||
| return item; | ||
| }) | ||
| ) | ||
| ); | ||
|
|
||
| return { | ||
| title: 'Fars News - Showcase', | ||
| link: currentUrl, | ||
| item: processedItems, | ||
| }; | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.