web.php 11 KB

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