feat(route): 添加BestBlogs.dev文章路由 (#16659)
* Add BestBlogs.dev * fix per review comments
This commit is contained in:
parent
d354f81467
commit
afa85c6437
|
|
@ -0,0 +1,107 @@
|
|||
import { Route } from '@/types';
|
||||
import ofetch from '@/utils/ofetch';
|
||||
import { parseDate } from '@/utils/parse-date';
|
||||
|
||||
export const route: Route = {
|
||||
path: '/feeds/:category?',
|
||||
categories: ['programming'],
|
||||
example: '/bestblogs/feeds/featured',
|
||||
parameters: { category: 'the category of articles. Can be `programming`, `ai`, `product`, `business` or `featured`. Default is `featured`' },
|
||||
features: {
|
||||
requireConfig: false,
|
||||
requirePuppeteer: false,
|
||||
antiCrawler: false,
|
||||
supportBT: false,
|
||||
supportPodcast: false,
|
||||
supportScihub: false,
|
||||
},
|
||||
name: '文章列表',
|
||||
maintainers: ['zhenlohuang'],
|
||||
handler,
|
||||
};
|
||||
|
||||
class APIRequest {
|
||||
keyword?: string;
|
||||
qualifiedFilter: string;
|
||||
sourceId?: string;
|
||||
category?: string;
|
||||
timeFilter: string;
|
||||
language: string;
|
||||
userLanguage: string;
|
||||
sortType: string;
|
||||
currentPage: number;
|
||||
pageSize: number;
|
||||
|
||||
constructor({ keyword = '', qualifiedFilter = 'true', sourceId = '', category = '', timeFilter = '1w', language = 'all', userLanguage = 'zh', sortType = 'default', currentPage = 1, pageSize = 10 } = {}) {
|
||||
this.keyword = keyword;
|
||||
this.qualifiedFilter = qualifiedFilter;
|
||||
this.sourceId = sourceId;
|
||||
this.category = category;
|
||||
this.timeFilter = timeFilter;
|
||||
this.language = language;
|
||||
this.userLanguage = userLanguage;
|
||||
this.sortType = sortType;
|
||||
this.currentPage = currentPage;
|
||||
this.pageSize = pageSize;
|
||||
}
|
||||
|
||||
toJson(): string {
|
||||
const requestBody = {
|
||||
keyword: this.keyword,
|
||||
qualifiedFilter: this.qualifiedFilter,
|
||||
sourceId: this.sourceId,
|
||||
category: this.category,
|
||||
timeFilter: this.timeFilter,
|
||||
language: this.language,
|
||||
userLanguage: this.userLanguage,
|
||||
sortType: this.sortType,
|
||||
currentPage: this.currentPage,
|
||||
pageSize: this.pageSize,
|
||||
};
|
||||
|
||||
return JSON.stringify(requestBody);
|
||||
}
|
||||
}
|
||||
|
||||
async function handler(ctx) {
|
||||
const defaultPageSize = 100;
|
||||
const defaultTimeFilter = '1w';
|
||||
const { category = 'featured' } = ctx.req.param();
|
||||
|
||||
const apiRequest = new APIRequest({
|
||||
category,
|
||||
pageSize: defaultPageSize,
|
||||
qualifiedFilter: category === 'featured' ? 'true' : 'false',
|
||||
timeFilter: defaultTimeFilter,
|
||||
});
|
||||
|
||||
const apiUrl = 'https://api.bestblogs.dev/api/resource/list';
|
||||
const response = await ofetch(apiUrl, {
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
method: 'POST',
|
||||
body: apiRequest.toJson(),
|
||||
});
|
||||
|
||||
if (!response || !response.data || !response.data.dataList) {
|
||||
throw new Error('Invalid API response: ' + JSON.stringify(response));
|
||||
}
|
||||
|
||||
const articles = response.data.dataList;
|
||||
|
||||
const items = articles.map((article) => ({
|
||||
title: article.title,
|
||||
link: article.url,
|
||||
description: article.summary,
|
||||
pubDate: parseDate(article.publishDateTimeStr),
|
||||
author: Array.isArray(article.authors) ? article.authors.map((author) => ({ name: author })) : [{ name: article.authors }],
|
||||
category: article.category,
|
||||
}));
|
||||
|
||||
return {
|
||||
title: `Bestblogs.dev`,
|
||||
link: `https://www.bestblogs.dev/feeds`,
|
||||
item: items,
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
import type { Namespace } from '@/types';
|
||||
|
||||
export const namespace: Namespace = {
|
||||
name: 'bestblogs.dev',
|
||||
url: 'www.bestblogs.dev',
|
||||
};
|
||||
Loading…
Reference in New Issue