requests = array();
if($opts->enable_duckduckgo == "on") {
require ABSPATH."engines/search/duckduckgo.php";
$this->requests[] = new DuckDuckGoRequest($opts, $mh);
}
if($opts->enable_google == "on") {
require ABSPATH."engines/search/google.php";
$this->requests[] = new GoogleRequest($opts, $mh);
}
if($opts->enable_reddit == "on") {
require ABSPATH."engines/search/reddit.php";
$this->requests[] = new RedditRequest($opts, $mh);
}
if($opts->enable_wikipedia == "on") {
require ABSPATH."engines/search/wikipedia.php";
$this->requests[] = new WikiRequest($opts, $mh);
}
if($opts->enable_ecosia == "on") {
require ABSPATH."engines/search/ecosia.php";
$this->requests[] = new EcosiaRequest($opts, $mh);
}
// Special search
$this->special_request = special_search_request($opts);
}
public function parse_results($response) {
$results = array();
foreach($this->requests as $request) {
if($request->request_successful()) {
$engine_result = $request->get_results();
if(!empty($engine_result)) {
if(array_key_exists('did_you_mean', $engine_result)) {
$results['did_you_mean'] = $engine_result['did_you_mean'];
}
if(array_key_exists('search_specific', $engine_result)) {
$results['search_specific'][] = $engine_result['search_specific'];
}
if(array_key_exists('search', $engine_result)) {
// Merge duplicates and apply relevance scoring
foreach($engine_result['search'] as $result) {
if(array_key_exists('search', $results)) {
$result_urls = array_column($results['search'], "url", "id");
$found_key = array_search($result['url'], $result_urls);
} else {
$found_key = false;
}
$social_media_multiplier = (is_social_media($result['url'])) ? ($request->opts->social_media_relevance / 10) : 1;
$goosle_rank = floor($result['engine_rank'] * floatval($social_media_multiplier));
if($found_key !== false) {
// Duplicate result from another source, merge and rank accordingly
$results['search'][$found_key]['goosle_rank'] += $goosle_rank;
$results['search'][$found_key]['combo_source'][] = $result['source'];
} else {
// First find, rank and add to results
$query_terms = explode(" ", preg_replace("/[^a-z0-9 ]+/", "", strtolower($request->query)));
$match_rank = match_count($result['title'], $query_terms);
$match_rank += match_count($result['description'], $query_terms);
// $match_rank += match_count($result['url'], $query_terms);
$result['goosle_rank'] = $goosle_rank + $match_rank;
$result['combo_source'][] = $result['source'];
$results['search'][$result['id']] = $result;
}
unset($result, $result_urls, $found_key, $social_media_multiplier, $goosle_rank, $match_rank);
}
}
}
} else {
$request_result = curl_getinfo($request->ch);
$http_code_info = ($request_result['http_code'] > 200 && $request_result['http_code'] < 600) ? " - What's this?" : "";
$github_issue_url = "https://github.com/adegans/Goosle/discussions/new?category=general&".http_build_query(array("title" => get_class($request)." failed with error ".$request_result['http_code'], "body" => "```\nEngine: ".get_class($request)."\nError Code: ".$request_result['http_code']."\nRequest url: ".$request_result['url']."\n```", "labels" => 'request-error'));
$results['error'][] = array(
"message" => "Ohno! A search query ran into some trouble. Usually you can try again in a few seconds to get a result!
Engine: ".get_class($request)."
Error code: ".$request_result['http_code'].$http_code_info."
Request url: ".$request_result['url']."
Need help? Find similar issues, or ask your own question."
);
}
unset($request);
}
// Check for Special result
if($this->special_request) {
$special_result = $this->special_request->get_results();
if($special_result) {
$results['special'] = $special_result;
}
unset($special_result);
}
if(array_key_exists('search', $results)) {
// Re-order results based on rank
$keys = array_column($results['search'], 'goosle_rank');
array_multisort($keys, SORT_DESC, $results['search']);
// Count results per source
$sources = array_count_values(array_column($results['search'], 'source'));
if(count($sources) > 0) $results['sources'] = $sources;
unset($keys);
} else {
// Add error if there are no search results
$results['error'][] = array(
"message" => "No results found. Please try with more specific or different keywords!"
);
}
return $results;
}
public static function print_results($results, $opts) {
/*
// Uncomment for debugging
echo '
Settings: '; print_r($opts); echo ''; echo '
Search results: '; print_r($results); echo ''; */ if(array_key_exists("search", $results)) { echo "