1
0

web.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <?php
  2. /*
  3. Initialize random shit
  4. */
  5. include "data/config.php";
  6. include "lib/frontend.php";
  7. $frontend = new frontend();
  8. [$scraper, $filters] = $frontend->getscraperfilters("web");
  9. $get = $frontend->parsegetfilters($_GET, $filters);
  10. /*
  11. Captcha
  12. */
  13. include "lib/bot_protection.php";
  14. new bot_protection($frontend, $get, $filters, "web", true);
  15. $payload = [
  16. "timetaken" => microtime(true),
  17. "class" => "",
  18. "right-left" => "",
  19. "right-right" => "",
  20. "left" => ""
  21. ];
  22. // increment request count
  23. $frontend->increment_real_reqs($get["scraper"]);
  24. try{
  25. $results = $scraper->web($get);
  26. }catch(Exception $error){
  27. $frontend->drawscrapererror($error->getMessage(), $get, "web", $payload["timetaken"]);
  28. }
  29. $answerlen = 0;
  30. /*
  31. Spelling checker
  32. */
  33. if($results["spelling"]["type"] != "no_correction"){
  34. switch($results["spelling"]["type"]){
  35. case "including":
  36. $type = "Including results for";
  37. break;
  38. case "not_many":
  39. $type = "Not many results contains";
  40. break;
  41. }
  42. $payload["left"] .=
  43. '<div class="infobox">' .
  44. $type . ' <b>' . htmlspecialchars($results["spelling"]["using"]) . '</b>.<br>' .
  45. 'Did you mean <a href="?s=' .
  46. urlencode($results["spelling"]["correction"]) .
  47. '&' .
  48. $frontend->buildquery($get, true) .
  49. '&spellcheck=no">' .
  50. htmlspecialchars($results["spelling"]["correction"]) .
  51. '</a>?' .
  52. '</div>';
  53. }
  54. /*
  55. Populate links
  56. */
  57. if(count($results["web"]) === 0){
  58. $payload["left"] .=
  59. '<div class="infobox">' .
  60. "<h1>Nobody here but us chickens!</h1>" .
  61. 'Have you tried:' .
  62. '<ul>' .
  63. '<li>Using a different scraper</li>' .
  64. '<li>Using fewer keywords</li>' .
  65. '<li>Defining broader filters (Is NSFW turned off?)</li>' .
  66. '</ul>' .
  67. '</div>';
  68. }
  69. foreach($results["web"] as $site){
  70. $n = null;
  71. if($site["date"] !== null){
  72. $date = date("jS M y @ g:ia", $site["date"]);
  73. }else{
  74. $date = null;
  75. }
  76. $payload["left"] .= $frontend->drawtextresult($site, $date, $n, $get["s"]);
  77. }
  78. $right = [];
  79. /*
  80. Generate images
  81. */
  82. if(count($results["image"]) !== 0){
  83. $answerlen++;
  84. $right["image"] =
  85. '<div class="answer-wrapper">' .
  86. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  87. '<div class="answer">' .
  88. '<div class="answer-title">' .
  89. '<a class="answer-title" href="/images?s=' . urlencode($get["s"]) . '"><h2>Images</h2></a>' .
  90. '</div>' .
  91. '<div class="images">';
  92. foreach($results["image"] as $image){
  93. $right["image"] .=
  94. '<a class="image" href="' . htmlspecialchars($image["url"]) . '" rel="noreferrer nofollow" title="' . htmlspecialchars($image["title"]) . '" data-json="' . htmlspecialchars(json_encode($image["source"])) . '" tabindex="-1">' .
  95. '<img src="' . $frontend->htmlimage($image["source"][count($image["source"]) - 1]["url"], "square") . '" alt="thumb">';
  96. if(
  97. $image["source"][0]["width"] !== null &&
  98. $image["source"][0]["height"] !== null
  99. ){
  100. $right["image"] .= '<div class="duration">' . $image["source"][0]["width"] . 'x' . $image["source"][0]["height"] . '</div>';
  101. }
  102. $right["image"] .= '</a>';
  103. }
  104. $right["image"] .=
  105. '</div></div>' .
  106. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  107. }
  108. /*
  109. Generate videos
  110. */
  111. if(count($results["video"]) !== 0){
  112. $answerlen++;
  113. $right["video"] =
  114. '<div class="answer-wrapper">' .
  115. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  116. '<div class="answer">' .
  117. '<div class="answer-title">' .
  118. '<a class="answer-title" href="/videos?s=' . urlencode($get["s"]) . '"><h2>Videos</h2></a>' .
  119. '</div>';
  120. foreach($results["video"] as $video){
  121. if($video["views"] !== null){
  122. $greentext = number_format($video["views"]) . " views";
  123. }else{
  124. $greentext = null;
  125. }
  126. if($video["date"] !== null){
  127. if($greentext !== null){
  128. $greentext .= " • ";
  129. }
  130. $greentext .= date("jS M y @ g:ia", $video["date"]);
  131. }
  132. if($video["duration"] !== null){
  133. if($video["duration"] == "_LIVE"){
  134. $duration = 'LIVE';
  135. }else{
  136. $duration = $frontend->s_to_timestamp($video["duration"]);
  137. }
  138. }else{
  139. $duration = null;
  140. }
  141. $right["video"] .= $frontend->drawtextresult($video, $greentext, $duration, $get["s"], false);
  142. }
  143. $right["video"] .=
  144. '</div>' .
  145. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  146. }
  147. /*
  148. Generate news
  149. */
  150. if(count($results["news"]) !== 0){
  151. $answerlen++;
  152. $right["news"] =
  153. '<div class="answer-wrapper">' .
  154. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  155. '<div class="answer">' .
  156. '<div class="answer-title">' .
  157. '<a class="answer-title" href="/news?s=' . urlencode($get["s"]) . '"><h2>News</h2></a>' .
  158. '</div>';
  159. foreach($results["news"] as $news){
  160. if($news["date"] !== null){
  161. $greentext = date("jS M y @ g:ia", $news["date"]);
  162. }else{
  163. $greentext = null;
  164. }
  165. $right["news"] .= $frontend->drawtextresult($news, $greentext, null, $get["s"], false);
  166. }
  167. $right["news"] .=
  168. '</div>' .
  169. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  170. }
  171. /*
  172. Generate answers
  173. */
  174. if(count($results["answer"]) !== 0){
  175. $right["answer"] = "";
  176. foreach($results["answer"] as $answer){
  177. $answerlen++;
  178. $right["answer"] .=
  179. '<div class="answer-wrapper">' .
  180. '<input id="answer' . $answerlen . '" class="spoiler" type="checkbox">' .
  181. '<div class="answer"><div class="wiki-head">';
  182. if(!empty($answer["title"])){
  183. $right["answer"] .=
  184. '<div class="answer-title">';
  185. if(!empty($answer["url"])){
  186. $right["answer"] .= '<a class="answer-title" href="' . htmlspecialchars($answer["url"]) . '" rel="noreferrer nofollow">';
  187. }
  188. $right["answer"] .= '<h1>' . htmlspecialchars($answer["title"]) . '</h1>';
  189. if(!empty($answer["url"])){
  190. $right["answer"] .= '</a>';
  191. }
  192. $right["answer"] .= '</div>';
  193. }
  194. if(!empty($answer["url"])){
  195. $right["answer"] .=
  196. $frontend->drawlink($answer["url"]);
  197. }
  198. $right["answer"] .= '<div class="description">';
  199. if(!empty($answer["thumb"])){
  200. $right["answer"] .=
  201. '<a href="' . htmlspecialchars($answer["thumb"]) . '" rel="noreferrer nofollow" class="photo">' .
  202. '<img src="' . $frontend->htmlimage($answer["thumb"], "cover") . '" alt="thumb" class="openimg">' .
  203. '</a>';
  204. }
  205. foreach($answer["description"] as $description){
  206. switch($description["type"]){
  207. case "text":
  208. $right["answer"] .= $frontend->highlighttext($get["s"], $description["value"]);
  209. break;
  210. case "title":
  211. $right["answer"] .=
  212. '<h2>' .
  213. htmlspecialchars($description["value"]) .
  214. '</h2>';
  215. break;
  216. case "italic":
  217. $right["answer"] .=
  218. '<i>' .
  219. $frontend->highlighttext($get["s"], $description["value"]) .
  220. '</i>';
  221. break;
  222. case "quote":
  223. $right["answer"] .=
  224. '<div class="quote">' .
  225. $frontend->highlighttext($get["s"], $description["value"]) .
  226. '</div>';
  227. break;
  228. case "code":
  229. $right["answer"] .=
  230. '<div class="code" tabindex="-1">' .
  231. $frontend->highlightcode($description["value"], true) .
  232. '</div>';
  233. break;
  234. case "inline_code":
  235. $right["answer"] .=
  236. '<div class="code-inline">' .
  237. htmlspecialchars($description["value"]) .
  238. '</div>';
  239. break;
  240. case "link":
  241. $right["answer"] .=
  242. '<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" class="underline" tabindex="-1">' . htmlspecialchars($description["value"]) . '</a>';
  243. break;
  244. case "image":
  245. $right["answer"] .=
  246. '<a href="' . htmlspecialchars($description["url"]) . '" rel="noreferrer nofollow" tabindex="-1"><img src="' . $frontend->htmlimage($description["url"], "thumb") . '" alt="image" class="fullimg openimg"></a>';
  247. break;
  248. case "audio":
  249. $right["answer"] .=
  250. '<audio src="/audio/linear?s=' . urlencode($description["url"]) . '" controls><a href="/audio/linear?s=' . urlencode($description["url"]) . '">Listen to the pronunciation audio</a></audio>';
  251. break;
  252. }
  253. }
  254. $right["answer"] .= '</div>';
  255. if(count($answer["table"]) !== 0){
  256. $right["answer"] .= '<table>';
  257. foreach($answer["table"] as $info => $value){
  258. $right["answer"] .=
  259. '<tr>' .
  260. '<td>' . htmlspecialchars($info) . '</td>' .
  261. '<td>' . htmlspecialchars($value) . '</td>' .
  262. '</tr>';
  263. }
  264. $right["answer"] .= '</table>';
  265. }
  266. if(count($answer["sublink"]) !== 0){
  267. $right["answer"] .= '<div class="socials">';
  268. $icons = glob("static/icon/*");
  269. foreach($answer["sublink"] as $website => $url){
  270. $flag = false;
  271. $icon = str_replace(" ", "", strtolower($website));
  272. foreach($icons as $path){
  273. if(pathinfo($path, PATHINFO_FILENAME) == $icon){
  274. $flag = true;
  275. break;
  276. }
  277. }
  278. if($flag === false){
  279. $icon = "website";
  280. }
  281. $right["answer"] .=
  282. '<a href="' . htmlspecialchars($url) . '" rel="noreferrer nofollow" tabindex="-1">' .
  283. '<div class="center">' .
  284. '<img src="/static/icon/' . $icon . '.png" alt="icon">' .
  285. '<div class="title">' . $website . '</div>' .
  286. '</div>' .
  287. '</a>';
  288. }
  289. $right["answer"] .= '</div>';
  290. }
  291. $right["answer"] .=
  292. '</div></div>' .
  293. '<label class="spoiler-button" for="answer' . $answerlen . '"></label></div>';
  294. }
  295. }
  296. /*
  297. Add right containers
  298. */
  299. if(isset($right["answer"])){
  300. if(count($right) >= 2){
  301. $payload["right-right"] = $right["answer"];
  302. unset($right["answer"]);
  303. }
  304. }
  305. $c = 0;
  306. foreach($right as $snippet){
  307. if($c % 2 === 0){
  308. $payload["right-left"] .= $snippet;
  309. }else{
  310. $payload["right-right"] .= $snippet;
  311. }
  312. $c++;
  313. }
  314. if($c !== 0){
  315. $payload["class"] = " has-answer";
  316. }
  317. /*
  318. Generate related searches
  319. */
  320. $c = count($results["related"]);
  321. if($c !== 0){
  322. $payload["left"] .= '<h3>Related searches</h3><table class="related">';
  323. $opentr = false;
  324. for($i=0; $i<$c; $i++){
  325. if(($i % 2) === 0){
  326. $opentr = true;
  327. $payload["left"] .= '<tr>';
  328. }else{
  329. $opentr = false;
  330. }
  331. $payload["left"] .=
  332. '<td>' .
  333. '<a href="/web?s=' .
  334. urlencode($results["related"][$i]) . "&" .
  335. $frontend->buildquery($get, true) .
  336. '">' .
  337. htmlspecialchars($results["related"][$i]) .
  338. '</a>';
  339. $payload["left"] .= '</td>';
  340. if($opentr === false){
  341. $payload["left"] .= '</tr>';
  342. }
  343. }
  344. if($opentr === true){
  345. $payload["left"] .= '<td></td></tr>';
  346. }
  347. $payload["left"] .= '</table>';
  348. }
  349. /*
  350. Load next page
  351. */
  352. if($results["npt"] !== null){
  353. $payload["left"] .=
  354. '<a href="' . $frontend->htmlnextpage($get, $results["npt"], "web") . '" class="nextpage">Next page &gt;</a>';
  355. }
  356. echo $frontend->load("search.html", $payload);