replaced google video results with brave, fixed an xss exploit, added bang search support at the end of query, added instances.json, optimized some image sizes

This commit is contained in:
hnhx 2022-09-03 19:45:47 +02:00
parent d4905c3886
commit e814e63f0b
12 changed files with 141 additions and 84 deletions

View File

@ -19,13 +19,13 @@
| [search.funami.tech](https://search.funami.tech/) | ❌ | ❌ | 🇰🇷 KR | | [search.funami.tech](https://search.funami.tech/) | ❌ | ❌ | 🇰🇷 KR |
| [librex.catalyst.sx](https://librex.catalyst.sx/) | ❌ | ❌ | 🇺🇸 US | | [librex.catalyst.sx](https://librex.catalyst.sx/) | ❌ | ❌ | 🇺🇸 US |
| [search.madreyk.xyz](https://search.madreyk.xyz/) | ❌ | ❌ | 🇩🇪 DE | | [search.madreyk.xyz](https://search.madreyk.xyz/) | ❌ | ❌ | 🇩🇪 DE |
| ❌ | [](http://librex.so2mpiyfo4cje7bof5v52y3cvjyo2haxpqfvut4sr6gj2ul4mddx2jid.onion/) | ❌ | ??? | | ❌ | [](http://librex.so2mpiyfo4cje7bof5v52y3cvjyo2haxpqfvut4sr6gj2ul4mddx2jid.onion/) | ❌ | ??? |
<br> <br>
### About LibreX ### About LibreX
LibreX gives you results from Google, Qwant and popular torrent sites without spying on you. LibreX gives you results from Google, Brave, Qwant and popular torrent sites without spying on you.
<br> <br>
<br> <br>
If you would like to learn more about LibreX check out the [Wiki](https://github.com/hnhx/librex/wiki). If you would like to learn more about LibreX check out the [Wiki](https://github.com/hnhx/librex/wiki).
@ -33,7 +33,7 @@ If you would like to learn more about LibreX check out the [Wiki](https://github
<br> <br>
### Mirror ### Mirror
In case GitHub would remove LibreX, you can access the source code via this git mirror You can access the source code via this git mirror
``` ```
git clone https://git.beparanoid.de/librex git clone https://git.beparanoid.de/librex
``` ```

View File

@ -10,16 +10,16 @@
"disable_bittorent_search" => false, "disable_bittorent_search" => false,
"bittorent_trackers" => "&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce", "bittorent_trackers" => "&tr=http%3A%2F%2Fnyaa.tracker.wf%3A7777%2Fannounce&tr=udp%3A%2F%2Fopen.stealth.si%3A80%2Fannounce&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.torrent.eu.org%3A451%2Fannounce",
/* /*
Preset privacy friendly frontends for users, these can be overwritten by users in settings Preset privacy friendly frontends for users, these can be overwritten by users in settings
e.g.: "invidious" => "https://yewtu.be", e.g.: "invidious" => "https://yewtu.be",
*/ */
"invidious" => "", "invidious" => "", // youtube
"bibliogram" => "", "bibliogram" => "", // instagram
"nitter" => "", "nitter" => "", // twitter
"libreddit" => "", "libreddit" => "", // reddit
"proxitok" => "", "proxitok" => "", // tiktok
"wikiless" => "", "wikiless" => "", // wikipedia
/* /*
To send requests trough a proxy uncomment CURLOPT_PROXY and CURLOPT_PROXYTYPE: To send requests trough a proxy uncomment CURLOPT_PROXY and CURLOPT_PROXYTYPE:
@ -45,7 +45,7 @@
CURLOPT_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP, CURLOPT_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP,
CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP, CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTPS | CURLPROTO_HTTP,
CURLOPT_MAXREDIRS => 5, CURLOPT_MAXREDIRS => 5,
CURLOPT_TIMEOUT => 8, CURLOPT_TIMEOUT => 18,
CURLOPT_VERBOSE => false CURLOPT_VERBOSE => false
) )

65
engines/brave/video.php Normal file
View File

@ -0,0 +1,65 @@
<?php
function get_video_results($query)
{
global $config;
$url = "https://search.brave.com/videos?q=$query&source=web";
$response = request($url);
$xpath = get_xpath($response);
$results = array();
foreach($xpath->query("//div[@id='results']//div[@class='card']") as $result)
{
$url = $xpath->evaluate(".//a/@href", $result)[0]->textContent;
$title = $xpath->evaluate(".//div/@title", $result)[0]->textContent;
$views = $xpath->evaluate(".//div/@title", $result)[1]->textContent;
$date = $xpath->evaluate(".//div//span", $result)[0]->textContent;
$thumbnail_raw1 = $xpath->evaluate(".//div/@style", $result)[0]->textContent;
$thumbnail_raw2 = explode("url('", $thumbnail_raw1)[1];
$thumbnail = explode("'), url", $thumbnail_raw2)[0];
$url = check_for_privacy_frontend($url);
array_push($results,
array (
"title" => htmlspecialchars($title),
"url" => htmlspecialchars($url),
"base_url" => htmlspecialchars(get_base_url($url)),
"views" => htmlspecialchars($views),
"date" => htmlspecialchars($date),
"thumbnail" => htmlspecialchars($thumbnail)
)
);
}
return $results;
}
function print_video_results($results)
{
echo "<div class=\"text-result-container\">";
foreach($results as $result)
{
$title = $result["title"];
$url = $result["url"];
$base_url = $result["base_url"];
$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 src=\"image_proxy.php?url=$thumbnail\">";
echo "<br>";
echo "<span>$date - $views</span>";
echo "</a>";
echo "</div>";
}
echo "</div>";
}
?>

View File

@ -1,61 +0,0 @@
<?php
function get_video_results($query, $page=0)
{
global $config;
$url = "https://www.google.$config->google_domain/search?&q=$query&start=$page&hl=$config->google_language&tbm=vid";
$response = request($url);
$xpath = get_xpath($response);
$results = array();
foreach($xpath->query("//div[@id='search']//div[contains(@class, 'g')]") as $result)
{
$url = $xpath->evaluate(".//a/@href", $result)[0];
if ($url == null)
continue;
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(".//h3", $result)[0];
array_push($results,
array (
"title" => htmlspecialchars($title->textContent),
"url" => htmlspecialchars($url),
"base_url" => htmlspecialchars(get_base_url($url))
)
);
}
return $results;
}
function print_video_results($results)
{
echo "<div class=\"text-result-container\">";
foreach($results as $result)
{
$title = $result["title"];
$url = $result["url"];
$base_url = $result["base_url"];
echo "<div class=\"text-result-wrapper\">";
echo "<a href=\"$url\">";
echo "$base_url";
echo "<h2>$title</h2>";
echo "</a>";
echo "</div>";
}
echo "</div>";
}
?>

View File

@ -7,11 +7,11 @@
$split_url = explode("/", $url); $split_url = explode("/", $url);
$base_url = $split_url[2]; $base_url = $split_url[2];
$base_url_main_split = explode(".", strrev($base_url)); $base_url_main_split = explode(".", strrev($base_url));
$base_url_main = strrev($base_url_main_split[1]) . "." . strrev($base_url_main_split[0]); $base_url_main = strrev($base_url_main_split[1]) . "." . strrev($base_url_main_split[0]);
if ($base_url_main == "qwant.com" || $base_url_main == "wikimedia.org") if ($base_url_main == "qwant.com" || $base_url_main == "wikimedia.org" || $base_url_main == "brave.com")
{ {
$image = $url; $image = $url;
$image_src = request($image); $image_src = request($image);

46
instances.json Normal file
View File

@ -0,0 +1,46 @@
{
"instances": [
{
"clearnet": "https://librex.beparanoid.de/",
"tor": "http://librex.2356uhnbpv5nk3bni5bv6jg2cd6lgj664kwx3lhyelstpttpyv4kk2qd.onion/",
"i2p": null,
"country": "HU"
},
{
"clearnet": "https://librex.extravi.dev/",
"tor": "http://ncblhz7q4sfbf755bdbhebfzxcpypz7ewafgi4agatecojz7pln4i3id.onion/",
"i2p": "http://rra33hiaf6nmby7jfpqe2gqmng3jnzkvbu2n7jgce7vbhoyuhzya.b32.i2p/",
"country": "DE"
},
{
"clearnet": "https://search.davidovski.xyz/",
"tor": null,
"i2p": null,
"country": "UK"
},
{
"clearnet": "https://search.funami.tech/",
"tor": null,
"i2p": null,
"country": "KR"
},
{
"clearnet": "https://librex.catalyst.sx/",
"tor": null,
"i2p": null,
"country": "US"
},
{
"clearnet": "https://search.madreyk.xyz/",
"tor": null,
"i2p": null,
"country": "DE"
},
{
"clearnet": null,
"tor": "http://librex.so2mpiyfo4cje7bof5v52y3cvjyo2haxpqfvut4sr6gj2ul4mddx2jid.onion/",
"i2p": null,
"country": null
}
]
}

View File

@ -19,12 +19,12 @@
else if (!empty($config->$frontend)) else if (!empty($config->$frontend))
$frontend = $config->$frontend; $frontend = $config->$frontend;
if ($original == "instagram.com") if ($original == "instagram.com")
{ {
if (!strpos($url, "/p/")) if (!strpos($url, "/p/"))
$frontend .= "/u"; $frontend .= "/u";
} }
$url = $frontend . explode($original, $url)[1]; $url = $frontend . explode($original, $url)[1];
return $url; return $url;
@ -59,10 +59,14 @@
function check_ddg_bang($query) function check_ddg_bang($query)
{ {
$bangs_json = file_get_contents("static/misc/ddg_bang.json"); $bangs_json = file_get_contents("static/misc/ddg_bang.json");
$bangs = json_decode($bangs_json, true); $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);
$search_word = substr(explode(" ", $query)[0], 1);
$bang_url = null; $bang_url = null;
foreach($bangs as $bang) foreach($bangs as $bang)

View File

@ -1,6 +1,10 @@
<?php require "misc/header.php"; ?> <?php require "misc/header.php"; ?>
<title> <?php echo $_REQUEST["q"]; ?> - LibreX</title> <title>
<?php
$query = htmlspecialchars(trim($_REQUEST["q"]));
echo $query;
?> - LibreX</title>
</head> </head>
<body> <body>
<form class="sub-search-container" method="get" autocomplete="off"> <form class="sub-search-container" method="get" autocomplete="off">
@ -8,7 +12,6 @@
<a href="./"><img class="logo" src="static/images/librex.png" alt="librex logo"></a> <a href="./"><img class="logo" src="static/images/librex.png" alt="librex logo"></a>
<input type="text" name="q" <input type="text" name="q"
<?php <?php
$query = htmlspecialchars(trim($_REQUEST["q"]));
$query_encoded = urlencode($query); $query_encoded = urlencode($query);
if (1 > strlen($query) || strlen($query) > 256) if (1 > strlen($query) || strlen($query) > 256)
@ -46,7 +49,7 @@
switch ($type) switch ($type)
{ {
case 0: case 0:
if (substr($query, 0, 1) == "!") if (substr($query, 0, 1) == "!" || substr(end(explode(" ", $query)), 0, 1) == "!")
check_ddg_bang($query); check_ddg_bang($query);
require "engines/google/text.php"; require "engines/google/text.php";
$results = get_text_results($query, $page); $results = get_text_results($query, $page);
@ -62,8 +65,8 @@
break; break;
case 2: case 2:
require "engines/google/video.php"; require "engines/brave/video.php";
$results = get_video_results($query_encoded, $page); $results = get_video_results($query_encoded);
print_elapsed_time($start_time); print_elapsed_time($start_time);
print_video_results($results); print_video_results($results);
break; break;
@ -91,7 +94,7 @@
} }
if ($type != 3) if (2 > $type)
{ {
echo "<div class=\"next-page-button-wrapper\">"; echo "<div class=\"next-page-button-wrapper\">";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 360 B