aboutsummaryrefslogtreecommitdiff
path: root/bridges/ThePirateBayBridge.php
diff options
context:
space:
mode:
Diffstat (limited to 'bridges/ThePirateBayBridge.php')
-rw-r--r--bridges/ThePirateBayBridge.php554
1 files changed, 285 insertions, 269 deletions
diff --git a/bridges/ThePirateBayBridge.php b/bridges/ThePirateBayBridge.php
index 68c39d5e..13095062 100644
--- a/bridges/ThePirateBayBridge.php
+++ b/bridges/ThePirateBayBridge.php
@@ -3,309 +3,325 @@
/**
* Much of the logic here is copied from https://thepiratebay.org/static/main.js
*/
-class ThePirateBayBridge extends BridgeAbstract {
-
- const MAINTAINER = 'dvikan';
- const NAME = 'The Pirate Bay';
- const URI = 'https://thepiratebay.org';
- const DESCRIPTION = 'Returns results for the keywords. You can put several
+class ThePirateBayBridge extends BridgeAbstract
+{
+ const MAINTAINER = 'dvikan';
+ const NAME = 'The Pirate Bay';
+ const URI = 'https://thepiratebay.org';
+ const DESCRIPTION = 'Returns results for the keywords. You can put several
list of keywords by separating them with a semicolon (e.g. "one show;another
show"). Category based search needs the category number as input. User based
search takes the Uploader name. Search can be done in a specified category';
- const PARAMETERS = array( array(
- 'q' => array(
- 'name' => 'keywords/username/category, separated by semicolons',
- 'exampleValue' => 'simpsons',
- 'required' => true
- ),
- 'crit' => array(
- 'type' => 'list',
- 'name' => 'Search type',
- 'values' => array(
- 'search' => 'search',
- 'category' => 'cat',
- 'user' => 'usr',
- )
- ),
- 'catCheck' => array(
- 'type' => 'checkbox',
- 'name' => 'Specify category for keyword search ?',
- ),
- 'cat' => array(
- 'name' => 'Category number',
- 'exampleValue' => '100, 200… See TPB for category number'
- ),
- 'trusted' => array(
- 'type' => 'checkbox',
- 'name' => 'Only get results from Trusted or VIP users ?',
- ),
- ));
+ const PARAMETERS = [ [
+ 'q' => [
+ 'name' => 'keywords/username/category, separated by semicolons',
+ 'exampleValue' => 'simpsons',
+ 'required' => true
+ ],
+ 'crit' => [
+ 'type' => 'list',
+ 'name' => 'Search type',
+ 'values' => [
+ 'search' => 'search',
+ 'category' => 'cat',
+ 'user' => 'usr',
+ ]
+ ],
+ 'catCheck' => [
+ 'type' => 'checkbox',
+ 'name' => 'Specify category for keyword search ?',
+ ],
+ 'cat' => [
+ 'name' => 'Category number',
+ 'exampleValue' => '100, 200… See TPB for category number'
+ ],
+ 'trusted' => [
+ 'type' => 'checkbox',
+ 'name' => 'Only get results from Trusted or VIP users ?',
+ ],
+ ]];
- const STATIC_SERVER = 'https://torrindex.net';
+ const STATIC_SERVER = 'https://torrindex.net';
- const CATEGORIES = array(
- '1' => 'Audio',
- '2' => 'Video',
- '3' => 'Applications',
- '4' => 'Games',
- '5' => 'Porn',
- '6' => 'Other',
- '101' => 'Music',
- '102' => 'Audio Books',
- '103' => 'Sound clips',
- '104' => 'FLAC',
- '199' => 'Other',
- '201' => 'Movies',
- '202' => 'Movies DVDR',
- '203' => 'Music videos',
- '204' => 'Movie Clips',
- '205' => 'TV-Shows',
- '206' => 'Handheld',
- '207' => 'HD Movies',
- '208' => 'HD TV-Shows',
- '209' => '3D',
- '299' => 'Other',
- '301' => 'Windows',
- '302' => 'Mac/Apple',
- '303' => 'UNIX',
- '304' => 'Handheld',
- '305' => 'IOS(iPad/iPhone)',
- '306' => 'Android',
- '399' => 'Other OS',
- '401' => 'PC',
- '402' => 'Mac/Apple',
- '403' => 'PSx',
- '404' => 'XBOX360',
- '405' => 'Wii',
- '406' => 'Handheld',
- '407' => 'IOS(iPad/iPhone)',
- '408' => 'Android',
- '499' => 'Other OS',
- '501' => 'Movies',
- '502' => 'Movies DVDR',
- '503' => 'Pictures',
- '504' => 'Games',
- '505' => 'HD-Movies',
- '506' => 'Movie Clips',
- '599' => 'Other',
- '601' => 'E-books',
- '602' => 'Comics',
- '603' => 'Pictures',
- '604' => 'Covers',
- '605' => 'Physibles',
- '699' => 'Other',
- );
+ const CATEGORIES = [
+ '1' => 'Audio',
+ '2' => 'Video',
+ '3' => 'Applications',
+ '4' => 'Games',
+ '5' => 'Porn',
+ '6' => 'Other',
+ '101' => 'Music',
+ '102' => 'Audio Books',
+ '103' => 'Sound clips',
+ '104' => 'FLAC',
+ '199' => 'Other',
+ '201' => 'Movies',
+ '202' => 'Movies DVDR',
+ '203' => 'Music videos',
+ '204' => 'Movie Clips',
+ '205' => 'TV-Shows',
+ '206' => 'Handheld',
+ '207' => 'HD Movies',
+ '208' => 'HD TV-Shows',
+ '209' => '3D',
+ '299' => 'Other',
+ '301' => 'Windows',
+ '302' => 'Mac/Apple',
+ '303' => 'UNIX',
+ '304' => 'Handheld',
+ '305' => 'IOS(iPad/iPhone)',
+ '306' => 'Android',
+ '399' => 'Other OS',
+ '401' => 'PC',
+ '402' => 'Mac/Apple',
+ '403' => 'PSx',
+ '404' => 'XBOX360',
+ '405' => 'Wii',
+ '406' => 'Handheld',
+ '407' => 'IOS(iPad/iPhone)',
+ '408' => 'Android',
+ '499' => 'Other OS',
+ '501' => 'Movies',
+ '502' => 'Movies DVDR',
+ '503' => 'Pictures',
+ '504' => 'Games',
+ '505' => 'HD-Movies',
+ '506' => 'Movie Clips',
+ '599' => 'Other',
+ '601' => 'E-books',
+ '602' => 'Comics',
+ '603' => 'Pictures',
+ '604' => 'Covers',
+ '605' => 'Physibles',
+ '699' => 'Other',
+ ];
- public function collectData() {
- $keywords = explode(';', $this->getInput('q'));
+ public function collectData()
+ {
+ $keywords = explode(';', $this->getInput('q'));
- foreach($keywords as $keyword) {
- $this->processKeyword($keyword);
- }
- }
+ foreach ($keywords as $keyword) {
+ $this->processKeyword($keyword);
+ }
+ }
- private function processKeyword($keyword)
- {
- $keyword = trim($keyword);
- switch ($this->getInput('crit')) {
- case 'search':
- $catCheck = $this->getInput('catCheck');
- if ($catCheck) {
- $categories = $this->getInput('cat');
- $query = sprintf(
- '/q.php?q=%s&cat=%s',
- rawurlencode($keyword),
- rawurlencode($categories)
- );
- } else {
- $query = sprintf('/q.php?q=%s', rawurlencode($keyword));
- }
- break;
- case 'cat':
- $query = sprintf('/q.php?q=category:%s', rawurlencode($keyword));
- break;
- case 'usr':
- $query = sprintf('/q.php?q=user:%s', rawurlencode($keyword));
- break;
- default:
- returnClientError('Impossible');
- }
- $api = 'https://apibay.org';
- $json = getContents($api . $query);
- $result = json_decode($json);
+ private function processKeyword($keyword)
+ {
+ $keyword = trim($keyword);
+ switch ($this->getInput('crit')) {
+ case 'search':
+ $catCheck = $this->getInput('catCheck');
+ if ($catCheck) {
+ $categories = $this->getInput('cat');
+ $query = sprintf(
+ '/q.php?q=%s&cat=%s',
+ rawurlencode($keyword),
+ rawurlencode($categories)
+ );
+ } else {
+ $query = sprintf('/q.php?q=%s', rawurlencode($keyword));
+ }
+ break;
+ case 'cat':
+ $query = sprintf('/q.php?q=category:%s', rawurlencode($keyword));
+ break;
+ case 'usr':
+ $query = sprintf('/q.php?q=user:%s', rawurlencode($keyword));
+ break;
+ default:
+ returnClientError('Impossible');
+ }
+ $api = 'https://apibay.org';
+ $json = getContents($api . $query);
+ $result = json_decode($json);
- if ($result[0]->name === 'No results returned') {
- return;
- }
- foreach ($result as $torrent) {
- // This is the check for whether to include results from Trusted or VIP users
- if ($this->getInput('trusted')
- && !in_array($torrent->status, array('vip', 'trusted'))
- ) {
- continue;
- }
- $this->processTorrent($torrent);
- }
- }
+ if ($result[0]->name === 'No results returned') {
+ return;
+ }
+ foreach ($result as $torrent) {
+ // This is the check for whether to include results from Trusted or VIP users
+ if (
+ $this->getInput('trusted')
+ && !in_array($torrent->status, ['vip', 'trusted'])
+ ) {
+ continue;
+ }
+ $this->processTorrent($torrent);
+ }
+ }
- private function processTorrent($torrent)
- {
- // Extracted these trackers from the magnet links on thepiratebay.org
- $trackers = array(
- 'udp://tracker.coppersurfer.tk:6969/announce',
- 'udp://tracker.openbittorrent.com:6969/announce',
- 'udp://9.rarbg.to:2710/announce',
- 'udp://9.rarbg.me:2780/announce',
- 'udp://9.rarbg.to:2730/announce',
- 'udp://tracker.opentrackr.org:1337',
- 'http://p4p.arenabg.com:1337/announce',
- 'udp://tracker.torrent.eu.org:451/announce',
- 'udp://tracker.tiny-vps.com:6969/announce',
- 'udp://open.stealth.si:80/announce',
- );
+ private function processTorrent($torrent)
+ {
+ // Extracted these trackers from the magnet links on thepiratebay.org
+ $trackers = [
+ 'udp://tracker.coppersurfer.tk:6969/announce',
+ 'udp://tracker.openbittorrent.com:6969/announce',
+ 'udp://9.rarbg.to:2710/announce',
+ 'udp://9.rarbg.me:2780/announce',
+ 'udp://9.rarbg.to:2730/announce',
+ 'udp://tracker.opentrackr.org:1337',
+ 'http://p4p.arenabg.com:1337/announce',
+ 'udp://tracker.torrent.eu.org:451/announce',
+ 'udp://tracker.tiny-vps.com:6969/announce',
+ 'udp://open.stealth.si:80/announce',
+ ];
- $magnetLink = sprintf(
- 'magnet:?xt=urn:btih:%s&dn=%s',
- $torrent->info_hash,
- rawurlencode($torrent->name)
- );
- foreach ($trackers as $tracker) {
- // Build magnet link manually instead of using http_build_query because it
- // creates undesirable query such as ?tr[0]=foo&tr[1]=bar&tr[2]=baz
- $magnetLink .= '&tr=' . rawurlencode($tracker);
- }
+ $magnetLink = sprintf(
+ 'magnet:?xt=urn:btih:%s&dn=%s',
+ $torrent->info_hash,
+ rawurlencode($torrent->name)
+ );
+ foreach ($trackers as $tracker) {
+ // Build magnet link manually instead of using http_build_query because it
+ // creates undesirable query such as ?tr[0]=foo&tr[1]=bar&tr[2]=baz
+ $magnetLink .= '&tr=' . rawurlencode($tracker);
+ }
- $item = array();
+ $item = [];
- $item['title'] = $torrent->name;
- // This uri should be a magnet link so that feed readers can easily pick it up.
- // However, rss-bridge only allows http or https schemes
- $item['uri'] = sprintf('%s/description.php?id=%s', self::URI, $torrent->id);
- $item['timestamp'] = $torrent->added;
- $item['author'] = $torrent->username;
+ $item['title'] = $torrent->name;
+ // This uri should be a magnet link so that feed readers can easily pick it up.
+ // However, rss-bridge only allows http or https schemes
+ $item['uri'] = sprintf('%s/description.php?id=%s', self::URI, $torrent->id);
+ $item['timestamp'] = $torrent->added;
+ $item['author'] = $torrent->username;
- $content = '<b>Type:</b> '
- . $this->renderCategory($torrent->category) . '<br>';
- $content .= "<b>Files:</b> $torrent->num_files<br>";
- $content .= '<b>Size:</b> ' . $this->renderSize($torrent->size) . '<br><br>';
+ $content = '<b>Type:</b> '
+ . $this->renderCategory($torrent->category) . '<br>';
+ $content .= "<b>Files:</b> $torrent->num_files<br>";
+ $content .= '<b>Size:</b> ' . $this->renderSize($torrent->size) . '<br><br>';
- $content .= '<b>Uploaded:</b> '
- . $this->renderUploadDate($torrent->added) . '<br>';
- $content .= '<b>By:</b> ' . $this->renderUser($torrent) . '<br>';
+ $content .= '<b>Uploaded:</b> '
+ . $this->renderUploadDate($torrent->added) . '<br>';
+ $content .= '<b>By:</b> ' . $this->renderUser($torrent) . '<br>';
- $content .= "<b>Seeders:</b> {$torrent->seeders}<br>";
- $content .= "<b>Leechers:</b> {$torrent->leechers}<br>";
- $content .= "<b>Info hash:</b> {$torrent->info_hash}<br><br>";
+ $content .= "<b>Seeders:</b> {$torrent->seeders}<br>";
+ $content .= "<b>Leechers:</b> {$torrent->leechers}<br>";
+ $content .= "<b>Info hash:</b> {$torrent->info_hash}<br><br>";
- if ($torrent->imdb) {
- $content .= '<b>Imdb:</b> '
- . $this->renderImdbLink($torrent->imdb) . '<br><br>';
- }
+ if ($torrent->imdb) {
+ $content .= '<b>Imdb:</b> '
+ . $this->renderImdbLink($torrent->imdb) . '<br><br>';
+ }
- $html = <<<HTML
+ $html = <<<HTML
<a href="%s">
<img src="%s/images/icon-magnet.gif"> GET THIS TORRENT
</a>
<br>
HTML;
- $content .= sprintf($html, $magnetLink, self::STATIC_SERVER);
+ $content .= sprintf($html, $magnetLink, self::STATIC_SERVER);
- $item['content'] = $content;
+ $item['content'] = $content;
- $this->items[] = $item;
- }
+ $this->items[] = $item;
+ }
- private function renderSize($size)
- {
- if ($size < 1024) return $size . ' B';
- if ($size < pow(1024, 2)) return round($size / 1024, 2) . ' KB';
- if ($size < pow(1024, 3)) return round($size / pow(1024, 2), 2) . ' MB';
- if ($size < pow(1024, 4)) return round($size / pow(1024, 3), 2) . ' GB';
+ private function renderSize($size)
+ {
+ if ($size < 1024) {
+ return $size . ' B';
+ }
+ if ($size < pow(1024, 2)) {
+ return round($size / 1024, 2) . ' KB';
+ }
+ if ($size < pow(1024, 3)) {
+ return round($size / pow(1024, 2), 2) . ' MB';
+ }
+ if ($size < pow(1024, 4)) {
+ return round($size / pow(1024, 3), 2) . ' GB';
+ }
- return round($size / pow(1024, 4), 2) . ' TB';
- }
+ return round($size / pow(1024, 4), 2) . ' TB';
+ }
- private function renderUploadDate($added)
- {
- return date('Y-m-d', $added ?: time());
- }
+ private function renderUploadDate($added)
+ {
+ return date('Y-m-d', $added ?: time());
+ }
- private function renderCategory($category)
- {
- $mainCategory = sprintf(
- '<a href="%s/search.php?q=category:%s">%s</a>',
- self::URI,
- $category[0] . '00',
- self::CATEGORIES[$category[0]]
- );
+ private function renderCategory($category)
+ {
+ $mainCategory = sprintf(
+ '<a href="%s/search.php?q=category:%s">%s</a>',
+ self::URI,
+ $category[0] . '00',
+ self::CATEGORIES[$category[0]]
+ );
- $subCategory = sprintf(
- '<a href="%s/search.php?q=category:%s">%s</a>',
- self::URI,
- $category,
- self::CATEGORIES[$category]
- );
+ $subCategory = sprintf(
+ '<a href="%s/search.php?q=category:%s">%s</a>',
+ self::URI,
+ $category,
+ self::CATEGORIES[$category]
+ );
- return sprintf('%s > %s', $mainCategory, $subCategory);
- }
+ return sprintf('%s > %s', $mainCategory, $subCategory);
+ }
- private function renderUser($torrent)
- {
- if ($torrent->username === 'Anonymous') {
- return $torrent->username . ' ' . $this->renderStatusImage($torrent->status);
- }
- return sprintf(
- '<a href="%s/search.php?q=user:%s">%s %s</a>',
- self::URI,
- $torrent->username,
- $torrent->username,
- $this->renderStatusImage($torrent->status)
- );
- }
+ private function renderUser($torrent)
+ {
+ if ($torrent->username === 'Anonymous') {
+ return $torrent->username . ' ' . $this->renderStatusImage($torrent->status);
+ }
+ return sprintf(
+ '<a href="%s/search.php?q=user:%s">%s %s</a>',
+ self::URI,
+ $torrent->username,
+ $torrent->username,
+ $this->renderStatusImage($torrent->status)
+ );
+ }
- private function renderStatusImage($status)
- {
- if ($status == 'trusted')
- return sprintf(
- '<img src="%s/images/trusted.png" title="Trusted"/>',
- self::STATIC_SERVER
- );
- if ($status == 'vip')
- return sprintf(
- '<img src="%s/images/vip.gif" title="VIP"/>',
- self::STATIC_SERVER
- );
- if ($status == 'helper')
- return sprintf(
- '<img src="%s/images/helper.png" title="Helper"/>',
- self::STATIC_SERVER
- );
- if ($status == 'moderator')
- return sprintf(
- '<img src="%s/images/moderator.gif" title="Moderator"/>',
- self::STATIC_SERVER
- );
- if ($status == 'supermod')
- return sprintf(
- '<img src="%s/images/supermod.png" title="Super Mod"/>',
- self::STATIC_SERVER
- );
- if ($status == 'admin')
- return sprintf(
- '<img src="%s/images/admin.gif" title="Admin"/>',
- self::STATIC_SERVER
- );
+ private function renderStatusImage($status)
+ {
+ if ($status == 'trusted') {
+ return sprintf(
+ '<img src="%s/images/trusted.png" title="Trusted"/>',
+ self::STATIC_SERVER
+ );
+ }
+ if ($status == 'vip') {
+ return sprintf(
+ '<img src="%s/images/vip.gif" title="VIP"/>',
+ self::STATIC_SERVER
+ );
+ }
+ if ($status == 'helper') {
+ return sprintf(
+ '<img src="%s/images/helper.png" title="Helper"/>',
+ self::STATIC_SERVER
+ );
+ }
+ if ($status == 'moderator') {
+ return sprintf(
+ '<img src="%s/images/moderator.gif" title="Moderator"/>',
+ self::STATIC_SERVER
+ );
+ }
+ if ($status == 'supermod') {
+ return sprintf(
+ '<img src="%s/images/supermod.png" title="Super Mod"/>',
+ self::STATIC_SERVER
+ );
+ }
+ if ($status == 'admin') {
+ return sprintf(
+ '<img src="%s/images/admin.gif" title="Admin"/>',
+ self::STATIC_SERVER
+ );
+ }
- return '';
- }
+ return '';
+ }
- private function renderImdbLink($imdb)
- {
- return sprintf(
- '<a href="%s">%s</a>',
- "https://www.imdb.com/title/$imdb",
- "https://www.imdb.com/title/$imdb"
- );
- }
+ private function renderImdbLink($imdb)
+ {
+ return sprintf(
+ '<a href="%s">%s</a>',
+ "https://www.imdb.com/title/$imdb",
+ "https://www.imdb.com/title/$imdb"
+ );
+ }
}