Version 1.2.1
1.2.1 - January 15, 2024 - [new] Merge identical downloads (determined by info hash) from different torrent sites that provide hashes - [new] Option to cache to flat files instead of APCu, files stored in /cache/ folder - [new] Blank index.php files in all subfolders to shield from prying eyes - [tweak] Improved version check - [fix] Stray periods in some Limetorrent categories - [fix] Inconsistent size indication for torrent results
This commit is contained in:
parent
b0415ee3b9
commit
426daab980
4
assets/css/index.php
Normal file
4
assets/css/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
4
assets/images/index.php
Normal file
4
assets/images/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
4
assets/index.php
Normal file
4
assets/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
4
cache/index.php
vendored
Normal file
4
cache/index.php
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
|
@ -23,13 +23,23 @@ HASH AUTH:
|
||||||
Disclaimer: This is not meant to 'hack proof' or truly secure the setup. Just a simple token to keep surface level prying eyes out.
|
Disclaimer: This is not meant to 'hack proof' or truly secure the setup. Just a simple token to keep surface level prying eyes out.
|
||||||
|
|
||||||
CACHE:
|
CACHE:
|
||||||
If you have ACPu enabled in your server it is highly recommended to enable caching as it'll speed up repeat searches by a lot.
|
It is highly recommended to enable caching as it'll speed up repeat searches by a lot.
|
||||||
"on" (Recommended) for active sites, requires APCu
|
"on" (Recommended)
|
||||||
"off" Disables cache, useful for testing or if your server lacks APCu support
|
"off" Disables cache
|
||||||
|
|
||||||
CACHE_TIME:
|
CACHE_TIME:
|
||||||
Minutes the result should be cached in ACPu.
|
Minutes the result should be cached. Accepts a numeric value between 1 and 720.
|
||||||
Accepts a numeric value between 1 and 30.
|
APCu stores in memory, using a longer time takes up more of it. It is recommended to not exceed 30 minutes for it.
|
||||||
|
The file cache is only limited by your hosting storage space and can safely be much much longer if you want.
|
||||||
|
To not show outdated results the 'limit' is 720 minutes, which equals 12 hours.
|
||||||
|
Ignored if above 'cache' option is set to off.
|
||||||
|
|
||||||
|
CACHE_TYPE:
|
||||||
|
Choose how to cache results. The cache is NOT unique per user but shared between all users. Different users searching for the exact same thing get the same results.
|
||||||
|
Default caching method is APCu. Alternatively, you can store the results in text files in the /cache/ folder.
|
||||||
|
Ignored if above 'cache' option is set to off.
|
||||||
|
"apcu" (Recommended) faster, utilize memory.
|
||||||
|
"file" Store results in text files.
|
||||||
|
|
||||||
LANGUAGE:
|
LANGUAGE:
|
||||||
DuckDuckGo, Google and Ecosia are language agnostic. But they DO profile you for your locale.
|
DuckDuckGo, Google and Ecosia are language agnostic. But they DO profile you for your locale.
|
||||||
|
@ -82,12 +92,12 @@ SPECIAL:
|
||||||
"off" Disable this special search
|
"off" Disable this special search
|
||||||
|
|
||||||
USER AGENTS:
|
USER AGENTS:
|
||||||
Add more or less user agents to the list. Keep at least one.
|
Add more or less user agents to the list. Keep at least one!
|
||||||
On every search Goosle picks one at random to identify as.
|
On every search Goosle picks one at random to identify as.
|
||||||
Keep them generic to prevent profiling, but also so that the request comes off as a generic boring browser and not as a server/crawler.
|
Keep them generic to prevent profiling, but also so that the request comes off as a generic boring browser and not as a server/crawler.
|
||||||
|
|
||||||
Safari, Firefox and Internet Explorer/Edge should be safe to use.
|
Safari, Firefox and Internet Explorer/Edge should be safe to use.
|
||||||
Chrome may attract attention because of the lack of Chrome information (tracking) aside from the user agent. The search engine will know something is wrong.
|
Chrome may attract attention because of the lack of Chrome information (tracking) aside from the user agent. The search engine may know something is 'weird'.
|
||||||
Opera/Edge/Brave and many others use Chrome under the hood and are not a good pick for that reason.
|
Opera/Edge/Brave and many others use Chrome under the hood and are not a good pick for that reason.
|
||||||
Mobile agents may work, but some services like Wikipedia are a bit picky when it comes to answering API calls. Mobile users generally do not use APIs, so they may block your search.
|
Mobile agents may work, but some services like Wikipedia are a bit picky when it comes to answering API calls. Mobile users generally do not use APIs, so they may block your search.
|
||||||
|
|
||||||
|
@ -120,6 +130,7 @@ return (object) array(
|
||||||
"hash" => "j9fg-i2du-er6m",
|
"hash" => "j9fg-i2du-er6m",
|
||||||
"hash_auth" => "off", // Default: off
|
"hash_auth" => "off", // Default: off
|
||||||
"cache" => "off", // Default: off
|
"cache" => "off", // Default: off
|
||||||
|
"cache_type" => "apcu", // Default: apcu
|
||||||
"cache_time" => 30, // Default: 30 (Minutes)
|
"cache_time" => 30, // Default: 30 (Minutes)
|
||||||
|
|
||||||
"duckduckgo_language" => "uk-en", // Default: uk-en (United Kingdom)
|
"duckduckgo_language" => "uk-en", // Default: uk-en (United Kingdom)
|
||||||
|
@ -158,11 +169,7 @@ return (object) array(
|
||||||
"udp://tracker.opentrackr.org:1337/announce",
|
"udp://tracker.opentrackr.org:1337/announce",
|
||||||
"udp://exodus.desync.com:6969/announce",
|
"udp://exodus.desync.com:6969/announce",
|
||||||
"udp://tracker.torrent.eu.org:451/announce",
|
"udp://tracker.torrent.eu.org:451/announce",
|
||||||
"udp://tracker.yify-torrents.com/announce",
|
|
||||||
"udp://coppersurfer.tk:6969/announce",
|
|
||||||
"udp://opentracker.i2p.rocks:6969/announce",
|
"udp://opentracker.i2p.rocks:6969/announce",
|
||||||
"udp://tracker.internetwarriors.net:1337/announce",
|
|
||||||
"udp://tracker.zer0day.to:1337/announce",
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
?>
|
?>
|
||||||
|
|
4
engines/image/index.php
Normal file
4
engines/image/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
|
@ -101,6 +101,7 @@ class YahooImageRequest extends EngineRequest {
|
||||||
$results['search'][] = array ("id" => $id, "source" => "Yahoo! Images", "image" => $image, "alt" => $alt, "url" => $url, "width" => $dimensions_w, "height" => $dimensions_h, "filesize" => $filesize, "direct_link" => $link, "engine_rank" => $rank);
|
$results['search'][] = array ("id" => $id, "source" => "Yahoo! Images", "image" => $image, "alt" => $alt, "url" => $url, "width" => $dimensions_w, "height" => $dimensions_h, "filesize" => $filesize, "direct_link" => $link, "engine_rank" => $rank);
|
||||||
$rank -= 1;
|
$rank -= 1;
|
||||||
}
|
}
|
||||||
|
unset($response, $xpath, $scrape, $rank);
|
||||||
|
|
||||||
// Add error if there are no search results
|
// Add error if there are no search results
|
||||||
if(empty($results['search'])) {
|
if(empty($results['search'])) {
|
||||||
|
|
4
engines/index.php
Normal file
4
engines/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
|
@ -29,18 +29,15 @@ class ImageSearch extends EngineRequest {
|
||||||
$engine_result = $request->get_results();
|
$engine_result = $request->get_results();
|
||||||
|
|
||||||
if(!empty($engine_result)) {
|
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)) {
|
if(array_key_exists('search', $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'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$query_terms = explode(" ", preg_replace("/[^a-z0-9 ]+/", "", strtolower($request->query)));
|
|
||||||
|
|
||||||
// Merge duplicates and apply relevance scoring
|
// Merge duplicates and apply relevance scoring
|
||||||
foreach($engine_result['search'] as $result) {
|
foreach($engine_result['search'] as $result) {
|
||||||
if(array_key_exists('search', $results)) {
|
if(array_key_exists('search', $results)) {
|
||||||
|
@ -55,6 +52,7 @@ class ImageSearch extends EngineRequest {
|
||||||
$results['search'][$found_key]['goosle_rank'] += $result['engine_rank'];
|
$results['search'][$found_key]['goosle_rank'] += $result['engine_rank'];
|
||||||
} else {
|
} else {
|
||||||
// First find, rank and add to results
|
// First find, rank and add to results
|
||||||
|
$query_terms = explode(" ", preg_replace("/[^a-z0-9 ]+/", "", strtolower($request->query)));
|
||||||
$match_rank = match_count($result['alt'], $query_terms);
|
$match_rank = match_count($result['alt'], $query_terms);
|
||||||
|
|
||||||
$result['goosle_rank'] = $result['engine_rank'] + $match_rank;
|
$result['goosle_rank'] = $result['engine_rank'] + $match_rank;
|
||||||
|
|
|
@ -38,7 +38,36 @@ class TorrentSearch extends EngineRequest {
|
||||||
$engine_result = $request->get_results();
|
$engine_result = $request->get_results();
|
||||||
|
|
||||||
if(!empty($engine_result)) {
|
if(!empty($engine_result)) {
|
||||||
$results_temp = array_merge($results_temp, $engine_result);
|
// No merging of results
|
||||||
|
// $results_temp = array_merge($results_temp, $engine_result);
|
||||||
|
|
||||||
|
// Merge duplicates and apply relevance scoring
|
||||||
|
foreach($engine_result as $result) {
|
||||||
|
if(count($results_temp) > 1 && !is_null($result['hash'])) {
|
||||||
|
$result_urls = array_column($results_temp, "hash", "id");
|
||||||
|
$found_key = array_search($result['hash'], $result_urls);
|
||||||
|
} else {
|
||||||
|
$found_key = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($found_key !== false) {
|
||||||
|
// Duplicate result from another source
|
||||||
|
// If seeders and/or leechers mismatch, assume they're different users
|
||||||
|
if($results_temp[$found_key]['seeders'] != $result['seeders']) $results_temp[$found_key]['combo_seeders'] += $result['seeders'];
|
||||||
|
if($results_temp[$found_key]['leechers'] != $result['leechers']) $results_temp[$found_key]['combo_leechers'] += $result['leechers'];
|
||||||
|
|
||||||
|
$results_temp[$found_key]['combo_source'][] = $result['source'];
|
||||||
|
} else {
|
||||||
|
// First find, rank and add to results
|
||||||
|
$result['combo_seeders'] = $result['seeders'];
|
||||||
|
$result['combo_leechers'] = $result['leechers'];
|
||||||
|
$result['combo_source'][] = $result['source'];
|
||||||
|
|
||||||
|
$results_temp[$result['id']] = $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
unset($result, $result_urls, $found_key, $social_media_multiplier, $goosle_rank, $match_rank);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$request_result = curl_getinfo($request->ch);
|
$request_result = curl_getinfo($request->ch);
|
||||||
|
@ -54,7 +83,7 @@ class TorrentSearch extends EngineRequest {
|
||||||
|
|
||||||
if(count($results_temp) > 0) {
|
if(count($results_temp) > 0) {
|
||||||
// Sort by highest seeders
|
// Sort by highest seeders
|
||||||
$seeders = array_column($results_temp, "seeders");
|
$seeders = array_column($results_temp, "combo_seeders");
|
||||||
array_multisort($seeders, SORT_DESC, $results_temp);
|
array_multisort($seeders, SORT_DESC, $results_temp);
|
||||||
|
|
||||||
// Cap results to 50
|
// Cap results to 50
|
||||||
|
@ -102,18 +131,18 @@ echo '</pre>';
|
||||||
foreach($results['search'] as $result) {
|
foreach($results['search'] as $result) {
|
||||||
// Extra data
|
// Extra data
|
||||||
$meta = array();
|
$meta = array();
|
||||||
if($opts->show_search_source == "on") $meta[] = "<strong>Source:</strong> ".$result['source'];
|
|
||||||
if(array_key_exists('quality', $result)) $meta[] = "<strong>Quality:</strong> ".$result['quality'];
|
if(array_key_exists('quality', $result)) $meta[] = "<strong>Quality:</strong> ".$result['quality'];
|
||||||
if(array_key_exists('year', $result)) $meta[] = "<strong>Year:</strong> ".$result['year'];
|
if(array_key_exists('year', $result)) $meta[] = "<strong>Year:</strong> ".$result['year'];
|
||||||
if(array_key_exists('category', $result)) $meta[] = "<strong>Category:</strong> ".$result['category'];
|
if(array_key_exists('category', $result)) $meta[] = "<strong>Category:</strong> ".$result['category'];
|
||||||
if(array_key_exists('runtime', $result)) $meta[] = "<strong>Runtime:</strong> ".date('H:i', mktime(0, $result['runtime']));
|
if(array_key_exists('runtime', $result)) $meta[] = "<strong>Runtime:</strong> ".date('H:i', mktime(0, $result['runtime']));
|
||||||
if(array_key_exists('date_added', $result)) $meta[] = "<strong>Added:</strong> ".date('M d, Y', $result['date_added']);
|
if(array_key_exists('date_added', $result)) $meta[] = "<strong>Added on:</strong> ".date('M d, Y', $result['date_added']);
|
||||||
if(array_key_exists('url', $result)) $meta[] = "<a href=\"".$result['url']."\" target=\"_blank\" title=\"Careful - Site may contain intrusive popup ads and malware!\">Torrent page</a>";
|
if(array_key_exists('url', $result)) $url = " - <a href=\"".$result['url']."\" target=\"_blank\" title=\"Careful - Site may contain intrusive popup ads and malware!\">torrent page</a>";
|
||||||
|
|
||||||
// Put result together
|
// Put result together
|
||||||
echo "<li class=\"result\"><article>";
|
echo "<li class=\"result\"><article>";
|
||||||
echo "<div class=\"title\"><a href=\"".$result['magnet']."\"><h2>".stripslashes($result['name'])."</h2></a></div>";
|
echo "<div class=\"title\"><a href=\"".$result['magnet']."\"><h2>".stripslashes($result['name'])."</h2></a></div>";
|
||||||
echo "<div class=\"description\"><strong>Seeds:</strong> <span class=\"seeders\">".$result['seeders']."</span> - <strong>Peers:</strong> <span class=\"leechers\">".$result['leechers']."</span> - <strong>Size:</strong> ".$result['size']."<br />".implode(" - ", $meta)."</div>";
|
echo "<div class=\"description\"><strong>Seeds:</strong> <span class=\"seeders\">".$result['combo_seeders']."</span> - <strong>Peers:</strong> <span class=\"leechers\">".$result['combo_leechers']."</span> - <strong>Size:</strong> ".$result['size']."<br />".implode(" - ", $meta)."</div>";
|
||||||
|
if($opts->show_search_source == "on") echo "<div class=\"description\"><strong>Found on:</strong> ".replace_last_comma(implode(", ", $result['combo_source'])).$url."</div>";
|
||||||
echo "</article></li>";
|
echo "</article></li>";
|
||||||
|
|
||||||
unset($result, $meta);
|
unset($result, $meta);
|
||||||
|
|
|
@ -38,18 +38,15 @@ class Search extends EngineRequest {
|
||||||
$engine_result = $request->get_results();
|
$engine_result = $request->get_results();
|
||||||
|
|
||||||
if(!empty($engine_result)) {
|
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)) {
|
if(array_key_exists('search', $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'];
|
|
||||||
}
|
|
||||||
|
|
||||||
$query_terms = explode(" ", preg_replace("/[^a-z0-9 ]+/", "", strtolower($request->query)));
|
|
||||||
|
|
||||||
// Merge duplicates and apply relevance scoring
|
// Merge duplicates and apply relevance scoring
|
||||||
foreach($engine_result['search'] as $result) {
|
foreach($engine_result['search'] as $result) {
|
||||||
if(array_key_exists('search', $results)) {
|
if(array_key_exists('search', $results)) {
|
||||||
|
@ -68,6 +65,7 @@ class Search extends EngineRequest {
|
||||||
$results['search'][$found_key]['combo_source'][] = $result['source'];
|
$results['search'][$found_key]['combo_source'][] = $result['source'];
|
||||||
} else {
|
} else {
|
||||||
// First find, rank and add to results
|
// 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['title'], $query_terms);
|
||||||
$match_rank += match_count($result['description'], $query_terms);
|
$match_rank += match_count($result['description'], $query_terms);
|
||||||
// $match_rank += match_count($result['url'], $query_terms);
|
// $match_rank += match_count($result['url'], $query_terms);
|
||||||
|
@ -111,7 +109,8 @@ class Search extends EngineRequest {
|
||||||
array_multisort($keys, SORT_DESC, $results['search']);
|
array_multisort($keys, SORT_DESC, $results['search']);
|
||||||
|
|
||||||
// Count results per source
|
// Count results per source
|
||||||
$results['sources'] = array_count_values(array_column($results['search'], 'source'));
|
$sources = array_count_values(array_column($results['search'], 'source'));
|
||||||
|
if(count($sources) > 0) $results['sources'] = $sources;
|
||||||
|
|
||||||
unset($keys);
|
unset($keys);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -78,7 +78,7 @@ class GoogleRequest extends EngineRequest {
|
||||||
$title = htmlspecialchars(trim($title->textContent));
|
$title = htmlspecialchars(trim($title->textContent));
|
||||||
$id = uniqid(rand(0, 9999));
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results['search'][] = array ("id" => $id, "source" => "Google", "title" => $title, "url" => $url, "description" => $description, "engine_rank" => $rank);
|
$results['search'][] = array("id" => $id, "source" => "Google", "title" => $title, "url" => $url, "description" => $description, "engine_rank" => $rank);
|
||||||
$rank -= 1;
|
$rank -= 1;
|
||||||
}
|
}
|
||||||
unset($response, $xpath, $scrape, $rank);
|
unset($response, $xpath, $scrape, $rank);
|
||||||
|
|
4
engines/search/index.php
Normal file
4
engines/search/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
4
engines/special/index.php
Normal file
4
engines/special/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
|
@ -111,8 +111,9 @@ class LeetxRequest extends EngineRequest {
|
||||||
foreach($xpath->query("//table/tbody/tr") as $result) {
|
foreach($xpath->query("//table/tbody/tr") as $result) {
|
||||||
$name = sanitize($xpath->evaluate(".//td[@class='coll-1 name']/a", $result)[1]->textContent);
|
$name = sanitize($xpath->evaluate(".//td[@class='coll-1 name']/a", $result)[1]->textContent);
|
||||||
$url = "https://1337x.to".sanitize($xpath->evaluate(".//td[@class='coll-1 name']/a/@href", $result)[1]->textContent);
|
$url = "https://1337x.to".sanitize($xpath->evaluate(".//td[@class='coll-1 name']/a/@href", $result)[1]->textContent);
|
||||||
$seeders = sanitize($xpath->evaluate(".//td[@class='coll-2 seeds']", $result)[0]->textContent);
|
$magnet = "./engines/torrent/magnetize_1337x.php?url=".$url;
|
||||||
$leechers = sanitize($xpath->evaluate(".//td[@class='coll-3 leeches']", $result)[0]->textContent);
|
$seeders = sanitize_numeric(sanitize($xpath->evaluate(".//td[@class='coll-2 seeds']", $result)[0]->textContent));
|
||||||
|
$leechers = sanitize_numeric(sanitize($xpath->evaluate(".//td[@class='coll-3 leeches']", $result)[0]->textContent));
|
||||||
$size_unformatted = explode(" ", sanitize($xpath->evaluate(".//td[contains(@class, 'coll-4 size')]", $result)[0]->textContent));
|
$size_unformatted = explode(" ", sanitize($xpath->evaluate(".//td[contains(@class, 'coll-4 size')]", $result)[0]->textContent));
|
||||||
$size = $size_unformatted[0] . " " . preg_replace("/[0-9]+/", "", $size_unformatted[1]);
|
$size = $size_unformatted[0] . " " . preg_replace("/[0-9]+/", "", $size_unformatted[1]);
|
||||||
|
|
||||||
|
@ -127,21 +128,23 @@ class LeetxRequest extends EngineRequest {
|
||||||
if(in_array($category, $this->opts->leetx_categories_blocked)) continue;
|
if(in_array($category, $this->opts->leetx_categories_blocked)) continue;
|
||||||
|
|
||||||
// Filter by Season (S01) or Season and Episode (S01E01)
|
// Filter by Season (S01) or Season and Episode (S01E01)
|
||||||
|
// Where [0][0] = Season and [0][1] = Episode
|
||||||
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
||||||
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results[] = array (
|
$results[] = array (
|
||||||
// Required
|
// Required
|
||||||
"source" => "1337x.to", "name" => $name, "magnet" => "./engines/torrent/magnetize_1337x.php?url=".$url, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
"id" => $id, "source" => "1337x.to", "name" => $name, "magnet" => $magnet, "hash" => null, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
||||||
// Extra
|
// Extra
|
||||||
"category" => $categories[$category], "url" => $url
|
"category" => $categories[$category], "url" => $url
|
||||||
);
|
);
|
||||||
|
|
||||||
unset($name, $seeders, $leechers, $size_unformatted, $size, $category, $url);
|
|
||||||
}
|
}
|
||||||
|
unset($response, $xpath);
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,11 +36,12 @@ class EZTVRequest extends EngineRequest {
|
||||||
if($json_response['torrents_count'] == 0) return $results;
|
if($json_response['torrents_count'] == 0) return $results;
|
||||||
|
|
||||||
// Use API result
|
// Use API result
|
||||||
foreach ($json_response['torrents'] as $episode) {
|
foreach($json_response['torrents'] as $episode) {
|
||||||
$name = sanitize($episode['title']);
|
$name = sanitize($episode['title']);
|
||||||
$magnet = sanitize($episode['magnet_url']);
|
$magnet = sanitize($episode['magnet_url']);
|
||||||
$seeders = sanitize($episode['seeds']);
|
$hash = sanitize($episode['hash']);
|
||||||
$leechers = sanitize($episode['peers']);
|
$seeders = sanitize_numeric(sanitize($episode['seeds']));
|
||||||
|
$leechers = sanitize_numeric(sanitize($episode['peers']));
|
||||||
$size = sanitize($episode['size_bytes']);
|
$size = sanitize($episode['size_bytes']);
|
||||||
|
|
||||||
// Ignore results with 0 seeders?
|
// Ignore results with 0 seeders?
|
||||||
|
@ -51,6 +52,7 @@ class EZTVRequest extends EngineRequest {
|
||||||
$date_added = sanitize($episode['date_released_unix']);
|
$date_added = sanitize($episode['date_released_unix']);
|
||||||
|
|
||||||
// Filter by Season (S01) or Season and Episode (S01E01)
|
// Filter by Season (S01) or Season and Episode (S01E01)
|
||||||
|
// Where [0][0] = Season and [0][1] = Episode
|
||||||
$season = sanitize($episode['season']);
|
$season = sanitize($episode['season']);
|
||||||
$episode = sanitize($episode['episode']);
|
$episode = sanitize($episode['episode']);
|
||||||
|
|
||||||
|
@ -60,15 +62,16 @@ class EZTVRequest extends EngineRequest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results[] = array (
|
$results[] = array (
|
||||||
// Required
|
// Required
|
||||||
"source" => "EZTV", "name" => $name, "magnet" => $magnet, "seeders" => $seeders, "leechers" => $leechers, "size" => human_filesize($size),
|
"id" => $id, "source" => "EZTV", "name" => $name, "magnet" => $magnet, "hash" => $hash, "seeders" => $seeders, "leechers" => $leechers, "size" => human_filesize($size),
|
||||||
// Extra
|
// Extra
|
||||||
"quality" => $quality, "date_added" => $date_added
|
"quality" => $quality, "date_added" => $date_added
|
||||||
);
|
);
|
||||||
|
|
||||||
unset($name, $magnet, $seeders, $leechers, $size, $quality, $category, $date_added, $season, $episode);
|
|
||||||
}
|
}
|
||||||
|
unset($json_response);
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
4
engines/torrent/index.php
Normal file
4
engines/torrent/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
|
@ -29,35 +29,38 @@ class LimeRequest extends EngineRequest {
|
||||||
$name = sanitize($xpath->evaluate(".//td[@class='tdleft']//a[2]", $result)[0]->textContent);
|
$name = sanitize($xpath->evaluate(".//td[@class='tdleft']//a[2]", $result)[0]->textContent);
|
||||||
$hash = sanitize($xpath->evaluate(".//td[@class='tdleft']//a[1]/@href", $result)[0]->textContent);
|
$hash = sanitize($xpath->evaluate(".//td[@class='tdleft']//a[1]/@href", $result)[0]->textContent);
|
||||||
$hash = explode("/", substr($hash, 0, strpos($hash, ".torrent?")));
|
$hash = explode("/", substr($hash, 0, strpos($hash, ".torrent?")));
|
||||||
$magnet = "magnet:?xt=urn:btih:".$hash[array_key_last($hash)]."&dn=".$name."&tr=".implode("&tr=", $this->opts->torrent_trackers);
|
$hash = $hash[array_key_last($hash)];
|
||||||
$seeders = sanitize($xpath->evaluate(".//td[@class='tdseed']", $result)[0]->textContent);
|
$magnet = "magnet:?xt=urn:btih:".$hash."&dn=".urlencode($name)."&tr=".implode("&tr=", $this->opts->torrent_trackers);
|
||||||
$leechers = sanitize($xpath->evaluate(".//td[@class='tdleech']", $result)[0]->textContent);
|
$seeders = sanitize_numeric(sanitize($xpath->evaluate(".//td[@class='tdseed']", $result)[0]->textContent));
|
||||||
|
$leechers = sanitize_numeric(sanitize($xpath->evaluate(".//td[@class='tdleech']", $result)[0]->textContent));
|
||||||
$size = sanitize($xpath->evaluate(".//td[@class='tdnormal'][2]", $result)[0]->textContent);
|
$size = sanitize($xpath->evaluate(".//td[@class='tdnormal'][2]", $result)[0]->textContent);
|
||||||
|
|
||||||
// Ignore results with 0 seeders?
|
// Ignore results with 0 seeders?
|
||||||
if($this->opts->show_zero_seeders == "off" AND $seeders == 0) continue;
|
if($this->opts->show_zero_seeders == "off" AND $seeders == 0) continue;
|
||||||
|
|
||||||
// Get extra data
|
// Get extra data
|
||||||
$category = explode(" ", sanitize($xpath->evaluate(".//td[@class='tdnormal'][1]", $result)[0]->textContent));
|
$category = explode(" ", trim(sanitize($xpath->evaluate(".//td[@class='tdnormal'][1]", $result)[0]->textContent), ".,"));
|
||||||
$category = $category[array_key_last($category)];
|
$category = $category[array_key_last($category)];
|
||||||
$url = "https://www.limetorrents.lol".sanitize($xpath->evaluate(".//td[@class='tdleft']//a[2]/@href", $result)[0]->textContent);
|
$url = "https://www.limetorrents.lol".sanitize($xpath->evaluate(".//td[@class='tdleft']//a[2]/@href", $result)[0]->textContent);
|
||||||
|
|
||||||
// Filter by Season (S01) or Season and Episode (S01E01)
|
// Filter by Season (S01) or Season and Episode (S01E01)
|
||||||
|
// Where [0][0] = Season and [0][1] = Episode
|
||||||
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
||||||
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results[] = array (
|
$results[] = array (
|
||||||
// Required
|
// Required
|
||||||
"source" => "limetorrents.lol", "name" => $name, "magnet" => $magnet, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
"id" => $id, "source" => "limetorrents.lol", "name" => $name, "magnet" => $magnet, "hash" => $hash, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
||||||
// Extra
|
// Extra
|
||||||
"category" => $category, "url" => $url
|
"category" => $category, "url" => $url
|
||||||
);
|
);
|
||||||
|
|
||||||
unset($name, $seeders, $leechers, $size, $hash, $magnet, $category, $url);
|
|
||||||
}
|
}
|
||||||
|
unset($response, $xpath);
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,10 +32,13 @@ class NyaaRequest extends EngineRequest {
|
||||||
|
|
||||||
$name = sanitize($xpath->evaluate(".//td[@colspan='2']//a[not(contains(@class, 'comments'))]/@title", $result)[0]->textContent);
|
$name = sanitize($xpath->evaluate(".//td[@colspan='2']//a[not(contains(@class, 'comments'))]/@title", $result)[0]->textContent);
|
||||||
$magnet = sanitize($xpath->evaluate(".//a[2]/@href", $meta[0])[0]->textContent);
|
$magnet = sanitize($xpath->evaluate(".//a[2]/@href", $meta[0])[0]->textContent);
|
||||||
$seeders = sanitize($meta[3]->textContent);
|
$hash = parse_url($magnet, PHP_URL_QUERY);
|
||||||
$leechers = sanitize($meta[4]->textContent);
|
parse_str($hash, $hash_parameters);
|
||||||
$size = sanitize($meta[1]->textContent);
|
$hash = str_replace("urn:btih:", "", $hash_parameters['xt']);
|
||||||
|
$seeders = sanitize_numeric(sanitize($meta[3]->textContent));
|
||||||
|
$leechers = sanitize_numeric(sanitize($meta[4]->textContent));
|
||||||
|
$size = str_replace("GiB", "GB", str_replace("MiB", "MB", sanitize($meta[1]->textContent)));
|
||||||
|
|
||||||
// Ignore results with 0 seeders?
|
// Ignore results with 0 seeders?
|
||||||
if($this->opts->show_zero_seeders == "off" AND $seeders == 0) continue;
|
if($this->opts->show_zero_seeders == "off" AND $seeders == 0) continue;
|
||||||
|
|
||||||
|
@ -48,21 +51,23 @@ class NyaaRequest extends EngineRequest {
|
||||||
$date_added = mktime(0, 0, 0, intval($date_added[1]), intval($date_added[2]), intval($date_added[0]));
|
$date_added = mktime(0, 0, 0, intval($date_added[1]), intval($date_added[2]), intval($date_added[0]));
|
||||||
|
|
||||||
// Filter by Season (S01) or Season and Episode (S01E01)
|
// Filter by Season (S01) or Season and Episode (S01E01)
|
||||||
|
// Where [0][0] = Season and [0][1] = Episode
|
||||||
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
||||||
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results[] = array (
|
$results[] = array (
|
||||||
// Required
|
// Required
|
||||||
"source" => "nyaa.si", "name" => $name, "magnet" => $magnet, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
"id" => $id, "source" => "nyaa.si", "name" => $name, "magnet" => $magnet, "hash" => $hash, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
||||||
// Extra
|
// Extra
|
||||||
"category" => $category, "url" => $url, "date_added" => $date_added
|
"category" => $category, "url" => $url, "date_added" => $date_added
|
||||||
);
|
);
|
||||||
|
|
||||||
unset($name, $magnet, $seeders, $leechers, $size, $category, $url, $date_added, $meta);
|
|
||||||
}
|
}
|
||||||
|
unset($response, $xpath);
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,10 +93,12 @@ class PirateBayRequest extends EngineRequest {
|
||||||
// Nothing found
|
// Nothing found
|
||||||
if($response['name'] == "No results returned") break;
|
if($response['name'] == "No results returned") break;
|
||||||
|
|
||||||
|
|
||||||
$name = sanitize($response['name']);
|
$name = sanitize($response['name']);
|
||||||
$magnet = "magnet:?xt=urn:btih:".sanitize($response['info_hash'])."&dn=".$name."&tr=".implode("&tr=", $this->opts->torrent_trackers);
|
$hash = sanitize($response['info_hash']);
|
||||||
$seeders = sanitize($response['seeders']);
|
$magnet = "magnet:?xt=urn:btih:".$hash."&dn=".urlencode($name)."&tr=".implode("&tr=", $this->opts->torrent_trackers);
|
||||||
$leechers = sanitize($response['leechers']);
|
$seeders = sanitize_numeric(sanitize($response['seeders']));
|
||||||
|
$leechers = sanitize_numeric(sanitize($response['leechers']));
|
||||||
$size = sanitize($response['size']);
|
$size = sanitize($response['size']);
|
||||||
|
|
||||||
// Ignore results with 0 seeders?
|
// Ignore results with 0 seeders?
|
||||||
|
@ -111,21 +113,23 @@ class PirateBayRequest extends EngineRequest {
|
||||||
if(in_array($category, $this->opts->piratebay_categories_blocked)) continue;
|
if(in_array($category, $this->opts->piratebay_categories_blocked)) continue;
|
||||||
|
|
||||||
// Filter by Season (S01) or Season and Episode (S01E01)
|
// Filter by Season (S01) or Season and Episode (S01E01)
|
||||||
|
// Where [0][0] = Season and [0][1] = Episode
|
||||||
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
if(preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $this->query, $query_episode) && preg_match_all("/(S[0-9]{1,3})|(E[0-9]{1,3})/i", $name, $match_episode)) {
|
||||||
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
if($query_episode[0][0] != $match_episode[0][0] || (array_key_exists(1, $query_episode[0]) && array_key_exists(1, $match_episode[0]) && $query_episode[0][1] != $match_episode[0][1])) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results[] = array(
|
$results[] = array(
|
||||||
// Required
|
// Required
|
||||||
"source" => "thepiratebay.org", "name" => $name, "magnet" => $magnet, "seeders" => $seeders, "leechers" => $leechers, "size" => human_filesize($size),
|
"id" => $id, "source" => "thepiratebay.org", "name" => $name, "magnet" => $magnet, "hash" => $hash, "seeders" => $seeders, "leechers" => $leechers, "size" => human_filesize($size),
|
||||||
// Extra
|
// Extra
|
||||||
"category" => $categories[$category], "url" => $url, "date_added" => $date_added,
|
"category" => $categories[$category], "url" => $url, "date_added" => $date_added,
|
||||||
);
|
);
|
||||||
|
|
||||||
unset($name, $magnet, $seeders, $leechers, $size, $category, $url, $date_added);
|
|
||||||
}
|
}
|
||||||
|
unset($json_response);
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,9 +51,10 @@ class YTSRequest extends EngineRequest {
|
||||||
$date_added = sanitize($movie['date_uploaded_unix']);
|
$date_added = sanitize($movie['date_uploaded_unix']);
|
||||||
|
|
||||||
foreach ($movie['torrents'] as $torrent) {
|
foreach ($movie['torrents'] as $torrent) {
|
||||||
$magnet = "magnet:?xt=urn:btih:".sanitize($torrent['hash'])."&dn=".urlencode($name)."&tr=".implode("&tr=", $this->opts->torrent_trackers);
|
$hash = sanitize($torrent['hash']);
|
||||||
$seeders = sanitize($torrent['seeds']);
|
$magnet = "magnet:?xt=urn:btih:".$hash."&dn=".urlencode($name)."&tr=".implode("&tr=", $this->opts->torrent_trackers);
|
||||||
$leechers = sanitize($torrent['peers']);
|
$seeders = sanitize_numeric(sanitize($torrent['seeds']));
|
||||||
|
$leechers = sanitize_numeric(sanitize($torrent['peers']));
|
||||||
$size = sanitize($torrent['size']);
|
$size = sanitize($torrent['size']);
|
||||||
|
|
||||||
// Ignore results with 0 seeders?
|
// Ignore results with 0 seeders?
|
||||||
|
@ -61,17 +62,17 @@ class YTSRequest extends EngineRequest {
|
||||||
|
|
||||||
// Get extra data
|
// Get extra data
|
||||||
$quality = sanitize($torrent['quality']);
|
$quality = sanitize($torrent['quality']);
|
||||||
|
$id = uniqid(rand(0, 9999));
|
||||||
|
|
||||||
$results[] = array (
|
$results[] = array (
|
||||||
// Required
|
// Required
|
||||||
"source" => "yts.mx", "name" => $name, "magnet" => $magnet, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
"id" => $id, "source" => "yts.mx", "name" => $name, "magnet" => $magnet, "hash" => $hash, "seeders" => $seeders, "leechers" => $leechers, "size" => $size,
|
||||||
// Extra
|
// Extra
|
||||||
"quality" => $quality, "year" => $year, "category" => $category, "runtime" => $runtime, "url" => $url, "date_added" => $date_added
|
"quality" => $quality, "year" => $year, "category" => $category, "runtime" => $runtime, "url" => $url, "date_added" => $date_added
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
unset($name, $magnet, $seeders, $leechers, $size, $quality, $year, $category, $runtime, $url, $date_added);
|
|
||||||
}
|
}
|
||||||
|
unset($json_response);
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
4
functions/index.php
Normal file
4
functions/index.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?php
|
||||||
|
header("Location: /");
|
||||||
|
die();
|
||||||
|
?>
|
|
@ -23,7 +23,7 @@ abstract class EngineRequest {
|
||||||
if(!$this->url) return;
|
if(!$this->url) return;
|
||||||
|
|
||||||
// Skip if there is a cached result (from earlier search)
|
// Skip if there is a cached result (from earlier search)
|
||||||
if($this->opts->cache == "on" && has_cached_results($this->url, $this->opts->hash)) return;
|
if($this->opts->cache == "on" && has_cached_results($this->opts->cache_type, $this->opts->hash, $this->url, (intval($this->opts->cache_time) * 60))) return;
|
||||||
|
|
||||||
// Curl
|
// Curl
|
||||||
$this->ch = curl_init();
|
$this->ch = curl_init();
|
||||||
|
@ -43,7 +43,7 @@ abstract class EngineRequest {
|
||||||
// Check if a request to a search engine was successful
|
// Check if a request to a search engine was successful
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
public function request_successful() {
|
public function request_successful() {
|
||||||
if((isset($this->ch) && curl_getinfo($this->ch)['http_code'] == '200') || has_cached_results($this->url, $this->opts->hash)) {
|
if((isset($this->ch) && curl_getinfo($this->ch)['http_code'] == '200') || has_cached_results($this->opts->cache_type, $this->opts->hash, $this->url, (intval($this->opts->cache_time) * 60))) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,21 +56,31 @@ abstract class EngineRequest {
|
||||||
// Load search results
|
// Load search results
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
public function get_results() {
|
public function get_results() {
|
||||||
|
if(!isset($this->url)) {
|
||||||
// It's a torrent search?
|
return $this->parse_results(null);
|
||||||
if(!isset($this->url)) return $this->parse_results(null);
|
}
|
||||||
|
|
||||||
|
$ttl = intval($this->opts->cache_time) * 60;
|
||||||
|
|
||||||
// If there is a cached result from an earlier search use that instead
|
// If there is a cached result from an earlier search use that instead
|
||||||
if($this->opts->cache == "on" && has_cached_results($this->url, $this->opts->hash)) return fetch_cached_results($this->url, $this->opts->hash);
|
if($this->opts->cache == "on" && has_cached_results($this->opts->cache_type, $this->opts->hash, $this->url, $ttl)) {
|
||||||
|
return fetch_cached_results($this->opts->cache_type, $this->opts->hash, $this->url);
|
||||||
|
}
|
||||||
|
|
||||||
// Curl request
|
// Curl request
|
||||||
if(!isset($this->ch)) return $this->parse_results(null);
|
if(!isset($this->ch)) {
|
||||||
|
return $this->parse_results(null);
|
||||||
|
}
|
||||||
|
|
||||||
$response = ($this->mh) ? curl_multi_getcontent($this->ch) : curl_exec($this->ch);
|
$response = ($this->mh) ? curl_multi_getcontent($this->ch) : curl_exec($this->ch);
|
||||||
|
|
||||||
$results = $this->parse_results($response) ?? array();
|
$results = $this->parse_results($response) ?? array();
|
||||||
|
|
||||||
// Cache last request
|
// Cache last request
|
||||||
if($this->opts->cache == "on" && !empty($results)) store_cached_results($this->url, $this->opts->hash, $results, (intval($this->opts->cache_time) * 60));
|
if($this->opts->cache == "on") {
|
||||||
|
if(!empty($results)) store_cached_results($this->opts->cache_type, $this->opts->hash, $this->url, $results, $ttl);
|
||||||
|
if($this->opts->cache_type == "file") delete_cached_results($ttl);
|
||||||
|
}
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
@ -90,9 +100,11 @@ function load_opts() {
|
||||||
$opts->user_auth = (isset($_REQUEST['a'])) ? sanitize($_REQUEST['a']) : "";
|
$opts->user_auth = (isset($_REQUEST['a'])) ? sanitize($_REQUEST['a']) : "";
|
||||||
|
|
||||||
// Force a few defaults and safeguards
|
// Force a few defaults and safeguards
|
||||||
|
if($opts->cache_type == "file" && !is_dir(dirname(__DIR__).'/cache/')) $opts->cache = "off";
|
||||||
|
if($opts->cache_type == "apcu" && !function_exists("apcu_exists")) $opts->cache = "off";
|
||||||
if($opts->enable_image_search == "off" && $opts->type == 1) $opts->type = 0;
|
if($opts->enable_image_search == "off" && $opts->type == 1) $opts->type = 0;
|
||||||
if($opts->enable_torrent_search == "off" && $opts->type == 9) $opts->type = 0;
|
if($opts->enable_torrent_search == "off" && $opts->type == 9) $opts->type = 0;
|
||||||
if(!is_numeric($opts->cache_time) || ($opts->cache_time > 30 || $opts->cache_time < 1)) $opts->cache_time = 30;
|
if(!is_numeric($opts->cache_time) || ($opts->cache_time > 720 || $opts->cache_time < 1)) $opts->cache_time = 30;
|
||||||
if(!is_numeric($opts->social_media_relevance) || ($opts->social_media_relevance > 10 || $opts->social_media_relevance < 0)) $opts->social_media_relevance = 8;
|
if(!is_numeric($opts->social_media_relevance) || ($opts->social_media_relevance > 10 || $opts->social_media_relevance < 0)) $opts->social_media_relevance = 8;
|
||||||
|
|
||||||
// Remove ! at the start of queries to prevent DDG Bangs (!g, !c and crap like that)
|
// Remove ! at the start of queries to prevent DDG Bangs (!g, !c and crap like that)
|
||||||
|
|
|
@ -53,14 +53,13 @@ function set_curl_options($curl, $url, $user_agents) {
|
||||||
// Load pages into a DOM
|
// Load pages into a DOM
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
function get_xpath($response) {
|
function get_xpath($response) {
|
||||||
if(!$response)
|
if(!$response) return null;
|
||||||
return null;
|
|
||||||
|
$htmlDom = new DOMDocument;
|
||||||
$htmlDom = new DOMDocument;
|
@$htmlDom->loadHTML($response);
|
||||||
@$htmlDom->loadHTML($response);
|
$xpath = new DOMXPath($htmlDom);
|
||||||
$xpath = new DOMXPath($htmlDom);
|
|
||||||
|
return $xpath;
|
||||||
return $xpath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------
|
/*--------------------------------------
|
||||||
|
@ -68,38 +67,73 @@ function get_xpath($response) {
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
function get_formatted_url($url) {
|
function get_formatted_url($url) {
|
||||||
$url = parse_url($url);
|
$url = parse_url($url);
|
||||||
|
|
||||||
$formatted_url = $url['scheme'] . "://" . $url['host'];
|
$formatted_url = $url['scheme'] . "://" . $url['host'];
|
||||||
$formatted_url .= str_replace('/', ' › ', urldecode(str_replace('%20', ' ', rtrim($url['path'], '/'))));
|
$formatted_url .= str_replace('/', ' › ', urldecode(str_replace('%20', ' ', rtrim($url['path'], '/'))));
|
||||||
|
|
||||||
return $formatted_url;
|
return $formatted_url;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------
|
/*--------------------------------------
|
||||||
// APCu Caching
|
// Result Caching
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
function has_cached_results($url, $hash) {
|
function has_cached_results($cache_type, $hash, $url, $ttl) {
|
||||||
if(function_exists("apcu_exists")) {
|
if($cache_type == "apcu") {
|
||||||
return apcu_exists("$hash:$url");
|
return apcu_exists("$hash:$url");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($cache_type == "file") {
|
||||||
|
$cache_file = dirname(__DIR__).'/cache/'.md5("$hash:$url").'.data';
|
||||||
|
if(is_file($cache_file)) {
|
||||||
|
if(filemtime($cache_file) >= (time() - $ttl)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function store_cached_results($url, $hash, $results, $ttl = 0) {
|
function store_cached_results($cache_type, $hash, $url, $results, $ttl) {
|
||||||
if(function_exists("apcu_store") && !empty($results)) {
|
if($cache_type == "apcu" && !empty($results)) {
|
||||||
return apcu_store("$hash:$url", $results, $ttl);
|
apcu_store("$hash:$url", $results, $ttl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($cache_type == "file") {
|
||||||
|
$cache_file = dirname(__DIR__).'/cache/'.md5("$hash:$url").'.data';
|
||||||
|
file_put_contents($cache_file, serialize($results));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetch_cached_results($url, $hash) {
|
function fetch_cached_results($cache_type, $hash, $url) {
|
||||||
if(function_exists("apcu_fetch")) {
|
if($cache_type == "apcu") {
|
||||||
return apcu_fetch("$hash:$url");
|
return apcu_fetch("$hash:$url");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($cache_type == "file") {
|
||||||
|
$cache_file = dirname(__DIR__).'/cache/'.md5("$hash:$url").'.data';
|
||||||
|
if(is_file($cache_file)) {
|
||||||
|
return unserialize(file_get_contents($cache_file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function delete_cached_results($ttl) {
|
||||||
|
$folder = opendir(dirname(__DIR__).'/cache/');
|
||||||
|
while($file_name = readdir($folder)) {
|
||||||
|
$extension = pathinfo($file_name, PATHINFO_EXTENSION);
|
||||||
|
if($file_name == "." OR $file_name == ".." OR $extension != "data") continue;
|
||||||
|
|
||||||
|
if(is_file($folder.$file_name)) {
|
||||||
|
if(filemtime($folder.$file_name) < (time() - $ttl)) {
|
||||||
|
unlink($folder.$file_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------------
|
/*--------------------------------------
|
||||||
// Sanitize variables
|
// Sanitize variables
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
|
@ -119,6 +153,13 @@ function sanitize($variable) {
|
||||||
return $variable;
|
return $variable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sanitize_numeric($variable) {
|
||||||
|
$variable = preg_replace('/[^0-9]/', '', $variable);
|
||||||
|
if(strlen($variable) == 0) $variable = 0;
|
||||||
|
|
||||||
|
return $variable;
|
||||||
|
}
|
||||||
|
|
||||||
/*--------------------------------------
|
/*--------------------------------------
|
||||||
// Search result match counter
|
// Search result match counter
|
||||||
--------------------------------------*/
|
--------------------------------------*/
|
||||||
|
@ -200,7 +241,7 @@ function search_sources($results) {
|
||||||
|
|
||||||
$sources = replace_last_comma(implode(', ', $sources));
|
$sources = replace_last_comma(implode(', ', $sources));
|
||||||
|
|
||||||
echo "<li class=\"sources\">".$sources.".</li>";
|
echo "<li class=\"sources\">Includes ".$sources.".</li>";
|
||||||
|
|
||||||
unset($sources);
|
unset($sources);
|
||||||
}
|
}
|
||||||
|
@ -280,21 +321,22 @@ function string_generator() {
|
||||||
function show_version($opts) {
|
function show_version($opts) {
|
||||||
$cache_file = dirname(__DIR__).'/version.data';
|
$cache_file = dirname(__DIR__).'/version.data';
|
||||||
|
|
||||||
|
// Currently installed version
|
||||||
|
$current_version = "1.2.1";
|
||||||
|
|
||||||
if(!is_file($cache_file)){
|
if(!is_file($cache_file)){
|
||||||
// Create update cache file
|
// Create update cache file
|
||||||
$version = array('version' => "1.2", 'latest' => "0.0", "checked" => 0, "url" => "");
|
$version = array('latest' => "0.0", "checked" => 0, "url" => "");
|
||||||
file_put_contents($cache_file, serialize($version));
|
file_put_contents($cache_file, serialize($version));
|
||||||
} else {
|
} else {
|
||||||
// Get update information
|
// Get update information
|
||||||
$version = unserialize(file_get_contents($cache_file));
|
$version = unserialize(file_get_contents($cache_file));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Current version
|
// Update check, every week
|
||||||
$show_version = "<a href=\"https://github.com/adegans/Goosle/\" target=\"_blank\">Goosle ".$version['version']."</a>.";
|
|
||||||
|
|
||||||
if($version['checked'] < time() - 604800) {
|
if($version['checked'] < time() - 604800) {
|
||||||
$ch = curl_init();
|
$ch = curl_init();
|
||||||
set_curl_options($ch, "https://api.github.com/repos/adegans/goosle/releases/latest", $opts->user_agents);
|
set_curl_options($ch, "https://api.github.com/repos/adegans/goosle/releases/latest", array("goosle/".$current_version.";"));
|
||||||
$response = curl_exec($ch);
|
$response = curl_exec($ch);
|
||||||
curl_close($ch);
|
curl_close($ch);
|
||||||
|
|
||||||
|
@ -304,12 +346,15 @@ function show_version($opts) {
|
||||||
if(empty($json_response)) return $show_version;
|
if(empty($json_response)) return $show_version;
|
||||||
|
|
||||||
// Update version info
|
// Update version info
|
||||||
$version = array('version' => $version['version'], 'latest' => $json_response['tag_name'], "checked" => time(), "url" => $json_response['html_url']);
|
$version = array('latest' => $json_response['tag_name'], "checked" => time(), "url" => $json_response['html_url']);
|
||||||
file_put_contents($cache_file, serialize($version));
|
file_put_contents($cache_file, serialize($version));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Format version for footer
|
||||||
|
$show_version = "<a href=\"https://github.com/adegans/Goosle/\" target=\"_blank\">Goosle ".$current_version."</a>.";
|
||||||
|
|
||||||
// Check if a newer version is available and add it to the version display
|
// Check if a newer version is available and add it to the version display
|
||||||
if(version_compare($version['version'], $version['latest'], "<")) {
|
if(version_compare($current_version, $version['latest'], "<")) {
|
||||||
$show_version .= " <a href=\"".$version['url']."\" target=\"_blank\" class=\"update\">Version ".$version['latest']." is available!</a>";
|
$show_version .= " <a href=\"".$version['url']."\" target=\"_blank\" class=\"update\">Version ".$version['latest']." is available!</a>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
26
readme.md
26
readme.md
|
@ -14,7 +14,7 @@ Host for yourself and friends, with a access hash key. Or set up a public search
|
||||||
|
|
||||||
After-all, finding things should be easy and not turn into a chore.
|
After-all, finding things should be easy and not turn into a chore.
|
||||||
|
|
||||||
[![Goosle Mainpage](https://ajdg.solutions/assets/goosle/goosle-main.jpg)](https://ajdg.solutions/assets/goosle/goosle-main.jpg)
|
[![Goosle Mainpage](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-mainpage-960x593.png)](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-mainpage.png)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- Works on **any** hosting package that does PHP7.4 or newer
|
- Works on **any** hosting package that does PHP7.4 or newer
|
||||||
|
@ -44,9 +44,9 @@ And yet it just works... fast!
|
||||||
If you like Goosle, or found a use for it, please support my work and [donate](https://www.arnan.me/donate.html?mtm_campaign=goosle_readme) and tell everyone about its existence.
|
If you like Goosle, or found a use for it, please support my work and [donate](https://www.arnan.me/donate.html?mtm_campaign=goosle_readme) and tell everyone about its existence.
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
[![Goosle Search results](https://ajdg.solutions/assets/goosle/goosle-search-150x150.jpg)](https://ajdg.solutions/assets/goosle/goosle-search.jpg)
|
[![Goosle Mainpage](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-mainpage-150x150.png)](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-mainpage.png)
|
||||||
[![Goosle Image results](https://ajdg.solutions/assets/goosle/goosle-images-150x150.jpg)](https://ajdg.solutions/assets/goosle/goosle-images.jpg)
|
[![Goosle Search results](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-search-150x150.png)](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-search.png)
|
||||||
[![Goosle Torrent results](https://ajdg.solutions/assets/goosle/goosle-torrents-150x150.jpg)](https://ajdg.solutions/assets/goosle/goosle-torrents.jpg)
|
[![Goosle Torrent results](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-torrentsearch-150x150.png)](https://ajdg.solutions/wp-content/uploads/2023/12/goosle-torrentsearch.png)
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
Any basic webserver/webhosting package with PHP7.4 or newer. \
|
Any basic webserver/webhosting package with PHP7.4 or newer. \
|
||||||
|
@ -56,16 +56,16 @@ Tested to work on Apache with PHP8.0.24-8.2.x.
|
||||||
## Installation
|
## Installation
|
||||||
1. Unzip the download.
|
1. Unzip the download.
|
||||||
2. In the main directory. Copy config.default.php to config.php.
|
2. In the main directory. Copy config.default.php to config.php.
|
||||||
3. Edit the config.php file and set your preferences.
|
3. Edit config.php file and set your preferences.
|
||||||
4. Upload all files to your webserver, for example to the root folder of a domain (eg. example.com), subdomain (eg. search.example.com) or a sub-folder on your main domain (eg. example.com/search/)
|
4. Upload all files to your webserver, for example to the root folder of a subdomain (eg. search.example.com) or a sub-folder on your main site (eg. example.com/search/)
|
||||||
5. Rename goosle.htaccess to .htaccess
|
5. Rename goosle.htaccess to .htaccess
|
||||||
6. Load the site in your browser. If you've enabled the access hash add *?a=YOURHASH* to the url.
|
6. Load the site in your browser. If you've enabled the access hash add ?a=YOURHASH to the url.
|
||||||
7. Let me know where you installed Goosle :-)
|
7. Let me know where you installed Goosle :-)
|
||||||
|
|
||||||
## Updates
|
## Updates
|
||||||
1. Unzip the download.
|
1. Unzip the download.
|
||||||
2. Check your config.php file and go over your preferences. Make sure any new settings are present in your config.php. (Or reconfigure Goosle with a new copy from config.default.php)
|
2. Check your config.php file and go over your preferences. Make sure any new settings or changed values are present in your config.php. (Or reconfigure Goosle with a new copy from config.default.php)
|
||||||
3. Upload all files to your webserver, overwriting the current Goosle files.
|
3. Upload all files to your webserver, overwriting all files except perhaps config.php.
|
||||||
4. Load the site in your browser. If you've enabled the access hash don't forget to add *?a=YOURHASH* to the url.
|
4. Load the site in your browser. If you've enabled the access hash don't forget to add *?a=YOURHASH* to the url.
|
||||||
5. Enjoy your updated search experience!
|
5. Enjoy your updated search experience!
|
||||||
|
|
||||||
|
@ -82,6 +82,14 @@ You can post your questions on Github Discussions or on my support forum on [ajd
|
||||||
Or say hi on [Mastodon](https://mas.to/@arnan) or [Telegram](https://t.me/arnandegans).
|
Or say hi on [Mastodon](https://mas.to/@arnan) or [Telegram](https://t.me/arnandegans).
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
1.2.1 - January 15, 2024
|
||||||
|
- [new] Merge identical downloads (determined by info hash) from different torrent sites that provide hashes
|
||||||
|
- [new] Option to cache to flat files instead of APCu, files stored in /cache/ folder
|
||||||
|
- [new] Blank index.php files in all subfolders to shield from prying eyes
|
||||||
|
- [tweak] Improved version check
|
||||||
|
- [fix] Stray periods in some Limetorrent categories
|
||||||
|
- [fix] Inconsistent size indication for torrent results
|
||||||
|
|
||||||
1.2 - January 2, 2024
|
1.2 - January 2, 2024
|
||||||
- [new] Preferred language setting for DuckDuckGo results in config.php.
|
- [new] Preferred language setting for DuckDuckGo results in config.php.
|
||||||
- [new] Preferred language setting for Wikipedia results in config.php.
|
- [new] Preferred language setting for Wikipedia results in config.php.
|
||||||
|
|
Loading…
Reference in a new issue