From fd93a0e1541832cb450580fe902b7dc47fc6e96b Mon Sep 17 00:00:00 2001 From: davidovski Date: Mon, 21 Aug 2023 16:29:50 +0100 Subject: [PATCH 01/23] Add EngineRequest class --- engines/ahmia/hidden_service.php | 23 --- engines/bittorrent/merge.php | 6 +- engines/duckduckgo/text.php | 209 +++++--------------------- engines/google/text.php | 249 +++++++------------------------ engines/special.php | 88 +++++++++++ engines/special/currency.php | 11 +- engines/special/definition.php | 12 +- engines/special/ip.php | 22 ++- engines/special/tor.php | 18 ++- engines/special/user_agent.php | 10 +- engines/special/weather.php | 39 ++--- engines/special/wikipedia.php | 28 ++-- engines/text.php | 143 ++++++++++++++++++ misc/tools.php | 80 ---------- search.php | 38 +++-- 15 files changed, 441 insertions(+), 535 deletions(-) create mode 100644 engines/special.php create mode 100644 engines/text.php diff --git a/engines/ahmia/hidden_service.php b/engines/ahmia/hidden_service.php index 5a840f7c..d501b963 100644 --- a/engines/ahmia/hidden_service.php +++ b/engines/ahmia/hidden_service.php @@ -27,27 +27,4 @@ function get_hidden_service_results($query) return $results; } - - function print_hidden_service_results($results) - { - echo "
"; - - foreach($results as $result) - { - $title = $result["title"]; - $url = $result["url"]; - $base_url = $result["base_url"]; - $description = $result["description"]; - - echo "
"; - echo ""; - echo "$base_url"; - echo "

$title

"; - echo "
"; - echo "$description"; - echo "
"; - } - - echo "
"; - } ?> diff --git a/engines/bittorrent/merge.php b/engines/bittorrent/merge.php index 6e105f14..1106ba36 100644 --- a/engines/bittorrent/merge.php +++ b/engines/bittorrent/merge.php @@ -23,7 +23,7 @@ function get_merged_torrent_results($query) $_1337x_url, $sukebei_url ); - + $mh = curl_multi_init(); $chs = $results = array(); @@ -32,7 +32,7 @@ function get_merged_torrent_results($query) $ch = curl_init($url); curl_setopt_array($ch, $config->curl_settings); array_push($chs, $ch); - curl_multi_add_handle($mh, $ch); + curl_multi_add_handle($mh, $ch); } $running = null; @@ -69,7 +69,7 @@ function get_merged_torrent_results($query) break; } } - + $seeders = array_column($results, "seeders"); array_multisort($seeders, SORT_DESC, $results); diff --git a/engines/duckduckgo/text.php b/engines/duckduckgo/text.php index 2bbab7f6..e4bdbac0 100644 --- a/engines/duckduckgo/text.php +++ b/engines/duckduckgo/text.php @@ -1,10 +1,9 @@ query)); $results = array(); // $domain = $config->google_domain; @@ -25,180 +24,46 @@ function get_text_results($query, $page) if (isset($_COOKIE["safe_search"])) $url .= "&safe=medium"; - - $google_ch = curl_init($url); - curl_setopt_array($google_ch, $config->curl_settings); - curl_multi_add_handle($mh, $google_ch); - - $special_search = $page ? 0 : check_for_special_search($query); - $special_ch = null; - $url = null; - if ($special_search != 0) - { - switch ($special_search) - { - case 1: - $url = "https://cdn.moneyconvert.net/api/latest.json"; - break; - case 2: - $split_query = explode(" ", $query); - $reversed_split_q = array_reverse($split_query); - $word_to_define = $reversed_split_q[1]; - $url = "https://api.dictionaryapi.dev/api/v2/entries/en/$word_to_define"; - break; - case 5: - $url = "https://wttr.in/@" . $_SERVER["REMOTE_ADDR"] . "?format=j1"; - break; - case 6: - $url = "https://check.torproject.org/torbulkexitlist"; - break; - case 7: - $wikipedia_language = isset($_COOKIE["wikipedia_language"]) ? trim(htmlspecialchars($_COOKIE["wikipedia_language"])) : $config->wikipedia_language; - if (in_array($wikipedia_language, json_decode(file_get_contents("static/misc/wikipedia_langs.json"), true))) - $url = "https://$wikipedia_language.wikipedia.org/w/api.php?format=json&action=query&prop=extracts%7Cpageimages&exintro&explaintext&redirects=1&pithumbsize=500&titles=$query_encoded"; - break; - } - - if ($url != NULL) - { - $special_ch = curl_init($url); - curl_setopt_array($special_ch, $config->curl_settings); - curl_multi_add_handle($mh, $special_ch); - } + return $url; } - $running = null; - do { - curl_multi_exec($mh, $running); - } while ($running); - - if (curl_getinfo($google_ch)['http_code'] != '200') - { - require "engines/librex/text.php"; - return get_librex_results($query, $page); - } - - - - if ($special_search != 0) - { - $special_result = null; - - switch ($special_search) + public function get_results() { + $results = array(); + $xpath = get_xpath(curl_multi_getcontent($this->ch)); + + foreach($xpath->query("/html/body/div[1]/div[". count($xpath->query('/html/body/div[1]/div')) ."]/div/div/div/div") as $result) { - case 1: - require "engines/special/currency.php"; - $special_result = currency_results($query, curl_multi_getcontent($special_ch)); - break; - case 2: - require "engines/special/definition.php"; - $special_result = definition_results($query, curl_multi_getcontent($special_ch)); - break; - - case 3: - require "engines/special/ip.php"; - $special_result = ip_result(); - break; - case 4: - require "engines/special/user_agent.php"; - $special_result = user_agent_result(); - break; - case 5: - require "engines/special/weather.php"; - $special_result = weather_results(curl_multi_getcontent($special_ch)); - break; - case 6: - require "engines/special/tor.php"; - $special_result = tor_result(curl_multi_getcontent($special_ch)); - break; - case 7: - require "engines/special/wikipedia.php"; - $special_result = wikipedia_results($query, curl_multi_getcontent($special_ch)); - break; - } - - if ($special_result != null) - array_push($results, $special_result); - } - - $xpath = get_xpath(curl_multi_getcontent($google_ch)); - - foreach($xpath->query("/html/body/div[1]/div[". count($xpath->query('/html/body/div[1]/div')) ."]/div/div/div/div") as $result) - { - $url = $xpath->evaluate(".//h2[@class='result__title']//a/@href", $result)[0]; - - if ($url == null) - continue; + $url = $xpath->evaluate(".//h2[@class='result__title']//a/@href", $result)[0]; + + if ($url == null) + continue; - if (!empty($results)) // filter duplicate results, ignore special result - { - if (!array_key_exists("special_response", end($results))) + if (!empty($results)) // filter duplicate results + { if (end($results)["url"] == $url->textContent) continue; - } - - $url = $url->textContent; - - $url = check_for_privacy_frontend($url); - - $title = $xpath->evaluate(".//h2[@class='result__title']", $result)[0]; - $description = $xpath->evaluate(".//a[@class='result__snippet']", $result)[0]; - - array_push($results, - array ( - "title" => htmlspecialchars($title->textContent), - "url" => htmlspecialchars($url), - "base_url" => htmlspecialchars(get_base_url($url)), - "description" => $description == null ? - "No description was provided for this site." : - htmlspecialchars($description->textContent) - ) - ); - } - + } + + $url = $url->textContent; + + $url = check_for_privacy_frontend($url); + + $title = $xpath->evaluate(".//h2[@class='result__title']", $result)[0]; + $description = $xpath->evaluate(".//a[@class='result__snippet']", $result)[0]; + + array_push($results, + array ( + "title" => htmlspecialchars($title->textContent), + "url" => htmlspecialchars($url), + "base_url" => htmlspecialchars(get_base_url($url)), + "description" => $description == null ? + "No description was provided for this site." : + htmlspecialchars($description->textContent) + ) + ); + } return $results; - } - - function print_text_results($results) - { - $special = $results[0]; - if (array_key_exists("special_response", $special)) - { - $response = $special["special_response"]["response"]; - $source = $special["special_response"]["source"]; - - echo "

"; - if (array_key_exists("image", $special["special_response"])) - { - $image_url = $special["special_response"]["image"]; - echo ""; - } - echo $response; - if ($source) - echo "$source"; - echo "

"; - - array_shift($results); - } - - echo "
"; - - foreach($results as $result) - { - $title = $result["title"]; - $url = $result["url"]; - $base_url = $result["base_url"]; - $description = $result["description"]; - - echo "
"; - echo ""; - echo "$base_url"; - echo "

$title

"; - echo "
"; - echo "$description"; - echo "
"; } - echo "
"; } ?> diff --git a/engines/google/text.php b/engines/google/text.php index 75f9082e..323c0e7b 100644 --- a/engines/google/text.php +++ b/engines/google/text.php @@ -1,226 +1,81 @@ google_domain; - $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $config->google_language_site; - $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $config->google_language_results; - $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $config->google_number_of_results; + class GoogleRequest extends EngineRequest { + function get_request_url() + { + $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; - $url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$page"; - error_log($url); + $query_encoded = str_replace("%22", "\"", urlencode($this->query)); + $results = array(); - if (3 > strlen($site_language) && 0 < strlen($site_language)) - $url .= "&hl=$site_language"; + $domain = $this->config->google_domain; + $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $this->config->google_language_site; + $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; + $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; - if (3 > strlen($results_language) && 0 < strlen($results_language)) - $url .= "&lr=lang_$results_language"; + $url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$page"; + error_log($url); - if (3 > strlen($number_of_results) && 0 < strlen($number_of_results)) - $url .= "&num=$number_of_results"; + if (3 > strlen($site_language) && 0 < strlen($site_language)) + $url .= "&hl=$site_language"; - if (isset($_COOKIE["safe_search"])) - $url .= "&safe=medium"; + if (3 > strlen($results_language) && 0 < strlen($results_language)) + $url .= "&lr=lang_$results_language"; - $google_ch = curl_init($url); - curl_setopt_array($google_ch, $config->curl_settings); - curl_multi_add_handle($mh, $google_ch); + if (3 > strlen($number_of_results) && 0 < strlen($number_of_results)) + $url .= "&num=$number_of_results"; - $special_search = $page ? 0 : check_for_special_search($query); - $special_ch = null; - $url = null; - if ($special_search != 0) - { - switch ($special_search) - { - case 1: - $url = "https://cdn.moneyconvert.net/api/latest.json"; - break; - case 2: - $split_query = explode(" ", $query); - $reversed_split_q = array_reverse($split_query); - $word_to_define = $reversed_split_q[1]; - $url = "https://api.dictionaryapi.dev/api/v2/entries/en/$word_to_define"; - break; - case 5: - $url = "https://wttr.in/@" . $_SERVER["REMOTE_ADDR"] . "?format=j1"; - break; - case 6: - $url = "https://check.torproject.org/torbulkexitlist"; - break; - case 7: - $wikipedia_language = isset($_COOKIE["wikipedia_language"]) ? trim(htmlspecialchars($_COOKIE["wikipedia_language"])) : $config->wikipedia_language; - if (in_array($wikipedia_language, json_decode(file_get_contents("static/misc/wikipedia_langs.json"), true))) - $url = "https://$wikipedia_language.wikipedia.org/w/api.php?format=json&action=query&prop=extracts%7Cpageimages&exintro&explaintext&redirects=1&pithumbsize=500&titles=$query_encoded"; - break; - } + if (isset($_COOKIE["safe_search"])) + $url .= "&safe=medium"; - if ($url != NULL) - { - $special_ch = curl_init($url); - curl_setopt_array($special_ch, $config->curl_settings); - curl_multi_add_handle($mh, $special_ch); - } + return $url; } - $running = null; - do { - curl_multi_exec($mh, $running); - } while ($running); - if (curl_getinfo($google_ch)['http_code'] != '200') - { - require "engines/librex/text.php"; - return get_librex_results($query, $page); - } + public function get_results() { + $results = array(); + $xpath = get_xpath(curl_multi_getcontent($this->ch)); - $special_result = array(); - if ($special_search != 0) - { + $didyoumean = $xpath->query(".//a[@class='gL9Hy']")[0]; - switch ($special_search) - { - case 1: - require "engines/special/currency.php"; - $special_result = currency_results($query, curl_multi_getcontent($special_ch)); - break; - case 2: - require "engines/special/definition.php"; - $special_result = definition_results($query, curl_multi_getcontent($special_ch)); - break; - - case 3: - require "engines/special/ip.php"; - $special_result = ip_result(); - break; - case 4: - require "engines/special/user_agent.php"; - $special_result = user_agent_result(); - break; - case 5: - require "engines/special/weather.php"; - $special_result = weather_results(curl_multi_getcontent($special_ch)); - break; - case 6: - require "engines/special/tor.php"; - $special_result = tor_result(curl_multi_getcontent($special_ch)); - break; - case 7: - require "engines/special/wikipedia.php"; - $special_result = wikipedia_results($query, curl_multi_getcontent($special_ch)); - break; - } - } - - $xpath = get_xpath(curl_multi_getcontent($google_ch)); - - $didyoumean = $xpath->query(".//a[@class='gL9Hy']")[0]; + if (!is_null($didyoumean)) + array_push($results, array( + "did_you_mean" => $didyoumean->textContent + )); - if (!is_null($didyoumean)) - $special_result["did_you_mean"] = $didyoumean->textContent; - - if (!empty($special_result)) - array_push($results, $special_result); - - - - foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result) - { - $url = $xpath->evaluate(".//div[@class='yuRUbf']//a/@href", $result)[0]; + foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result) + { + $url = $xpath->evaluate(".//div[@class='yuRUbf']//a/@href", $result)[0]; - if ($url == null) - continue; + if ($url == null) + continue; - if (!empty($results)) // filter duplicate results, ignore special result - { - if (!array_key_exists("special_response", end($results))) + if (!empty($results)) // filter duplicate results, ignore special result + { if (end($results)["url"] == $url->textContent) continue; - } - - $url = $url->textContent; - - $url = check_for_privacy_frontend($url); - - $title = $xpath->evaluate(".//h3", $result)[0]; - $description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0]; - - array_push($results, - array ( - "title" => htmlspecialchars($title->textContent), - "url" => htmlspecialchars($url), - "base_url" => htmlspecialchars(get_base_url($url)), - "description" => $description == null ? - "No description was provided for this site." : - htmlspecialchars($description->textContent) - ) - ); - } - - return $results; - } + } - function print_text_results($results) - { + $url = $url->textContent; - if (empty($results)) - return; + $url = check_for_privacy_frontend($url); - $special = $results[0]; + $title = $xpath->evaluate(".//h3", $result)[0]; + $description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0]; - if (array_key_exists("did_you_mean", $special)) - { - $didyoumean = $special["did_you_mean"]; - $new_url = "/search.php?q=" . urlencode($didyoumean); - echo "

Did you mean "; - echo "$didyoumean"; - echo "?

"; - } - - if (array_key_exists("special_response", $special)) - { - $response = $special["special_response"]["response"]; - $source = $special["special_response"]["source"]; - - echo "

"; - if (array_key_exists("image", $special["special_response"])) - { - $image_url = $special["special_response"]["image"]; - echo ""; + array_push($results, + array ( + "title" => htmlspecialchars($title->textContent), + "url" => htmlspecialchars($url), + "base_url" => htmlspecialchars(get_base_url($url)), + "description" => $description == null ? + "No description was provided for this site." : + htmlspecialchars($description->textContent) + ) + ); } - echo $response; - if ($source) - echo "$source"; - echo "

"; - } - - echo "
"; - foreach($results as $result) - { - if (!array_key_exists("title", $result)) - continue; - - $title = $result["title"]; - $url = $result["url"]; - $base_url = $result["base_url"]; - $description = $result["description"]; - - echo "
"; - echo ""; - echo "$base_url"; - echo "

$title

"; - echo "
"; - echo "$description"; - echo "
"; + return $results; } - - echo "
"; } ?> diff --git a/engines/special.php b/engines/special.php new file mode 100644 index 00000000..e4530574 --- /dev/null +++ b/engines/special.php @@ -0,0 +1,88 @@ += 4) // currency + { + $amount_to_convert = floatval($split_query[0]); + if ($amount_to_convert != 0) + return 1; + } + else if (strpos($query_lower, "mean") && count($split_query) >= 2) // definition + { + return 2; + } + else if (strpos($query_lower, "my") !== false) + { + if (strpos($query_lower, "ip")) + { + return 3; + } + else if (strpos($query_lower, "user agent") || strpos($query_lower, "ua")) + { + return 4; + } + } + else if (strpos($query_lower, "weather") !== false) + { + return 5; + } + else if ($query_lower == "tor") + { + return 6; + } + else if (3 > count(explode(" ", $query))) // wikipedia + { + return 7; + } + + return 0; + } + + function get_special_search_request ($query, $page, $mh, $config) { + $special_search = $page ? 0 : check_for_special_search($query); + $special_request = null; + $url = null; + + if ($special_search == 0) + return null; + + switch ($special_search) { + case 1: + require "engines/special/currency.php"; + $special_request = new CurrencyRequest($query, $mh, $config); + break; + case 2: + require "engines/special/definition.php"; + $special_request = new DefinitionRequest($query, $mh, $config); + break; + case 3: + require "engines/special/ip.php"; + $special_request = new IPRequest($query, $mh, $config); + break; + case 4: + require "engines/special/user_agent.php"; + $special_request = new UserAgentRequest($query, $mh, $config); + break; + case 5: + require "engines/special/weather.php"; + $special_request = new WeatherRequest($query, $mh, $config); + break; + case 6: + require "engines/special/tor.php"; + $special_request = new TorRequest($query, $mh, $config); + break; + case 7: + require "engines/special/wikipedia.php"; + $special_request = new WikipediaRequest($query, $mh, $config); + break; + } + + return $special_request; + } +?> diff --git a/engines/special/currency.php b/engines/special/currency.php index 4c508494..fd11b79f 100644 --- a/engines/special/currency.php +++ b/engines/special/currency.php @@ -1,7 +1,14 @@ ch); + + $split_query = explode(" ", $this->query); $base_currency = strtoupper($split_query[1]); $currency_to_convert = strtoupper($split_query[3]); diff --git a/engines/special/definition.php b/engines/special/definition.php index bd1f3646..819eeb4e 100644 --- a/engines/special/definition.php +++ b/engines/special/definition.php @@ -1,9 +1,14 @@ query); $reversed_split_q = array_reverse($split_query); $word_to_define = $reversed_split_q[1]; + return "https://api.dictionaryapi.dev/api/v2/entries/en/$word_to_define"; + } + + public function get_results() { + $response = curl_multi_getcontent($this->ch); $json_response = json_decode($response, true); @@ -20,5 +25,6 @@ function definition_results($query, $response) ); } + } } ?> diff --git a/engines/special/ip.php b/engines/special/ip.php index 91a16f86..85a1abd2 100644 --- a/engines/special/ip.php +++ b/engines/special/ip.php @@ -1,11 +1,17 @@ array( - "response" => $_SERVER["REMOTE_ADDR"], - "source" => null - ) - ); + class IPRequest extends EngineRequest { + function __construct($query, $mh, $config) { + $this->query = $query; + } + + function get_results() + { + return array( + "special_response" => array( + "response" => $_SERVER["REMOTE_ADDR"], + "source" => null + ) + ); + } } ?> diff --git a/engines/special/tor.php b/engines/special/tor.php index 451bf4e2..d3172d06 100644 --- a/engines/special/tor.php +++ b/engines/special/tor.php @@ -1,18 +1,22 @@ array( "response" => $formatted_response, "source" => $source ) ); + } } ?> diff --git a/engines/special/user_agent.php b/engines/special/user_agent.php index 336606e1..d5575744 100644 --- a/engines/special/user_agent.php +++ b/engines/special/user_agent.php @@ -1,11 +1,17 @@ query = $query; + } + + function get_results() + { return array( "special_response" => array( "response" => $_SERVER["HTTP_USER_AGENT"], "source" => null ) ); + } } ?> diff --git a/engines/special/weather.php b/engines/special/weather.php index f98b1587..2d1d0fba 100644 --- a/engines/special/weather.php +++ b/engines/special/weather.php @@ -1,26 +1,31 @@ ch); $json_response = json_decode($response, true); - if ($json_response) - { - $current_weather = $json_response["current_condition"][0]; + if (!$json_response) + return array(); - $temp_c = $current_weather["temp_C"]; - $temp_f = $current_weather["temp_F"]; - $description = $current_weather["weatherDesc"][0]["value"]; + $current_weather = $json_response["current_condition"][0]; - $formatted_response = "$description - $temp_c °C | $temp_f °F"; + $temp_c = $current_weather["temp_C"]; + $temp_f = $current_weather["temp_F"]; + $description = $current_weather["weatherDesc"][0]["value"]; - $source = "https://wttr.in"; - return array( - "special_response" => array( - "response" => htmlspecialchars($formatted_response), - "source" => $source - ) - ); - } + $formatted_response = "$description - $temp_c °C | $temp_f °F"; + $source = "https://wttr.in"; + return array( + "special_response" => array( + "response" => htmlspecialchars($formatted_response), + "source" => $source + ) + ); + } } ?> diff --git a/engines/special/wikipedia.php b/engines/special/wikipedia.php index bb8fd622..fdfd2298 100644 --- a/engines/special/wikipedia.php +++ b/engines/special/wikipedia.php @@ -1,21 +1,27 @@ wikipedia_language = isset($_COOKIE["wikipedia_language"]) ? trim(htmlspecialchars($_COOKIE["wikipedia_language"])) : $this->config->wikipedia_language; + $query_encoded = urlencode($this->query); - $query_encoded = urlencode($query); + if (in_array($this->wikipedia_language, json_decode(file_get_contents("static/misc/wikipedia_langs.json"), true))) + return "https://$this->wikipedia_language.wikipedia.org/w/api.php?format=json&action=query&prop=extracts%7Cpageimages&exintro&explaintext&redirects=1&pithumbsize=500&titles=$query_encoded"; - $json_response = json_decode($response, true); + return ""; + } - $first_page = array_values($json_response["query"]["pages"])[0]; + public function get_results() { + $response = curl_multi_getcontent($this->ch); - if (!array_key_exists("missing", $first_page)) - { - $description = substr($first_page["extract"], 0, 250) . "..."; + $json_response = json_decode($response, true); - $wikipedia_language = isset($_COOKIE["wikipedia_language"]) ? trim(htmlspecialchars($_COOKIE["wikipedia_language"])) : $config->wikipedia_language; + $first_page = array_values($json_response["query"]["pages"])[0]; + + if (array_key_exists("missing", $first_page)) + return array(); + $description = substr($first_page["extract"], 0, 250) . "..."; - $source = check_for_privacy_frontend("https://$wikipedia_language.wikipedia.org/wiki/$query"); + $source = check_for_privacy_frontend("https://$wikipedia_language.wikipedia.org/wiki/$this->query"); $response = array( "special_response" => array( "response" => htmlspecialchars($description), diff --git a/engines/text.php b/engines/text.php new file mode 100644 index 00000000..713602b6 --- /dev/null +++ b/engines/text.php @@ -0,0 +1,143 @@ +preferred_engines['text']; + if (is_null($engine)) + $engine = "google"; + $query_parts = explode(" ", $query); + $last_word_query = end($query_parts); + if (substr($query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") + check_ddg_bang($query); + + if ($engine == "google") { + require "engines/google/text.php"; + $engine_request = new GoogleRequest($query, $mh, $config); + } + + if ($engine == "duckduckgo") { + require "engines/duckduckgo/text.php"; + $engine_request = new DuckDuckGoRequest($query, $mh, $config); + } + + require "engines/special.php"; + $special_request = get_special_search_request($query, $page, $mh, $config); + + $running = null; + + do { + curl_multi_exec($mh, $running); + } while ($running); + + if (curl_getinfo($)['http_code'] != '200') + { + require "engines/librex/text.php"; + return get_librex_results($query, $page); + } + + $results = $engine_request->get_results(); + + $special_result = $special_request->get_results(); + if ($special_result) + $results = array_merge(array($special_result), $results); + + return $results; + } + + function print_text_results($results) + { + + if (empty($results)) + return; + + $special = $results[0]; + + if (array_key_exists("did_you_mean", $special)) + { + $didyoumean = $special["did_you_mean"]; + $new_url = "/search.php?q=" . urlencode($didyoumean); + echo "

Did you mean "; + echo "$didyoumean"; + echo "?

"; + } + + if (array_key_exists("special_response", $special)) + { + $response = $special["special_response"]["response"]; + $source = $special["special_response"]["source"]; + + echo "

"; + if (array_key_exists("image", $special["special_response"])) + { + $image_url = $special["special_response"]["image"]; + echo ""; + } + echo $response; + if ($source) + echo "$source"; + echo "

"; + } + + echo "
"; + + foreach($results as $result) + { + if (!array_key_exists("title", $result)) + continue; + + $title = $result["title"]; + $url = $result["url"]; + $base_url = $result["base_url"]; + $description = $result["description"]; + + echo "
"; + echo ""; + echo "$base_url"; + echo "

$title

"; + echo "
"; + echo "$description"; + echo "
"; + } + + echo "
"; + } + + function check_ddg_bang($query) + { + + $bangs_json = file_get_contents("static/misc/ddg_bang.json"); + $bangs = json_decode($bangs_json, true); + + if (substr($query, 0, 1) == "!") + $search_word = substr(explode(" ", $query)[0], 1); + else + $search_word = substr(end(explode(" ", $query)), 1); + + $bang_url = null; + + foreach($bangs as $bang) + { + if ($bang["t"] == $search_word) + { + $bang_url = $bang["u"]; + break; + } + } + + if ($bang_url) + { + $bang_query_array = explode("!" . $search_word, $query); + $bang_query = trim(implode("", $bang_query_array)); + + $request_url = str_replace("{{{s}}}", str_replace('%26quot%3B','%22', urlencode($bang_query)), $bang_url); + $request_url = check_for_privacy_frontend($request_url); + + header("Location: " . $request_url); + die(); + } + } + +?> diff --git a/misc/tools.php b/misc/tools.php index 9ea5f529..b70ba0e9 100644 --- a/misc/tools.php +++ b/misc/tools.php @@ -101,86 +101,6 @@ function check_for_privacy_frontend($url) return $url; } - function check_ddg_bang($query) - { - - $bangs_json = file_get_contents("static/misc/ddg_bang.json"); - $bangs = json_decode($bangs_json, true); - - if (substr($query, 0, 1) == "!") - $search_word = substr(explode(" ", $query)[0], 1); - else - $search_word = substr(end(explode(" ", $query)), 1); - - $bang_url = null; - - foreach($bangs as $bang) - { - if ($bang["t"] == $search_word) - { - $bang_url = $bang["u"]; - break; - } - } - - if ($bang_url) - { - $bang_query_array = explode("!" . $search_word, $query); - $bang_query = trim(implode("", $bang_query_array)); - - $request_url = str_replace("{{{s}}}", str_replace('%26quot%3B','%22', urlencode($bang_query)), $bang_url); - $request_url = check_for_privacy_frontend($request_url); - - header("Location: " . $request_url); - die(); - } - } - - function check_for_special_search($query) - { - if (isset($_COOKIE["disable_special"])) - return 0; - - $query_lower = strtolower($query); - $split_query = explode(" ", $query); - - if (strpos($query_lower, "to") && count($split_query) >= 4) // currency - { - $amount_to_convert = floatval($split_query[0]); - if ($amount_to_convert != 0) - return 1; - } - else if (strpos($query_lower, "mean") && count($split_query) >= 2) // definition - { - return 2; - } - else if (strpos($query_lower, "my") !== false) - { - if (strpos($query_lower, "ip")) - { - return 3; - } - else if (strpos($query_lower, "user agent") || strpos($query_lower, "ua")) - { - return 4; - } - } - else if (strpos($query_lower, "weather") !== false) - { - return 5; - } - else if ($query_lower == "tor") - { - return 6; - } - else if (3 > count(explode(" ", $query))) // wikipedia - { - return 7; - } - - return 0; - } - function get_xpath($response) { $htmlDom = new DOMDocument; diff --git a/search.php b/search.php index 27d45ec1..e1bd8b63 100644 --- a/search.php +++ b/search.php @@ -3,11 +3,37 @@ $config = require "config.php"; require "misc/tools.php"; + $query = trim($_REQUEST["q"]); + + class EngineRequest { + public $ch; + public $query; + + function __construct($query, $mh, $config) { + $this->query = $query; + $this->config = $config; + + $url = $this->get_request_url(); + if ($url) { + $this->ch = curl_init($url); + curl_setopt_array($this->ch, $config->curl_settings); + curl_multi_add_handle($mh, $this->ch); + } + } + + public function get_request_url() { + return ""; + } + + public function get_results() { + return array(); + } + } + ?> <?php - $query = trim($_REQUEST["q"]); echo $query; ?> - LibreY @@ -56,20 +82,12 @@ preferred_engines['text']; - if (is_null($engine)) - $engine = "google"; - $query_parts = explode(" ", $query); - $last_word_query = end($query_parts); - if (substr($query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") - check_ddg_bang($query); - require "engines/$engine/text.php"; + require "engines/text.php"; $results = get_text_results($query, $page); print_elapsed_time($start_time); print_text_results($results); From f59f94fdd5fb18bd2aae9893edd3f9e270da9191 Mon Sep 17 00:00:00 2001 From: davidovski Date: Mon, 21 Aug 2023 17:31:20 +0100 Subject: [PATCH 02/23] include different print and fetch functions for search --- api.php | 5 +- engines/ahmia/hidden_service.php | 3 +- engines/bittorrent/merge.php | 4 +- engines/duckduckgo/text.php | 8 +-- engines/invidious/video.php | 5 +- engines/qwant/image.php | 4 +- engines/text.php | 8 +-- search.php | 96 +++++++++++++------------------- 8 files changed, 54 insertions(+), 79 deletions(-) diff --git a/api.php b/api.php index 4413a486..3dcbe1ad 100644 --- a/api.php +++ b/api.php @@ -26,10 +26,7 @@ switch ($type) { case 0: - $engine=$config->preferred_engines['text']; - if (is_null($engine)) - $engine = "google"; - require "engines/$engine/text.php"; + require "engines/text.php"; $results = get_text_results($query, $page); break; case 1: diff --git a/engines/ahmia/hidden_service.php b/engines/ahmia/hidden_service.php index d501b963..16a95dbe 100644 --- a/engines/ahmia/hidden_service.php +++ b/engines/ahmia/hidden_service.php @@ -1,5 +1,5 @@ diff --git a/engines/bittorrent/merge.php b/engines/bittorrent/merge.php index 1106ba36..9126ac9b 100644 --- a/engines/bittorrent/merge.php +++ b/engines/bittorrent/merge.php @@ -1,6 +1,6 @@ "; diff --git a/engines/duckduckgo/text.php b/engines/duckduckgo/text.php index e4bdbac0..0b4455bb 100644 --- a/engines/duckduckgo/text.php +++ b/engines/duckduckgo/text.php @@ -6,11 +6,11 @@ function get_request_url() $query_encoded = str_replace("%22", "\"", urlencode($this->query)); $results = array(); - // $domain = $config->google_domain; + // $domain = $this->config->google_domain; $domain = 'com'; - $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $config->google_language_site; - $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $config->google_language_results; - $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $config->google_number_of_results; + $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $this->config->google_language_site; + $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; + $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; $url = "https://html.duckduckgo.$domain/html/?q=$query_encoded&kd=-1&s=" . 3 * $page; if (3 > strlen($site_language) && 0 < strlen($site_language)) diff --git a/engines/invidious/video.php b/engines/invidious/video.php index 1d7076b5..df32f5e1 100644 --- a/engines/invidious/video.php +++ b/engines/invidious/video.php @@ -1,6 +1,5 @@ invidious_instance_for_video_results; @@ -38,7 +37,7 @@ function get_video_results($query) return $results; } - function print_video_results($results) + function print_search_results($results) { echo "
"; diff --git a/engines/qwant/image.php b/engines/qwant/image.php index d5b7a160..9ecc8f4e 100644 --- a/engines/qwant/image.php +++ b/engines/qwant/image.php @@ -1,5 +1,5 @@ "; diff --git a/engines/text.php b/engines/text.php index 713602b6..b225316b 100644 --- a/engines/text.php +++ b/engines/text.php @@ -1,6 +1,5 @@ ch)['http_code'] != '200') { require "engines/librex/text.php"; return get_librex_results($query, $page); @@ -47,8 +46,7 @@ function get_text_results($query, $page) return $results; } - function print_text_results($results) - { + function print_search_results($results) { if (empty($results)) return; diff --git a/search.php b/search.php index e1bd8b63..2f163697 100644 --- a/search.php +++ b/search.php @@ -30,6 +30,40 @@ public function get_results() { } } + function import_search_category($type) { + switch ($type) + { + case 0: + require "engines/text.php"; + break; + + case 1: + require "engines/qwant/image.php"; + break; + + case 2: + require "engines/invidious/video.php"; + break; + + case 3: + if ($config->disable_bittorent_search) + echo "

The host disabled this feature! :C

"; + else + require "engines/bittorrent/merge.php"; + break; + + case 4: + if ($config->disable_hidden_service_search) + echo "

The host disabled this feature! :C

"; + else + require "engines/ahmia/hidden_service.php"; + break; + + default: + require "engines/text.php"; + break; + } + } ?> @@ -84,64 +118,10 @@ public function get_results() { <?php $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; $start_time = microtime(true); - switch ($type) - { - case 0: - require "engines/text.php"; - $results = get_text_results($query, $page); - print_elapsed_time($start_time); - print_text_results($results); - break; - - case 1: - require "engines/qwant/image.php"; - $results = get_image_results($query_encoded, $page); - print_elapsed_time($start_time); - print_image_results($results); - break; - - case 2: - require "engines/invidious/video.php"; - $results = get_video_results($query_encoded); - print_elapsed_time($start_time); - print_video_results($results); - break; - - case 3: - if ($config->disable_bittorent_search) - echo "<p class=\"text-result-container\">The host disabled this feature! :C</p>"; - else - { - require "engines/bittorrent/merge.php"; - $results = get_merged_torrent_results($query_encoded); - print_elapsed_time($start_time); - print_merged_torrent_results($results); - } - break; - - case 4: - if ($config->disable_hidden_service_search) - echo "<p class=\"text-result-container\">The host disabled this feature! :C</p>"; - else - { - require "engines/ahmia/hidden_service.php"; - $results = get_hidden_service_results($query_encoded); - print_elapsed_time($start_time); - print_hidden_service_results($results); - } - break; - - default: - $query_parts = explode(" ", $query); - $last_word_query = end($query_parts); - if (substr($query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") - check_ddg_bang($query); - require "engines/google/text.php"; - $results = get_text_results($query, $page); - print_elapsed_time($start_time); - print_text_results($results); - break; - } + import_search_category($type); + $results = fetch_search_results($query, $page); + print_elapsed_time($start_time); + print_search_results($results); if (2 > $type) From 74da63dab2b65e5ad1d458f2814eb1c5bc89ec3e Mon Sep 17 00:00:00 2001 From: davidovski <david@davidovski.xyz> Date: Mon, 21 Aug 2023 21:55:24 +0100 Subject: [PATCH 03/23] Make search categories type of request --- engines/duckduckgo/text.php | 35 ++++---- engines/google/text.php | 3 +- engines/invidious/video.php | 113 +++++++++++------------ engines/qwant/image.php | 100 ++++++++++----------- engines/special.php | 15 ++-- engines/special/ip.php | 2 +- engines/special/user_agent.php | 3 +- engines/special/wikipedia.php | 2 +- engines/text.php | 160 ++++++++++++++++----------------- search.php | 40 +++++---- 10 files changed, 238 insertions(+), 235 deletions(-) diff --git a/engines/duckduckgo/text.php b/engines/duckduckgo/text.php index 0b4455bb..a7817107 100644 --- a/engines/duckduckgo/text.php +++ b/engines/duckduckgo/text.php @@ -2,29 +2,28 @@ class DuckDuckGoRequest extends EngineRequest { function get_request_url() { - $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; - $query_encoded = str_replace("%22", "\"", urlencode($this->query)); - $results = array(); + $query_encoded = str_replace("%22", "\"", urlencode($this->query)); + $results = array(); - // $domain = $this->config->google_domain; - $domain = 'com'; - $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $this->config->google_language_site; - $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; - $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; + // $domain = $this->config->google_domain; + $domain = 'com'; + $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $this->config->google_language_site; + $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; + $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; - $url = "https://html.duckduckgo.$domain/html/?q=$query_encoded&kd=-1&s=" . 3 * $page; - if (3 > strlen($site_language) && 0 < strlen($site_language)) - $url .= "&hl=$site_language"; + $url = "https://html.duckduckgo.$domain/html/?q=$query_encoded&kd=-1&s=" . 3 * $this->page; + if (3 > strlen($site_language) && 0 < strlen($site_language)) + $url .= "&hl=$site_language"; - if (3 > strlen($results_language) && 0 < strlen($results_language)) - $url .= "&lr=lang_$results_language"; + if (3 > strlen($results_language) && 0 < strlen($results_language)) + $url .= "&lr=lang_$results_language"; - if (3 > strlen($number_of_results) && 0 < strlen($number_of_results)) - $url .= "&num=$number_of_results"; + if (3 > strlen($number_of_results) && 0 < strlen($number_of_results)) + $url .= "&num=$number_of_results"; - if (isset($_COOKIE["safe_search"])) - $url .= "&safe=medium"; - return $url; + if (isset($_COOKIE["safe_search"])) + $url .= "&safe=medium"; + return $url; } public function get_results() { diff --git a/engines/google/text.php b/engines/google/text.php index 323c0e7b..eb2ac26c 100644 --- a/engines/google/text.php +++ b/engines/google/text.php @@ -2,7 +2,6 @@ class GoogleRequest extends EngineRequest { function get_request_url() { - $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; $query_encoded = str_replace("%22", "\"", urlencode($this->query)); $results = array(); @@ -12,7 +11,7 @@ function get_request_url() $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; - $url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$page"; + $url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$this->page"; error_log($url); if (3 > strlen($site_language) && 0 < strlen($site_language)) diff --git a/engines/invidious/video.php b/engines/invidious/video.php index df32f5e1..92dd6cff 100644 --- a/engines/invidious/video.php +++ b/engines/invidious/video.php @@ -1,67 +1,70 @@ <?php - function fetch_search_results($query, $page) { - global $config; - $instance_url = $config->invidious_instance_for_video_results; - - $url = "$instance_url/api/v1/search?q=$query"; - $response = request($url); - $json_response = json_decode($response, true); - $results = array(); + class VideoSearch extends EngineRequest { + public function get_request_url() { + $this->instance_url = $this->config->invidious_instance_for_video_results; + $query = urlencode($this->query); + return "$this->instance_url/api/v1/search?q=$query"; + } + + public function get_results() { + $results = array(); + $response = curl_multi_getcontent($this->ch); + $json_response = json_decode($response, true); - foreach ($json_response as $response) - { - if ($response["type"] == "video") + foreach ($json_response as $response) { - $title = $response["title"]; - $url = "https://youtube.com/watch?v=" . $response["videoId"]; - $url = check_for_privacy_frontend($url); - $uploader = $response["author"]; - $views = $response["viewCount"]; - $date = $response["publishedText"]; - $thumbnail = $instance_url . "/vi/" . explode("/vi/" ,$response["videoThumbnails"][4]["url"])[1]; + if ($response["type"] == "video") + { + $title = $response["title"]; + $url = "https://youtube.com/watch?v=" . $response["videoId"]; + $url = check_for_privacy_frontend($url); + $uploader = $response["author"]; + $views = $response["viewCount"]; + $date = $response["publishedText"]; + $thumbnail = $this->instance_url . "/vi/" . explode("/vi/" ,$response["videoThumbnails"][4]["url"])[1]; - array_push($results, - array ( - "title" => htmlspecialchars($title), - "url" => htmlspecialchars($url), - "base_url" => htmlspecialchars(get_base_url($url)), - "uploader" => htmlspecialchars($uploader), - "views" => htmlspecialchars($views), - "date" => htmlspecialchars($date), - "thumbnail" => htmlspecialchars($thumbnail) - ) - ); + array_push($results, + array ( + "title" => htmlspecialchars($title), + "url" => htmlspecialchars($url), + "base_url" => htmlspecialchars(get_base_url($url)), + "uploader" => htmlspecialchars($uploader), + "views" => htmlspecialchars($views), + "date" => htmlspecialchars($date), + "thumbnail" => htmlspecialchars($thumbnail) + ) + ); + } } - } - return $results; - } + return $results; + } - function print_search_results($results) - { - echo "<div class=\"text-result-container\">"; + public function print_results($results) { + echo "<div class=\"text-result-container\">"; - foreach($results as $result) - { - $title = $result["title"]; - $url = $result["url"]; - $base_url = $result["base_url"]; - $uploader = $result["uploader"]; - $views = $result["views"]; - $date = $result["date"]; - $thumbnail = $result["thumbnail"]; + foreach($results as $result) + { + $title = $result["title"]; + $url = $result["url"]; + $base_url = $result["base_url"]; + $uploader = $result["uploader"]; + $views = $result["views"]; + $date = $result["date"]; + $thumbnail = $result["thumbnail"]; - echo "<div class=\"text-result-wrapper\">"; - echo "<a href=\"$url\">"; - echo "$base_url"; - echo "<h2>$title</h2>"; - echo "<img class=\"video-img\" src=\"image_proxy.php?url=$thumbnail\">"; - echo "<br>"; - echo "<span>$uploader - $date - $views views</span>"; - echo "</a>"; - echo "</div>"; - } + echo "<div class=\"text-result-wrapper\">"; + echo "<a href=\"$url\">"; + echo "$base_url"; + echo "<h2>$title</h2>"; + echo "<img class=\"video-img\" src=\"image_proxy.php?url=$thumbnail\">"; + echo "<br>"; + echo "<span>$uploader - $date - $views views</span>"; + echo "</a>"; + echo "</div>"; + } - echo "</div>"; + echo "</div>"; + } } ?> diff --git a/engines/qwant/image.php b/engines/qwant/image.php index 9ecc8f4e..725db78b 100644 --- a/engines/qwant/image.php +++ b/engines/qwant/image.php @@ -1,60 +1,60 @@ <?php - function fetch_search_results($query, $page) - { - global $config; + class QwantImageSearch extends EngineRequest { + public function get_request_url() { + $page = $this->page / 10 + 1; // qwant has a different page system + $query = urlencode($this->query); + + return "https://lite.qwant.com/?q=$query&t=images&p=$page"; + } - $page = $page / 10 + 1; // qwant has a different page system + public function get_results() { + $results = array(); + $xpath = get_xpath(curl_multi_getcontent($this->ch)); + + foreach($xpath->query("//a[@rel='noopener']") as $result) + { + $image = $xpath->evaluate(".//img", $result)[0]; + + if ($image) + { + $encoded_url = $result->getAttribute("href"); + $encoded_url_split1 = explode("==/", $encoded_url)[1]; + $encoded_url_split2 = explode("?position", $encoded_url_split1)[0]; + $real_url = urldecode(base64_decode($encoded_url_split2)); + $real_url = check_for_privacy_frontend($real_url); + + $alt = $image->getAttribute("alt"); + $thumbnail = urlencode($image->getAttribute("src")); + + array_push($results, + array ( + "thumbnail" => urldecode(htmlspecialchars($thumbnail)), + "alt" => htmlspecialchars($alt), + "url" => htmlspecialchars($real_url) + ) + ); - $url = "https://lite.qwant.com/?q=$query&t=images&p=$page"; - $response = request($url); - $xpath = get_xpath($response); - - $results = array(); - - foreach($xpath->query("//a[@rel='noopener']") as $result) - { - $image = $xpath->evaluate(".//img", $result)[0]; + } + } - if ($image) - { - $encoded_url = $result->getAttribute("href"); - $encoded_url_split1 = explode("==/", $encoded_url)[1]; - $encoded_url_split2 = explode("?position", $encoded_url_split1)[0]; - $real_url = urldecode(base64_decode($encoded_url_split2)); - $real_url = check_for_privacy_frontend($real_url); - - $alt = $image->getAttribute("alt"); - $thumbnail = urlencode($image->getAttribute("src")); - - array_push($results, - array ( - "thumbnail" => urldecode(htmlspecialchars($thumbnail)), - "alt" => htmlspecialchars($alt), - "url" => htmlspecialchars($real_url) - ) - ); - - } + return $results; } + + public function print_results($results) { + echo "<div class=\"image-result-container\">"; - return $results; - } - - function print_search_results($results) - { - echo "<div class=\"image-result-container\">"; - - foreach($results as $result) - { - $thumbnail = urlencode($result["thumbnail"]); - $alt = $result["alt"]; - $url = $result["url"]; + foreach($results as $result) + { + $thumbnail = urlencode($result["thumbnail"]); + $alt = $result["alt"]; + $url = $result["url"]; - echo "<a title=\"$alt\" href=\"$url\" target=\"_blank\">"; - echo "<img src=\"image_proxy.php?url=$thumbnail\">"; - echo "</a>"; - } + echo "<a title=\"$alt\" href=\"$url\" target=\"_blank\">"; + echo "<img src=\"image_proxy.php?url=$thumbnail\">"; + echo "</a>"; + } - echo "</div>"; + echo "</div>"; + } } ?> diff --git a/engines/special.php b/engines/special.php index e4530574..15a4700d 100644 --- a/engines/special.php +++ b/engines/special.php @@ -1,5 +1,6 @@ <?php + // TODO make this a EngineRequest also function check_for_special_search($query) { if (isset($_COOKIE["disable_special"])) return 0; @@ -55,31 +56,31 @@ function get_special_search_request ($query, $page, $mh, $config) { switch ($special_search) { case 1: require "engines/special/currency.php"; - $special_request = new CurrencyRequest($query, $mh, $config); + $special_request = new CurrencyRequest($query, $page, $mh, $config); break; case 2: require "engines/special/definition.php"; - $special_request = new DefinitionRequest($query, $mh, $config); + $special_request = new DefinitionRequest($query, $page, $mh, $config); break; case 3: require "engines/special/ip.php"; - $special_request = new IPRequest($query, $mh, $config); + $special_request = new IPRequest($query, $page, $mh, $config); break; case 4: require "engines/special/user_agent.php"; - $special_request = new UserAgentRequest($query, $mh, $config); + $special_request = new UserAgentRequest($query, $page, $mh, $config); break; case 5: require "engines/special/weather.php"; - $special_request = new WeatherRequest($query, $mh, $config); + $special_request = new WeatherRequest($query, $page, $mh, $config); break; case 6: require "engines/special/tor.php"; - $special_request = new TorRequest($query, $mh, $config); + $special_request = new TorRequest($query, $page, $mh, $config); break; case 7: require "engines/special/wikipedia.php"; - $special_request = new WikipediaRequest($query, $mh, $config); + $special_request = new WikipediaRequest($query, $page, $mh, $config); break; } diff --git a/engines/special/ip.php b/engines/special/ip.php index 85a1abd2..1e7cab9e 100644 --- a/engines/special/ip.php +++ b/engines/special/ip.php @@ -1,6 +1,6 @@ <?php class IPRequest extends EngineRequest { - function __construct($query, $mh, $config) { + function __construct($query, $page, $mh, $config) { $this->query = $query; } diff --git a/engines/special/user_agent.php b/engines/special/user_agent.php index d5575744..aab3d59e 100644 --- a/engines/special/user_agent.php +++ b/engines/special/user_agent.php @@ -1,7 +1,8 @@ <?php class UserAgentRequest extends EngineRequest { - function __construct($query, $mh, $config) { + function __construct($query, $page, $mh, $config) { $this->query = $query; + $this->page = $page; } function get_results() diff --git a/engines/special/wikipedia.php b/engines/special/wikipedia.php index fdfd2298..8f5189e2 100644 --- a/engines/special/wikipedia.php +++ b/engines/special/wikipedia.php @@ -21,7 +21,7 @@ public function get_results() { return array(); $description = substr($first_page["extract"], 0, 250) . "..."; - $source = check_for_privacy_frontend("https://$wikipedia_language.wikipedia.org/wiki/$this->query"); + $source = check_for_privacy_frontend("https://$this->wikipedia_language.wikipedia.org/wiki/$this->query"); $response = array( "special_response" => array( "response" => htmlspecialchars($description), diff --git a/engines/text.php b/engines/text.php index b225316b..f9d78d33 100644 --- a/engines/text.php +++ b/engines/text.php @@ -1,106 +1,100 @@ <?php - function fetch_search_results($query, $page) { - global $config; - - $mh = curl_multi_init(); - - $engine=$config->preferred_engines['text']; - if (is_null($engine)) - $engine = "google"; - $query_parts = explode(" ", $query); - $last_word_query = end($query_parts); - if (substr($query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") - check_ddg_bang($query); - - if ($engine == "google") { - require "engines/google/text.php"; - $engine_request = new GoogleRequest($query, $mh, $config); - } + class TextSearch extends EngineRequest { + public function __construct($query, $page, $mh, $config) { + $engine=$config->preferred_engines['text']; + if (is_null($engine)) + $engine = "google"; + $query_parts = explode(" ", $query); + $last_word_query = end($query_parts); + if (substr($query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") + check_ddg_bang($query); + + if ($engine == "google") { + require "engines/google/text.php"; + $this->engine_request = new GoogleRequest($query, $page, $mh, $config); + } + + if ($engine == "duckduckgo") { + require "engines/duckduckgo/text.php"; + $this->engine_request = new DuckDuckGoRequest($query, $page, $mh, $config); + } - if ($engine == "duckduckgo") { - require "engines/duckduckgo/text.php"; - $engine_request = new DuckDuckGoRequest($query, $mh, $config); + require "engines/special.php"; + $this->special_request = get_special_search_request($query, $page, $mh, $config); } - require "engines/special.php"; - $special_request = get_special_search_request($query, $page, $mh, $config); + public function get_results() { + if (curl_getinfo($this->engine_request->ch)['http_code'] != '200') + { + require "engines/librex/text.php"; + return get_librex_results($this->query, $this->page); + } - $running = null; + $results = $this->engine_request->get_results(); - do { - curl_multi_exec($mh, $running); - } while ($running); + $special_result = $this->special_request->get_results(); + if ($special_result) + $results = array_merge(array($special_result), $results); - if (curl_getinfo($engine_request->ch)['http_code'] != '200') - { - require "engines/librex/text.php"; - return get_librex_results($query, $page); + return $results; } - $results = $engine_request->get_results(); - - $special_result = $special_request->get_results(); - if ($special_result) - $results = array_merge(array($special_result), $results); + public function print_results($results) { - return $results; - } + if (empty($results)) + return; - function print_search_results($results) { + $special = $results[0]; - if (empty($results)) - return; - - $special = $results[0]; + if (array_key_exists("did_you_mean", $special)) + { + $didyoumean = $special["did_you_mean"]; + $new_url = "/search.php?q=" . urlencode($didyoumean); + echo "<p class=\"did-you-mean\">Did you mean "; + echo "<a href=\"$new_url\">$didyoumean</a>"; + echo "?</p>"; + } - if (array_key_exists("did_you_mean", $special)) - { - $didyoumean = $special["did_you_mean"]; - $new_url = "/search.php?q=" . urlencode($didyoumean); - echo "<p class=\"did-you-mean\">Did you mean "; - echo "<a href=\"$new_url\">$didyoumean</a>"; - echo "?</p>"; - } + if (array_key_exists("special_response", $special)) + { + $response = $special["special_response"]["response"]; + $source = $special["special_response"]["source"]; + + echo "<p class=\"special-result-container\">"; + if (array_key_exists("image", $special["special_response"])) + { + $image_url = $special["special_response"]["image"]; + echo "<img src=\"image_proxy.php?url=$image_url\">"; + } + echo $response; + if ($source) + echo "<a href=\"$source\" target=\"_blank\">$source</a>"; + echo "</p>"; + } - if (array_key_exists("special_response", $special)) - { - $response = $special["special_response"]["response"]; - $source = $special["special_response"]["source"]; + echo "<div class=\"text-result-container\">"; - echo "<p class=\"special-result-container\">"; - if (array_key_exists("image", $special["special_response"])) + foreach($results as $result) { - $image_url = $special["special_response"]["image"]; - echo "<img src=\"image_proxy.php?url=$image_url\">"; + if (!array_key_exists("title", $result)) + continue; + + $title = $result["title"]; + $url = $result["url"]; + $base_url = $result["base_url"]; + $description = $result["description"]; + + echo "<div class=\"text-result-wrapper\">"; + echo "<a href=\"$url\">"; + echo "$base_url"; + echo "<h2>$title</h2>"; + echo "</a>"; + echo "<span>$description</span>"; + echo "</div>"; } - echo $response; - if ($source) - echo "<a href=\"$source\" target=\"_blank\">$source</a>"; - echo "</p>"; - } - - echo "<div class=\"text-result-container\">"; - foreach($results as $result) - { - if (!array_key_exists("title", $result)) - continue; - - $title = $result["title"]; - $url = $result["url"]; - $base_url = $result["base_url"]; - $description = $result["description"]; - - echo "<div class=\"text-result-wrapper\">"; - echo "<a href=\"$url\">"; - echo "$base_url"; - echo "<h2>$title</h2>"; - echo "</a>"; - echo "<span>$description</span>"; echo "</div>"; } - - echo "</div>"; } function check_ddg_bang($query) diff --git a/search.php b/search.php index 2f163697..b061c5cf 100644 --- a/search.php +++ b/search.php @@ -5,44 +5,42 @@ require "misc/tools.php"; $query = trim($_REQUEST["q"]); - class EngineRequest { - public $ch; - public $query; - - function __construct($query, $mh, $config) { + abstract class EngineRequest { + function __construct($query, $page, $mh, $config) { $this->query = $query; + $this->page = $page; $this->config = $config; $url = $this->get_request_url(); if ($url) { + error_log($url); $this->ch = curl_init($url); curl_setopt_array($this->ch, $config->curl_settings); curl_multi_add_handle($mh, $this->ch); } } - public function get_request_url() { + abstract function get_results(); + public function get_request_url(){ return ""; } - - public function get_results() { - return array(); - } + public function print_results($results){} } - function import_search_category($type) { + function init_search($type, $query, $page, $mh, $config) { switch ($type) { case 0: require "engines/text.php"; - break; + return new TextSearch($query, $page, $mh, $config); case 1: require "engines/qwant/image.php"; - break; + return new QwantImageSearch($query, $page, $mh, $config); case 2: require "engines/invidious/video.php"; + return new VideoSearch($query, $page, $mh, $config); break; case 3: @@ -118,11 +116,19 @@ function import_search_category($type) { <?php $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; $start_time = microtime(true); - import_search_category($type); - $results = fetch_search_results($query, $page); - print_elapsed_time($start_time); - print_search_results($results); + $mh = curl_multi_init(); + $search_category = init_search($type, $query, $page, $mh, $config); + + $running = null; + + do { + curl_multi_exec($mh, $running); + } while ($running); + + $results = $search_category->get_results($query, $page); + print_elapsed_time($start_time); + $search_category->print_results($results); if (2 > $type) { From 19627c94c9575160c68429d9b5ceef7780b3d33a Mon Sep 17 00:00:00 2001 From: davidovski <david@davidovski.xyz> Date: Mon, 21 Aug 2023 23:28:02 +0100 Subject: [PATCH 04/23] add bittorrent and tor to be enginerequest types --- engines/ahmia/hidden_service.php | 52 +++++---- engines/bittorrent/merge.php | 191 +++++++++++++++---------------- engines/invidious/video.php | 2 +- engines/qwant/image.php | 2 +- engines/text.php | 5 +- misc/engine_request.php | 58 ++++++++++ search.php | 65 +---------- 7 files changed, 192 insertions(+), 183 deletions(-) create mode 100644 misc/engine_request.php diff --git a/engines/ahmia/hidden_service.php b/engines/ahmia/hidden_service.php index 16a95dbe..e88da588 100644 --- a/engines/ahmia/hidden_service.php +++ b/engines/ahmia/hidden_service.php @@ -1,31 +1,39 @@ <?php - function get_search_results($query) - { - global $config; + require "engines/text.php"; + + class TorSearch extends EngineRequest { + public function get_request_url() { + $query = urlencode($this->query); + return "https://ahmia.fi/search/?q=$query"; + } - $url = "https://ahmia.fi/search/?q=$query"; - $response = request($url); - $xpath = get_xpath($response); + public function get_results() { + $response = curl_multi_getcontent($this->ch); + $xpath = get_xpath($response); - $results = array(); + $results = array(); - foreach($xpath->query("//ol[@class='searchResults']//li[@class='result']") as $result) - { - $url = "http://" . $xpath->evaluate(".//cite", $result)[0]->textContent; - $title = remove_special($xpath->evaluate(".//h4", $result)[0]->textContent); - $description = $xpath->evaluate(".//p", $result)[0]->textContent; + foreach($xpath->query("//ol[@class='searchResults']//li[@class='result']") as $result) + { + $url = "http://" . $xpath->evaluate(".//cite", $result)[0]->textContent; + $title = remove_special($xpath->evaluate(".//h4", $result)[0]->textContent); + $description = $xpath->evaluate(".//p", $result)[0]->textContent; - array_push($results, - array ( - "title" => $title ? htmlspecialchars($title) : "No description provided", - "url" => htmlspecialchars($url), - "base_url" => htmlspecialchars(get_base_url($url)), - "description" => htmlspecialchars($description) - ) - ); + array_push($results, + array ( + "title" => $title ? htmlspecialchars($title) : "No description provided", + "url" => htmlspecialchars($url), + "base_url" => htmlspecialchars(get_base_url($url)), + "description" => htmlspecialchars($description) + ) + ); + } + + return $results; } - return $results; + public static function print_results($results) { + TextSearch::print_results($results); + } } - require "engines/text.php"; ?> diff --git a/engines/bittorrent/merge.php b/engines/bittorrent/merge.php index 9126ac9b..be4727f5 100644 --- a/engines/bittorrent/merge.php +++ b/engines/bittorrent/merge.php @@ -1,111 +1,110 @@ <?php - - function fetch_search_results($query) - { - global $config; - - require "engines/bittorrent/thepiratebay.php"; - require "engines/bittorrent/rutor.php"; - require "engines/bittorrent/nyaa.php"; - require "engines/bittorrent/yts.php"; - require "engines/bittorrent/torrentgalaxy.php"; - require "engines/bittorrent/1337x.php"; - require "engines/bittorrent/sukebei.php"; - - $query = urlencode($query); - - $torrent_urls = array( - $thepiratebay_url, - $rutor_url, - $nyaa_url, - $yts_url, - $torrentgalaxy_url, - $_1337x_url, - $sukebei_url - ); - - $mh = curl_multi_init(); - $chs = $results = array(); - - foreach ($torrent_urls as $url) - { - $ch = curl_init($url); - curl_setopt_array($ch, $config->curl_settings); - array_push($chs, $ch); - curl_multi_add_handle($mh, $ch); + class TorrentSearch extends EngineRequest { + public function __construct($query, $page, $mh, $config) { + $this->query = $query; + $this->page = $page; + + // TODO make these engine requests + require "engines/bittorrent/thepiratebay.php"; + require "engines/bittorrent/rutor.php"; + require "engines/bittorrent/nyaa.php"; + require "engines/bittorrent/yts.php"; + require "engines/bittorrent/torrentgalaxy.php"; + require "engines/bittorrent/1337x.php"; + require "engines/bittorrent/sukebei.php"; + + $query = urlencode($query); + + $torrent_urls = array( + $thepiratebay_url, + $rutor_url, + $nyaa_url, + $yts_url, + $torrentgalaxy_url, + $_1337x_url, + $sukebei_url + ); + + $this->chs = array(); + + foreach ($torrent_urls as $url) + { + $ch = curl_init($url); + curl_setopt_array($ch, $config->curl_settings); + array_push($this->chs, $ch); + curl_multi_add_handle($mh, $ch); + } } - $running = null; - do { - curl_multi_exec($mh, $running); - } while ($running); - - for ($i=0; count($chs)>$i; $i++) - { - $response = curl_multi_getcontent($chs[$i]); - - switch ($i) + public function get_results() { + $query = urlencode($this->query); + $results = array(); + for ($i=0; count($this->chs)>$i; $i++) { - case 0: - $results = array_merge($results, get_thepiratebay_results($response)); - break; - case 1: - $results = array_merge($results, get_rutor_results($response)); - break; - case 2: - $results = array_merge($results, get_nyaa_results($response)); - break; - case 3: - $results = array_merge($results, get_yts_results($response)); - break; - case 4: - $results = array_merge($results, get_torrentgalaxy_results($response)); - break; - case 5: - $results = array_merge($results, get_1337x_results($response)); - break; - case 6: - $results = array_merge($results, get_sukebei_results($response)); - break; + $response = curl_multi_getcontent($this->chs[$i]); + + switch ($i) + { + case 0: + $results = array_merge($results, get_thepiratebay_results($response)); + break; + case 1: + $results = array_merge($results, get_rutor_results($response)); + break; + case 2: + $results = array_merge($results, get_nyaa_results($response)); + break; + case 3: + $results = array_merge($results, get_yts_results($response)); + break; + case 4: + //$results = array_merge($results, get_torrentgalaxy_results($response)); + break; + case 5: + //$results = array_merge($results, get_1337x_results($response)); + break; + case 6: + $results = array_merge($results, get_sukebei_results($response)); + break; + } } - } - $seeders = array_column($results, "seeders"); - array_multisort($seeders, SORT_DESC, $results); + $seeders = array_column($results, "seeders"); + array_multisort($seeders, SORT_DESC, $results); - return $results; - } + return $results; + } - function print_search_results($results) - { - echo "<div class=\"text-result-container\">"; + public static function print_results($results) { + echo "<div class=\"text-result-container\">"; - if (!empty($results)) - { - foreach($results as $result) + if (!empty($results)) { - $source = $result["source"]; - $name = $result["name"]; - $magnet = $result["magnet"]; - $seeders = $result["seeders"]; - $leechers = $result["leechers"]; - $size = $result["size"]; - - echo "<div class=\"text-result-wrapper\">"; - echo "<a href=\"$magnet\">"; - echo "$source"; - echo "<h2>$name</h2>"; - echo "</a>"; - echo "<span>SE: <span class=\"seeders\">$seeders</span> - "; - echo "LE: <span class=\"leechers\">$leechers</span> - "; - echo "$size</span>"; - echo "</div>"; + foreach($results as $result) + { + $source = $result["source"]; + $name = $result["name"]; + $magnet = $result["magnet"]; + $seeders = $result["seeders"]; + $leechers = $result["leechers"]; + $size = $result["size"]; + + echo "<div class=\"text-result-wrapper\">"; + echo "<a href=\"$magnet\">"; + echo "$source"; + echo "<h2>$name</h2>"; + echo "</a>"; + echo "<span>SE: <span class=\"seeders\">$seeders</span> - "; + echo "LE: <span class=\"leechers\">$leechers</span> - "; + echo "$size</span>"; + echo "</div>"; + } } - } - else - echo "<p>There are no results. Please try different keywords!</p>"; + else + echo "<p>There are no results. Please try different keywords!</p>"; - echo "</div>"; + echo "</div>"; + } } ?> diff --git a/engines/invidious/video.php b/engines/invidious/video.php index 92dd6cff..7fefbf61 100644 --- a/engines/invidious/video.php +++ b/engines/invidious/video.php @@ -40,7 +40,7 @@ public function get_results() { return $results; } - public function print_results($results) { + public static function print_results($results) { echo "<div class=\"text-result-container\">"; foreach($results as $result) diff --git a/engines/qwant/image.php b/engines/qwant/image.php index 725db78b..a32dfce3 100644 --- a/engines/qwant/image.php +++ b/engines/qwant/image.php @@ -40,7 +40,7 @@ public function get_results() { return $results; } - public function print_results($results) { + public static function print_results($results) { echo "<div class=\"image-result-container\">"; foreach($results as $result) diff --git a/engines/text.php b/engines/text.php index f9d78d33..95063186 100644 --- a/engines/text.php +++ b/engines/text.php @@ -1,6 +1,9 @@ <?php class TextSearch extends EngineRequest { public function __construct($query, $page, $mh, $config) { + $this->query = $query; + $this->page = $page; + $engine=$config->preferred_engines['text']; if (is_null($engine)) $engine = "google"; @@ -39,7 +42,7 @@ public function get_results() { return $results; } - public function print_results($results) { + public static function print_results($results) { if (empty($results)) return; diff --git a/misc/engine_request.php b/misc/engine_request.php new file mode 100644 index 00000000..9a47bf34 --- /dev/null +++ b/misc/engine_request.php @@ -0,0 +1,58 @@ +<?php + abstract class EngineRequest { + function __construct($query, $page, $mh, $config) { + $this->query = $query; + $this->page = $page; + $this->config = $config; + + $url = $this->get_request_url(); + if ($url) { + error_log($url); + $this->ch = curl_init($url); + curl_setopt_array($this->ch, $config->curl_settings); + curl_multi_add_handle($mh, $this->ch); + } + } + + public function get_request_url(){ + return ""; + } + + abstract function get_results(); + static public function print_results($results){} + } + + function init_search($type, $query, $page, $mh, $config) { + switch ($type) + { + case 1: + require "engines/qwant/image.php"; + return new QwantImageSearch($query, $page, $mh, $config); + + case 2: + require "engines/invidious/video.php"; + return new VideoSearch($query, $page, $mh, $config); + + case 3: + if ($config->disable_bittorent_search) { + echo "<p class=\"text-result-container\">The host disabled this feature! :C</p>"; + break; + } + + require "engines/bittorrent/merge.php"; + return new TorrentSearch($query, $page, $mh, $config); + + case 4: + if ($config->disable_hidden_service_search) { + echo "<p class=\"text-result-container\">The host disabled this feature! :C</p>"; + break; + } + require "engines/ahmia/hidden_service.php"; + return new TorSearch($query, $page, $mh, $config); + + default: + require "engines/text.php"; + return new TextSearch($query, $page, $mh, $config); + } + } +?> diff --git a/search.php b/search.php index b061c5cf..baf454f2 100644 --- a/search.php +++ b/search.php @@ -3,70 +3,13 @@ $config = require "config.php"; require "misc/tools.php"; - $query = trim($_REQUEST["q"]); - - abstract class EngineRequest { - function __construct($query, $page, $mh, $config) { - $this->query = $query; - $this->page = $page; - $this->config = $config; - - $url = $this->get_request_url(); - if ($url) { - error_log($url); - $this->ch = curl_init($url); - curl_setopt_array($this->ch, $config->curl_settings); - curl_multi_add_handle($mh, $this->ch); - } - } - - abstract function get_results(); - public function get_request_url(){ - return ""; - } - public function print_results($results){} - } - - function init_search($type, $query, $page, $mh, $config) { - switch ($type) - { - case 0: - require "engines/text.php"; - return new TextSearch($query, $page, $mh, $config); - - case 1: - require "engines/qwant/image.php"; - return new QwantImageSearch($query, $page, $mh, $config); - - case 2: - require "engines/invidious/video.php"; - return new VideoSearch($query, $page, $mh, $config); - break; - - case 3: - if ($config->disable_bittorent_search) - echo "<p class=\"text-result-container\">The host disabled this feature! :C</p>"; - else - require "engines/bittorrent/merge.php"; - break; - - case 4: - if ($config->disable_hidden_service_search) - echo "<p class=\"text-result-container\">The host disabled this feature! :C</p>"; - else - require "engines/ahmia/hidden_service.php"; - break; - - default: - require "engines/text.php"; - break; - } - } + require "misc/engine_request.php"; ?> <title> <?php - echo $query; + $query = trim($_REQUEST["q"]); + echo $query; ?> - LibreY @@ -74,8 +17,6 @@ function init_search($type, $query, $page, $mh, $config) {

LibreY

strlen($query) || strlen($query) > 256) { header("Location: ./"); From 34fdaac05826f574731c91a787039c9eb4326998 Mon Sep 17 00:00:00 2001 From: davidovski Date: Mon, 21 Aug 2023 23:58:09 +0100 Subject: [PATCH 05/23] use same logic for search and api --- api.php | 42 +------------ .../{engine_request.php => search_engine.php} | 23 ++++++- search.php | 62 ++++++++----------- 3 files changed, 50 insertions(+), 77 deletions(-) rename misc/{engine_request.php => search_engine.php} (76%) diff --git a/api.php b/api.php index 3dcbe1ad..a18046ea 100644 --- a/api.php +++ b/api.php @@ -1,6 +1,7 @@ disable_bittorent_search) - $results = array("error" => "disabled"); - else - { - require "engines/bittorrent/merge.php"; - $results = get_merged_torrent_results($query_encoded); - } - break; - case 4: - if ($config->disable_hidden_service_search) - $results = array("error" => "disabled"); - else - { - require "engines/ahmia/hidden_service.php"; - $results = get_hidden_service_results($query_encoded); - } - break; - default: - require "engines/google/text.php"; - $results = get_text_results($query_encoded, $page); - break; - } - + $results = fetch_search_results($type, $query, $page, $config, false); header("Content-Type: application/json"); echo json_encode($results); ?> diff --git a/misc/engine_request.php b/misc/search_engine.php similarity index 76% rename from misc/engine_request.php rename to misc/search_engine.php index 9a47bf34..39e4a644 100644 --- a/misc/engine_request.php +++ b/misc/search_engine.php @@ -7,7 +7,6 @@ function __construct($query, $page, $mh, $config) { $url = $this->get_request_url(); if ($url) { - error_log($url); $this->ch = curl_init($url); curl_setopt_array($this->ch, $config->curl_settings); curl_multi_add_handle($mh, $this->ch); @@ -55,4 +54,26 @@ function init_search($type, $query, $page, $mh, $config) { return new TextSearch($query, $page, $mh, $config); } } + + function fetch_search_results($type, $query, $page, $config, $do_print) { + $start_time = microtime(true); + $mh = curl_multi_init(); + $search_category = init_search($type, $query, $page, $mh, $config); + + $running = null; + + do { + curl_multi_exec($mh, $running); + } while ($running); + + $results = $search_category->get_results($query, $page); + + if (!$do_print) + return $results; + + print_elapsed_time($start_time); + $search_category->print_results($results); + + return $results; + } ?> diff --git a/search.php b/search.php index baf454f2..4ebd3eef 100644 --- a/search.php +++ b/search.php @@ -3,12 +3,34 @@ $config = require "config.php"; require "misc/tools.php"; - require "misc/engine_request.php"; + require "misc/search_engine.php"; + + function print_page_buttons($type, $query, $page) { + if ($type > 1) + return; + echo "
"; + + if ($page != 0) + { + print_next_page_button("<<", 0, $query, $type); + print_next_page_button("<", $page - 10, $query, $type); + } + + for ($i=$page / 10; $page / 10 + 10 > $i; $i++) + print_next_page_button($i + 1, $i * 10, $query, $type); + + print_next_page_button(">", $page + 10, $query, $type); + + echo "
"; + } + + $query = trim($_REQUEST["q"]); + $type = isset($_REQUEST["t"]) ? (int) $_REQUEST["t"] : 0; + $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; ?> <?php - $query = trim($_REQUEST["q"]); echo $query; ?> - LibreY @@ -28,7 +50,6 @@ >
"; ?> @@ -55,39 +76,8 @@ get_results($query, $page); - print_elapsed_time($start_time); - $search_category->print_results($results); - - if (2 > $type) - { - echo "
"; - - if ($page != 0) - { - print_next_page_button("<<", 0, $query, $type); - print_next_page_button("<", $page - 10, $query, $type); - } - - for ($i=$page / 10; $page / 10 + 10 > $i; $i++) - print_next_page_button($i + 1, $i * 10, $query, $type); - - print_next_page_button(">", $page + 10, $query, $type); - - echo "
"; - } + fetch_search_results($type, $query, $page, $config, true); + print_page_buttons($type, $query, $page); ?> From f4a80135bd2888e73376a52d9236beacd6455ff0 Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 22 Aug 2023 00:05:35 +0100 Subject: [PATCH 06/23] ensure url remaisn the same when switching types --- search.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search.php b/search.php index 4ebd3eef..07319d35 100644 --- a/search.php +++ b/search.php @@ -68,7 +68,7 @@ function print_page_buttons($type, $query, $page) { continue; } - echo "\""" . ucfirst($category) . ""; + echo "\""" . ucfirst($category) . ""; } ?>
From 0bd726d897a48c6b4a281bded498148be694bfcc Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 22 Aug 2023 00:16:22 +0100 Subject: [PATCH 07/23] moved files --- engines/{ => special}/special.php | 1 - .../{duckduckgo/text.php => text/duckduckgo.php} | 0 engines/{google/text.php => text/google.php} | 0 engines/{ => text}/text.php | 15 +++++++++------ misc/search_engine.php | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) rename engines/{ => special}/special.php (98%) rename engines/{duckduckgo/text.php => text/duckduckgo.php} (100%) rename engines/{google/text.php => text/google.php} (100%) rename engines/{ => text}/text.php (91%) diff --git a/engines/special.php b/engines/special/special.php similarity index 98% rename from engines/special.php rename to engines/special/special.php index 15a4700d..d149ee2e 100644 --- a/engines/special.php +++ b/engines/special/special.php @@ -1,6 +1,5 @@ engine_request = new GoogleRequest($query, $page, $mh, $config); } if ($engine == "duckduckgo") { - require "engines/duckduckgo/text.php"; + require "engines/text/duckduckgo.php"; $this->engine_request = new DuckDuckGoRequest($query, $page, $mh, $config); } - require "engines/special.php"; + require "engines/special/special.php"; $this->special_request = get_special_search_request($query, $page, $mh, $config); } @@ -35,9 +35,12 @@ public function get_results() { $results = $this->engine_request->get_results(); - $special_result = $this->special_request->get_results(); - if ($special_result) - $results = array_merge(array($special_result), $results); + if ($this->special_request) { + $special_result = $this->special_request->get_results(); + + if ($special_result) + $results = array_merge(array($special_result), $results); + } return $results; } diff --git a/misc/search_engine.php b/misc/search_engine.php index 39e4a644..28a8b266 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -50,7 +50,7 @@ function init_search($type, $query, $page, $mh, $config) { return new TorSearch($query, $page, $mh, $config); default: - require "engines/text.php"; + require "engines/text/text.php"; return new TextSearch($query, $page, $mh, $config); } } From 4941a6aa58aeb96a95fc02c7a836a115e6c4dbad Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 22 Aug 2023 13:25:44 +0100 Subject: [PATCH 08/23] use engine request for torrent search --- engines/bittorrent/1337x.php | 57 ++++++++------- engines/bittorrent/merge.php | 105 +++++++++------------------ engines/bittorrent/nyaa.php | 71 +++++++++++------- engines/bittorrent/rutor.php | 59 ++++++++------- engines/bittorrent/sukebei.php | 44 +---------- engines/bittorrent/thepiratebay.php | 76 +++++++++---------- engines/bittorrent/torrentgalaxy.php | 60 ++++++++------- engines/bittorrent/yts.php | 68 ++++++++--------- misc/search_engine.php | 4 + 9 files changed, 252 insertions(+), 292 deletions(-) diff --git a/engines/bittorrent/1337x.php b/engines/bittorrent/1337x.php index 21a80ebf..e7ae3e51 100644 --- a/engines/bittorrent/1337x.php +++ b/engines/bittorrent/1337x.php @@ -1,34 +1,39 @@ query); + return "https://1337x.to/search/$query/1/"; + } - function get_1337x_results($response) - { - global $config; - $xpath = get_xpath($response); - $results = array(); + public function get_results() { + $response = curl_multi_getcontent($this->ch); - foreach($xpath->query("//table/tbody/tr") as $result) - { + $xpath = get_xpath($response); + $results = array(); - $name = $xpath->evaluate(".//td[@class='coll-1 name']/a", $result)[1]->textContent; - $magnet = "./engines/bittorrent/get_magnet_1337x.php?url=https://1337x.to" . $xpath->evaluate(".//td[@class='coll-1 name']/a/@href", $result)[1]->textContent; - $size_unformatted = explode(" ", $xpath->evaluate(".//td[contains(@class, 'coll-4 size')]", $result)[0]->textContent); - $size = $size_unformatted[0] . " " . preg_replace("/[0-9]+/", "", $size_unformatted[1]); - $seeders = $xpath->evaluate(".//td[@class='coll-2 seeds']", $result)[0]->textContent; - $leechers = $xpath->evaluate(".//td[@class='coll-3 leeches']", $result)[0]->textContent; + foreach($xpath->query("//table/tbody/tr") as $result) + { - array_push($results, - array ( - "name" => htmlspecialchars($name), - "seeders" => (int) $seeders, - "leechers" => (int) $leechers, - "magnet" => htmlspecialchars($magnet), - "size" => htmlspecialchars($size), - "source" => "1337x.to" - ) - ); - } + $name = $xpath->evaluate(".//td[@class='coll-1 name']/a", $result)[1]->textContent; + $magnet = "./engines/bittorrent/get_magnet_1337x.php?url=https://1337x.to" . $xpath->evaluate(".//td[@class='coll-1 name']/a/@href", $result)[1]->textContent; + $size_unformatted = explode(" ", $xpath->evaluate(".//td[contains(@class, 'coll-4 size')]", $result)[0]->textContent); + $size = $size_unformatted[0] . " " . preg_replace("/[0-9]+/", "", $size_unformatted[1]); + $seeders = $xpath->evaluate(".//td[@class='coll-2 seeds']", $result)[0]->textContent; + $leechers = $xpath->evaluate(".//td[@class='coll-3 leeches']", $result)[0]->textContent; - return $results; + array_push($results, + array ( + "name" => htmlspecialchars($name), + "seeders" => (int) $seeders, + "leechers" => (int) $leechers, + "magnet" => htmlspecialchars($magnet), + "size" => htmlspecialchars($size), + "source" => "1337x.to" + ) + ); + } + + return $results; + } } ?> diff --git a/engines/bittorrent/merge.php b/engines/bittorrent/merge.php index be4727f5..ec99127f 100644 --- a/engines/bittorrent/merge.php +++ b/engines/bittorrent/merge.php @@ -4,68 +4,32 @@ public function __construct($query, $page, $mh, $config) { $this->query = $query; $this->page = $page; - // TODO make these engine requests require "engines/bittorrent/thepiratebay.php"; require "engines/bittorrent/rutor.php"; - require "engines/bittorrent/nyaa.php"; require "engines/bittorrent/yts.php"; require "engines/bittorrent/torrentgalaxy.php"; require "engines/bittorrent/1337x.php"; require "engines/bittorrent/sukebei.php"; - $query = urlencode($query); - - $torrent_urls = array( - $thepiratebay_url, - $rutor_url, - $nyaa_url, - $yts_url, - $torrentgalaxy_url, - $_1337x_url, - $sukebei_url + $this->requests = array( + new PirateBayRequest($query, $page, $mh, $config), + new _1337xRequest($query, $page, $mh, $config), + new NyaaRequest($query, $page, $mh, $config), + new RutorRequest($query, $page, $mh, $config), + new SukebeiRequest($query, $page, $mh, $config), + new TorrentGalaxyRequest($query, $page, $mh, $config), + new YTSRequest($query, $page, $mh, $config), ); - - $this->chs = array(); - - foreach ($torrent_urls as $url) - { - $ch = curl_init($url); - curl_setopt_array($ch, $config->curl_settings); - array_push($this->chs, $ch); - curl_multi_add_handle($mh, $ch); - } } public function get_results() { $query = urlencode($this->query); $results = array(); - for ($i=0; count($this->chs)>$i; $i++) - { - $response = curl_multi_getcontent($this->chs[$i]); - - switch ($i) - { - case 0: - $results = array_merge($results, get_thepiratebay_results($response)); - break; - case 1: - $results = array_merge($results, get_rutor_results($response)); - break; - case 2: - $results = array_merge($results, get_nyaa_results($response)); - break; - case 3: - $results = array_merge($results, get_yts_results($response)); - break; - case 4: - //$results = array_merge($results, get_torrentgalaxy_results($response)); - break; - case 5: - //$results = array_merge($results, get_1337x_results($response)); - break; - case 6: - $results = array_merge($results, get_sukebei_results($response)); - break; + foreach ($this->requests as $request) { + error_log($request->get_request_url()); + error_log( curl_getinfo($request->ch)['http_code'] ); + if ($request->successful()) { + $results = array_merge($results, $request->get_results()); } } @@ -78,30 +42,29 @@ public function get_results() { public static function print_results($results) { echo "
"; - if (!empty($results)) - { - foreach($results as $result) - { - $source = $result["source"]; - $name = $result["name"]; - $magnet = $result["magnet"]; - $seeders = $result["seeders"]; - $leechers = $result["leechers"]; - $size = $result["size"]; + if (empty($results)) { + echo "

There are no results. Please try different keywords!

"; + return; + } - echo "
"; - echo ""; - echo "$source"; - echo "

$name

"; - echo "
"; - echo "SE: $seeders - "; - echo "LE: $leechers - "; - echo "$size"; - echo "
"; - } + foreach($results as $result) { + $source = $result["source"]; + $name = $result["name"]; + $magnet = $result["magnet"]; + $seeders = $result["seeders"]; + $leechers = $result["leechers"]; + $size = $result["size"]; + + echo "
"; + echo ""; + echo "$source"; + echo "

$name

"; + echo "
"; + echo "SE: $seeders - "; + echo "LE: $leechers - "; + echo "$size"; + echo "
"; } - else - echo "

There are no results. Please try different keywords!

"; echo "
"; } diff --git a/engines/bittorrent/nyaa.php b/engines/bittorrent/nyaa.php index e2b846d5..9eeb58da 100644 --- a/engines/bittorrent/nyaa.php +++ b/engines/bittorrent/nyaa.php @@ -1,35 +1,50 @@ SOURCE/?q=" . urlencode($this->query); + } - foreach($xpath->query("//tbody/tr") as $result) - { - $name = $xpath->evaluate(".//td[@colspan='2']//a[not(contains(@class, 'comments'))]/@title", $result)[0]->textContent; - $centered = $xpath->evaluate(".//td[@class='text-center']", $result); - $magnet = $xpath->evaluate(".//a[2]/@href", $centered[0])[0]->textContent; - $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $config->bittorent_trackers; - $size = $centered[1]->textContent; - $seeders = $centered[3]->textContent; - $leechers = $centered[4]->textContent; + public function get_results() { + $response = curl_multi_getcontent($this->ch); + $xpath = get_xpath($response); + $results = array(); - array_push($results, - array ( - "name" => htmlspecialchars($name), - "seeders" => (int) $seeders, - "leechers" => (int) $leechers, - "magnet" => htmlspecialchars($magnet), - "size" => htmlspecialchars($size), - "source" => "nyaa.si" - ) - ); - } + foreach($xpath->query("//tbody/tr") as $result) + { + $name_node = $xpath->evaluate(".//td[@colspan='2']//a[not(contains(@class, 'comments'))]/@title", $result); + if ($name_node->length > 0) { + $name = $name_node[0]->textContent; + } else { + $name = ""; + } + $centered = $xpath->evaluate(".//td[@class='text-center']", $result); + $magnet_node = $xpath->evaluate(".//a[2]/@href", $centered[0]); + if ($magnet_node->length > 0) { + $magnet = $magnet_node[0]->textContent; + $magnet_without_tracker = explode("&tr=", $magnet)[0]; + $magnet = $magnet_without_tracker . $this->config->bittorent_trackers; + } else { + $magnet = ""; + } + $size = $centered[1]->textContent; + $seeders = $centered[3]->textContent; + $leechers = $centered[4]->textContent; - return $results; + array_push($results, + array ( + "name" => htmlspecialchars($name), + "seeders" => (int) $seeders, + "leechers" => (int) $leechers, + "magnet" => htmlspecialchars($magnet), + "size" => htmlspecialchars($size), + "source" => $this->SOURCE + ) + ); + } + + return $results; + } } ?> diff --git a/engines/bittorrent/rutor.php b/engines/bittorrent/rutor.php index 8369f3e5..3bda93ff 100644 --- a/engines/bittorrent/rutor.php +++ b/engines/bittorrent/rutor.php @@ -1,36 +1,39 @@ query); + } - function get_rutor_results($response) - { - global $config; - $xpath = get_xpath($response); - $results = array(); + public function get_results() { + $response = curl_multi_getcontent($this->ch); + $xpath = get_xpath($response); + $results = array(); - foreach($xpath->query("//table/tr[@class='gai' or @class='tum']") as $result) - { - $name = $xpath->evaluate(".//td/a", $result)[2]->textContent; - $magnet = $xpath->evaluate(".//td/a/@href", $result)[1]->textContent; - $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $config->bittorent_trackers; - $td = $xpath->evaluate(".//td", $result); - $size = $td[count($td) == 5 ? 3 : 2]->textContent; - $seeders = $xpath->evaluate(".//span", $result)[0]->textContent; - $leechers = $xpath->evaluate(".//span", $result)[1]->textContent; + foreach($xpath->query("//table/tr[@class='gai' or @class='tum']") as $result) + { + $name = $xpath->evaluate(".//td/a", $result)[2]->textContent; + $magnet = $xpath->evaluate(".//td/a/@href", $result)[1]->textContent; + $magnet_without_tracker = explode("&tr=", $magnet)[0]; + $magnet = $magnet_without_tracker . $this->config->bittorent_trackers; + $td = $xpath->evaluate(".//td", $result); + $size = $td[count($td) == 5 ? 3 : 2]->textContent; + $seeders = $xpath->evaluate(".//span", $result)[0]->textContent; + $leechers = $xpath->evaluate(".//span", $result)[1]->textContent; - array_push($results, - array ( - "name" => htmlspecialchars($name), - "seeders" => (int) filter_var($seeders, FILTER_SANITIZE_NUMBER_INT), - "leechers" => (int) filter_var($leechers, FILTER_SANITIZE_NUMBER_INT), - "magnet" => htmlspecialchars($magnet), - "size" => htmlspecialchars($size), - "source" => "rutor.info" - ) - ); - } + array_push($results, + array ( + "name" => htmlspecialchars($name), + "seeders" => (int) filter_var($seeders, FILTER_SANITIZE_NUMBER_INT), + "leechers" => (int) filter_var($leechers, FILTER_SANITIZE_NUMBER_INT), + "magnet" => htmlspecialchars($magnet), + "size" => htmlspecialchars($size), + "source" => "rutor.info" + ) + ); + } - return $results; + return $results; + } } ?> diff --git a/engines/bittorrent/sukebei.php b/engines/bittorrent/sukebei.php index 61485cc4..106ff1a5 100644 --- a/engines/bittorrent/sukebei.php +++ b/engines/bittorrent/sukebei.php @@ -1,44 +1,6 @@ query("//tbody/tr") as $result) - { - $name_node = $xpath->evaluate(".//td[@colspan='2']//a[not(contains(@class, 'comments'))]/@title", $result); - if ($name_node->length > 0) { - $name = $name_node[0]->textContent; - } else { - $name = ""; - } - $centered = $xpath->evaluate(".//td[@class='text-center']", $result); - $magnet_node = $xpath->evaluate(".//a[2]/@href", $centered[0]); - if ($magnet_node->length > 0) { - $magnet = $magnet_node[0]->textContent; - $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $config->bittorent_trackers; - } else { - $magnet = ""; - } - $size = $centered[1]->textContent; - $seeders = $centered[3]->textContent; - $leechers = $centered[4]->textContent; - - array_push($results, - array ( - "name" => htmlspecialchars($name), - "seeders" => (int) $seeders, - "leechers" => (int) $leechers, - "magnet" => htmlspecialchars($magnet), - "size" => htmlspecialchars($size), - "source" => "sukebei.nyaa.si" - ) - ); - } - return $results; + include "engines/bittorrent/nyaa.php"; + class SukebeiRequest extends NyaaRequest { + public $SOURCE = "sukebei.nyaa.si"; } ?> diff --git a/engines/bittorrent/thepiratebay.php b/engines/bittorrent/thepiratebay.php index 49b24765..02375ec1 100644 --- a/engines/bittorrent/thepiratebay.php +++ b/engines/bittorrent/thepiratebay.php @@ -1,44 +1,46 @@ query); } - foreach ($json_response as $response) - { - $size = human_filesize($response["size"]); - $hash = $response["info_hash"]; - $name = $response["name"]; - $seeders = (int) $response["seeders"]; - $leechers = (int) $response["leechers"]; + public function get_results() { + $response = curl_multi_getcontent($this->ch); + $results = array(); + $json_response = json_decode($response, true); + + if (empty($json_response)) + { + return $results; + } + + foreach ($json_response as $response) + { + $size = human_filesize($response["size"]); + $hash = $response["info_hash"]; + $name = $response["name"]; + $seeders = (int) $response["seeders"]; + $leechers = (int) $response["leechers"]; + + $magnet = "magnet:?xt=urn:btih:$hash&dn=$name" . $config->bittorent_trackers; + + if ($name == "No results returned") + break; + + array_push($results, + array ( + "size" => htmlspecialchars($size), + "name" => htmlspecialchars($name), + "seeders" => (int) htmlspecialchars($seeders), + "leechers" => (int) htmlspecialchars($leechers), + "magnet" => htmlspecialchars($magnet), + "source" => "thepiratebay.org" + ) + ); + } - $magnet = "magnet:?xt=urn:btih:$hash&dn=$name" . $config->bittorent_trackers; - - if ($name == "No results returned") - break; - - array_push($results, - array ( - "size" => htmlspecialchars($size), - "name" => htmlspecialchars($name), - "seeders" => (int) htmlspecialchars($seeders), - "leechers" => (int) htmlspecialchars($leechers), - "magnet" => htmlspecialchars($magnet), - "source" => "thepiratebay.org" - ) - ); + return $results; + } - - return $results; - } ?> diff --git a/engines/bittorrent/torrentgalaxy.php b/engines/bittorrent/torrentgalaxy.php index 5d31e82d..75c209bd 100644 --- a/engines/bittorrent/torrentgalaxy.php +++ b/engines/bittorrent/torrentgalaxy.php @@ -1,34 +1,38 @@ query); + return "https://torrentgalaxy.to/torrents.php?search=$query#results"; + } - function get_torrentgalaxy_results($response) - { - global $config; - $xpath = get_xpath($response); - $results = array(); + public function get_results() { + $response = curl_multi_getcontent($this->ch); + $xpath = get_xpath($response); + $results = array(); - foreach($xpath->query("//div[@class='tgxtablerow txlight']") as $result) - { - $name = $xpath->evaluate(".//div[contains(@class, 'clickable-row')]", $result)[0]->textContent; - $magnet = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/a/@href", $result)[1]->textContent; - $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $config->bittorent_trackers; - $size = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span", $result)[0]->textContent; - $seeders = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[1]->textContent; - $leechers = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[2]->textContent; + foreach($xpath->query("//div[@class='tgxtablerow txlight']") as $result) + { + $name = $xpath->evaluate(".//div[contains(@class, 'clickable-row')]", $result)[0]->textContent; + $magnet = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/a/@href", $result)[1]->textContent; + $magnet_without_tracker = explode("&tr=", $magnet)[0]; + $magnet = $magnet_without_tracker . $this->config->bittorent_trackers; + $size = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span", $result)[0]->textContent; + $seeders = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[1]->textContent; + $leechers = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[2]->textContent; - array_push($results, - array ( - "name" => htmlspecialchars($name), - "seeders" => (int) $seeders, - "leechers" => (int) $leechers, - "magnet" => htmlspecialchars($magnet), - "size" => htmlspecialchars($size), - "source" => "torrentgalaxy.to" - ) - ); - } + array_push($results, + array ( + "name" => htmlspecialchars($name), + "seeders" => (int) $seeders, + "leechers" => (int) $leechers, + "magnet" => htmlspecialchars($magnet), + "size" => htmlspecialchars($size), + "source" => "torrentgalaxy.to" + ) + ); + } - return $results; - } + return $results; + } + } ?> diff --git a/engines/bittorrent/yts.php b/engines/bittorrent/yts.php index f3a588d9..ea2fd26f 100644 --- a/engines/bittorrent/yts.php +++ b/engines/bittorrent/yts.php @@ -1,45 +1,47 @@ query); + } - function get_yts_results($response) - { - global $config; - $results = array(); - $json_response = json_decode($response, true); + public function get_results() { + $response = curl_multi_getcontent($this->ch); + global $config; + $results = array(); + $json_response = json_decode($response, true); - if ($json_response["status"] == "ok" && $json_response["data"]["movie_count"] != 0) - { - foreach ($json_response["data"]["movies"] as $movie) + if ($json_response["status"] == "ok" && $json_response["data"]["movie_count"] != 0) { - $name = $movie["title"]; - $name_encoded = urlencode($name); + foreach ($json_response["data"]["movies"] as $movie) + { + $name = $movie["title"]; + $name_encoded = urlencode($name); - foreach ($movie["torrents"] as $torrent) - { + foreach ($movie["torrents"] as $torrent) + { - $hash = $torrent["hash"]; - $seeders = $torrent["seeds"]; - $leechers = $torrent["peers"]; - $size = $torrent["size"]; + $hash = $torrent["hash"]; + $seeders = $torrent["seeds"]; + $leechers = $torrent["peers"]; + $size = $torrent["size"]; - $magnet = "magnet:?xt=urn:btih:$hash&dn=$name_encoded$config->bittorent_trackers"; + $magnet = "magnet:?xt=urn:btih:$hash&dn=$name_encoded$config->bittorent_trackers"; - array_push($results, - array ( - "size" => htmlspecialchars($size), - "name" => htmlspecialchars($name), - "seeders" => htmlspecialchars($seeders), - "leechers" => htmlspecialchars($leechers), - "magnet" => htmlspecialchars($magnet), - "source" => "yts.mx" - ) - ); - - } + array_push($results, + array ( + "size" => htmlspecialchars($size), + "name" => htmlspecialchars($name), + "seeders" => htmlspecialchars($seeders), + "leechers" => htmlspecialchars($leechers), + "magnet" => htmlspecialchars($magnet), + "source" => "yts.mx" + ) + ); + } + } } - } - return $results; - + return $results; + } } ?> diff --git a/misc/search_engine.php b/misc/search_engine.php index 28a8b266..c028913b 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -17,6 +17,10 @@ public function get_request_url(){ return ""; } + public function successful() { + return curl_getinfo($this->ch)['http_code'] == '200'; + } + abstract function get_results(); static public function print_results($results){} } From 6c253bcb478a1625d350033534ae49b0c40a38dc Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 22 Aug 2023 18:41:02 +0100 Subject: [PATCH 09/23] put all settings in single "opts" array --- config.php.example | 10 ++--- engines/ahmia/hidden_service.php | 5 +-- engines/bittorrent/1337x.php | 4 +- engines/bittorrent/merge.php | 25 +++++-------- engines/bittorrent/nyaa.php | 2 +- engines/bittorrent/rutor.php | 2 +- engines/bittorrent/thepiratebay.php | 2 +- engines/bittorrent/torrentgalaxy.php | 2 +- engines/bittorrent/yts.php | 30 +++++++-------- engines/special/currency.php | 37 +++++++++--------- engines/special/definition.php | 1 + engines/special/ip.php | 19 ++++------ engines/special/special.php | 21 ++++++----- engines/special/user_agent.php | 8 +--- engines/special/wikipedia.php | 12 +++--- engines/text/duckduckgo.php | 8 +--- engines/text/google.php | 11 ++---- engines/text/text.php | 26 ++++++------- misc/header.php | 6 +-- misc/search_engine.php | 56 +++++++++++++++++++--------- search.php | 27 ++++++-------- settings.php | 1 + 22 files changed, 151 insertions(+), 164 deletions(-) diff --git a/config.php.example b/config.php.example index 99ad26dd..9d287184 100644 --- a/config.php.example +++ b/config.php.example @@ -4,13 +4,9 @@ // e.g.: fr -> https://google.fr/ "google_domain" => "com", - // Google results will be in this language - "google_language_site" => "", - "google_language_results" => "", - "google_number_of_results" => 10, - - // You can set a language for results in wikipedia - "wikipedia_language" => "en", + // Results will be in this language + "language" => "", + "number_of_results" => 10, // You can use any Invidious instance here "invidious_instance_for_video_results" => "https://invidious.snopyta.org", diff --git a/engines/ahmia/hidden_service.php b/engines/ahmia/hidden_service.php index e88da588..9ddd58b4 100644 --- a/engines/ahmia/hidden_service.php +++ b/engines/ahmia/hidden_service.php @@ -1,10 +1,9 @@ query); - return "https://ahmia.fi/search/?q=$query"; + return "https://ahmia.fi/search/?q=" . urlencode($this->query); } public function get_results() { diff --git a/engines/bittorrent/1337x.php b/engines/bittorrent/1337x.php index e7ae3e51..c70468fa 100644 --- a/engines/bittorrent/1337x.php +++ b/engines/bittorrent/1337x.php @@ -11,9 +11,7 @@ public function get_results() { $xpath = get_xpath($response); $results = array(); - foreach($xpath->query("//table/tbody/tr") as $result) - { - + foreach($xpath->query("//table/tbody/tr") as $result) { $name = $xpath->evaluate(".//td[@class='coll-1 name']/a", $result)[1]->textContent; $magnet = "./engines/bittorrent/get_magnet_1337x.php?url=https://1337x.to" . $xpath->evaluate(".//td[@class='coll-1 name']/a/@href", $result)[1]->textContent; $size_unformatted = explode(" ", $xpath->evaluate(".//td[contains(@class, 'coll-4 size')]", $result)[0]->textContent); diff --git a/engines/bittorrent/merge.php b/engines/bittorrent/merge.php index ec99127f..31dcc24f 100644 --- a/engines/bittorrent/merge.php +++ b/engines/bittorrent/merge.php @@ -1,8 +1,7 @@ query = $query; - $this->page = $page; + public function __construct($opts, $mh) { + parent::__construct($opts, $mh); require "engines/bittorrent/thepiratebay.php"; require "engines/bittorrent/rutor.php"; @@ -12,25 +11,21 @@ public function __construct($query, $page, $mh, $config) { require "engines/bittorrent/sukebei.php"; $this->requests = array( - new PirateBayRequest($query, $page, $mh, $config), - new _1337xRequest($query, $page, $mh, $config), - new NyaaRequest($query, $page, $mh, $config), - new RutorRequest($query, $page, $mh, $config), - new SukebeiRequest($query, $page, $mh, $config), - new TorrentGalaxyRequest($query, $page, $mh, $config), - new YTSRequest($query, $page, $mh, $config), + new PirateBayRequest($opts, $mh), + new _1337xRequest($opts, $mh), + new NyaaRequest($opts, $mh), + new RutorRequest($opts, $mh), + new SukebeiRequest($opts, $mh), + new TorrentGalaxyRequest($opts, $mh), + new YTSRequest($opts, $mh), ); } public function get_results() { - $query = urlencode($this->query); $results = array(); foreach ($this->requests as $request) { - error_log($request->get_request_url()); - error_log( curl_getinfo($request->ch)['http_code'] ); - if ($request->successful()) { + if ($request->successful()) $results = array_merge($results, $request->get_results()); - } } $seeders = array_column($results, "seeders"); diff --git a/engines/bittorrent/nyaa.php b/engines/bittorrent/nyaa.php index 9eeb58da..c250f1ac 100644 --- a/engines/bittorrent/nyaa.php +++ b/engines/bittorrent/nyaa.php @@ -24,7 +24,7 @@ public function get_results() { if ($magnet_node->length > 0) { $magnet = $magnet_node[0]->textContent; $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $this->config->bittorent_trackers; + $magnet = $magnet_without_tracker . $this->opts->bittorent_trackers; } else { $magnet = ""; } diff --git a/engines/bittorrent/rutor.php b/engines/bittorrent/rutor.php index 3bda93ff..f6790a78 100644 --- a/engines/bittorrent/rutor.php +++ b/engines/bittorrent/rutor.php @@ -15,7 +15,7 @@ public function get_results() { $name = $xpath->evaluate(".//td/a", $result)[2]->textContent; $magnet = $xpath->evaluate(".//td/a/@href", $result)[1]->textContent; $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $this->config->bittorent_trackers; + $magnet = $magnet_without_tracker . $this->opts->bittorrent_trackers; $td = $xpath->evaluate(".//td", $result); $size = $td[count($td) == 5 ? 3 : 2]->textContent; $seeders = $xpath->evaluate(".//span", $result)[0]->textContent; diff --git a/engines/bittorrent/thepiratebay.php b/engines/bittorrent/thepiratebay.php index 02375ec1..49f3f7ae 100644 --- a/engines/bittorrent/thepiratebay.php +++ b/engines/bittorrent/thepiratebay.php @@ -22,7 +22,7 @@ public function get_results() { $seeders = (int) $response["seeders"]; $leechers = (int) $response["leechers"]; - $magnet = "magnet:?xt=urn:btih:$hash&dn=$name" . $config->bittorent_trackers; + $magnet = "magnet:?xt=urn:btih:$hash&dn=$name" . $this->opts->bittorrent_trackers; if ($name == "No results returned") break; diff --git a/engines/bittorrent/torrentgalaxy.php b/engines/bittorrent/torrentgalaxy.php index 75c209bd..d893db3b 100644 --- a/engines/bittorrent/torrentgalaxy.php +++ b/engines/bittorrent/torrentgalaxy.php @@ -15,7 +15,7 @@ public function get_results() { $name = $xpath->evaluate(".//div[contains(@class, 'clickable-row')]", $result)[0]->textContent; $magnet = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/a/@href", $result)[1]->textContent; $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $this->config->bittorent_trackers; + $magnet = $magnet_without_tracker . $this->opts->bittorrent_trackers; $size = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span", $result)[0]->textContent; $seeders = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[1]->textContent; $leechers = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[2]->textContent; diff --git a/engines/bittorrent/yts.php b/engines/bittorrent/yts.php index ea2fd26f..d146ba74 100644 --- a/engines/bittorrent/yts.php +++ b/engines/bittorrent/yts.php @@ -10,24 +10,25 @@ public function get_results() { $results = array(); $json_response = json_decode($response, true); - if ($json_response["status"] == "ok" && $json_response["data"]["movie_count"] != 0) + if ($json_response["status"] != "ok" || $json_response["data"]["movie_count"] == 0) + return $results; + + foreach ($json_response["data"]["movies"] as $movie) { - foreach ($json_response["data"]["movies"] as $movie) - { - $name = $movie["title"]; - $name_encoded = urlencode($name); + $name = $movie["title"]; + $name_encoded = urlencode($name); - foreach ($movie["torrents"] as $torrent) - { + foreach ($movie["torrents"] as $torrent) + { - $hash = $torrent["hash"]; - $seeders = $torrent["seeds"]; - $leechers = $torrent["peers"]; - $size = $torrent["size"]; + $hash = $torrent["hash"]; + $seeders = $torrent["seeds"]; + $leechers = $torrent["peers"]; + $size = $torrent["size"]; - $magnet = "magnet:?xt=urn:btih:$hash&dn=$name_encoded$config->bittorent_trackers"; + $magnet = "magnet:?xt=urn:btih:$hash&dn=$name_encoded$this->opts->bittorrent_trackers"; - array_push($results, + array_push($results, array ( "size" => htmlspecialchars($size), "name" => htmlspecialchars($name), @@ -37,8 +38,7 @@ public function get_results() { "source" => "yts.mx" ) ); - } - } + } } return $results; diff --git a/engines/special/currency.php b/engines/special/currency.php index fd11b79f..ba535983 100644 --- a/engines/special/currency.php +++ b/engines/special/currency.php @@ -1,25 +1,24 @@ ch); + class CurrencyRequest extends EngineRequest { + public function get_request_url() { + return "https://cdn.moneyconvert.net/api/latest.json"; + } + + public function get_results() { + $response = curl_multi_getcontent($this->ch); - $split_query = explode(" ", $this->query); + $split_query = explode(" ", $this->query); - $base_currency = strtoupper($split_query[1]); - $currency_to_convert = strtoupper($split_query[3]); - $amount_to_convert = floatval($split_query[0]); - - $json_response = json_decode($response, true); - - $rates = $json_response["rates"]; + $base_currency = strtoupper($split_query[1]); + $currency_to_convert = strtoupper($split_query[3]); + $amount_to_convert = floatval($split_query[0]); + + $json_response = json_decode($response, true); + + $rates = $json_response["rates"]; - if (array_key_exists($base_currency, $rates) && array_key_exists($currency_to_convert, $rates)) - { + if (!array_key_exists($base_currency, $rates) || !array_key_exists($currency_to_convert, $rates)) + return array(); $base_currency_response = $rates[$base_currency]; $currency_to_convert_response = $rates[$currency_to_convert]; @@ -33,6 +32,6 @@ public function get_results() "source" => $source ) ); - } + } } ?> diff --git a/engines/special/definition.php b/engines/special/definition.php index 819eeb4e..b862b327 100644 --- a/engines/special/definition.php +++ b/engines/special/definition.php @@ -1,5 +1,6 @@ query); $reversed_split_q = array_reverse($split_query); diff --git a/engines/special/ip.php b/engines/special/ip.php index 1e7cab9e..6fbb6842 100644 --- a/engines/special/ip.php +++ b/engines/special/ip.php @@ -1,17 +1,12 @@ query = $query; - } - - function get_results() - { - return array( - "special_response" => array( - "response" => $_SERVER["REMOTE_ADDR"], - "source" => null - ) - ); + function get_results() { + return array( + "special_response" => array( + "response" => $_SERVER["REMOTE_ADDR"], + "source" => null + ) + ); } } ?> diff --git a/engines/special/special.php b/engines/special/special.php index d149ee2e..41f706f1 100644 --- a/engines/special/special.php +++ b/engines/special/special.php @@ -44,8 +44,11 @@ function check_for_special_search($query) { return 0; } - function get_special_search_request ($query, $page, $mh, $config) { - $special_search = $page ? 0 : check_for_special_search($query); + function get_special_search_request($opts, $mh) { + if ($opts->page != 0) + return null; + + $special_search = check_for_special_search($opts->query); $special_request = null; $url = null; @@ -55,31 +58,31 @@ function get_special_search_request ($query, $page, $mh, $config) { switch ($special_search) { case 1: require "engines/special/currency.php"; - $special_request = new CurrencyRequest($query, $page, $mh, $config); + $special_request = new CurrencyRequest($opts, $mh); break; case 2: require "engines/special/definition.php"; - $special_request = new DefinitionRequest($query, $page, $mh, $config); + $special_request = new DefinitionRequest($opts, $mh); break; case 3: require "engines/special/ip.php"; - $special_request = new IPRequest($query, $page, $mh, $config); + $special_request = new IPRequest($opts, $mh); break; case 4: require "engines/special/user_agent.php"; - $special_request = new UserAgentRequest($query, $page, $mh, $config); + $special_request = new UserAgentRequest($opts, $mh); break; case 5: require "engines/special/weather.php"; - $special_request = new WeatherRequest($query, $page, $mh, $config); + $special_request = new WeatherRequest($opts, $mh); break; case 6: require "engines/special/tor.php"; - $special_request = new TorRequest($query, $page, $mh, $config); + $special_request = new TorRequest($opts, $mh); break; case 7: require "engines/special/wikipedia.php"; - $special_request = new WikipediaRequest($query, $page, $mh, $config); + $special_request = new WikipediaRequest($opts, $mh); break; } diff --git a/engines/special/user_agent.php b/engines/special/user_agent.php index aab3d59e..64f5e8a8 100644 --- a/engines/special/user_agent.php +++ b/engines/special/user_agent.php @@ -1,12 +1,6 @@ query = $query; - $this->page = $page; - } - - function get_results() - { + function get_results() { return array( "special_response" => array( "response" => $_SERVER["HTTP_USER_AGENT"], diff --git a/engines/special/wikipedia.php b/engines/special/wikipedia.php index 8f5189e2..786a357f 100644 --- a/engines/special/wikipedia.php +++ b/engines/special/wikipedia.php @@ -1,13 +1,13 @@ wikipedia_language = isset($_COOKIE["wikipedia_language"]) ? trim(htmlspecialchars($_COOKIE["wikipedia_language"])) : $this->config->wikipedia_language; + $this->wikipedia_language = $this->opts->language; $query_encoded = urlencode($this->query); - if (in_array($this->wikipedia_language, json_decode(file_get_contents("static/misc/wikipedia_langs.json"), true))) - return "https://$this->wikipedia_language.wikipedia.org/w/api.php?format=json&action=query&prop=extracts%7Cpageimages&exintro&explaintext&redirects=1&pithumbsize=500&titles=$query_encoded"; + if (!in_array($this->wikipedia_language, json_decode(file_get_contents("static/misc/wikipedia_langs.json"), true))) + $this->wikipedia_language = "en"; - return ""; + return "https://$this->wikipedia_language.wikipedia.org/w/api.php?format=json&action=query&prop=extracts%7Cpageimages&exintro&explaintext&redirects=1&pithumbsize=500&titles=$query_encoded"; } public function get_results() { @@ -19,6 +19,7 @@ public function get_results() { if (array_key_exists("missing", $first_page)) return array(); + $description = substr($first_page["extract"], 0, 250) . "..."; $source = check_for_privacy_frontend("https://$this->wikipedia_language.wikipedia.org/wiki/$this->query"); @@ -29,8 +30,7 @@ public function get_results() { ) ); - if (array_key_exists("thumbnail", $first_page)) - { + if (array_key_exists("thumbnail", $first_page)) { $image_url = $first_page["thumbnail"]["source"]; $response["special_response"]["image"] = $image_url; } diff --git a/engines/text/duckduckgo.php b/engines/text/duckduckgo.php index a7817107..6833f4a3 100644 --- a/engines/text/duckduckgo.php +++ b/engines/text/duckduckgo.php @@ -5,15 +5,11 @@ function get_request_url() $query_encoded = str_replace("%22", "\"", urlencode($this->query)); $results = array(); - // $domain = $this->config->google_domain; $domain = 'com'; - $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $this->config->google_language_site; - $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; - $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; + $results_language = $this->opts->language; + $number_of_results = $this->opts->number_of_results; $url = "https://html.duckduckgo.$domain/html/?q=$query_encoded&kd=-1&s=" . 3 * $this->page; - if (3 > strlen($site_language) && 0 < strlen($site_language)) - $url .= "&hl=$site_language"; if (3 > strlen($results_language) && 0 < strlen($results_language)) $url .= "&lr=lang_$results_language"; diff --git a/engines/text/google.php b/engines/text/google.php index eb2ac26c..83c731f1 100644 --- a/engines/text/google.php +++ b/engines/text/google.php @@ -6,16 +6,11 @@ function get_request_url() $query_encoded = str_replace("%22", "\"", urlencode($this->query)); $results = array(); - $domain = $this->config->google_domain; - $site_language = isset($_COOKIE["google_language_site"]) ? trim(htmlspecialchars($_COOKIE["google_language_site"])) : $this->config->google_language_site; - $results_language = isset($_COOKIE["google_language_results"]) ? trim(htmlspecialchars($_COOKIE["google_language_results"])) : $this->config->google_language_results; - $number_of_results = isset($_COOKIE["google_number_of_results"]) ? trim(htmlspecialchars($_COOKIE["google_number_of_results"])) : $this->config->google_number_of_results; + $domain = $this->opts->google_domain; + $results_language = $this->opts->language; + $number_of_results = $this->opts->number_of_results; $url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$this->page"; - error_log($url); - - if (3 > strlen($site_language) && 0 < strlen($site_language)) - $url .= "&hl=$site_language"; if (3 > strlen($results_language) && 0 < strlen($results_language)) $url .= "&lr=lang_$results_language"; diff --git a/engines/text/text.php b/engines/text/text.php index 4a4e0f88..df29438e 100644 --- a/engines/text/text.php +++ b/engines/text/text.php @@ -1,29 +1,29 @@ query = $query; - $this->page = $page; - - $engine=$config->preferred_engines['text']; - if (is_null($engine)) - $engine = "google"; - $query_parts = explode(" ", $query); + public function __construct($opts, $mh) { + $this->query = $opts->query; + $this->page = $opts->page; + $this->opts = $opts; + + $engine = $opts->preferred_engines->text ?? "google"; + + $query_parts = explode(" ", $this->query); $last_word_query = end($query_parts); - if (substr($query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") - check_ddg_bang($query); + if (substr($this->query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") + check_ddg_bang($this->query); if ($engine == "google") { require "engines/text/google.php"; - $this->engine_request = new GoogleRequest($query, $page, $mh, $config); + $this->engine_request = new GoogleRequest($opts, $mh); } if ($engine == "duckduckgo") { require "engines/text/duckduckgo.php"; - $this->engine_request = new DuckDuckGoRequest($query, $page, $mh, $config); + $this->engine_request = new DuckDuckGoRequest($opts, $mh); } require "engines/special/special.php"; - $this->special_request = get_special_search_request($query, $page, $mh, $config); + $this->special_request = get_special_search_request($opts, $mh); } public function get_results() { diff --git a/misc/header.php b/misc/header.php index 657fa679..2d6db464 100644 --- a/misc/header.php +++ b/misc/header.php @@ -8,9 +8,5 @@ "/> diff --git a/misc/search_engine.php b/misc/search_engine.php index c028913b..dd877deb 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -1,14 +1,14 @@ query = $query; - $this->page = $page; - $this->config = $config; + function __construct($opts, $mh) { + $this->query = $opts->query; + $this->page = $opts->page; + $this->opts = $opts; $url = $this->get_request_url(); if ($url) { $this->ch = curl_init($url); - curl_setopt_array($this->ch, $config->curl_settings); + curl_setopt_array($this->ch, $opts->curl_settings); curl_multi_add_handle($mh, $this->ch); } } @@ -25,44 +25,64 @@ abstract function get_results(); static public function print_results($results){} } - function init_search($type, $query, $page, $mh, $config) { - switch ($type) + function load_opts() { + $opts = require "config.php"; + + $opts->query = trim($_REQUEST["q"]); + $opts->type = (int) $_REQUEST["t"] ?? 0; + $opts->page = (int) $_REQUEST["p"] ?? 0; + + $opts->theme = trim(htmlspecialchars($_COOKIE["theme"] ?? "dark")); + $opts->safe_search = isset($_COOKIE["safe_search"]); + $opts->disable_special = isset($_COOKIE["disable_special"]); + $opts->disable_frontends = isset($_COOKIE["disable_frontends"]); + + $opts->language ??= trim(htmlspecialchars($_COOKIE["language"])); + $opts->number_of_results ??= trim(htmlspecialchars($_COOKIE["number_of_results"])); + + // TODO frontends + + return $opts; + } + + function init_search($opts, $mh) { + switch ($opts->type) { case 1: require "engines/qwant/image.php"; - return new QwantImageSearch($query, $page, $mh, $config); + return new QwantImageSearch($opts, $mh); case 2: require "engines/invidious/video.php"; - return new VideoSearch($query, $page, $mh, $config); + return new VideoSearch($opts, $mh); case 3: - if ($config->disable_bittorent_search) { + if ($opts->disable_bittorent_search) { echo "

The host disabled this feature! :C

"; break; } require "engines/bittorrent/merge.php"; - return new TorrentSearch($query, $page, $mh, $config); + return new TorrentSearch($opts, $mh); case 4: - if ($config->disable_hidden_service_search) { + if ($opts->disable_hidden_service_search) { echo "

The host disabled this feature! :C

"; break; } require "engines/ahmia/hidden_service.php"; - return new TorSearch($query, $page, $mh, $config); + return new TorSearch($opts, $mh); default: require "engines/text/text.php"; - return new TextSearch($query, $page, $mh, $config); + return new TextSearch($opts, $mh); } } - function fetch_search_results($type, $query, $page, $config, $do_print) { + function fetch_search_results($opts, $do_print) { $start_time = microtime(true); $mh = curl_multi_init(); - $search_category = init_search($type, $query, $page, $mh, $config); + $search_category = init_search($opts, $mh); $running = null; @@ -70,7 +90,9 @@ function fetch_search_results($type, $query, $page, $config, $do_print) { curl_multi_exec($mh, $running); } while ($running); - $results = $search_category->get_results($query, $page); + $results = $search_category->get_results(); + + // TODO test if no results here and fallback if (!$do_print) return $results; diff --git a/search.php b/search.php index 07319d35..25497d6e 100644 --- a/search.php +++ b/search.php @@ -1,10 +1,11 @@ - 1) return; @@ -23,15 +24,11 @@ function print_page_buttons($type, $query, $page) { echo ""; } - - $query = trim($_REQUEST["q"]); - $type = isset($_REQUEST["t"]) ? (int) $_REQUEST["t"] : 0; - $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; ?> <?php - echo $query; + echo $opts->query; ?> - LibreY @@ -39,18 +36,18 @@ function print_page_buttons($type, $query, $page) {

LibreY

strlen($query) || strlen($query) > 256) + if (1 > strlen($opts->query) || strlen($opts->query) > 256) { header("Location: ./"); die(); } - echo "value=\"" . htmlspecialchars($query) . "\""; + echo "value=\"" . htmlspecialchars($opts->query) . "\""; ?> >
"; + echo ""; ?> @@ -62,13 +59,13 @@ function print_page_buttons($type, $query, $page) { { $category_index = array_search($category, $categories); - if (($config->disable_bittorent_search && $category_index == 3) || - ($config->disable_hidden_service_search && $category_index ==4)) + if (($opts->disable_bittorent_search && $category_index == 3) || + ($opts->disable_hidden_service_search && $category_index ==4)) { continue; } - echo "\""" . ucfirst($category) . ""; + echo "type) ? "class=\"active\" " : "") . "href=\"./search.php?q=" . urlencode($opts->query) . "&p=0&t=" . $category_index . "\">\""" . ucfirst($category) . ""; } ?> @@ -76,8 +73,8 @@ function print_page_buttons($type, $query, $page) { type, $opts->query, $opts->page); ?> diff --git a/settings.php b/settings.php index 5c943f4d..e67baa61 100644 --- a/settings.php +++ b/settings.php @@ -1,4 +1,5 @@ Date: Tue, 22 Aug 2023 22:48:37 +0100 Subject: [PATCH 10/23] Make settings.php use opts --- misc/search_engine.php | 13 ++++-- settings.php | 104 +++++++++++++++-------------------------- 2 files changed, 47 insertions(+), 70 deletions(-) diff --git a/misc/search_engine.php b/misc/search_engine.php index dd877deb..b6dbb534 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -28,9 +28,9 @@ static public function print_results($results){} function load_opts() { $opts = require "config.php"; - $opts->query = trim($_REQUEST["q"]); - $opts->type = (int) $_REQUEST["t"] ?? 0; - $opts->page = (int) $_REQUEST["p"] ?? 0; + $opts->query = trim($_REQUEST->q ?? 0); + $opts->type = (int) ($_REQUEST["t"] ?? 0); + $opts->page = (int) ($_REQUEST["p"] ?? 0); $opts->theme = trim(htmlspecialchars($_COOKIE["theme"] ?? "dark")); $opts->safe_search = isset($_COOKIE["safe_search"]); @@ -40,7 +40,12 @@ function load_opts() { $opts->language ??= trim(htmlspecialchars($_COOKIE["language"])); $opts->number_of_results ??= trim(htmlspecialchars($_COOKIE["number_of_results"])); - // TODO frontends + foreach (array_keys($opts->frontends ?? array()) as $frontend) { + $opts->frontends[$frontend]["instance_url"] = $_COOKIE[$frontend] ?? ""; + } + + echo "
";
+        echo "
"; return $opts; } diff --git a/settings.php b/settings.php index e67baa61..6a4f849c 100644 --- a/settings.php +++ b/settings.php @@ -1,44 +1,35 @@ $value) - { - if (!empty($value)) - { - setcookie($key, $value, time() + (86400 * 90), '/'); - } - else - { - setcookie($key, "", time() - 1000); - } - } + if (isset($_REQUEST["save"])) { + foreach($_POST as $key=>$value) { + if (!empty($value)) { + setcookie($key, $value, time() + (86400 * 90), '/'); + } else { + setcookie($key, "", time() - 1000); } + } + } - if (isset($_REQUEST["save"]) || isset($_REQUEST["reset"])) - { - header("Location: ./"); - die(); - } + if (isset($_REQUEST["save"]) || isset($_REQUEST["reset"])) { + header("Location: ./"); + die(); + } - require "misc/header.php"; + require "misc/header.php"; ?> LibreY - Settings @@ -68,10 +59,9 @@ "; - if (isset($_COOKIE["theme"])) - { - $cookie_theme = $_COOKIE["theme"]; - $themes = str_replace($cookie_theme . "\"", $cookie_theme . "\" selected", $themes); + if (isset($_COOKIE["theme"])) { + $theme = $opts->theme; + $themes = str_replace($theme . "\"", $theme . "\" selected", $themes); } echo $themes; @@ -80,19 +70,19 @@
- > + disable_special ? "checked" : ""; ?> >

Privacy friendly frontends

For an example if you want to view YouTube without getting spied on, click on "Invidious", find the instance that is most suitable for you then paste it in (correct format: https://example.com)

frontends as $frontend => $data) + foreach($opts->frontends as $frontend => $data) { echo "
"; echo "" . ucfirst($frontend) . ""; echo "frontends["$frontend"]["instance_url"] ?? ""); echo ">"; echo "
"; } @@ -100,43 +90,25 @@
- > + disable_frontends ? "checked" : ""; ?> >

Search settings

- Site language - google_language_site; - ?>"> -
-
- Results language + Language google_language_results; - ?>"> + // TODO make this a dropdown + echo "language ?? "") . "\">"; + ?>
- google_number_of_results; ?>" > + " >
- > -
-
- -

Wikipedia settings

-
-
- Results language - wikipedia_language; - ?>"> + safe_search ? "checked" : ""; ?> >
From b3693add934c3cfb1d8f14991f4deb4bb17e9e41 Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 22 Aug 2023 22:49:24 +0100 Subject: [PATCH 11/23] use correct parameter for search query --- misc/search_engine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/search_engine.php b/misc/search_engine.php index b6dbb534..d62db9a8 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -28,7 +28,7 @@ static public function print_results($results){} function load_opts() { $opts = require "config.php"; - $opts->query = trim($_REQUEST->q ?? 0); + $opts->query = trim($_REQUEST["q"] ?? ""); $opts->type = (int) ($_REQUEST["t"] ?? 0); $opts->page = (int) ($_REQUEST["p"] ?? 0); From 649b0065e3f7b0a8e83196b354dd6f5ef7b445d3 Mon Sep 17 00:00:00 2001 From: davidovski Date: Tue, 22 Aug 2023 23:55:11 +0100 Subject: [PATCH 12/23] make some options editable via url parameters --- engines/librex/{text.php => fallback.php} | 17 ++++- engines/special/wikipedia.php | 2 +- engines/text/duckduckgo.php | 2 +- engines/text/google.php | 3 +- misc/search_engine.php | 40 +++++++++--- misc/tools.php | 79 +++++++---------------- 6 files changed, 74 insertions(+), 69 deletions(-) rename engines/librex/{text.php => fallback.php} (80%) diff --git a/engines/librex/text.php b/engines/librex/fallback.php similarity index 80% rename from engines/librex/text.php rename to engines/librex/fallback.php index ba314e37..8492bc2a 100644 --- a/engines/librex/text.php +++ b/engines/librex/fallback.php @@ -1,7 +1,19 @@ instance = $instance; + parent::__construct($opts, $mh); + } + + public function get_request_url() { + return $instance . "api.php?" .opts_to_params($opts); + } + +} + + + function get_librex_results($opts, $mh) { global $config; if (isset($_REQUEST["nfb"]) && $_REQUEST["nfb"] == "1") @@ -50,4 +62,5 @@ function get_librex_results($query, $page) return array_values($results); } + ?> diff --git a/engines/special/wikipedia.php b/engines/special/wikipedia.php index 786a357f..436deb42 100644 --- a/engines/special/wikipedia.php +++ b/engines/special/wikipedia.php @@ -22,7 +22,7 @@ public function get_results() { $description = substr($first_page["extract"], 0, 250) . "..."; - $source = check_for_privacy_frontend("https://$this->wikipedia_language.wikipedia.org/wiki/$this->query"); + $source = check_for_privacy_frontend("https://$this->wikipedia_language.wikipedia.org/wiki/$this->query", $this->opts); $response = array( "special_response" => array( "response" => htmlspecialchars($description), diff --git a/engines/text/duckduckgo.php b/engines/text/duckduckgo.php index 6833f4a3..98026c9c 100644 --- a/engines/text/duckduckgo.php +++ b/engines/text/duckduckgo.php @@ -41,7 +41,7 @@ public function get_results() { $url = $url->textContent; - $url = check_for_privacy_frontend($url); + $url = check_for_privacy_frontend($url, $opts); $title = $xpath->evaluate(".//h2[@class='result__title']", $result)[0]; $description = $xpath->evaluate(".//a[@class='result__snippet']", $result)[0]; diff --git a/engines/text/google.php b/engines/text/google.php index 83c731f1..6104d48e 100644 --- a/engines/text/google.php +++ b/engines/text/google.php @@ -51,8 +51,7 @@ public function get_results() { } $url = $url->textContent; - - $url = check_for_privacy_frontend($url); + $url = check_for_privacy_frontend($url, $opts); $title = $xpath->evaluate(".//h3", $result)[0]; $description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0]; diff --git a/misc/search_engine.php b/misc/search_engine.php index d62db9a8..3561a0a7 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -31,23 +31,44 @@ function load_opts() { $opts->query = trim($_REQUEST["q"] ?? ""); $opts->type = (int) ($_REQUEST["t"] ?? 0); $opts->page = (int) ($_REQUEST["p"] ?? 0); + $opts->do_fallback = (int) ($_REQUEST["nfb"] ?? 0) == 0; $opts->theme = trim(htmlspecialchars($_COOKIE["theme"] ?? "dark")); - $opts->safe_search = isset($_COOKIE["safe_search"]); - $opts->disable_special = isset($_COOKIE["disable_special"]); - $opts->disable_frontends = isset($_COOKIE["disable_frontends"]); - $opts->language ??= trim(htmlspecialchars($_COOKIE["language"])); + $opts->safe_search = (int) ($_REQUEST["safe"] ?? 0) == 1 || isset($_COOKIE["safe_search"]); + + $opts->disable_special = (int) ($_REQUEST["ns"] ?? 0) == 1 || isset($_COOKIE["disable_special"]); + + $opts->disable_frontends = (int) ($_REQUEST["nf"] ?? 0) == 1 || isset($_COOKIE["disable_frontends"]); + + $opts->language = $_REQUEST["lang"] ?? trim(htmlspecialchars($_COOKIE["language"])); + + $opts->do_fallback = (int) ($_REQUEST["nfb"] ?? 0) == 0; + if (!$opts->instance_fallback) { + $opts->do_fallback = false; + } + $opts->number_of_results ??= trim(htmlspecialchars($_COOKIE["number_of_results"])); foreach (array_keys($opts->frontends ?? array()) as $frontend) { $opts->frontends[$frontend]["instance_url"] = $_COOKIE[$frontend] ?? ""; } + return $opts; + } - echo "
";
-        echo "
"; + function opts_to_params($opts) { + $query = urlencode($opts->query); - return $opts; + $params = ""; + $params .= "p=$opts->page"; + $params .= "&q=$query"; + $params .= "&t=$opts->type"; + $params .= "&nfb=" . $opts->do_fallback ? 0 : 1; + $params .= "&safe=" . $opts->safe_search ? 1 : 0; + $params .= "&nf=" . $opts->disable_frontends ? 1 : 0; + $params .= "&ns=" . $opts->disable_special ? 1 : 0; + + return $params; } function init_search($opts, $mh) { @@ -97,7 +118,10 @@ function fetch_search_results($opts, $do_print) { $results = $search_category->get_results(); - // TODO test if no results here and fallback + if (empty($results)) { + //if (!$opt->do_fallback) + //return ; + } if (!$do_print) return $results; diff --git a/misc/tools.php b/misc/tools.php index b70ba0e9..23d41bfa 100644 --- a/misc/tools.php +++ b/misc/tools.php @@ -20,50 +20,35 @@ function get_root_domain($url) function try_replace_with_frontend($url, $frontend, $original) { global $config; - $frontends = $config->frontends; + $frontends = $opts->frontends; + $frontend = $opts->$frontend["instance_url"]; - if (isset($_COOKIE[$frontend]) || !empty($frontends[$frontend]["instance_url"])) - { + if ($frontend) { - if (isset($_COOKIE[$frontend])) - $frontend = $_COOKIE[$frontend]; - else if (!empty($frontends[$frontend]["instance_url"])) - $frontend = $frontends[$frontend]["instance_url"]; if (empty(trim($frontend))) return $url; - if (strpos($url, "wikipedia.org") !== false) - { + if (strpos($url, "wikipedia.org") !== false) { $wiki_split = explode(".", $url); - if (count($wiki_split) > 1) - { + if (count($wiki_split) > 1) { $lang = explode("://", $wiki_split[0])[1]; $url = $frontend . explode($original, $url)[1] . (strpos($url, "?") !== false ? "&" : "?") . "lang=" . $lang; } - } - else if (strpos($url, "fandom.com") !== false) - { + } else if (strpos($url, "fandom.com") !== false) { $fandom_split = explode(".", $url); - if (count($fandom_split) > 1) - { + if (count($fandom_split) > 1) { $wiki_name = explode("://", $fandom_split[0])[1]; $url = $frontend . "/" . $wiki_name . explode($original, $url)[1]; } - } - else if (strpos($url, "gist.github.com") !== false) - { + } else if (strpos($url, "gist.github.com") !== false) { $gist_path = explode("gist.github.com", $url)[1]; $url = $frontend . "/gist" . $gist_path; - } - else if (strpos($url, "stackexchange.com") !== false) - { + } else if (strpos($url, "stackexchange.com") !== false) { $se_domain = explode(".", explode("://", $url)[1])[0]; $se_path = explode("stackexchange.com", $url)[1]; $url = $frontend . "/exchange" . "/" . $se_domain . $se_path; - } - else - { + } else { $url = $frontend . explode($original, $url)[1]; } @@ -74,25 +59,17 @@ function try_replace_with_frontend($url, $frontend, $original) return $url; } - function check_for_privacy_frontend($url) - { - - global $config; - - if (isset($_COOKIE["disable_frontends"])) + function check_for_privacy_frontend($url, $opts) { + if ($opts->disable_frontends) return $url; - foreach($config->frontends as $frontend => $data) - { + foreach($opts->frontends as $frontend => $data) { $original = $data["original_url"]; - if (strpos($url, $original)) - { + if (strpos($url, $original)) { $url = try_replace_with_frontend($url, $frontend, $original); break; - } - else if (strpos($url, "stackexchange.com")) - { + } else if (strpos($url, "stackexchange.com")) { $url = try_replace_with_frontend($url, "anonymousoverflow", "stackexchange.com"); break; } @@ -101,8 +78,7 @@ function check_for_privacy_frontend($url) return $url; } - function get_xpath($response) - { + function get_xpath($response) { $htmlDom = new DOMDocument; @$htmlDom->loadHTML($response); $xpath = new DOMXPath($htmlDom); @@ -110,9 +86,8 @@ function get_xpath($response) return $xpath; } - function request($url) - { - global $config; + function request($url) { + $config ??= require "config.php"; $ch = curl_init($url); curl_setopt_array($ch, $config->curl_settings); @@ -121,28 +96,24 @@ function request($url) return $response; } - function human_filesize($bytes, $dec = 2) - { + function human_filesize($bytes, $dec = 2) { $size = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $factor = floor((strlen($bytes) - 1) / 3); return sprintf("%.{$dec}f ", $bytes / pow(1024, $factor)) . @$size[$factor]; } - function remove_special($string) - { + function remove_special($string) { $string = preg_replace("/[\r\n]+/", "\n", $string); return trim(preg_replace("/\s+/", ' ', $string)); } - function print_elapsed_time($start_time) - { + function print_elapsed_time($start_time) { $end_time = number_format(microtime(true) - $start_time, 2, '.', ''); echo "

Fetched the results in $end_time seconds

"; } - function print_next_page_button($text, $page, $query, $type) - { + function print_next_page_button($text, $page, $query, $type) { echo "
"; echo ""; echo ""; @@ -151,15 +122,13 @@ function print_next_page_button($text, $page, $query, $type) echo "
"; } - function copy_cookies($curl) - { + function copy_cookies($curl) { if (array_key_exists("HTTP_COOKIE", $_SERVER)) curl_setopt( $curl, CURLOPT_COOKIE, $_SERVER['HTTP_COOKIE'] ); } - function get_country_emote($code) - { + function get_country_emote($code) { $emoji = []; foreach(str_split($code) as $c) { if(($o = ord($c)) > 64 && $o % 32 < 27) { From 1b898c6614b3c164c09e3b2ea9cde4429808cf67 Mon Sep 17 00:00:00 2001 From: davidovski Date: Wed, 23 Aug 2023 00:38:59 +0100 Subject: [PATCH 13/23] fallback on all queries --- api.php | 13 ++----- engines/ahmia/hidden_service.php | 4 +- engines/bittorrent/1337x.php | 3 ++ engines/bittorrent/nyaa.php | 3 ++ engines/bittorrent/rutor.php | 2 + engines/bittorrent/torrentgalaxy.php | 51 ++++++++++++++------------ engines/invidious/video.php | 2 +- engines/librex/fallback.php | 55 +++++++++++++--------------- engines/qwant/image.php | 3 ++ engines/text/duckduckgo.php | 2 +- engines/text/google.php | 2 +- engines/text/text.php | 7 +--- misc/search_engine.php | 24 +++++++----- misc/tools.php | 15 ++++---- 14 files changed, 98 insertions(+), 88 deletions(-) diff --git a/api.php b/api.php index a18046ea..8084fd9e 100644 --- a/api.php +++ b/api.php @@ -1,10 +1,10 @@ query) { echo "

Example API request: ./api.php?q=gentoo&p=2&t=0


\"q\" is the keyword

@@ -17,12 +17,7 @@ die(); } - $query = $_REQUEST["q"]; - $query_encoded = urlencode($query); - $page = isset($_REQUEST["p"]) ? (int) $_REQUEST["p"] : 0; - $type = isset($_REQUEST["t"]) ? (int) $_REQUEST["t"] : 0; - - $results = fetch_search_results($type, $query, $page, $config, false); + $results = fetch_search_results($opts, false); header("Content-Type: application/json"); echo json_encode($results); ?> diff --git a/engines/ahmia/hidden_service.php b/engines/ahmia/hidden_service.php index 9ddd58b4..f950ba87 100644 --- a/engines/ahmia/hidden_service.php +++ b/engines/ahmia/hidden_service.php @@ -8,9 +8,11 @@ public function get_request_url() { public function get_results() { $response = curl_multi_getcontent($this->ch); + $results = array(); $xpath = get_xpath($response); - $results = array(); + if (!$xpath) + return $results; foreach($xpath->query("//ol[@class='searchResults']//li[@class='result']") as $result) { diff --git a/engines/bittorrent/1337x.php b/engines/bittorrent/1337x.php index c70468fa..f5390ecf 100644 --- a/engines/bittorrent/1337x.php +++ b/engines/bittorrent/1337x.php @@ -11,6 +11,9 @@ public function get_results() { $xpath = get_xpath($response); $results = array(); + if (!$xpath) + return $results; + foreach($xpath->query("//table/tbody/tr") as $result) { $name = $xpath->evaluate(".//td[@class='coll-1 name']/a", $result)[1]->textContent; $magnet = "./engines/bittorrent/get_magnet_1337x.php?url=https://1337x.to" . $xpath->evaluate(".//td[@class='coll-1 name']/a/@href", $result)[1]->textContent; diff --git a/engines/bittorrent/nyaa.php b/engines/bittorrent/nyaa.php index c250f1ac..d3cc22ae 100644 --- a/engines/bittorrent/nyaa.php +++ b/engines/bittorrent/nyaa.php @@ -11,6 +11,9 @@ public function get_results() { $xpath = get_xpath($response); $results = array(); + if (!$xpath) + return $results; + foreach($xpath->query("//tbody/tr") as $result) { $name_node = $xpath->evaluate(".//td[@colspan='2']//a[not(contains(@class, 'comments'))]/@title", $result); diff --git a/engines/bittorrent/rutor.php b/engines/bittorrent/rutor.php index f6790a78..e575bac8 100644 --- a/engines/bittorrent/rutor.php +++ b/engines/bittorrent/rutor.php @@ -9,6 +9,8 @@ public function get_results() { $xpath = get_xpath($response); $results = array(); + if (!$xpath) + return $results; foreach($xpath->query("//table/tr[@class='gai' or @class='tum']") as $result) { diff --git a/engines/bittorrent/torrentgalaxy.php b/engines/bittorrent/torrentgalaxy.php index d893db3b..2f6c6062 100644 --- a/engines/bittorrent/torrentgalaxy.php +++ b/engines/bittorrent/torrentgalaxy.php @@ -6,33 +6,36 @@ public function get_request_url() { } public function get_results() { - $response = curl_multi_getcontent($this->ch); - $xpath = get_xpath($response); - $results = array(); + $response = curl_multi_getcontent($this->ch); + $xpath = get_xpath($response); + $results = array(); - foreach($xpath->query("//div[@class='tgxtablerow txlight']") as $result) - { - $name = $xpath->evaluate(".//div[contains(@class, 'clickable-row')]", $result)[0]->textContent; - $magnet = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/a/@href", $result)[1]->textContent; - $magnet_without_tracker = explode("&tr=", $magnet)[0]; - $magnet = $magnet_without_tracker . $this->opts->bittorrent_trackers; - $size = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span", $result)[0]->textContent; - $seeders = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[1]->textContent; - $leechers = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[2]->textContent; + if (!$xpath) + return $results; - array_push($results, - array ( - "name" => htmlspecialchars($name), - "seeders" => (int) $seeders, - "leechers" => (int) $leechers, - "magnet" => htmlspecialchars($magnet), - "size" => htmlspecialchars($size), - "source" => "torrentgalaxy.to" - ) - ); - } + foreach($xpath->query("//div[@class='tgxtablerow txlight']") as $result) + { + $name = $xpath->evaluate(".//div[contains(@class, 'clickable-row')]", $result)[0]->textContent; + $magnet = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/a/@href", $result)[1]->textContent; + $magnet_without_tracker = explode("&tr=", $magnet)[0]; + $magnet = $magnet_without_tracker . $this->opts->bittorrent_trackers; + $size = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span", $result)[0]->textContent; + $seeders = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[1]->textContent; + $leechers = $xpath->evaluate(".//div[@class='tgxtablecell collapsehide rounded txlight']/span/font", $result)[2]->textContent; - return $results; + array_push($results, + array ( + "name" => htmlspecialchars($name), + "seeders" => (int) $seeders, + "leechers" => (int) $leechers, + "magnet" => htmlspecialchars($magnet), + "size" => htmlspecialchars($size), + "source" => "torrentgalaxy.to" + ) + ); } + + return $results; } + } ?> diff --git a/engines/invidious/video.php b/engines/invidious/video.php index 7fefbf61..ad46a9a2 100644 --- a/engines/invidious/video.php +++ b/engines/invidious/video.php @@ -1,7 +1,7 @@ instance_url = $this->config->invidious_instance_for_video_results; + $this->instance_url = $this->opts->invidious_instance_for_video_results; $query = urlencode($this->query); return "$this->instance_url/api/v1/search?q=$query"; } diff --git a/engines/librex/fallback.php b/engines/librex/fallback.php index 8492bc2a..7d5e6a10 100644 --- a/engines/librex/fallback.php +++ b/engines/librex/fallback.php @@ -1,25 +1,28 @@ instance = $instance; - parent::__construct($opts, $mh); + class LibreXFallback extends EngineRequest { + public function __construct($instance, $opts, $mh) { + $this->instance = $instance; + parent::__construct($opts, $mh); + } + + public function get_request_url() { + return $this->instance . "api.php?" . opts_to_params($this->opts); + } + + public function get_results() { + $response = curl_exec($this->ch); + $response = json_decode($response, true); + if (!$response) + return array(); + + return array_values($response); + } } - public function get_request_url() { - return $instance . "api.php?" .opts_to_params($opts); - } - -} - - - function get_librex_results($opts, $mh) { - global $config; - if (isset($_REQUEST["nfb"]) && $_REQUEST["nfb"] == "1") - return array(); - - if (!$config->instance_fallback) + function get_librex_results($opts) { + if (!$opts->do_fallback) return array(); $instances_json = json_decode(file_get_contents("instances.json"), true); @@ -27,12 +30,11 @@ function get_librex_results($opts, $mh) { if (empty($instances_json["instances"])) return array(); + // TODO pick instances which aren't on cooldown $instances = array_map(fn($n) => $n['clearnet'], array_filter($instances_json['instances'], fn($n) => !is_null($n['clearnet']))); shuffle($instances); - $query_encoded = urlencode($query); - $results = array(); $tries = 0; @@ -44,18 +46,13 @@ function get_librex_results($opts, $mh) { if (parse_url($instance)["host"] == parse_url($_SERVER['HTTP_HOST'])["host"]) continue; - $url = $instance . "api.php?q=$query_encoded&p=$page&t=0&nfb=1"; - - $librex_ch = curl_init($url); - curl_setopt_array($librex_ch, $config->curl_settings); - copy_cookies($librex_ch); - $response = curl_exec($librex_ch); - curl_close($librex_ch); + $librex_request = new LibreXFallback($instance, $opts, null); + $results = $librex_request->get_results(); - $code = curl_getinfo($librex_ch)["http_code"]; - $results = json_decode($response, true); + if (count($results) > 1) + return $results; - } while ( !empty($instances) && ($results == null || count($results) <= 1)); + } while ( !empty($instances)); if (empty($instances)) return array(); diff --git a/engines/qwant/image.php b/engines/qwant/image.php index a32dfce3..2655008f 100644 --- a/engines/qwant/image.php +++ b/engines/qwant/image.php @@ -11,6 +11,9 @@ public function get_results() { $results = array(); $xpath = get_xpath(curl_multi_getcontent($this->ch)); + if (!$xpath) + return $results; + foreach($xpath->query("//a[@rel='noopener']") as $result) { $image = $xpath->evaluate(".//img", $result)[0]; diff --git a/engines/text/duckduckgo.php b/engines/text/duckduckgo.php index 98026c9c..7bcff562 100644 --- a/engines/text/duckduckgo.php +++ b/engines/text/duckduckgo.php @@ -57,7 +57,7 @@ public function get_results() { ) ); } - return $results; + return $results; } } diff --git a/engines/text/google.php b/engines/text/google.php index 6104d48e..c12f9fa4 100644 --- a/engines/text/google.php +++ b/engines/text/google.php @@ -51,7 +51,7 @@ public function get_results() { } $url = $url->textContent; - $url = check_for_privacy_frontend($url, $opts); + $url = check_for_privacy_frontend($url, $this->opts); $title = $xpath->evaluate(".//h3", $result)[0]; $description = $xpath->evaluate(".//div[contains(@class, 'VwiC3b')]", $result)[0]; diff --git a/engines/text/text.php b/engines/text/text.php index df29438e..cdaaa4a5 100644 --- a/engines/text/text.php +++ b/engines/text/text.php @@ -27,11 +27,8 @@ public function __construct($opts, $mh) { } public function get_results() { - if (curl_getinfo($this->engine_request->ch)['http_code'] != '200') - { - require "engines/librex/text.php"; - return get_librex_results($this->query, $this->page); - } + if (curl_getinfo($this->engine_request->ch)['http_code'] != '200') + return array(); $results = $this->engine_request->get_results(); diff --git a/misc/search_engine.php b/misc/search_engine.php index 3561a0a7..6b38fe4f 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -6,17 +6,21 @@ function __construct($opts, $mh) { $this->opts = $opts; $url = $this->get_request_url(); + error_log($url); if ($url) { $this->ch = curl_init($url); - curl_setopt_array($this->ch, $opts->curl_settings); - curl_multi_add_handle($mh, $this->ch); + + if ($opts->curl_settings) + curl_setopt_array($this->ch, $opts->curl_settings); + + if ($mh) + curl_multi_add_handle($mh, $this->ch); } } public function get_request_url(){ return ""; } - public function successful() { return curl_getinfo($this->ch)['http_code'] == '200'; } @@ -41,7 +45,7 @@ function load_opts() { $opts->disable_frontends = (int) ($_REQUEST["nf"] ?? 0) == 1 || isset($_COOKIE["disable_frontends"]); - $opts->language = $_REQUEST["lang"] ?? trim(htmlspecialchars($_COOKIE["language"])); + $opts->language = $_REQUEST["lang"] ?? trim(htmlspecialchars($_COOKIE["language"] ?? "")); $opts->do_fallback = (int) ($_REQUEST["nfb"] ?? 0) == 0; if (!$opts->instance_fallback) { @@ -63,10 +67,10 @@ function opts_to_params($opts) { $params .= "p=$opts->page"; $params .= "&q=$query"; $params .= "&t=$opts->type"; - $params .= "&nfb=" . $opts->do_fallback ? 0 : 1; - $params .= "&safe=" . $opts->safe_search ? 1 : 0; - $params .= "&nf=" . $opts->disable_frontends ? 1 : 0; - $params .= "&ns=" . $opts->disable_special ? 1 : 0; + $params .= "&nfb=" . ($opts->do_fallback ? 0 : 1); + $params .= "&safe=" . ($opts->safe_search ? 1 : 0); + $params .= "&nf=" . ($opts->disable_frontends ? 1 : 0); + $params .= "&ns=" . ($opts->disable_special ? 1 : 0); return $params; } @@ -119,8 +123,8 @@ function fetch_search_results($opts, $do_print) { $results = $search_category->get_results(); if (empty($results)) { - //if (!$opt->do_fallback) - //return ; + require "engines/librex/fallback.php"; + $results = get_librex_results($opts); } if (!$do_print) diff --git a/misc/tools.php b/misc/tools.php index 23d41bfa..ee2292db 100644 --- a/misc/tools.php +++ b/misc/tools.php @@ -17,14 +17,12 @@ function get_root_domain($url) return $root_domain; } - function try_replace_with_frontend($url, $frontend, $original) - { - global $config; + function try_replace_with_frontend($url, $frontend, $original, $opts) { $frontends = $opts->frontends; - $frontend = $opts->$frontend["instance_url"]; + $frontend = $opts->$frontend; if ($frontend) { - + $frontend = $frontend->instance_url; if (empty(trim($frontend))) return $url; @@ -67,10 +65,10 @@ function check_for_privacy_frontend($url, $opts) { $original = $data["original_url"]; if (strpos($url, $original)) { - $url = try_replace_with_frontend($url, $frontend, $original); + $url = try_replace_with_frontend($url, $frontend, $original, $opts); break; } else if (strpos($url, "stackexchange.com")) { - $url = try_replace_with_frontend($url, "anonymousoverflow", "stackexchange.com"); + $url = try_replace_with_frontend($url, "anonymousoverflow", "stackexchange.com", $opts); break; } } @@ -79,6 +77,9 @@ function check_for_privacy_frontend($url, $opts) { } function get_xpath($response) { + if (!$response) + return null; + $htmlDom = new DOMDocument; @$htmlDom->loadHTML($response); $xpath = new DOMXPath($htmlDom); From 14cdccb83f2ac83c91464f90111b61f51d71d164 Mon Sep 17 00:00:00 2001 From: davidovski Date: Wed, 23 Aug 2023 00:51:23 +0100 Subject: [PATCH 14/23] add theme to query parameter --- misc/header.php | 3 ++- misc/search_engine.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/misc/header.php b/misc/header.php index 2d6db464..b7944bf8 100644 --- a/misc/header.php +++ b/misc/header.php @@ -8,5 +8,6 @@ "/> diff --git a/misc/search_engine.php b/misc/search_engine.php index 6b38fe4f..9b42f14b 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -37,7 +37,7 @@ function load_opts() { $opts->page = (int) ($_REQUEST["p"] ?? 0); $opts->do_fallback = (int) ($_REQUEST["nfb"] ?? 0) == 0; - $opts->theme = trim(htmlspecialchars($_COOKIE["theme"] ?? "dark")); + $opts->theme = $_REQUEST["theme"] ?? trim(htmlspecialchars($_COOKIE["theme"] ?? "dark")); $opts->safe_search = (int) ($_REQUEST["safe"] ?? 0) == 1 || isset($_COOKIE["safe_search"]); From 1e150060678104010d0c5cd72caa1f0a475fb7fb Mon Sep 17 00:00:00 2001 From: davidovski Date: Wed, 23 Aug 2023 00:54:10 +0100 Subject: [PATCH 15/23] Remove duplicate nfb parameter --- misc/search_engine.php | 1 - 1 file changed, 1 deletion(-) diff --git a/misc/search_engine.php b/misc/search_engine.php index 9b42f14b..5d4c256c 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -35,7 +35,6 @@ function load_opts() { $opts->query = trim($_REQUEST["q"] ?? ""); $opts->type = (int) ($_REQUEST["t"] ?? 0); $opts->page = (int) ($_REQUEST["p"] ?? 0); - $opts->do_fallback = (int) ($_REQUEST["nfb"] ?? 0) == 0; $opts->theme = $_REQUEST["theme"] ?? trim(htmlspecialchars($_COOKIE["theme"] ?? "dark")); From 8ede57f4f46d46521b77b1f940bc537029f80843 Mon Sep 17 00:00:00 2001 From: davidovski Date: Wed, 23 Aug 2023 02:32:47 +0100 Subject: [PATCH 16/23] fix issue with not actually using duckduckgo --- engines/text/duckduckgo.php | 2 +- engines/text/google.php | 7 ++++--- engines/text/text.php | 5 +---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/engines/text/duckduckgo.php b/engines/text/duckduckgo.php index 7bcff562..378ad4e0 100644 --- a/engines/text/duckduckgo.php +++ b/engines/text/duckduckgo.php @@ -41,7 +41,7 @@ public function get_results() { $url = $url->textContent; - $url = check_for_privacy_frontend($url, $opts); + $url = check_for_privacy_frontend($url, $this->opts); $title = $xpath->evaluate(".//h2[@class='result__title']", $result)[0]; $description = $xpath->evaluate(".//a[@class='result__snippet']", $result)[0]; diff --git a/engines/text/google.php b/engines/text/google.php index c12f9fa4..4aa25238 100644 --- a/engines/text/google.php +++ b/engines/text/google.php @@ -25,11 +25,13 @@ function get_request_url() } - public function get_results() { $results = array(); $xpath = get_xpath(curl_multi_getcontent($this->ch)); + if (!$xpath) + return $results; + $didyoumean = $xpath->query(".//a[@class='gL9Hy']")[0]; if (!is_null($didyoumean)) @@ -37,8 +39,7 @@ public function get_results() { "did_you_mean" => $didyoumean->textContent )); - foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result) - { + foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result) { $url = $xpath->evaluate(".//div[@class='yuRUbf']//a/@href", $result)[0]; if ($url == null) diff --git a/engines/text/text.php b/engines/text/text.php index cdaaa4a5..fb4a7512 100644 --- a/engines/text/text.php +++ b/engines/text/text.php @@ -5,7 +5,7 @@ public function __construct($opts, $mh) { $this->page = $opts->page; $this->opts = $opts; - $engine = $opts->preferred_engines->text ?? "google"; + $engine = $opts->preferred_engines["text"] ?? "google"; $query_parts = explode(" ", $this->query); $last_word_query = end($query_parts); @@ -27,9 +27,6 @@ public function __construct($opts, $mh) { } public function get_results() { - if (curl_getinfo($this->engine_request->ch)['http_code'] != '200') - return array(); - $results = $this->engine_request->get_results(); if ($this->special_request) { From 1b694e088243b5fd9cc5a0232c0cc227ecb7a569 Mon Sep 17 00:00:00 2001 From: davidovski Date: Wed, 23 Aug 2023 10:55:18 +0100 Subject: [PATCH 17/23] Fix frontends being parsed from config --- misc/search_engine.php | 4 +++- misc/tools.php | 13 +++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/misc/search_engine.php b/misc/search_engine.php index 5d4c256c..b22941d1 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -21,6 +21,7 @@ function __construct($opts, $mh) { public function get_request_url(){ return ""; } + public function successful() { return curl_getinfo($this->ch)['http_code'] == '200'; } @@ -54,7 +55,8 @@ function load_opts() { $opts->number_of_results ??= trim(htmlspecialchars($_COOKIE["number_of_results"])); foreach (array_keys($opts->frontends ?? array()) as $frontend) { - $opts->frontends[$frontend]["instance_url"] = $_COOKIE[$frontend] ?? ""; + if (!$opts->frontends[$frontend]["instance_url"]) + $opts->frontends[$frontend]["instance_url"] = $_COOKIE[$frontend] ?? ""; } return $opts; } diff --git a/misc/tools.php b/misc/tools.php index ee2292db..20ffa9bc 100644 --- a/misc/tools.php +++ b/misc/tools.php @@ -1,28 +1,25 @@ frontends; - $frontend = $opts->$frontend; - if ($frontend) { - $frontend = $frontend->instance_url; + if (array_key_exists($frontend, $opts->frontends)) { + $frontend = $frontends[$frontend]["instance_url"]; if (empty(trim($frontend))) return $url; From 5ce0f2ccd02a01423a4b001c8437a7de79ec08e2 Mon Sep 17 00:00:00 2001 From: davidovski Date: Thu, 24 Aug 2023 03:57:11 +0100 Subject: [PATCH 18/23] fix video and image search --- engines/invidious/video.php | 11 ++++------- engines/qwant/image.php | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/engines/invidious/video.php b/engines/invidious/video.php index ad46a9a2..17264dfb 100644 --- a/engines/invidious/video.php +++ b/engines/invidious/video.php @@ -11,13 +11,11 @@ public function get_results() { $response = curl_multi_getcontent($this->ch); $json_response = json_decode($response, true); - foreach ($json_response as $response) - { - if ($response["type"] == "video") - { + foreach ($json_response as $response) { + if ($response["type"] == "video") { $title = $response["title"]; $url = "https://youtube.com/watch?v=" . $response["videoId"]; - $url = check_for_privacy_frontend($url); + $url = check_for_privacy_frontend($url, $this-opts); $uploader = $response["author"]; $views = $response["viewCount"]; $date = $response["publishedText"]; @@ -43,8 +41,7 @@ public function get_results() { public static function print_results($results) { echo "
"; - foreach($results as $result) - { + foreach($results as $result) { $title = $result["title"]; $url = $result["url"]; $base_url = $result["base_url"]; diff --git a/engines/qwant/image.php b/engines/qwant/image.php index 2655008f..7459b18d 100644 --- a/engines/qwant/image.php +++ b/engines/qwant/image.php @@ -24,7 +24,7 @@ public function get_results() { $encoded_url_split1 = explode("==/", $encoded_url)[1]; $encoded_url_split2 = explode("?position", $encoded_url_split1)[0]; $real_url = urldecode(base64_decode($encoded_url_split2)); - $real_url = check_for_privacy_frontend($real_url); + $real_url = check_for_privacy_frontend($real_url, $this->opts); $alt = $image->getAttribute("alt"); $thumbnail = urlencode($image->getAttribute("src")); From 508ac0c576adc5314c3b8d6e5287a5ee2506b461 Mon Sep 17 00:00:00 2001 From: davidovski Date: Thu, 24 Aug 2023 15:45:45 +0100 Subject: [PATCH 19/23] Use cookie frontend over config frontend --- engines/invidious/video.php | 2 +- misc/search_engine.php | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/engines/invidious/video.php b/engines/invidious/video.php index 17264dfb..afd51b21 100644 --- a/engines/invidious/video.php +++ b/engines/invidious/video.php @@ -15,7 +15,7 @@ public function get_results() { if ($response["type"] == "video") { $title = $response["title"]; $url = "https://youtube.com/watch?v=" . $response["videoId"]; - $url = check_for_privacy_frontend($url, $this-opts); + $url = check_for_privacy_frontend($url, $this->opts); $uploader = $response["author"]; $views = $response["viewCount"]; $date = $response["publishedText"]; diff --git a/misc/search_engine.php b/misc/search_engine.php index b22941d1..5ef99c4b 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -6,19 +6,19 @@ function __construct($opts, $mh) { $this->opts = $opts; $url = $this->get_request_url(); - error_log($url); - if ($url) { - $this->ch = curl_init($url); + if (!$url) + return; - if ($opts->curl_settings) - curl_setopt_array($this->ch, $opts->curl_settings); + $this->ch = curl_init($url); - if ($mh) - curl_multi_add_handle($mh, $this->ch); - } + if ($opts->curl_settings) + curl_setopt_array($this->ch, $opts->curl_settings); + + if ($mh) + curl_multi_add_handle($mh, $this->ch); } - public function get_request_url(){ + public function get_request_url() { return ""; } @@ -55,8 +55,7 @@ function load_opts() { $opts->number_of_results ??= trim(htmlspecialchars($_COOKIE["number_of_results"])); foreach (array_keys($opts->frontends ?? array()) as $frontend) { - if (!$opts->frontends[$frontend]["instance_url"]) - $opts->frontends[$frontend]["instance_url"] = $_COOKIE[$frontend] ?? ""; + $opts->frontends[$frontend]["instance_url"] = $_COOKIE[$frontend] ?? $opts->frontends[$frontend]["instance_url"]; } return $opts; } From 036b10efe7f6bd8219247d116a08253fa25c7c52 Mon Sep 17 00:00:00 2001 From: davidovski Date: Fri, 25 Aug 2023 00:03:12 +0100 Subject: [PATCH 20/23] Add hl back into google query --- engines/text/google.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/text/google.php b/engines/text/google.php index 4aa25238..d43ff1d2 100644 --- a/engines/text/google.php +++ b/engines/text/google.php @@ -12,8 +12,10 @@ function get_request_url() $url = "https://www.google.$domain/search?q=$query_encoded&nfpr=1&start=$this->page"; - if (3 > strlen($results_language) && 0 < strlen($results_language)) + if (3 > strlen($results_language) && 0 < strlen($results_language)) { $url .= "&lr=lang_$results_language"; + $url .= "&hl=$results_language"; + } if (3 > strlen($number_of_results) && 0 < strlen($number_of_results)) $url .= "&num=$number_of_results"; From 04e0183d79daaef3c19cc116f4e9736511ba5b90 Mon Sep 17 00:00:00 2001 From: davidovski Date: Fri, 25 Aug 2023 00:10:03 +0100 Subject: [PATCH 21/23] Fix missing arg error --- engines/text/text.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/text/text.php b/engines/text/text.php index fb4a7512..ea983beb 100644 --- a/engines/text/text.php +++ b/engines/text/text.php @@ -10,7 +10,7 @@ public function __construct($opts, $mh) { $query_parts = explode(" ", $this->query); $last_word_query = end($query_parts); if (substr($this->query, 0, 1) == "!" || substr($last_word_query, 0, 1) == "!") - check_ddg_bang($this->query); + check_ddg_bang($this->query, $opts); if ($engine == "google") { require "engines/text/google.php"; @@ -97,7 +97,7 @@ public static function print_results($results) { } } - function check_ddg_bang($query) + function check_ddg_bang($query, $opts) { $bangs_json = file_get_contents("static/misc/ddg_bang.json"); @@ -125,7 +125,7 @@ function check_ddg_bang($query) $bang_query = trim(implode("", $bang_query_array)); $request_url = str_replace("{{{s}}}", str_replace('%26quot%3B','%22', urlencode($bang_query)), $bang_url); - $request_url = check_for_privacy_frontend($request_url); + $request_url = check_for_privacy_frontend($request_url, $opts); header("Location: " . $request_url); die(); From 723887bfc0f3d37d59fb9e3cf0918b6c5cbb8127 Mon Sep 17 00:00:00 2001 From: davidovski Date: Fri, 25 Aug 2023 00:12:19 +0100 Subject: [PATCH 22/23] Fix typo in variable name for instances --- instances.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instances.php b/instances.php index dc7c9b2b..8e26a8f2 100644 --- a/instances.php +++ b/instances.php @@ -19,7 +19,7 @@ function list_instances($instances) foreach($instances as $instance) { $hostname = parse_url($instance["clearnet"])["host"]; - $country = get_country_emote($instance["country"]) . $instnace["country"]; + $country = get_country_emote($instance["country"]) . $instance["country"]; $is_tor = !is_null($instance["tor"]); $is_i2p = !is_null($instance["i2p"]); From a7d1836eff46f789c88811f6506c4b7fcafd8d3d Mon Sep 17 00:00:00 2001 From: davidovski Date: Fri, 25 Aug 2023 11:36:19 +0100 Subject: [PATCH 23/23] Fixed fallback not occuring when special result --- config.php.example | 33 +++++++++++++++++---------------- misc/search_engine.php | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/config.php.example b/config.php.example index 9d287184..f906c724 100644 --- a/config.php.example +++ b/config.php.example @@ -17,7 +17,8 @@ "disable_hidden_service_search" => false, // Fallback to another librex instance if google search fails - "instance_fallback" => false, // This might generate a 504 Gateway Timeout error, we are looking into this. + // This may greatly increase the time it takes to get a result and in some cases results in 504 errors + "instance_fallback" => false, /* Preset privacy friendly frontends for users, these can be overwritten by users in the settings @@ -27,74 +28,74 @@ "frontends" => array( "invidious" => array( "instance_url" => "", - "project_url" => "https://docs.invidious.io/instances/", + "project_url" => "https://docs.invidious.io/instances/", "original_name" => "YouTube", "original_url" => "youtube.com" ), "rimgo" => array( "instance_url" => "", - "project_url" => "https://codeberg.org/video-prize-ranch/rimgo#instances", + "project_url" => "https://codeberg.org/video-prize-ranch/rimgo#instances", "original_name" => "Imgur", "original_url" => "imgur.com" ), "scribe" => array( "instance_url" => "", - "project_url" => "https://git.sr.ht/~edwardloveall/scribe/tree/main/docs/instances.md", + "project_url" => "https://git.sr.ht/~edwardloveall/scribe/tree/main/docs/instances.md", "original_name" => "Medium", "original_url" => "medium.com" ), "gothub" => array( "instance_url" => "", - "project_url" => "https://codeberg.org/gothub/gothub#instances", + "project_url" => "https://codeberg.org/gothub/gothub#instances", "original_name" => "GitHub", "original_url" => "github.com" ), "nitter" => array( "instance_url" => "", - "project_url" => "https://github.com/zedeus/nitter/wiki/Instances", + "project_url" => "https://github.com/zedeus/nitter/wiki/Instances", "original_name" => "Twitter", "original_url" => "twitter.com" ), "libreddit" => array( "instance_url" => "", - "project_url" => "https://github.com/libreddit/libreddit-instances/blob/master/instances.md", + "project_url" => "https://github.com/libreddit/libreddit-instances/blob/master/instances.md", "original_name" => "Reddit", "original_url" => "reddit.com" ), "proxitok" => array( "instance_url" => "", - "project_url" => "https://github.com/pablouser1/ProxiTok/wiki/Public-instances", + "project_url" => "https://github.com/pablouser1/ProxiTok/wiki/Public-instances", "original_name" => "TikTok", "original_url" => "tiktok.com" ), "wikiless" => array( "instance_url" => "", - "project_url" => "https://github.com/Metastem/wikiless#instances", + "project_url" => "https://github.com/Metastem/wikiless#instances", "original_name" => "Wikipedia", "original_url" => "wikipedia.org" ), "quetre" => array( "instance_url" => "", - "project_url" => "https://github.com/zyachel/quetre#instances", + "project_url" => "https://github.com/zyachel/quetre#instances", "original_name" => "Quora", "original_url" => "quora.com" ), "libremdb" => array( "instance_url" => "", - "project_url" => "https://github.com/zyachel/libremdb#instances", + "project_url" => "https://github.com/zyachel/libremdb#instances", "original_name" => "IMDb", "original_url" => "imdb.com" ), "breezewiki" => array( "instance_url" => "", - "project_url" => "https://docs.breezewiki.com/Links.html", + "project_url" => "https://docs.breezewiki.com/Links.html", "original_name" => "Fandom", "original_url" => "fandom.com" ), "anonymousoverflow" => array( "instance_url" => "", - "project_url" => "https://github.com/httpjamesm/AnonymousOverflow#clearnet-instances", + "project_url" => "https://github.com/httpjamesm/AnonymousOverflow#clearnet-instances", "original_name" => "StackOverflow", "original_url" => "stackoverflow.com" ), @@ -111,10 +112,10 @@ "original_url" => "goodreads.com" ) ), - + "preferred_engines" => array( - + /* replace with "text" => "duckduckgo" to use duckduckgo instead * (recommended if being ratelimited */ "text" => "google" @@ -146,7 +147,7 @@ CURLOPT_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP, CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP, CURLOPT_MAXREDIRS => 5, - CURLOPT_TIMEOUT => 18, + CURLOPT_TIMEOUT => 3, CURLOPT_VERBOSE => false ) ); diff --git a/misc/search_engine.php b/misc/search_engine.php index 5ef99c4b..1c1c1002 100644 --- a/misc/search_engine.php +++ b/misc/search_engine.php @@ -122,7 +122,7 @@ function fetch_search_results($opts, $do_print) { $results = $search_category->get_results(); - if (empty($results)) { + if (count($results) <= 1) { require "engines/librex/fallback.php"; $results = get_librex_results($opts); }