2024-10-15 16:20:45 +05:30
|
|
|
import express from 'express';
|
2025-02-27 18:24:54 +01:00
|
|
|
import { searchSearxng } from '../lib/searchEngines/searxng';
|
2025-02-27 21:32:26 +01:00
|
|
|
import { searchGooglePSE } from '../lib/searchEngines/google_pse';
|
|
|
|
|
import { getSearchEngineBackend } from '../config';
|
2024-10-15 16:20:45 +05:30
|
|
|
import logger from '../utils/logger';
|
|
|
|
|
|
|
|
|
|
const router = express.Router();
|
|
|
|
|
|
2025-02-28 09:13:11 +01:00
|
|
|
async function performSearch(query: string, site: string) {
|
|
|
|
|
const searchEngine = getSearchEngineBackend();
|
2025-02-27 21:32:26 +01:00
|
|
|
switch (searchEngine) {
|
|
|
|
|
case 'google': {
|
|
|
|
|
const googleResult = await searchGooglePSE(query);
|
|
|
|
|
|
|
|
|
|
return googleResult.originalres.map(item => {
|
|
|
|
|
const imageSources = [
|
|
|
|
|
item.pagemap?.cse_image?.[0]?.src,
|
|
|
|
|
item.pagemap?.cse_thumbnail?.[0]?.src,
|
|
|
|
|
item.pagemap?.metatags?.[0]?.['og:image'],
|
|
|
|
|
item.pagemap?.metatags?.[0]?.['twitter:image'],
|
|
|
|
|
item.pagemap?.metatags?.[0]?.['image'],
|
|
|
|
|
].filter(Boolean); // Remove undefined values
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
title: item.title,
|
|
|
|
|
url: item.link,
|
|
|
|
|
content: item.snippet,
|
|
|
|
|
thumbnail: imageSources[0], // First available image
|
|
|
|
|
img_src: imageSources[0], // Same as thumbnail for consistency
|
|
|
|
|
iframe_src: null,
|
|
|
|
|
author: item.pagemap?.metatags?.[0]?.['og:site_name'] || site,
|
|
|
|
|
publishedDate: item.pagemap?.metatags?.[0]?.['article:published_time']
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case 'searxng': {
|
|
|
|
|
const searxResult = await searchSearxng(query, {
|
|
|
|
|
engines: ['bing news'],
|
|
|
|
|
pageno: 1,
|
|
|
|
|
});
|
|
|
|
|
return searxResult.results;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
throw new Error(`Unknown search engine ${searchEngine}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2024-10-15 16:20:45 +05:30
|
|
|
router.get('/', async (req, res) => {
|
|
|
|
|
try {
|
2025-02-27 21:32:26 +01:00
|
|
|
const queries = [
|
|
|
|
|
{ site: 'businessinsider.com', topic: 'AI' },
|
|
|
|
|
{ site: 'www.exchangewire.com', topic: 'AI' },
|
|
|
|
|
{ site: 'yahoo.com', topic: 'AI' },
|
|
|
|
|
{ site: 'businessinsider.com', topic: 'tech' },
|
|
|
|
|
{ site: 'www.exchangewire.com', topic: 'tech' },
|
|
|
|
|
{ site: 'yahoo.com', topic: 'tech' },
|
|
|
|
|
];
|
|
|
|
|
|
2024-10-15 16:20:45 +05:30
|
|
|
const data = (
|
2025-02-27 21:32:26 +01:00
|
|
|
await Promise.all(
|
|
|
|
|
queries.map(async ({ site, topic }) => {
|
|
|
|
|
try {
|
|
|
|
|
const query = `site:${site} ${topic}`;
|
2025-02-28 09:13:11 +01:00
|
|
|
return await performSearch(query, site);
|
2025-02-27 21:32:26 +01:00
|
|
|
} catch (error) {
|
|
|
|
|
logger.error(`Error searching ${site}: ${error.message}`);
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
)
|
2024-10-15 16:20:45 +05:30
|
|
|
)
|
|
|
|
|
.flat()
|
2025-02-27 21:32:26 +01:00
|
|
|
.sort(() => Math.random() - 0.5)
|
|
|
|
|
.filter(item => item.title && item.url && item.content);
|
2024-10-15 16:20:45 +05:30
|
|
|
|
|
|
|
|
return res.json({ blogs: data });
|
|
|
|
|
} catch (err: any) {
|
|
|
|
|
logger.error(`Error in discover route: ${err.message}`);
|
|
|
|
|
return res.status(500).json({ message: 'An error has occurred' });
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export default router;
|