| const axios = require('axios') |
| const config = require('../config/llm.json') |
|
|
| const queriesToday = new Map() |
|
|
| function getDateKey() { |
| return new Date().toISOString().split('T')[0] |
| } |
|
|
| function checkBudget() { |
| const today = getDateKey() |
| const used = queriesToday.get(today) || 0 |
| if (used >= config.webSearch.dailyBudget) return false |
| queriesToday.set(today, used) |
| return true |
| } |
|
|
| function consumeQuery() { |
| const today = getDateKey() |
| const used = (queriesToday.get(today) || 0) + 1 |
| queriesToday.set(today, used) |
| } |
|
|
| async function searchDomains(providerName) { |
| const apiKey = process.env.GOOGLE_CSE_API_KEY || config.webSearch.apiKey |
| const engineId = process.env.GOOGLE_CSE_ENGINE_ID || config.webSearch.engineId |
| const maxResults = config.webSearch.maxResults |
| if (!apiKey || !engineId) return [] |
| if (!checkBudget()) return [] |
|
|
| const queries = [ |
| `${providerName} streaming ver online 2026`, |
| `sitio como ${providerName} peliculas gratis`, |
| `dominio ${providerName} funciona`, |
| ] |
|
|
| const results = [] |
|
|
| for (const query of queries) { |
| try { |
| consumeQuery() |
| const response = await axios.get('https://www.googleapis.com/customsearch/v1', { |
| params: { |
| key: apiKey, |
| cx: engineId, |
| q: query, |
| num: Math.min(maxResults, 10), |
| }, |
| timeout: 10000, |
| }) |
|
|
| const items = response.data.items || [] |
| for (const item of items) { |
| try { |
| const url = new URL(item.link) |
| results.push(url.hostname) |
| } catch { |
| continue |
| } |
| } |
| } catch { |
| continue |
| } |
| } |
|
|
| return [...new Set(results)] |
| } |
|
|
| async function searchAlternativesDomains(providerName) { |
| return searchDomains(providerName) |
| } |
|
|
| module.exports = { |
| searchDomains, |
| searchAlternativesDomains, |
| } |
|
|