ThePirateBayBridge.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <?php
  2. class ThePirateBayBridge extends BridgeAbstract {
  3. const MAINTAINER = 'mitsukarenai';
  4. const NAME = 'The Pirate Bay';
  5. const URI = 'https://thepiratebay.org/';
  6. const DESCRIPTION = 'Returns results for the keywords. You can put several
  7. list of keywords by separating them with a semicolon (e.g. "one show;another
  8. show"). Category based search needs the category number as input. User based
  9. search takes the Uploader name. Search can be done in a specified category';
  10. const PARAMETERS = array( array(
  11. 'q' => array(
  12. 'name' => 'keywords/username/category, separated by semicolons',
  13. 'exampleValue' => 'first list;second list;…',
  14. 'required' => true
  15. ),
  16. 'crit' => array(
  17. 'type' => 'list',
  18. 'name' => 'Search type',
  19. 'values' => array(
  20. 'search' => 'search',
  21. 'category' => 'cat',
  22. 'user' => 'usr'
  23. )
  24. ),
  25. 'catCheck' => array(
  26. 'type' => 'checkbox',
  27. 'name' => 'Specify category for keyword search ?',
  28. ),
  29. 'cat' => array(
  30. 'name' => 'Category number',
  31. 'exampleValue' => '100, 200… See TPB for category number'
  32. ),
  33. 'trusted' => array(
  34. 'type' => 'checkbox',
  35. 'name' => 'Only get results from Trusted or VIP users ?',
  36. ),
  37. ));
  38. public function collectData(){
  39. function parseDateTimestamp($element){
  40. $guessedDate = $element->find('font', 0)->plaintext;
  41. $guessedDate = explode('Uploaded ', $guessedDate)[1];
  42. $guessedDate = explode(',', $guessedDate)[0];
  43. if(count(explode(':', $guessedDate)) == 1) {
  44. $guessedDate = strptime($guessedDate, '%m-%d&nbsp;%Y');
  45. $timestamp = mktime(
  46. 0,
  47. 0,
  48. 0,
  49. $guessedDate['tm_mon'] + 1,
  50. $guessedDate['tm_mday'],
  51. 1900 + $guessedDate['tm_year']
  52. );
  53. } elseif(explode('&nbsp;', $guessedDate)[0] == 'Today') {
  54. $guessedDate = strptime(
  55. explode('&nbsp;', $guessedDate)[1], '%H:%M'
  56. );
  57. $timestamp = mktime(
  58. $guessedDate['tm_hour'],
  59. $guessedDate['tm_min'],
  60. 0,
  61. date('m'),
  62. date('d'),
  63. date('Y')
  64. );
  65. } elseif(explode('&nbsp;', $guessedDate)[0] == 'Y-day') {
  66. $guessedDate = strptime(
  67. explode('&nbsp;', $guessedDate)[1], '%H:%M'
  68. );
  69. $timestamp = mktime(
  70. $guessedDate['tm_hour'],
  71. $guessedDate['tm_min'],
  72. 0,
  73. date('m', time() - 24 * 60 * 60),
  74. date('d', time() - 24 * 60 * 60),
  75. date('Y', time() - 24 * 60 * 60)
  76. );
  77. } else {
  78. $guessedDate = strptime($guessedDate, '%m-%d&nbsp;%H:%M');
  79. $timestamp = mktime(
  80. $guessedDate['tm_hour'],
  81. $guessedDate['tm_min'],
  82. 0,
  83. $guessedDate['tm_mon'] + 1,
  84. $guessedDate['tm_mday'],
  85. date('Y'));
  86. }
  87. return $timestamp;
  88. }
  89. $catBool = $this->getInput('catCheck');
  90. if($catBool) {
  91. $catNum = $this->getInput('cat');
  92. }
  93. $critList = $this->getInput('crit');
  94. $trustedBool = $this->getInput('trusted');
  95. $keywordsList = explode(';', $this->getInput('q'));
  96. foreach($keywordsList as $keywords) {
  97. switch($critList) {
  98. case 'search':
  99. if($catBool == false) {
  100. $html = getSimpleHTMLDOM(
  101. self::URI .
  102. 'search/' .
  103. rawurlencode($keywords) .
  104. '/0/3/0'
  105. ) or returnServerError('Could not request TPB.');
  106. } else {
  107. $html = getSimpleHTMLDOM(
  108. self::URI .
  109. 'search/' .
  110. rawurlencode($keywords) .
  111. '/0/3/' .
  112. rawurlencode($catNum)
  113. ) or returnServerError('Could not request TPB.');
  114. }
  115. break;
  116. case 'cat':
  117. $html = getSimpleHTMLDOM(
  118. self::URI .
  119. 'browse/' .
  120. rawurlencode($keywords) .
  121. '/0/3/0'
  122. ) or returnServerError('Could not request TPB.');
  123. break;
  124. case 'usr':
  125. $html = getSimpleHTMLDOM(
  126. self::URI .
  127. 'user/' .
  128. rawurlencode($keywords) .
  129. '/0/3/0'
  130. ) or returnServerError('Could not request TPB.');
  131. break;
  132. }
  133. if ($html->find('table#searchResult', 0) == false)
  134. returnServerError('No result for query ' . $keywords);
  135. foreach($html->find('tr') as $element) {
  136. if(!$trustedBool
  137. || !is_null($element->find('img[alt=VIP]', 0))
  138. || !is_null($element->find('img[alt=Trusted]', 0))) {
  139. $item = array();
  140. $item['uri'] = $element->find('a', 3)->href;
  141. $item['id'] = self::URI . $element->find('a.detLink', 0)->href;
  142. $item['timestamp'] = parseDateTimestamp($element);
  143. $item['author'] = $element->find('a.detDesc', 0)->plaintext;
  144. $item['title'] = $element->find('a.detLink', 0)->plaintext;
  145. $item['seeders'] = (int)$element->find('td', 2)->plaintext;
  146. $item['leechers'] = (int)$element->find('td', 3)->plaintext;
  147. $item['content'] = $element->find('font', 0)->plaintext
  148. . '<br>seeders: '
  149. . $item['seeders']
  150. . ' | leechers: '
  151. . $item['leechers']
  152. . '<br><a href="'
  153. . $item['id']
  154. . '">info page</a>';
  155. if(isset($item['title']))
  156. $this->items[] = $item;
  157. }
  158. }
  159. }
  160. }
  161. }