aboutsummaryrefslogtreecommitdiff
path: root/modules/core/module-searxng.js
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-05-30 18:01:51 +0200
committerAgando <roduccomm@gmail.com>2026-05-30 18:01:51 +0200
commitd8bf7fa398d6d928325be9b5c64ca24875bfeef8 (patch)
tree49ee4b3586ad68c648d546e6831abc30d8576be5 /modules/core/module-searxng.js
parente3fb2d434c4f7317944b7c77781599528d766a39 (diff)
auto: 2026-05-30_18:00 changes
Diffstat (limited to 'modules/core/module-searxng.js')
-rw-r--r--modules/core/module-searxng.js65
1 files changed, 49 insertions, 16 deletions
diff --git a/modules/core/module-searxng.js b/modules/core/module-searxng.js
index f2c2e72..24db0f5 100644
--- a/modules/core/module-searxng.js
+++ b/modules/core/module-searxng.js
@@ -5,29 +5,41 @@ class SearXNGModule {
}
getHelpInfo() {
return {
- 'search': 'search <query> [--summarize] [--fetch] — Search using SearXNG; --summarize/-s adds AI overview, --fetch/-f fetches page content',
- 's': 's <query> [--summarize] [--fetch] — Alias for search',
+ 'search': 'search <query> [--summarize/-s] [--fetch/-f] [--images/-i] [--videos/-v] — Search using SearXNG; --summarize/-s adds AI overview, --fetch/-f fetches page content, --images/-i searches for images, --videos/-v searches for videos',
+ 's': 's <query> [--summarize] [--fetch] [--images] [--videos] — Alias for search',
+ 'images': 'images <query> — Search for images',
+ 'videos': 'videos <query> — Search for videos',
};
}
registerCommands() {
this.commands['search'] = (args) => this.search(args);
this.commands['s'] = (args) => this.search(args);
+ this.commands['images'] = (args) => this.search(args, 'images');
+ this.commands['videos'] = (args) => this.search(args, 'videos');
}
- async search(args) {
- if (!args[0]) {
- this.terminal.print("Usage: search <query> [--summarize] [--fetch]", "warning");
+ async search(args, forceCategory) {
+ if (!args[0] && !forceCategory) {
+ this.terminal.print("Usage: search <query> [--summarize] [--fetch] [--images] [--videos]", "warning");
this.terminal.print("Example: search quantum computing --summarize", "info");
+ this.terminal.print("Example: search cats --images", "info");
+ this.terminal.print("Example: search cats --videos", "info");
+ this.terminal.print("Shortcuts: images <query> or videos <query>", "info");
return;
}
const argsList = args.slice();
const summarize = argsList.includes('--summarize') || argsList.includes('-s');
const fetchContent = argsList.includes('--fetch') || argsList.includes('-f');
+ const wantImages = forceCategory === 'images' || argsList.includes('--images') || argsList.includes('-i');
+ const wantVideos = forceCategory === 'videos' || argsList.includes('--videos') || argsList.includes('-v');
const query = argsList.filter(a => !a.startsWith('-')).join(' ');
if (!query) { this.terminal.print('Search query is required', 'warning'); return; }
- this.terminal.print(`🔍 Searching: ${query}`, 'info');
+ const category = wantImages ? 'images' : (wantVideos ? 'videos' : 'general');
+ const categoryLabel = category === 'images' ? '🖼️' : (category === 'videos' ? '🎬' : '🔍');
- let params = 'q=' + encodeURIComponent(query);
+ this.terminal.print(`${categoryLabel} Searching ${category}: ${query}`, 'info');
+
+ let params = 'q=' + encodeURIComponent(query) + '&categories=' + category;
if (summarize) params += '&summarize=true';
if (fetchContent) params += '&fetch_content=true';
@@ -46,7 +58,7 @@ class SearXNGModule {
return;
}
- this.terminal.print(`\n=== ${results.length} results (via ${data.source || 'unknown'}) ===\n`, 'success');
+ this.terminal.print(`\n=== ${results.length} results (${category}, via ${data.source || 'unknown'}) ===\n`, 'success');
if (data.ai_overview) {
this.terminal.print('🤖 AI Overview:', 'info');
@@ -57,14 +69,35 @@ class SearXNGModule {
results.forEach((r, i) => {
const snippet = r.content || '';
const contentSnippet = r.content_snippet || '';
- this.terminal.printHTML(`
- <div class="search-result">
- <strong>${i + 1}. <a href="${r.url}" target="_blank" style="color: #00aaff;">${r.title || 'No Title'}</a></strong><br/>
- <span style="color: #888888; font-size: 0.85em;">${r.url || 'No URL'}</span><br/>
- <span style="color: #00ff00; font-size: 0.85em;">${(snippet || '').substring(0, 200)}...</span>
- ${contentSnippet ? `<br/><span style="color: #aaaaaa; font-size: 0.8em;">📄 ${contentSnippet.substring(0, 150)}...</span>` : ''}
- </div>
- `);
+ const imgSrc = r.img_src || r.thumbnail_src || '';
+ const videoThumb = r.thumbnail || '';
+
+ if (category === 'images' && imgSrc) {
+ this.terminal.printHTML(`
+ <div class="search-result search-result-image">
+ <a href="${r.url}" target="_blank"><img src="${imgSrc}" style="max-width:200px;max-height:150px;border-radius:4px;object-fit:cover;" alt="${r.title || ''}" loading="lazy"></a>
+ <br/><strong>${i + 1}. <a href="${r.url}" target="_blank" style="color: #00aaff;">${r.title || 'No Title'}</a></strong>
+ </div>
+ `);
+ } else if (category === 'videos' && videoThumb) {
+ this.terminal.printHTML(`
+ <div class="search-result search-result-video">
+ <a href="${r.url}" target="_blank"><img src="${videoThumb}" style="max-width:200px;max-height:150px;border-radius:4px;object-fit:cover;" alt="${r.title || ''}" loading="lazy"></a>
+ <br/><strong>${i + 1}. <a href="${r.url}" target="_blank" style="color: #00aaff;">${r.title || 'No Title'}</a></strong><br/>
+ <span style="color: #888888; font-size: 0.85em;">${r.url || ''}</span>
+ </div>
+ `);
+ } else {
+ this.terminal.printHTML(`
+ <div class="search-result">
+ <strong>${i + 1}. <a href="${r.url}" target="_blank" style="color: #00aaff;">${r.title || 'No Title'}</a></strong><br/>
+ <span style="color: #888888; font-size: 0.85em;">${r.url || 'No URL'}</span><br/>
+ <span style="color: #00ff00; font-size: 0.85em;">${(snippet || '').substring(0, 200)}...</span>
+ ${contentSnippet ? `<br/><span style="color: #aaaaaa; font-size: 0.8em;">📄 ${contentSnippet.substring(0, 150)}...</span>` : ''}
+ ${imgSrc && category === 'general' ? `<br/><a href="${imgSrc}" target="_blank" style="color: #ff8800; font-size: 0.8em;">🖼️ View image</a>` : ''}
+ </div>
+ `);
+ }
});
} catch (e) {
this.terminal.print('Search failed: ' + e.message, 'error');