Skip to content

Commit

Permalink
feat(route): afr (DIYgod#17547)
Browse files Browse the repository at this point in the history
* feat(route): afr

* feat(route/afr): add image support to latest and navigation endpoints
  • Loading branch information
TonyRL authored Nov 12, 2024
1 parent fb8e90d commit 51ab456
Show file tree
Hide file tree
Showing 5 changed files with 580 additions and 0 deletions.
69 changes: 69 additions & 0 deletions lib/routes/afr/latest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { Route } from '@/types';
import type { Context } from 'hono';

import cache from '@/utils/cache';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
import { assetsConnectionByCriteriaQuery } from './query';
import { getItem } from './utils';

export const route: Route = {
path: '/latest',
categories: ['traditional-media'],
example: '/afr/latest',
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.afr.com/latest', 'www.afr.com/'],
},
],
name: 'Latest',
maintainers: ['TonyRL'],
handler,
url: 'www.afr.com/latest',
};

async function handler(ctx: Context) {
const limit = Number.parseInt(ctx.req.query('limit') ?? '10');
const response = await ofetch('https://api.afr.com/graphql', {
query: {
query: assetsConnectionByCriteriaQuery,
operationName: 'assetsConnectionByCriteria',
variables: {
brand: 'afr',
first: limit,
render: 'web',
types: ['article', 'bespoke', 'featureArticle', 'liveArticle', 'video'],
after: '',
},
},
});

const list = response.data.assetsConnectionByCriteria.edges.map(({ node }) => ({
title: node.asset.headlines.headline,
description: node.asset.about,
link: `https://www.afr.com${node.urls.published.afr.path}`,
pubDate: parseDate(node.dates.firstPublished),
updated: parseDate(node.dates.modified),
author: node.asset.byline,
category: [node.tags.primary.displayName, ...node.tags.secondary.map((tag) => tag.displayName)],
image: node.featuredImages && `https://static.ffx.io/images/${node.featuredImages.landscape16x9.data.id}`,
}));

const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));

return {
title: 'Latest | The Australian Financial Review | AFR',
description: 'The latest news, events, analysis and opinion from The Australian Financial Review',
image: 'https://www.afr.com/apple-touch-icon-1024x1024.png',
link: 'https://www.afr.com/latest',
item: items,
};
}
7 changes: 7 additions & 0 deletions lib/routes/afr/namespace.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import type { Namespace } from '@/types';

export const namespace: Namespace = {
name: 'The Australian Financial Review',
url: 'afr.com',
lang: 'en',
};
75 changes: 75 additions & 0 deletions lib/routes/afr/navigation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { Route } from '@/types';
import type { Context } from 'hono';

import cache from '@/utils/cache';
import ofetch from '@/utils/ofetch';
import { parseDate } from '@/utils/parse-date';
import { pageByNavigationPathQuery } from './query';
import { getItem } from './utils';

export const route: Route = {
path: '/navigation/:path{.+}',
categories: ['traditional-media'],
example: '/afr/navigation/markets',
parameters: {
path: 'Navigation path, can be found in the URL of the page',
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['www.afr.com/path*'],
},
],
name: 'Navigation',
maintainers: ['TonyRL'],
handler,
url: 'www.afr.com',
};

async function handler(ctx: Context) {
const { path } = ctx.req.param();
const limit = Number.parseInt(ctx.req.query('limit') ?? '10');

const response = await ofetch('https://api.afr.com/api/content-audience/afr/graphql', {
query: {
query: pageByNavigationPathQuery,
operationName: 'pageByNavigationPath',
variables: {
input: { brandKey: 'afr', navigationPath: `/${path}`, renderName: 'web' },
firstStories: limit,
afterStories: '',
},
},
});

const list = response.data.pageByNavigationPath.page.latestStoriesConnection.edges.map(({ node }) => ({
title: node.headlines.headline,
description: node.overview.about,
link: `https://www.afr.com${node.urls.canonical.path}`,
pubDate: parseDate(node.dates.firstPublished),
updated: parseDate(node.dates.modified),
author: node.byline
.filter((byline) => byline.type === 'AUTHOR')
.map((byline) => byline.author.name)
.join(', '),
category: [node.tags.primary.displayName, ...node.tags.secondary.map((tag) => tag.displayName)],
image: node.images && `https://static.ffx.io/images/${node.images.landscape16x9.mediaId}`,
}));

const items = await Promise.all(list.map((item) => cache.tryGet(item.link, () => getItem(item))));

return {
title: response.data.pageByNavigationPath.page.seo.title,
description: response.data.pageByNavigationPath.page.seo.description,
image: 'https://www.afr.com/apple-touch-icon-1024x1024.png',
link: `https://www.afr.com/${path}`,
item: items,
};
}
Loading

0 comments on commit 51ab456

Please sign in to comment.