|
2 | 2 | // @name Redirect SearXNG On Failure |
3 | 3 | // @description Redirect to a random SearXNG instance in case of error and empty result |
4 | 4 | // @icon https://www.google.com/s2/favicons?sz=64&domain=searx.space |
5 | | -// @version 0.2 |
| 5 | +// @version 0.3 |
6 | 6 | // @downloadURL https://userscripts.codonaft.com/redirect-searxng-on-failure.js |
7 | 7 | // ==/UserScript== |
8 | 8 |
|
|
11 | 11 |
|
12 | 12 | if (performance.getEntriesByType('navigation')[0]?.responseStatus !== 200) return; |
13 | 13 | const b = document.body; |
14 | | - if (!document.head.querySelector('link[type="application/opensearchdescription+xml"]')?.title?.includes('SearXNG') && !b.querySelector('a[href="https://searx.space"]')?.textContent?.includes('Public instances')) return; |
| 14 | + if (!document.head.querySelector('link[type="application/opensearchdescription+xml"]')?.title?.toLowerCase().includes('searx') && ![...b.querySelectorAll('a[href="https://searx.space"]')].find(i => i.textContent?.includes('Public instances'))) return; |
15 | 15 |
|
16 | 16 | const hasResults = (b.querySelector('td.response-time') || !b.querySelector('td.response-error')) && !b.querySelector('div.dialog-error-block')?.innerText.includes('No results were found'); |
17 | 17 | if (hasResults) return; |
18 | 18 |
|
19 | | - console.log('SearXNG: no results'); |
| 19 | + console.log('no SearXNG results'); |
20 | 20 | const url = new URL(window.location.href); |
21 | 21 | if (url.hostname.endsWith('.onion')) { |
22 | 22 | url.host = 'codonaftbvv4j5k7nsrdivbdblycqrng5ls2qkng6lm77svepqjyxgid.onion'; |
|
30 | 30 | } |
31 | 31 | url.pathname = '/searxng'; |
32 | 32 | url.searchParams.set('fast', '0'); |
| 33 | + |
| 34 | + const postRequest = !url.searchParams.has('q'); |
| 35 | + if (postRequest) { |
| 36 | + console.log('post request'); |
| 37 | + const query = b.querySelector('input#q')?.value; |
| 38 | + if (!query) { |
| 39 | + console.log('no query found'); |
| 40 | + return; |
| 41 | + } |
| 42 | + url.searchParams.set('q', query); |
| 43 | + |
| 44 | + const categories = [...b.querySelectorAll('div#categories button.selected')]; |
| 45 | + if (categories.length > 0) { |
| 46 | + url.searchParams.set('categories', categories |
| 47 | + .map(i => i.name.split('_')[1]) |
| 48 | + .filter(i => i) |
| 49 | + .join(',') |
| 50 | + ); |
| 51 | + } |
| 52 | + } |
| 53 | + |
33 | 54 | const params = url.searchParams.toString(); |
34 | 55 | url.search = ''; |
35 | 56 | window.location.replace(`${url.toString()}#${params}`); |
|
0 commit comments