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
JavaScript
;
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,
},
};
}