diff options
| author | Agando <roduccomm@gmail.com> | 2026-05-30 18:01:51 +0200 |
|---|---|---|
| committer | Agando <roduccomm@gmail.com> | 2026-05-30 18:01:51 +0200 |
| commit | d8bf7fa398d6d928325be9b5c64ca24875bfeef8 (patch) | |
| tree | 49ee4b3586ad68c648d546e6831abc30d8576be5 /modules/core/module-searxng.js | |
| parent | e3fb2d434c4f7317944b7c77781599528d766a39 (diff) | |
auto: 2026-05-30_18:00 changes
Diffstat (limited to 'modules/core/module-searxng.js')
| -rw-r--r-- | modules/core/module-searxng.js | 65 |
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'); |