UNPKG

n8n-nodes-duckduckgo-search

Version:

AI Agent-ready n8n community node for DuckDuckGo search. Search the web, images, news, and videos with no API key required and no outbound telemetry. Optionally fetch and extract the main text of result pages or any URL, and get DuckDuckGo Instant Answers

212 lines (211 loc) 7.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.processWebSearchResults = processWebSearchResults; exports.processImageSearchResults = processImageSearchResults; exports.processNewsSearchResults = processNewsSearchResults; exports.processVideoSearchResults = processVideoSearchResults; exports.processError = processError; const utils_1 = require("./utils"); function processWebSearchResults(results, itemIndex, rawResponse) { if (!results || !Array.isArray(results)) { return []; } const processedResults = []; const organicResults = results .filter(item => item && typeof item === 'object' && item.title && item.url) .map((item, index) => ({ json: { position: index + 1, title: (0, utils_1.decodeHtmlEntities)(item.title || '') || '', description: (0, utils_1.decodeHtmlEntities)(item.description || '') || '', url: item.url || '', hostname: item.hostname || '', sourceType: 'web', raw_description: item.description || '', ...((rawResponse === null || rawResponse === void 0 ? void 0 : rawResponse.vqd) && { vqd: rawResponse.vqd }), search_metadata: { engine: 'duckduckgo', timestamp: new Date().toISOString(), result_type: 'organic' } }, pairedItem: { item: itemIndex, }, })); processedResults.push(...organicResults); if (rawResponse === null || rawResponse === void 0 ? void 0 : rawResponse.knowledge_graph) { const kg = rawResponse.knowledge_graph; processedResults.push({ json: { sourceType: 'knowledge_graph', title: kg.title || '', subtitle: kg.subtitle || '', description: kg.description || '', website: kg.website || '', facts: kg.facts || {}, profiles: kg.profiles || [], people_also_search_for: kg.people_also_search_for || [], thumbnail: kg.thumbnail || '', search_metadata: { engine: 'duckduckgo', timestamp: new Date().toISOString(), result_type: 'knowledge_graph' } }, pairedItem: { item: itemIndex } }); } if (rawResponse === null || rawResponse === void 0 ? void 0 : rawResponse.ai_overview) { const ai = rawResponse.ai_overview; processedResults.push({ json: { sourceType: 'ai_overview', answer: ai.answer || '', sources: ai.sources || [], search_metadata: { engine: 'duckduckgo', timestamp: new Date().toISOString(), result_type: 'ai_overview' } }, pairedItem: { item: itemIndex } }); } if ((rawResponse === null || rawResponse === void 0 ? void 0 : rawResponse.top_stories) && Array.isArray(rawResponse.top_stories)) { rawResponse.top_stories.forEach((story, index) => { processedResults.push({ json: { sourceType: 'top_story', position: index + 1, title: story.title || '', link: story.link || '', source: story.source || '', date: story.date || '', snippet: story.snippet || '', thumbnail: story.thumbnail || '', search_metadata: { engine: 'duckduckgo', timestamp: new Date().toISOString(), result_type: 'top_story' } }, pairedItem: { item: itemIndex } }); }); } if ((rawResponse === null || rawResponse === void 0 ? void 0 : rawResponse.related_searches) && Array.isArray(rawResponse.related_searches)) { processedResults.push({ json: { sourceType: 'related_searches', searches: rawResponse.related_searches.map((search) => ({ query: search.query || '', link: search.link || '' })), search_metadata: { engine: 'duckduckgo', timestamp: new Date().toISOString(), result_type: 'related_searches' } }, pairedItem: { item: itemIndex } }); } return processedResults; } function processImageSearchResults(results, itemIndex) { if (!results || !Array.isArray(results)) { return []; } return results .filter(item => item && typeof item === 'object' && item.image) .map((item) => ({ json: { title: (0, utils_1.decodeHtmlEntities)(item.title || '') || '', description: null, url: item.url || '', imageUrl: item.image || '', thumbnailUrl: item.thumbnail || '', width: item.width || null, height: item.height || null, source: item.source || '', sourceType: 'image', }, pairedItem: { item: itemIndex, }, })); } function processNewsSearchResults(results, itemIndex) { return results.map((item) => { var _a; return ({ json: { title: (0, utils_1.decodeHtmlEntities)(item.title), description: (0, utils_1.decodeHtmlEntities)(item.excerpt), url: item.url, imageUrl: item.image, date: (0, utils_1.formatDate)(item.date), relativeTime: item.relativeTime, syndicate: item.syndicate, isOld: item.isOld, isFallback: (_a = item.isFallback) !== null && _a !== void 0 ? _a : false, sourceType: 'news', }, pairedItem: { item: itemIndex, }, }); }); } function processVideoSearchResults(results, itemIndex) { return results.map((item) => { var _a; return ({ json: { title: (0, utils_1.decodeHtmlEntities)(item.title), description: (0, utils_1.decodeHtmlEntities)(item.description), url: item.url, imageUrl: item.image, duration: item.duration, published: item.published, publishedOn: item.publishedOn, publisher: item.publisher, viewCount: item.viewCount, isFallback: (_a = item.isFallback) !== null && _a !== void 0 ? _a : false, sourceType: 'video', }, pairedItem: { item: itemIndex, }, }); }); } function processError(error, itemData, itemIndex, debug = false, operation, options) { const errorMessage = error.message || 'Unknown error occurred'; const errorObject = { ...itemData, success: false, error: errorMessage, timestamp: new Date().toISOString(), }; if (operation) { errorObject.operation = operation; } if (debug) { errorObject.errorDetails = { stack: error.stack, name: error.name, cause: error.cause, }; if (options) { errorObject.requestOptions = options; } } return { json: errorObject, pairedItem: { item: itemIndex, }, }; }