Perplexica/src/app/api/discover/route.ts

101 lines
2.7 KiB
TypeScript
Raw Normal View History

2025-03-19 13:37:54 +05:30
import { searchSearxng } from '@/lib/searxng';
2025-07-29 13:17:07 +05:30
const websitesForTopic = {
tech: {
query: ['technology news', 'latest tech', 'AI', 'science and innovation'],
links: ['techcrunch.com', 'wired.com', 'theverge.com'],
},
finance: {
query: ['finance news', 'economy', 'stock market', 'investing'],
links: ['bloomberg.com', 'cnbc.com', 'marketwatch.com'],
},
art: {
query: ['art news', 'culture', 'modern art', 'cultural events'],
links: ['artnews.com', 'hyperallergic.com', 'theartnewspaper.com'],
},
sports: {
query: ['sports news', 'latest sports', 'cricket football tennis'],
links: ['espn.com', 'bbc.com/sport', 'skysports.com'],
},
entertainment: {
query: ['entertainment news', 'movies', 'TV shows', 'celebrities'],
links: ['hollywoodreporter.com', 'variety.com', 'deadline.com'],
},
};
2025-03-19 13:37:54 +05:30
2025-07-29 13:17:07 +05:30
type Topic = keyof typeof websitesForTopic;
2025-03-19 13:37:54 +05:30
export const GET = async (req: Request) => {
try {
2025-05-30 08:35:15 +05:30
const params = new URL(req.url).searchParams;
2025-07-29 13:17:07 +05:30
2025-05-30 08:35:15 +05:30
const mode: 'normal' | 'preview' =
(params.get('mode') as 'normal' | 'preview') || 'normal';
2025-07-29 13:17:07 +05:30
const topic: Topic = (params.get('topic') as Topic) || 'tech';
const selectedTopic = websitesForTopic[topic];
2025-05-30 08:35:15 +05:30
let data = [];
if (mode === 'normal') {
const seenUrls = new Set();
2025-05-30 08:35:15 +05:30
data = (
await Promise.all(
selectedTopic.links.flatMap((link) =>
selectedTopic.query.map(async (query) => {
2025-05-30 08:35:15 +05:30
return (
await searchSearxng(`site:${link} ${query}`, {
categories: ['news'],
time_range: ['month'],
language: 'en',
pageno: 1,
})
2025-05-30 08:35:15 +05:30
).results;
}),
),
)
2025-05-30 08:35:15 +05:30
)
.flat()
.filter((item) => {
const url = item.url?.toLowerCase().trim();
if (seenUrls.has(url)) return false;
seenUrls.add(url);
return true;
})
2025-05-30 08:35:15 +05:30
.sort(() => Math.random() - 0.5);
} else {
data = (
await searchSearxng(
2025-07-29 13:17:07 +05:30
`site:${selectedTopic.links[Math.floor(Math.random() * selectedTopic.links.length)]} ${selectedTopic.query[Math.floor(Math.random() * selectedTopic.query.length)]}`,
{
categories: ['news'],
time_range: ['month'],
2025-07-17 22:23:11 +05:30
language: 'en',
pageno: 1,
},
2025-05-30 08:35:15 +05:30
)
).results;
}
2025-03-19 13:37:54 +05:30
return Response.json(
{
blogs: data,
},
{
status: 200,
},
);
} catch (err) {
2025-03-27 11:36:58 +05:30
console.error(`An error occurred in discover route: ${err}`);
2025-03-19 13:37:54 +05:30
return Response.json(
{
message: 'An error has occurred',
},
{
status: 500,
},
);
}
};