get rid of bot protection as well
All checks were successful
Build and publish the docker image / build (push) Successful in 10s

Signed-off-by: ngn <ngn@ngn.tf>
This commit is contained in:
ngn 2025-01-19 07:31:43 +03:00
parent 9868c6c7a5
commit 4be33b2da1
Signed by: ngn
GPG Key ID: A3654DF5AD9F641D
9 changed files with 553 additions and 1342 deletions

View File

@ -5,9 +5,6 @@ header("Access-Control-Allow-Origin: *");
include "data/config.php"; include "data/config.php";
$real_requests = apcu_fetch("real_requests");
$bot_requests = apcu_fetch("captcha_gen");
echo json_encode( echo json_encode(
[ [
"status" => "ok", "status" => "ok",
@ -16,8 +13,8 @@ echo json_encode(
"name" => config::SERVER_NAME, "name" => config::SERVER_NAME,
"description" => config::SERVER_LONG_DESCRIPTION, "description" => config::SERVER_LONG_DESCRIPTION,
"bot_protection" => config::BOT_PROTECTION, "bot_protection" => config::BOT_PROTECTION,
"real_requests" => $real_requests === false ? 0 : $real_requests, "real_requests" => 0,
"bot_requests" => $bot_requests === false ? 0 : $bot_requests, "bot_requests" => 0,
"api_enabled" => false, "api_enabled" => false,
"alt_addresses" => config::ALT_ADDRESSES, "alt_addresses" => config::ALT_ADDRESSES,
"version" => config::VERSION "version" => config::VERSION

View File

@ -12,12 +12,6 @@ $frontend = new frontend();
$get = $frontend->parsegetfilters($_GET, $filters); $get = $frontend->parsegetfilters($_GET, $filters);
/*
Captcha
*/
include "lib/bot_protection.php";
new bot_protection($frontend, $get, $filters, "images", true);
$payload = [ $payload = [
"timetaken" => microtime(true), "timetaken" => microtime(true),
"images" => "", "images" => "",
@ -26,14 +20,14 @@ $payload = [
try{ try{
$results = $scraper->image($get); $results = $scraper->image($get);
}catch(Exception $error){ }catch(Exception $error){
$frontend->drawscrapererror($error->getMessage(), $get, "images", $payload["timetaken"]); $frontend->drawscrapererror($error->getMessage(), $get, "images", $payload["timetaken"]);
} }
if(count($results["image"]) === 0){ if(count($results["image"]) === 0){
$payload["images"] = $payload["images"] =
'<div class="infobox">' . '<div class="infobox">' .
"<h1>Nobody here but us chickens!</h1>" . "<h1>Nobody here but us chickens!</h1>" .
@ -45,19 +39,19 @@ if(count($results["image"]) === 0){
'</ul>' . '</ul>' .
'</div>'; '</div>';
} }
foreach($results["image"] as $image){ foreach($results["image"] as $image){
$payload["images"] .= $payload["images"] .=
'<div class="image-wrapper" title="' . htmlspecialchars($image["title"]) .'" data-json="' . htmlspecialchars(json_encode($image["source"])) . '">' . '<div class="image-wrapper" title="' . htmlspecialchars($image["title"]) .'" data-json="' . htmlspecialchars(json_encode($image["source"])) . '">' .
'<div class="image">' . '<div class="image">' .
'<a href="' . htmlspecialchars($image["source"][0]["url"]) . '" rel="noreferrer nofollow" class="thumb">' . '<a href="' . htmlspecialchars($image["source"][0]["url"]) . '" rel="noreferrer nofollow" class="thumb">' .
'<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "thumb") . '" alt="thumbnail">'; '<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "thumb") . '" alt="thumbnail">';
if($image["source"][0]["width"] !== null){ if($image["source"][0]["width"] !== null){
$payload["images"] .= '<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>'; $payload["images"] .= '<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>';
} }
$payload["images"] .= $payload["images"] .=
'</a>' . '</a>' .
'<a href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow">' . '<a href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow">' .
@ -69,7 +63,7 @@ foreach($results["image"] as $image){
} }
if($results["npt"] !== null){ if($results["npt"] !== null){
$payload["nextpage"] = $payload["nextpage"] =
'<a href="' . $frontend->htmlnextpage($get, $results["npt"], "images") . '" class="nextpage img">Next page &gt;</a>'; '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "images") . '" class="nextpage img">Next page &gt;</a>';
} }

View File

@ -1,281 +0,0 @@
<?php
class bot_protection{
public function __construct($frontend, $get, $filters, $page, $output){
// check if we want captcha
if(config::BOT_PROTECTION !== 1){
apcu_inc("real_requests");
if($output === true){
$frontend->loadheader(
$get,
$filters,
$page
);
}
return;
}
/*
Validate cookie, if it exists
*/
if(isset($_COOKIE["pass"])){
if(
// check if key is not malformed
preg_match(
'/^k[0-9]+\.[A-Za-z0-9_]{20}$/',
$_COOKIE["pass"]
) &&
// does key exist
apcu_exists($_COOKIE["pass"])
){
// exists, increment counter
$inc = apcu_inc($_COOKIE["pass"]);
// we start counting from 1
// when it has been incremented to 102, it has reached
// 100 reqs
if($inc >= config::MAX_SEARCHES + 2){
// reached limit, delete and give captcha
apcu_delete($_COOKIE["pass"]);
}else{
// the cookie is OK! dont die() and give results
apcu_inc("real_requests");
if($output === true){
$frontend->loadheader(
$get,
$filters,
$page
);
}
return;
}
}
}
if($output === false){
http_response_code(401); // forbidden
echo json_encode([
"status" => "The \"pass\" token in your cookies is missing or has expired!!"
]);
die();
}
/*
Validate form data
*/
$lines =
explode(
"\r\n",
file_get_contents("php://input")
);
$invalid = false;
$answers = [];
$key = false;
$error = "";
foreach($lines as $line){
$line = explode("=", $line, 2);
if(count($line) !== 2){
$invalid = true;
break;
}
preg_match(
'/^c\[([0-9]+)\]$/',
$line[0],
$regex
);
if(
$line[1] != "on" ||
!isset($regex[0][1])
){
// check if its the v key
if(
$line[0] == "v" &&
preg_match(
'/^c[0-9]+\.[A-Za-z0-9_]{20}$/',
$line[1]
)
){
$key = apcu_fetch($line[1]);
apcu_delete($line[1]);
}
break;
}
$regex = (int)$regex[1];
if(
$regex >= 16 ||
$regex <= -1
){
$invalid = true;
break;
}
$answers[] = $regex;
}
if(
!$invalid &&
$key !== false // has captcha been gen'd?
){
$check = count($key);
// validate answer
for($i=0; $i<count($answers); $i++){
if(in_array($answers[$i], $key)){
$check--;
}else{
$check = -1;
break;
}
}
if($check === 0){
// we passed the captcha
// set cookie
$inc = apcu_inc("cookie");
$key = "k" . $inc . "." . $this->randomchars();
apcu_inc($key, 1, $stupid, 86400);
apcu_inc("real_requests");
setcookie(
"pass",
$key,
[
"expires" => time() + 86400, // expires in 24 hours
"samesite" => "Lax",
"path" => "/"
]
);
$frontend->loadheader(
$get,
$filters,
$page
);
return;
}else{
$error = "<div class=\"quote\">You were <a href=\"https://www.youtube.com/watch?v=e1d7fkQx2rk\" target=\"_BLANK\" rel=\"noreferrer nofollow\">kicked out of Mensa.</a> Please try again.</div>";
}
}
$key = "c" . apcu_inc("captcha_gen", 1) . "." . $this->randomchars();
$payload = [
"timetaken" => microtime(true),
"class" => "",
"right-left" => "",
"right-right" => "",
"left" =>
'<div class="infobox">' .
'<h1>IQ test</h1>' .
'IQ test has been enabled due to bot abuse on the network.<br>' .
'Solving this IQ test will let you make 100 searches today. I will add an invite system to bypass this soon...' .
$error .
'<form method="POST" enctype="text/plain" autocomplete="off">' .
'<div class="captcha-wrapper">' .
'<div class="captcha">' .
'<img src="captcha?v=' . $key . '" alt="Captcha image">' .
'<div class="captcha-controls">' .
'<input type="checkbox" name="c[0]" id="c0">' .
'<label for="c0"></label>' .
'<input type="checkbox" name="c[1]" id="c1">' .
'<label for="c1"></label>' .
'<input type="checkbox" name="c[2]" id="c2">' .
'<label for="c2"></label>' .
'<input type="checkbox" name="c[3]" id="c3">' .
'<label for="c3"></label>' .
'<input type="checkbox" name="c[4]" id="c4">' .
'<label for="c4"></label>' .
'<input type="checkbox" name="c[5]" id="c5">' .
'<label for="c5"></label>' .
'<input type="checkbox" name="c[6]" id="c6">' .
'<label for="c6"></label>' .
'<input type="checkbox" name="c[7]" id="c7">' .
'<label for="c7"></label>' .
'<input type="checkbox" name="c[8]" id="c8">' .
'<label for="c8"></label>' .
'<input type="checkbox" name="c[9]" id="c9">' .
'<label for="c9"></label>' .
'<input type="checkbox" name="c[10]" id="c10">' .
'<label for="c10"></label>' .
'<input type="checkbox" name="c[11]" id="c11">' .
'<label for="c11"></label>' .
'<input type="checkbox" name="c[12]" id="c12">' .
'<label for="c12"></label>' .
'<input type="checkbox" name="c[13]" id="c13">' .
'<label for="c13"></label>' .
'<input type="checkbox" name="c[14]" id="c14">' .
'<label for="c14"></label>' .
'<input type="checkbox" name="c[15]" id="c15">' .
'<label for="c15"></label>' .
'</div>' .
'</div>' .
'</div>' .
'<input type="hidden" name="v" value="' . $key . '">' .
'<input type="submit" value="Check IQ" class="captcha-submit">' .
'</form>' .
'</div>'
];
$frontend->loadheader(
$get,
$filters,
$page
);
echo $frontend->load("search.html", $payload);
die();
}
private function randomchars(){
$chars =
array_merge(
range("A", "Z"),
range("a", "z"),
range(0, 9)
);
$chars[] = "_";
$c = count($chars) - 1;
$key = "";
for($i=0; $i<20; $i++){
$key .= $chars[random_int(0, $c)];
}
return $key;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -12,12 +12,6 @@ $frontend = new frontend();
$get = $frontend->parsegetfilters($_GET, $filters); $get = $frontend->parsegetfilters($_GET, $filters);
/*
Captcha
*/
include "lib/bot_protection.php";
new bot_protection($frontend, $get, $filters, "music", true);
$payload = [ $payload = [
"timetaken" => microtime(true), "timetaken" => microtime(true),
"class" => "", "class" => "",
@ -28,9 +22,9 @@ $payload = [
try{ try{
$results = $scraper->music($get); $results = $scraper->music($get);
}catch(Exception $error){ }catch(Exception $error){
$frontend->drawscrapererror($error->getMessage(), $get, "music", $payload["timetaken"]); $frontend->drawscrapererror($error->getMessage(), $get, "music", $payload["timetaken"]);
} }
@ -49,31 +43,31 @@ $categories = [
$main = null; $main = null;
if(count($results["song"]) !== 0){ if(count($results["song"]) !== 0){
$main = "song"; $main = "song";
}elseif(count($results["album"]) !== 0){ }elseif(count($results["album"]) !== 0){
$main = "album"; $main = "album";
}elseif(count($results["playlist"]) !== 0){ }elseif(count($results["playlist"]) !== 0){
$main = "playlist"; $main = "playlist";
}elseif(count($results["podcast"]) !== 0){ }elseif(count($results["podcast"]) !== 0){
$main = "podcast"; $main = "podcast";
}elseif(count($results["author"]) !== 0){ }elseif(count($results["author"]) !== 0){
$main = "author"; $main = "author";
}elseif(count($results["user"]) !== 0){ }elseif(count($results["user"]) !== 0){
$main = "user"; $main = "user";
}else{ }else{
// No results found! // No results found!
echo echo
$frontend->drawerror( $frontend->drawerror(
@ -93,61 +87,61 @@ if(count($results["song"]) !== 0){
Generate list of songs Generate list of songs
*/ */
foreach($categories as $name => $data){ foreach($categories as $name => $data){
foreach($results[$name] as $item){ foreach($results[$name] as $item){
$greentext = []; $greentext = [];
if( if(
isset($item["date"]) && isset($item["date"]) &&
$item["date"] !== null $item["date"] !== null
){ ){
$greentext[] = date("jS M y @ g:ia", $item["date"]); $greentext[] = date("jS M y @ g:ia", $item["date"]);
} }
if( if(
isset($item["views"]) && isset($item["views"]) &&
$item["views"] !== null $item["views"] !== null
){ ){
$views = number_format($item["views"]) . " views"; $views = number_format($item["views"]) . " views";
$greentext[] = $views; $greentext[] = $views;
} }
if( if(
isset($item["followers"]) && isset($item["followers"]) &&
$item["followers"] !== null $item["followers"] !== null
){ ){
$greentext[] = number_format($item["followers"]) . " followers"; $greentext[] = number_format($item["followers"]) . " followers";
} }
if( if(
isset($item["author"]["name"]) && isset($item["author"]["name"]) &&
$item["author"]["name"] !== null $item["author"]["name"] !== null
){ ){
$greentext[] = $item["author"]["name"]; $greentext[] = $item["author"]["name"];
} }
$greentext = implode("", $greentext); $greentext = implode("", $greentext);
if( if(
isset($item["duration"]) && isset($item["duration"]) &&
$item["duration"] !== null $item["duration"] !== null
){ ){
$duration = $frontend->s_to_timestamp($item["duration"]); $duration = $frontend->s_to_timestamp($item["duration"]);
}else{ }else{
$duration = null; $duration = null;
} }
$tabindex = $name == $main ? true : false; $tabindex = $name == $main ? true : false;
$customhtml = null; $customhtml = null;
if( if(
( (
$name == "song" || $name == "song" ||
@ -155,11 +149,11 @@ foreach($categories as $name => $data){
) && ) &&
$item["stream"]["endpoint"] !== null $item["stream"]["endpoint"] !== null
){ ){
$customhtml = $customhtml =
'<audio src="/audio/' . $item["stream"]["endpoint"] . '?s=' . urlencode($item["stream"]["url"]) . '" controls autostart="false" preload="none">'; '<audio src="/audio/' . $item["stream"]["endpoint"] . '?s=' . urlencode($item["stream"]["url"]) . '" controls autostart="false" preload="none">';
} }
$categories[$name] .= $frontend->drawtextresult($item, $greentext, $duration, $get["s"], $tabindex, $customhtml); $categories[$name] .= $frontend->drawtextresult($item, $greentext, $duration, $get["s"], $tabindex, $customhtml);
} }
} }
@ -175,46 +169,46 @@ unset($categories[$main]);
$i = 1; $i = 1;
foreach($categories as $name => $value){ foreach($categories as $name => $value){
if($value == ""){ if($value == ""){
continue; continue;
} }
if($i % 2 === 1){ if($i % 2 === 1){
$write = "right-left"; $write = "right-left";
}else{ }else{
$write = "right-right"; $write = "right-right";
} }
$payload[$write] .= $payload[$write] .=
'<div class="answer-wrapper">' . '<div class="answer-wrapper">' .
'<input id="answer' . $i . '" class="spoiler" type="checkbox">' . '<input id="answer' . $i . '" class="spoiler" type="checkbox">' .
'<div class="answer">' . '<div class="answer">' .
'<div class="answer-title">' . '<div class="answer-title">' .
'<a class="answer-title" href="?s=' . urlencode($get["s"]); '<a class="answer-title" href="?s=' . urlencode($get["s"]);
$payload[$write] .= $payload[$write] .=
'&type=' . $name . '"><h2>' . ucfirst($name) . 's</h2></a>'; '&type=' . $name . '"><h2>' . ucfirst($name) . 's</h2></a>';
$payload[$write] .= $payload[$write] .=
'</div>' . '</div>' .
$categories[$name] . $categories[$name] .
'</div>' . '</div>' .
'<label class="spoiler-button" for="answer' . $i . '"></label></div>'; '<label class="spoiler-button" for="answer' . $i . '"></label></div>';
$i++; $i++;
} }
if($i !== 1){ if($i !== 1){
$payload["class"] = " has-answer"; $payload["class"] = " has-answer";
} }
if($results["npt"] !== null){ if($results["npt"] !== null){
$payload["left"] .= $payload["left"] .=
'<a href="' . $frontend->htmlnextpage($get, $results["npt"], "music") . '" class="nextpage">Next page &gt;</a>'; '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "music") . '" class="nextpage">Next page &gt;</a>';
} }

View File

@ -12,12 +12,6 @@ $frontend = new frontend();
$get = $frontend->parsegetfilters($_GET, $filters); $get = $frontend->parsegetfilters($_GET, $filters);
/*
Captcha
*/
include "lib/bot_protection.php";
new bot_protection($frontend, $get, $filters, "news", true);
$payload = [ $payload = [
"timetaken" => microtime(true), "timetaken" => microtime(true),
"class" => "", "class" => "",
@ -28,9 +22,9 @@ $payload = [
try{ try{
$results = $scraper->news($get); $results = $scraper->news($get);
}catch(Exception $error){ }catch(Exception $error){
$frontend->drawscrapererror($error->getMessage(), $get, "news", $payload["timetaken"]); $frontend->drawscrapererror($error->getMessage(), $get, "news", $payload["timetaken"]);
} }
@ -38,7 +32,7 @@ try{
Populate links Populate links
*/ */
if(count($results["news"]) === 0){ if(count($results["news"]) === 0){
$payload["left"] = $payload["left"] =
'<div class="infobox">' . '<div class="infobox">' .
"<h1>Nobody here but us chickens!</h1>" . "<h1>Nobody here but us chickens!</h1>" .
@ -52,33 +46,33 @@ if(count($results["news"]) === 0){
} }
foreach($results["news"] as $news){ foreach($results["news"] as $news){
$greentext = []; $greentext = [];
if($news["date"] !== null){ if($news["date"] !== null){
$greentext[] = date("jS M y @ g:ia", $news["date"]); $greentext[] = date("jS M y @ g:ia", $news["date"]);
} }
if($news["author"] !== null){ if($news["author"] !== null){
$greentext[] = htmlspecialchars($news["author"]); $greentext[] = htmlspecialchars($news["author"]);
} }
if(count($greentext) !== 0){ if(count($greentext) !== 0){
$greentext = implode("", $greentext); $greentext = implode("", $greentext);
}else{ }else{
$greentext = null; $greentext = null;
} }
$n = null; $n = null;
$payload["left"] .= $frontend->drawtextresult($news, $greentext, $n, $get["s"]); $payload["left"] .= $frontend->drawtextresult($news, $greentext, $n, $get["s"]);
} }
if($results["npt"] !== null){ if($results["npt"] !== null){
$payload["left"] .= $payload["left"] .=
'<a href="' . $frontend->htmlnextpage($get, $results["npt"], "news") . '" class="nextpage">Next page &gt;</a>'; '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "news") . '" class="nextpage">Next page &gt;</a>';
} }

View File

@ -1,473 +0,0 @@
function htmlspecialchars(str){
if(str === null){
return "<i>&lt;Empty&gt;</i>";
}
var map = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#039;'
}
return str.replace(/[&<>"']/g, function(m){return map[m];});
}
// initialize garbage
var list = [];
var pinged_list = [];
var reqs = 0;
var errors = 0;
var sort = 6; // highest version first
// check for instance redirect stuff
var redir = [];
var target = "/web?";
new URL(window.location.href)
.searchParams
.forEach(
function(value, key){
if(key == "target"){
target = "/" + encodeURIComponent(value) + "?";
return;
}
if(key == "npt"){ return; }
redir.push(encodeURIComponent(key) + "=" + encodeURIComponent(value))
}
);
if(redir.length !== 0){
redir = target + redir.join("&");
}else{
redir = "";
}
var quote = document.createElement("div");
quote.className = "quote";
quote.innerHTML = 'Pinged <b>0</b> servers (<b>0</b> failed requests)';
var [div_servercount, div_failedreqs] =
quote.getElementsByTagName("b");
var noscript = document.getElementsByTagName("noscript")[0];
document.body.insertBefore(quote, noscript.nextSibling);
// create table
var table = document.createElement("table");
table.innerHTML =
'<thead>' +
'<tr>' +
'<th class="extend">Server</th>' +
'<th>Address</th>' +
'<th>Bot protection</th>' +
'<th title="Amount of legit requests processed since the last APCU cache clear (usually happens at midnight)">Real reqs (?)</th>' +
'<th title="Amount of filtered requests processed since the last APCU cache clear (usually happens at midnight)">Bot reqs (?)</th>' +
'<th>API</th>' +
'<th><div class="arrow up"></div>Version</th>' +
'</tr>' +
'</thead>' +
'<tbody></tbody>';
document.body.insertBefore(table, quote.nextSibling);
// handle sorting clicks
var tbody = table.getElementsByTagName("tbody")[0];
var th = table.getElementsByTagName("th");
for(var i=0; i<th.length; i++){
th[i].addEventListener("click", function(event){
if(event.target.className.includes("arrow")){
var div = event.target.parentElement;
}else{
var div = event.target;
}
var arrow = div.getElementsByClassName("arrow");
var orientation = 0; // up
if(arrow.length === 0){
// delete arrow and add new one
arrow = document.getElementsByClassName("arrow");
arrow[0].remove();
arrow = document.createElement("div");
arrow.className = "arrow up";
div.insertBefore(arrow, event.target.firstChild);
}else{
// switch arrow position
if(arrow[0].className == "arrow down"){
arrow[0].className = "arrow up";
}else{
arrow[0].className = "arrow down";
orientation = 1;
}
}
switch(div.textContent.toLowerCase()){
case "server": sort = 0 + orientation; break;
case "address": sort = 2 + orientation; break;
case "bot protection": sort = 4 + orientation; break;
case "real reqs (?)": sort = 6 + orientation; break;
case "bot reqs (?)": sort = 8 + orientation; break;
case "api": sort = 10 + orientation; break;
case "version": sort = 12 + orientation; break;
}
render_list();
});
}
function validate_url(url, allow_http = false){
try{
url = new URL(url);
if(
url.protocol == "https:" ||
(
(
allow_http === true ||
window.location.protocol == "http:"
) &&
url.protocol == "http:"
)
){
return true;
}
}catch(error){} // do nothing
return false;
}
function number_format(int){
return new Intl.NumberFormat().format(int);
}
// parse initial server list
fetch_server(window.location.origin);
async function fetch_server(server){
if(!validate_url(server)){
console.warn("Invalid server URL: " + server);
return;
}
// make sure baseURL is origin
server = new URL(server).origin;
// prevent multiple fetches
for(var i=0; i<list.length; i++){
if(list[i] == server){
// serber was already fetched
return;
}
}
// prevent future fetches
list.push(server);
var data = null;
try{
var payload = await fetch(server + "/ami4get");
if(payload.status !== 200){
// endpoint is not available
errors++;
div_failedreqs.textContent = number_format(errors);
console.warn(server + ": Invalid HTTP code " + payload.status);
return;
}
data = await payload.json();
}catch(error){
errors++;
div_failedreqs.textContent = number_format(errors);
console.warn(server + ": Could not fetch or decode JSON");
return;
}
// sanitize data
if(
typeof data.status != "string" ||
data.status != "ok" ||
typeof data.server != "object" ||
!(
typeof data.server.name == "string" ||
(
typeof data.server.name == "object" &&
data.server.name === null
)
) ||
typeof data.service != "string" ||
data.service != "4get" ||
(
typeof data.server.description != "string" &&
data.server.description !== null
) ||
typeof data.server.bot_protection != "number" ||
typeof data.server.real_requests != "number" ||
typeof data.server.bot_requests != "number" ||
typeof data.server.api_enabled != "boolean" ||
typeof data.server.alt_addresses != "object" ||
typeof data.server.version != "number" ||
typeof data.instances != "object"
){
errors++;
div_failedreqs.textContent = number_format(errors);
console.warn(server + ": Malformed JSON");
return;
}
data.server.ip = server;
reqs++;
div_servercount.textContent = number_format(reqs);
var total = pinged_list.push(data) - 1;
pinged_list[total].index = total;
render_list();
// get more serbers
for(var i=0; i<data.instances.length; i++){
fetch_server(data.instances[i]);
}
}
function sorta(object, element, order){
return object.slice().sort(
function(a, b){
if(order){
return a.server[element] - b.server[element];
}
return b.server[element] - a.server[element];
}
);
}
function textsort(object, element, order){
var sort = object.slice().sort(
function(a, b){
return a.server[element].localeCompare(b.server[element]);
}
);
if(!order){
return sort.reverse();
}
return sort;
}
function render_list(){
var sorted_list = [];
// sort
var filter = Boolean(sort % 2);
switch(sort){
case 0:
case 1:
sorted_list = textsort(pinged_list, "name", filter === true ? false : true);
break;
case 2:
case 3:
sorted_list = textsort(pinged_list, "ip", filter === true ? false : true);
break;
case 4:
case 5:
sorted_list = sorta(pinged_list, "bot_protection", filter === true ? false : true);
break;
case 6:
case 7:
sorted_list = sorta(pinged_list, "real_requests", filter);
break;
case 8:
case 9:
sorted_list = sorta(pinged_list, "bot_requests", filter);
break;
case 10:
case 11:
sorted_list = sorta(pinged_list, "api_enabled", filter);
break;
case 12:
case 13:
sorted_list = sorta(pinged_list, "version", filter);
break;
}
// render tabloid
var html = "";
for(var k=0; k<sorted_list.length; k++){
html += '<tr onclick="show_server(' + sorted_list[k].index + ');">';
for(var i=0; i<7; i++){
html += '<td';
switch(i){
// server name
case 0: html += ' class="extend">' + htmlspecialchars(sorted_list[k].server.name); break;
case 1: html += '>' + htmlspecialchars(new URL(sorted_list[k].server.ip).host); break;
case 2: // bot protection
switch(sorted_list[k].server.bot_protection){
case 0:
html += '><span style="color:var(--green);">Disabled</span>';
break;
case 1:
html += '><span style="color:var(--yellow);">Image captcha</span>';
break;
case 2:
html += '><span style="color:var(--red);">Invite only</span>';
break;
default:
html += '>Unknown';
}
break;
case 3: // real reqs
html += '>' + number_format(sorted_list[k].server.real_requests);
break;
case 4: // bot reqs
html += '>' + number_format(sorted_list[k].server.bot_requests);
break;
case 5: // api enabled
if(sorted_list[k].server.api_enabled){
html += '><span style="color:var(--green);">Yes</span>';
}else{
html += '><span style="color:var(--red);">No</span>';
}
break;
// version
case 6: html += ">v" + sorted_list[k].server.version; break;
}
html += '</td>';
}
html += '</tr>';
}
console.log(html);
tbody.innerHTML = html;
}
var popup_bg = document.getElementById("popup-bg");
var popup_wrapper = document.getElementsByClassName("popup-wrapper")[0];
var popup = popup_wrapper.getElementsByClassName("popup")[0];
var popup_shown = false;
popup_bg.addEventListener("click", function(){
popup_wrapper.style.display = "none";
popup_bg.style.display = "none";
});
function show_server(serverid){
var html =
'<h2>' + htmlspecialchars(pinged_list[serverid].server.name) + '</h2>' +
'Description' +
'<div class="code">' + htmlspecialchars(pinged_list[serverid].server.description) + '</div>';
var url_obj = new URL(pinged_list[serverid].server.ip);
var url = htmlspecialchars(url_obj.origin);
var domain = url_obj.hostname;
html +=
'URL: <a rel="noreferer" target="_BLANK" href="' + url + redir + '">' + url + '</a> <a rel="noreferer" target="_BLANK" href="https://browserleaks.com/ip/' + encodeURIComponent(domain) + '">(IP lookup)</a>' +
'<br><br>Alt addresses:';
var len = pinged_list[serverid].server.alt_addresses.length;
if(len === 0){
html += ' <i>&lt;Empty&gt;</i>';
}else{
html += '<ul>';
for(var i=0; i<len; i++){
var url_obj = new URL(pinged_list[serverid].server.alt_addresses[i]);
var url = htmlspecialchars(url_obj.origin);
var domain = url_obj.hostname;
if(validate_url(pinged_list[serverid].server.alt_addresses[i], true)){
html += '<li><a rel="noreferer" href="' + url + redir + '" target="_BLANK">' + url + '</a> <a rel="noreferer" target="_BLANK" href="https://browserleaks.com/ip/' + encodeURIComponent(domain) + '">(IP lookup)</a></li>';
}else{
console.warn(pinged_list[serverid].server.ip + ": Invalid peer URL => " + pinged_list[serverid].server.alt_addresses[i]);
}
}
html += '</ul>';
}
popup.innerHTML = html;
popup_wrapper.style.display = "block";
popup_bg.style.display = "block";
}
function hide_server(){
popup_wrapper.style.display = "none";
popup_bg.style.display = "none";
}

View File

@ -12,12 +12,6 @@ $frontend = new frontend();
$get = $frontend->parsegetfilters($_GET, $filters); $get = $frontend->parsegetfilters($_GET, $filters);
/*
Captcha
*/
include "lib/bot_protection.php";
new bot_protection($frontend, $get, $filters, "videos", true);
$payload = [ $payload = [
"timetaken" => microtime(true), "timetaken" => microtime(true),
"class" => "", "class" => "",
@ -28,9 +22,9 @@ $payload = [
try{ try{
$results = $scraper->video($get); $results = $scraper->video($get);
}catch(Exception $error){ }catch(Exception $error){
$frontend->drawscrapererror($error->getMessage(), $get, "videos", $payload["timetaken"]); $frontend->drawscrapererror($error->getMessage(), $get, "videos", $payload["timetaken"]);
} }
@ -48,26 +42,26 @@ $categories = [
$main = null; $main = null;
if(count($results["video"]) !== 0){ if(count($results["video"]) !== 0){
$main = "video"; $main = "video";
}elseif(count($results["playlist"]) !== 0){ }elseif(count($results["playlist"]) !== 0){
$main = "playlist"; $main = "playlist";
}elseif(count($results["livestream"]) !== 0){ }elseif(count($results["livestream"]) !== 0){
$main = "livestream"; $main = "livestream";
}elseif(count($results["author"]) !== 0){ }elseif(count($results["author"]) !== 0){
$main = "author"; $main = "author";
}elseif(count($results["reel"]) !== 0){ }elseif(count($results["reel"]) !== 0){
$main = "reel"; $main = "reel";
}else{ }else{
// No results found! // No results found!
echo echo
$frontend->drawerror( $frontend->drawerror(
@ -87,68 +81,68 @@ if(count($results["video"]) !== 0){
Generate list of videos Generate list of videos
*/ */
foreach($categories as $name => $data){ foreach($categories as $name => $data){
foreach($results[$name] as $item){ foreach($results[$name] as $item){
$greentext = []; $greentext = [];
if( if(
isset($item["date"]) && isset($item["date"]) &&
$item["date"] !== null $item["date"] !== null
){ ){
$greentext[] = date("jS M y @ g:ia", $item["date"]); $greentext[] = date("jS M y @ g:ia", $item["date"]);
} }
if( if(
isset($item["views"]) && isset($item["views"]) &&
$item["views"] !== null $item["views"] !== null
){ ){
$views = number_format($item["views"]); $views = number_format($item["views"]);
if($name != "livestream"){ if($name != "livestream"){
$views .= " views"; $views .= " views";
}else{ }else{
$views .= " watching"; $views .= " watching";
} }
$greentext[] = $views; $greentext[] = $views;
} }
if( if(
isset($item["followers"]) && isset($item["followers"]) &&
$item["followers"] !== null $item["followers"] !== null
){ ){
$greentext[] = number_format($item["followers"]) . " followers"; $greentext[] = number_format($item["followers"]) . " followers";
} }
if( if(
isset($item["author"]["name"]) && isset($item["author"]["name"]) &&
$item["author"]["name"] !== null $item["author"]["name"] !== null
){ ){
$greentext[] = $item["author"]["name"]; $greentext[] = $item["author"]["name"];
} }
$greentext = implode("", $greentext); $greentext = implode("", $greentext);
if( if(
isset($item["duration"]) && isset($item["duration"]) &&
$item["duration"] !== null $item["duration"] !== null
){ ){
$duration = $frontend->s_to_timestamp($item["duration"]); $duration = $frontend->s_to_timestamp($item["duration"]);
}else{ }else{
$duration = null; $duration = null;
} }
$tabindex = $name == $main ? true : false; $tabindex = $name == $main ? true : false;
$categories[$name] .= $frontend->drawtextresult($item, $greentext, $duration, $get["s"], $tabindex); $categories[$name] .= $frontend->drawtextresult($item, $greentext, $duration, $get["s"], $tabindex);
} }
} }
@ -164,66 +158,66 @@ unset($categories[$main]);
$i = 1; $i = 1;
foreach($categories as $name => $value){ foreach($categories as $name => $value){
if($value == ""){ if($value == ""){
continue; continue;
} }
if($i % 2 === 1){ if($i % 2 === 1){
$write = "right-left"; $write = "right-left";
}else{ }else{
$write = "right-right"; $write = "right-right";
} }
$payload[$write] .= $payload[$write] .=
'<div class="answer-wrapper">' . '<div class="answer-wrapper">' .
'<input id="answer' . $i . '" class="spoiler" type="checkbox">' . '<input id="answer' . $i . '" class="spoiler" type="checkbox">' .
'<div class="answer">' . '<div class="answer">' .
'<div class="answer-title">' . '<div class="answer-title">' .
'<a class="answer-title" href="?s=' . urlencode($get["s"]); '<a class="answer-title" href="?s=' . urlencode($get["s"]);
switch($name){ switch($name){
case "playlist": case "playlist":
$payload[$write] .= $payload[$write] .=
'&type=playlist"><h2>Playlists</h2></a>'; '&type=playlist"><h2>Playlists</h2></a>';
break; break;
case "livestream": case "livestream":
$payload[$write] .= $payload[$write] .=
'&feature=live"><h2>Livestreams</h2></a>'; '&feature=live"><h2>Livestreams</h2></a>';
break; break;
case "author": case "author":
$payload[$write] .= $payload[$write] .=
'&type=channel"><h2>Authors</h2></a>'; '&type=channel"><h2>Authors</h2></a>';
break; break;
case "reel": case "reel":
$payload[$write] .= $payload[$write] .=
'&duration=short"><h2>Reels</h2></a>'; '&duration=short"><h2>Reels</h2></a>';
break; break;
} }
$payload[$write] .= $payload[$write] .=
'</div>' . '</div>' .
$categories[$name] . $categories[$name] .
'</div>' . '</div>' .
'<label class="spoiler-button" for="answer' . $i . '"></label></div>'; '<label class="spoiler-button" for="answer' . $i . '"></label></div>';
$i++; $i++;
} }
if($i !== 1){ if($i !== 1){
$payload["class"] = " has-answer"; $payload["class"] = " has-answer";
} }
if($results["npt"] !== null){ if($results["npt"] !== null){
$payload["left"] .= $payload["left"] .=
'<a href="' . $frontend->htmlnextpage($get, $results["npt"], "videos") . '" class="nextpage">Next page &gt;</a>'; '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "videos") . '" class="nextpage">Next page &gt;</a>';
} }

View File

@ -12,12 +12,6 @@ $frontend = new frontend();
$get = $frontend->parsegetfilters($_GET, $filters); $get = $frontend->parsegetfilters($_GET, $filters);
/*
Captcha
*/
include "lib/bot_protection.php";
new bot_protection($frontend, $get, $filters, "web", true);
$payload = [ $payload = [
"timetaken" => microtime(true), "timetaken" => microtime(true),
"class" => "", "class" => "",
@ -28,9 +22,9 @@ $payload = [
try{ try{
$results = $scraper->web($get); $results = $scraper->web($get);
}catch(Exception $error){ }catch(Exception $error){
$frontend->drawscrapererror($error->getMessage(), $get, "web", $payload["timetaken"]); $frontend->drawscrapererror($error->getMessage(), $get, "web", $payload["timetaken"]);
} }
@ -69,18 +63,18 @@ $answerlen = 0;
Spelling checker Spelling checker
*/ */
if($results["spelling"]["type"] != "no_correction"){ if($results["spelling"]["type"] != "no_correction"){
switch($results["spelling"]["type"]){ switch($results["spelling"]["type"]){
case "including": case "including":
$type = "Including results for"; $type = "Including results for";
break; break;
case "not_many": case "not_many":
$type = "Not many results contains"; $type = "Not many results contains";
break; break;
} }
$payload["left"] .= $payload["left"] .=
'<div class="infobox">' . '<div class="infobox">' .
$type . ' <b>' . htmlspecialchars($results["spelling"]["using"]) . '</b>.<br>' . $type . ' <b>' . htmlspecialchars($results["spelling"]["using"]) . '</b>.<br>' .
@ -98,7 +92,7 @@ if($results["spelling"]["type"] != "no_correction"){
Populate links Populate links
*/ */
if(count($results["web"]) === 0){ if(count($results["web"]) === 0){
$payload["left"] .= $payload["left"] .=
'<div class="infobox">' . '<div class="infobox">' .
"<h1>Nobody here but us chickens!</h1>" . "<h1>Nobody here but us chickens!</h1>" .
@ -112,17 +106,17 @@ if(count($results["web"]) === 0){
} }
foreach($results["web"] as $site){ foreach($results["web"] as $site){
$n = null; $n = null;
if($site["date"] !== null){ if($site["date"] !== null){
$date = date("jS M y @ g:ia", $site["date"]); $date = date("jS M y @ g:ia", $site["date"]);
}else{ }else{
$date = null; $date = null;
} }
$payload["left"] .= $frontend->drawtextresult($site, $date, $n, $get["s"]); $payload["left"] .= $frontend->drawtextresult($site, $date, $n, $get["s"]);
} }
@ -132,7 +126,7 @@ $right = [];
Generate images Generate images
*/ */
if(count($results["image"]) !== 0){ if(count($results["image"]) !== 0){
$answerlen++; $answerlen++;
$right["image"] = $right["image"] =
'<div class="answer-wrapper">' . '<div class="answer-wrapper">' .
@ -142,24 +136,24 @@ if(count($results["image"]) !== 0){
'<a class="answer-title" href="/images?s=' . urlencode($get["s"]) . '"><h2>Images</h2></a>' . '<a class="answer-title" href="/images?s=' . urlencode($get["s"]) . '"><h2>Images</h2></a>' .
'</div>' . '</div>' .
'<div class="images">'; '<div class="images">';
foreach($results["image"] as $image){ foreach($results["image"] as $image){
$right["image"] .= $right["image"] .=
'<a class="image" href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow" title="' . htmlspecialchars($image["title"]) . '" data-json="' . htmlspecialchars(json_encode($image["source"])) . '" tabindex="-1">' . '<a class="image" href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow" title="' . htmlspecialchars($image["title"]) . '" data-json="' . htmlspecialchars(json_encode($image["source"])) . '" tabindex="-1">' .
'<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "square") . '" alt="thumb">'; '<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "square") . '" alt="thumb">';
if( if(
$image["source"][0]["width"] !== null && $image["source"][0]["width"] !== null &&
$image["source"][0]["height"] !== null $image["source"][0]["height"] !== null
){ ){
$right["image"] .= '<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>'; $right["image"] .= '<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>';
} }
$right["image"] .= '</a>'; $right["image"] .= '</a>';
} }
$right["image"] .= $right["image"] .=
'</div></div>' . '</div></div>' .
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>'; '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
@ -169,7 +163,7 @@ if(count($results["image"]) !== 0){
Generate videos Generate videos
*/ */
if(count($results["video"]) !== 0){ if(count($results["video"]) !== 0){
$answerlen++; $answerlen++;
$right["video"] = $right["video"] =
'<div class="answer-wrapper">' . '<div class="answer-wrapper">' .
@ -178,44 +172,44 @@ if(count($results["video"]) !== 0){
'<div class="answer-title">' . '<div class="answer-title">' .
'<a class="answer-title" href="/videos?s=' . urlencode($get["s"]) . '"><h2>Videos</h2></a>' . '<a class="answer-title" href="/videos?s=' . urlencode($get["s"]) . '"><h2>Videos</h2></a>' .
'</div>'; '</div>';
foreach($results["video"] as $video){ foreach($results["video"] as $video){
if($video["views"] !== null){ if($video["views"] !== null){
$greentext = number_format($video["views"]) . " views"; $greentext = number_format($video["views"]) . " views";
}else{ }else{
$greentext = null; $greentext = null;
} }
if($video["date"] !== null){ if($video["date"] !== null){
if($greentext !== null){ if($greentext !== null){
$greentext .= ""; $greentext .= "";
} }
$greentext .= date("jS M y @ g:ia", $video["date"]); $greentext .= date("jS M y @ g:ia", $video["date"]);
} }
if($video["duration"] !== null){ if($video["duration"] !== null){
if($video["duration"] == "_LIVE"){ if($video["duration"] == "_LIVE"){
$duration = 'LIVE'; $duration = 'LIVE';
}else{ }else{
$duration = $frontend->s_to_timestamp($video["duration"]); $duration = $frontend->s_to_timestamp($video["duration"]);
} }
}else{ }else{
$duration = null; $duration = null;
} }
$right["video"] .= $frontend->drawtextresult($video, $greentext, $duration, $get["s"], false); $right["video"] .= $frontend->drawtextresult($video, $greentext, $duration, $get["s"], false);
} }
$right["video"] .= $right["video"] .=
'</div>' . '</div>' .
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>'; '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
@ -225,7 +219,7 @@ if(count($results["video"]) !== 0){
Generate news Generate news
*/ */
if(count($results["news"]) !== 0){ if(count($results["news"]) !== 0){
$answerlen++; $answerlen++;
$right["news"] = $right["news"] =
'<div class="answer-wrapper">' . '<div class="answer-wrapper">' .
@ -234,20 +228,20 @@ if(count($results["news"]) !== 0){
'<div class="answer-title">' . '<div class="answer-title">' .
'<a class="answer-title" href="/news?s=' . urlencode($get["s"]) . '"><h2>News</h2></a>' . '<a class="answer-title" href="/news?s=' . urlencode($get["s"]) . '"><h2>News</h2></a>' .
'</div>'; '</div>';
foreach($results["news"] as $news){ foreach($results["news"] as $news){
if($news["date"] !== null){ if($news["date"] !== null){
$greentext = date("jS M y @ g:ia", $news["date"]); $greentext = date("jS M y @ g:ia", $news["date"]);
}else{ }else{
$greentext = null; $greentext = null;
} }
$right["news"] .= $frontend->drawtextresult($news, $greentext, null, $get["s"], false); $right["news"] .= $frontend->drawtextresult($news, $greentext, null, $get["s"], false);
} }
$right["news"] .= $right["news"] .=
'</div>' . '</div>' .
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>'; '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
@ -257,156 +251,156 @@ if(count($results["news"]) !== 0){
Generate answers Generate answers
*/ */
if(count($results["answer"]) !== 0){ if(count($results["answer"]) !== 0){
$right["answer"] = ""; $right["answer"] = "";
foreach($results["answer"] as $answer){ foreach($results["answer"] as $answer){
$answerlen++; $answerlen++;
$right["answer"] .= $right["answer"] .=
'<div class="answer-wrapper">' . '<div class="answer-wrapper">' .
'<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' . '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
'<div class="answer"><div class="wiki-head">'; '<div class="answer"><div class="wiki-head">';
if(!empty($answer["title"])){ if(!empty($answer["title"])){
$right["answer"] .= $right["answer"] .=
'<div class="answer-title">'; '<div class="answer-title">';
if(!empty($answer["url"])){ if(!empty($answer["url"])){
$right["answer"] .= '<a class="answer-title" href="' . htmlspecialchars($answer["url"]) . '" rel="noreferrer nofollow">'; $right["answer"] .= '<a class="answer-title" href="' . htmlspecialchars($answer["url"]) . '" rel="noreferrer nofollow">';
} }
$right["answer"] .= '<h1>' . htmlspecialchars($answer["title"]) . '</h1>'; $right["answer"] .= '<h1>' . htmlspecialchars($answer["title"]) . '</h1>';
if(!empty($answer["url"])){ if(!empty($answer["url"])){
$right["answer"] .= '</a>'; $right["answer"] .= '</a>';
} }
$right["answer"] .= '</div>'; $right["answer"] .= '</div>';
} }
if(!empty($answer["url"])){ if(!empty($answer["url"])){
$right["answer"] .= $right["answer"] .=
$frontend->drawlink($answer["url"]); $frontend->drawlink($answer["url"]);
} }
$right["answer"] .= '<div class="description">'; $right["answer"] .= '<div class="description">';
if(!empty($answer["thumb"])){ if(!empty($answer["thumb"])){
$right["answer"] .= $right["answer"] .=
'<a href="' . htmlspecialchars($answer["thumb"]) . '" rel="noreferrer nofollow" class="photo">' . '<a href="' . htmlspecialchars($answer["thumb"]) . '" rel="noreferrer nofollow" class="photo">' .
'<img src="' . $frontend->htmlimage($answer["thumb"], "cover") . '" alt="thumb" class="openimg">' . '<img src="' . $frontend->htmlimage($answer["thumb"], "cover") . '" alt="thumb" class="openimg">' .
'</a>'; '</a>';
} }
foreach($answer["description"] as $description){ foreach($answer["description"] as $description){
switch($description["type"]){ switch($description["type"]){
case "text": case "text":
$right["answer"] .= $frontend->highlighttext($get["s"], $description["value"]); $right["answer"] .= $frontend->highlighttext($get["s"], $description["value"]);
break; break;
case "title": case "title":
$right["answer"] .= $right["answer"] .=
'<h2>' . '<h2>' .
htmlspecialchars($description["value"]) . htmlspecialchars($description["value"]) .
'</h2>'; '</h2>';
break; break;
case "italic": case "italic":
$right["answer"] .= $right["answer"] .=
'<i>' . '<i>' .
$frontend->highlighttext($get["s"], $description["value"]) . $frontend->highlighttext($get["s"], $description["value"]) .
'</i>'; '</i>';
break; break;
case "quote": case "quote":
$right["answer"] .= $right["answer"] .=
'<div class="quote">' . '<div class="quote">' .
$frontend->highlighttext($get["s"], $description["value"]) . $frontend->highlighttext($get["s"], $description["value"]) .
'</div>'; '</div>';
break; break;
case "code": case "code":
$right["answer"] .= $right["answer"] .=
'<div class="code" tabindex="-1">' . '<div class="code" tabindex="-1">' .
$frontend->highlightcode($description["value"], true) . $frontend->highlightcode($description["value"], true) .
'</div>'; '</div>';
break; break;
case "inline_code": case "inline_code":
$right["answer"] .= $right["answer"] .=
'<div class="code-inline">' . '<div class="code-inline">' .
htmlspecialchars($description["value"]) . htmlspecialchars($description["value"]) .
'</div>'; '</div>';
break; break;
case "link": case "link":
$right["answer"] .= $right["answer"] .=
'<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" class="underline" tabindex="-1">' . htmlspecialchars($description["value"]) . '</a>'; '<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" class="underline" tabindex="-1">' . htmlspecialchars($description["value"]) . '</a>';
break; break;
case "image": case "image":
$right["answer"] .= $right["answer"] .=
'<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" tabindex="-1"><img src="' . $frontend->htmlimage($description["url"], "thumb") . '" alt="image" class="fullimg openimg"></a>'; '<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" tabindex="-1"><img src="' . $frontend->htmlimage($description["url"], "thumb") . '" alt="image" class="fullimg openimg"></a>';
break; break;
case "audio": case "audio":
$right["answer"] .= $right["answer"] .=
'<audio src="/audio/linear?s=' . urlencode($description["url"]) . '" controls><a href="/audio/linear?s=' . urlencode($description["url"]) . '">Listen to the pronunciation audio</a></audio>'; '<audio src="/audio/linear?s=' . urlencode($description["url"]) . '" controls><a href="/audio/linear?s=' . urlencode($description["url"]) . '">Listen to the pronunciation audio</a></audio>';
break; break;
} }
} }
$right["answer"] .= '</div>'; $right["answer"] .= '</div>';
if(count($answer["table"]) !== 0){ if(count($answer["table"]) !== 0){
$right["answer"] .= '<table>'; $right["answer"] .= '<table>';
foreach($answer["table"] as $info => $value){ foreach($answer["table"] as $info => $value){
$right["answer"] .= $right["answer"] .=
'<tr>' . '<tr>' .
'<td>' . $info . '</td>' . '<td>' . $info . '</td>' .
'<td>' . $value . '</td>' . '<td>' . $value . '</td>' .
'</tr>'; '</tr>';
} }
$right["answer"] .= '</table>'; $right["answer"] .= '</table>';
} }
if(count($answer["sublink"]) !== 0){ if(count($answer["sublink"]) !== 0){
$right["answer"] .= '<div class="socials">'; $right["answer"] .= '<div class="socials">';
$icons = glob("static/icon/*"); $icons = glob("static/icon/*");
foreach($answer["sublink"] as $website => $url){ foreach($answer["sublink"] as $website => $url){
$flag = false; $flag = false;
$icon = str_replace(" ", "", strtolower($website)); $icon = str_replace(" ", "", strtolower($website));
foreach($icons as $path){ foreach($icons as $path){
if(pathinfo($path, PATHINFO_FILENAME) == $icon){ if(pathinfo($path, PATHINFO_FILENAME) == $icon){
$flag = true; $flag = true;
break; break;
} }
} }
if($flag === false){ if($flag === false){
$icon = "website"; $icon = "website";
} }
$right["answer"] .= $right["answer"] .=
'<a href="' . htmlspecialchars($url) . '" rel="noreferrer nofollow" tabindex="-1">' . '<a href="' . htmlspecialchars($url) . '" rel="noreferrer nofollow" tabindex="-1">' .
'<div class="center">' . '<div class="center">' .
@ -415,10 +409,10 @@ if(count($results["answer"]) !== 0){
'</div>' . '</div>' .
'</a>'; '</a>';
} }
$right["answer"] .= '</div>'; $right["answer"] .= '</div>';
} }
$right["answer"] .= $right["answer"] .=
'</div></div>' . '</div></div>' .
'<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>'; '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
@ -429,9 +423,9 @@ if(count($results["answer"]) !== 0){
Add right containers Add right containers
*/ */
if(isset($right["answer"])){ if(isset($right["answer"])){
if(count($right) >= 2){ if(count($right) >= 2){
$payload["right-right"] = $right["answer"]; $payload["right-right"] = $right["answer"];
unset($right["answer"]); unset($right["answer"]);
} }
@ -439,20 +433,20 @@ if(isset($right["answer"])){
$c = 0; $c = 0;
foreach($right as $snippet){ foreach($right as $snippet){
if($c % 2 === 0){ if($c % 2 === 0){
$payload["right-left"] .= $snippet; $payload["right-left"] .= $snippet;
}else{ }else{
$payload["right-right"] .= $snippet; $payload["right-right"] .= $snippet;
} }
$c++; $c++;
} }
if($c !== 0){ if($c !== 0){
$payload["class"] = " has-answer"; $payload["class"] = " has-answer";
} }
@ -465,18 +459,18 @@ if($c !== 0){
$payload["left"] .= '<h3>Related searches</h3><table class="related">'; $payload["left"] .= '<h3>Related searches</h3><table class="related">';
$opentr = false; $opentr = false;
for($i=0; $i<$c; $i++){ for($i=0; $i<$c; $i++){
if(($i % 2) === 0){ if(($i % 2) === 0){
$opentr = true; $opentr = true;
$payload["left"] .= '<tr>'; $payload["left"] .= '<tr>';
}else{ }else{
$opentr = false; $opentr = false;
} }
$payload["left"] .= $payload["left"] .=
'<td>' . '<td>' .
'<a href="/web?s=' . '<a href="/web?s=' .
@ -485,20 +479,20 @@ if($c !== 0){
'">' . '">' .
htmlspecialchars($results["related"][$i]) . htmlspecialchars($results["related"][$i]) .
'</a>'; '</a>';
$payload["left"] .= '</td>'; $payload["left"] .= '</td>';
if($opentr === false){ if($opentr === false){
$payload["left"] .= '</tr>'; $payload["left"] .= '</tr>';
} }
} }
if($opentr === true){ if($opentr === true){
$payload["left"] .= '<td></td></tr>'; $payload["left"] .= '<td></td></tr>';
} }
$payload["left"] .= '</table>'; $payload["left"] .= '</table>';
} }
@ -506,7 +500,7 @@ if($c !== 0){
Load next page Load next page
*/ */
if($results["npt"] !== null){ if($results["npt"] !== null){
$payload["left"] .= $payload["left"] .=
'<a href="' . $frontend->htmlnextpage($get, $results["npt"], "web") . '" class="nextpage">Next page &gt;</a>'; '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "web") . '" class="nextpage">Next page &gt;</a>';
} }