mirror of
https://github.com/ItzCrazyKns/Perplexica.git
synced 2025-10-14 11:38:14 +00:00
99 lines
2.6 KiB
TypeScript
99 lines
2.6 KiB
TypeScript
import { searchSearxng } from '@/lib/searxng';
|
|
|
|
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'],
|
|
},
|
|
};
|
|
|
|
type Topic = keyof typeof websitesForTopic;
|
|
|
|
export const GET = async (req: Request) => {
|
|
try {
|
|
const params = new URL(req.url).searchParams;
|
|
|
|
const mode: 'normal' | 'preview' =
|
|
(params.get('mode') as 'normal' | 'preview') || 'normal';
|
|
const topic: Topic = (params.get('topic') as Topic) || 'tech';
|
|
|
|
const selectedTopic = websitesForTopic[topic];
|
|
|
|
let data = [];
|
|
|
|
if (mode === 'normal') {
|
|
const seenUrls = new Set();
|
|
|
|
data = (
|
|
await Promise.all(
|
|
selectedTopic.links.flatMap((link) =>
|
|
selectedTopic.query.map(async (query) => {
|
|
return (
|
|
await searchSearxng(`site:${link} ${query}`, {
|
|
engines: ['bing news'],
|
|
pageno: 1,
|
|
language: 'en',
|
|
})
|
|
).results;
|
|
}),
|
|
),
|
|
)
|
|
)
|
|
.flat()
|
|
.filter((item) => {
|
|
const url = item.url?.toLowerCase().trim();
|
|
if (seenUrls.has(url)) return false;
|
|
seenUrls.add(url);
|
|
return true;
|
|
})
|
|
.sort(() => Math.random() - 0.5);
|
|
} else {
|
|
data = (
|
|
await searchSearxng(
|
|
`site:${selectedTopic.links[Math.floor(Math.random() * selectedTopic.links.length)]} ${selectedTopic.query[Math.floor(Math.random() * selectedTopic.query.length)]}`,
|
|
{
|
|
engines: ['bing news'],
|
|
pageno: 1,
|
|
language: 'en',
|
|
},
|
|
)
|
|
).results;
|
|
}
|
|
|
|
return Response.json(
|
|
{
|
|
blogs: data,
|
|
},
|
|
{
|
|
status: 200,
|
|
},
|
|
);
|
|
} catch (err) {
|
|
console.error(`An error occurred in discover route: ${err}`);
|
|
return Response.json(
|
|
{
|
|
message: 'An error has occurred',
|
|
},
|
|
{
|
|
status: 500,
|
|
},
|
|
);
|
|
}
|
|
};
|