|
@@ -4,143 +4,163 @@ class DemonoidBridge extends BridgeAbstract {
|
|
|
const MAINTAINER = 'metaMMA';
|
|
|
const NAME = 'Demonoid';
|
|
|
const URI = 'https://www.demonoid.pw/';
|
|
|
- const DESCRIPTION = 'Returns results for the keywords (in all categories or
|
|
|
- a specific category). You can put several keywords separated by a semicolon
|
|
|
- (e.g. "one show;another show"). Searches can by done in a specific category;
|
|
|
- category number must be specified. (All=0, Movies=1, Music=2, TV=3, Games=4,
|
|
|
- Applications=5, Pictures=8, Anime=9, Comics=10, Books=11 Music Videos=8,
|
|
|
- Audio Books=17). User feed takes the Uploader ID number (not uploader name)
|
|
|
- as keyword. Uploader ID is found by clicking on uploader, clicking on
|
|
|
- "View this user\'s torrents", and copying the number after "uid=". An entire
|
|
|
- category feed is accomplished by leaving "keywords" box blank and using the
|
|
|
- corresponding category number.';
|
|
|
+ const DESCRIPTION = 'Returns results from search';
|
|
|
|
|
|
- const PARAMETERS = array( array(
|
|
|
+ const PARAMETERS = array(array(
|
|
|
'q' => array(
|
|
|
- 'name' => 'keywords/user ID/category, separated by semicolons',
|
|
|
- 'exampleValue' => 'first list;second list;…',
|
|
|
- 'required' => true
|
|
|
- ),
|
|
|
- 'crit' => array(
|
|
|
+ 'name' => 'keywords',
|
|
|
+ 'exampleValue' => 'keyword1 keyword2…',
|
|
|
+ 'required' => true,
|
|
|
+ ),
|
|
|
+ 'category' => array(
|
|
|
+ 'name' => 'Category',
|
|
|
'type' => 'list',
|
|
|
- 'name' => 'Feed type',
|
|
|
'values' => array(
|
|
|
- 'search' => 'search',
|
|
|
- 'category' => 'cat',
|
|
|
- 'user' => 'usr'
|
|
|
+ 'All' => 0,
|
|
|
+ 'Movies' => 1,
|
|
|
+ 'Music' => 2,
|
|
|
+ 'TV' => 3,
|
|
|
+ 'Games' => 4,
|
|
|
+ 'Applications' => 5,
|
|
|
+ 'Pictures' => 8,
|
|
|
+ 'Anime' => 9,
|
|
|
+ 'Comics' => 10,
|
|
|
+ 'Books' => 11,
|
|
|
+ 'Audiobooks' => 17
|
|
|
+ )
|
|
|
)
|
|
|
- ),
|
|
|
- 'catCheck' => array(
|
|
|
- 'type' => 'checkbox',
|
|
|
- 'name' => 'Specify category for keyword search ?',
|
|
|
- ),
|
|
|
- 'cat' => array(
|
|
|
- 'name' => 'Category number',
|
|
|
- ),
|
|
|
- ));
|
|
|
+ ), array(
|
|
|
+ 'catOnly' => array(
|
|
|
+ 'name' => 'Category',
|
|
|
+ 'type' => 'list',
|
|
|
+ 'values' => array(
|
|
|
+ 'All' => 0,
|
|
|
+ 'Movies' => 1,
|
|
|
+ 'Music' => 2,
|
|
|
+ 'TV' => 3,
|
|
|
+ 'Games' => 4,
|
|
|
+ 'Applications' => 5,
|
|
|
+ 'Pictures' => 8,
|
|
|
+ 'Anime' => 9,
|
|
|
+ 'Comics' => 10,
|
|
|
+ 'Books' => 11,
|
|
|
+ 'Audiobooks' => 17
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ), array(
|
|
|
+ 'userid' => array(
|
|
|
+ 'name' => 'user id',
|
|
|
+ 'exampleValue' => '00000',
|
|
|
+ 'required' => true,
|
|
|
+ 'type' => 'number'
|
|
|
+ ),
|
|
|
+ 'category' => array(
|
|
|
+ 'name' => 'Category',
|
|
|
+ 'type' => 'list',
|
|
|
+ 'values' => array(
|
|
|
+ 'All' => 0,
|
|
|
+ 'Movies' => 1,
|
|
|
+ 'Music' => 2,
|
|
|
+ 'TV' => 3,
|
|
|
+ 'Games' => 4,
|
|
|
+ 'Applications' => 5,
|
|
|
+ 'Pictures' => 8,
|
|
|
+ 'Anime' => 9,
|
|
|
+ 'Comics' => 10,
|
|
|
+ 'Books' => 11,
|
|
|
+ 'Audiobooks' => 17
|
|
|
+ )
|
|
|
+ )
|
|
|
+ )
|
|
|
+ );
|
|
|
|
|
|
public function collectData() {
|
|
|
|
|
|
- $catBool = $this->getInput('catCheck');
|
|
|
- if($catBool) {
|
|
|
- $catNum = $this->getInput('cat');
|
|
|
- }
|
|
|
- $critList = $this->getInput('crit');
|
|
|
+ if(!empty($this->getInput('q'))) {
|
|
|
|
|
|
- $keywordsList = explode(';', $this->getInput('q'));
|
|
|
- foreach($keywordsList as $keywords) {
|
|
|
- switch($critList) {
|
|
|
- case 'search':
|
|
|
- if($catBool == false) {
|
|
|
- $html = getContents(
|
|
|
- self::URI .
|
|
|
- 'files/?category=0&subcategory=All&quality=All&seeded=2&external=2&query=' .
|
|
|
- urlencode($keywords) . #not rawurlencode so space -> '+'
|
|
|
- '&uid=0&sort='
|
|
|
- ) or returnServerError('Could not request Demonoid.');
|
|
|
- } else {
|
|
|
- $html = getContents(
|
|
|
- self::URI .
|
|
|
- 'files/?category=' .
|
|
|
- rawurlencode($catNum) .
|
|
|
- '&subcategory=All&quality=All&seeded=2&external=2&query=' .
|
|
|
- urlencode($keywords) . #not rawurlencode so space -> '+'
|
|
|
- '&uid=0&sort='
|
|
|
- ) or returnServerError('Could not request Demonoid.');
|
|
|
- }
|
|
|
- break;
|
|
|
- case 'usr':
|
|
|
- $html = getContents(
|
|
|
- self::URI .
|
|
|
- 'files/?uid=' .
|
|
|
- rawurlencode($keywords) .
|
|
|
- '&seeded=2'
|
|
|
- ) or returnServerError('Could not request Demonoid.');
|
|
|
- break;
|
|
|
- case 'cat':
|
|
|
- $html = getContents(
|
|
|
- self::URI .
|
|
|
- 'files/?uid=0&category=' .
|
|
|
- rawurlencode($keywords) .
|
|
|
- '&subcategory=0&language=0&seeded=2&quality=0&query=&sort='
|
|
|
- ) or returnServerError('Could not request Demonoid.');
|
|
|
- break;
|
|
|
- }
|
|
|
+ $html = getSimpleHTMLDOM(
|
|
|
+ self::URI .
|
|
|
+ 'files/?category=' .
|
|
|
+ rawurlencode($this->getInput('category')) .
|
|
|
+ '&subcategory=All&quality=All&seeded=2&external=2&query=' .
|
|
|
+ urlencode($this->getInput('q')) .
|
|
|
+ '&uid=0&sort='
|
|
|
+ ) or returnServerError('Could not request Demonoid.');
|
|
|
|
|
|
- if(preg_match('~No torrents found~', $html)) {
|
|
|
- returnServerError('No result for query ' . $keywords);
|
|
|
- }
|
|
|
+ } elseif(!empty($this->getInput('catOnly'))) {
|
|
|
+
|
|
|
+ $html = getSimpleHTMLDOM(
|
|
|
+ self::URI .
|
|
|
+ 'files/?uid=0&category=' .
|
|
|
+ rawurlencode($this->getInput('catOnly')) .
|
|
|
+ '&subcategory=0&language=0&seeded=2&quality=0&query=&sort='
|
|
|
+ ) or returnServerError('Could not request Demonoid.');
|
|
|
|
|
|
- $bigTable = explode('<!-- start torrent list -->', $html)[1];
|
|
|
- $last50 = explode('<!-- end torrent list -->', $bigTable)[0];
|
|
|
- $dateChunk = explode('added_today', $last50);
|
|
|
- $item = array ();
|
|
|
+ } elseif(!empty($this->getInput('userid'))) {
|
|
|
|
|
|
- for($block = 1;$block < count($dateChunk);$block++) {
|
|
|
- preg_match('~(?<=>Add).*?(?=<)~', $dateChunk[$block], $dateStr);
|
|
|
+ $html = getSimpleHTMLDOM(
|
|
|
+ self::URI .
|
|
|
+ 'files/?uid=' .
|
|
|
+ rawurlencode($this->getInput('userid')) .
|
|
|
+ '&seeded=2'
|
|
|
+ ) or returnServerError('Could not request Demonoid.');
|
|
|
+
|
|
|
+ } else {
|
|
|
+ returnServerError('Invalid parameters !');
|
|
|
+ }
|
|
|
+
|
|
|
+ if(preg_match('~No torrents found~', $html)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ $table = $html->find('td[class=ctable_content_no_pad]', 0);
|
|
|
+ $cursorCount = 4;
|
|
|
+ $elementCount = 0;
|
|
|
+ while($elementCount != 40) {
|
|
|
+ $elementCount++;
|
|
|
+ $currentElement = $table->find('tr', $cursorCount);
|
|
|
+ if(preg_match('~items total~', $currentElement)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ $item = array();
|
|
|
+ //Do we have a date ?
|
|
|
+ if(preg_match('~Added.*?(.*)~', $currentElement->plaintext, $dateStr)) {
|
|
|
if(preg_match('~today~', $dateStr[0])) {
|
|
|
date_default_timezone_set('UTC');
|
|
|
$timestamp = mktime(0, 0, 0, gmdate('n'), gmdate('j'), gmdate('Y'));
|
|
|
- } else {
|
|
|
- preg_match('~(?<=ed on ).*\d+~', $dateStr[0], $fullDateStr);
|
|
|
+ } else {
|
|
|
+ preg_match('~(?<=ed on ).*\d+~', $currentElement->plaintext, $fullDateStr);
|
|
|
date_default_timezone_set('UTC');
|
|
|
$dateObj = strptime($fullDateStr[0], '%A, %b %d, %Y');
|
|
|
$timestamp = mktime(0, 0, 0, $dateObj['tm_mon'] + 1, $dateObj['tm_mday'], 1900 + $dateObj['tm_year']);
|
|
|
}
|
|
|
+ $cursorCount++;
|
|
|
+ }
|
|
|
|
|
|
- $itemsChunk = explode('<!-- tstart -->', $dateChunk[$block]);
|
|
|
+ $content = $table->find('tr', $cursorCount)->find('a', 1);
|
|
|
+ $cursorCount++;
|
|
|
+ $torrentInfo = $table->find('tr', $cursorCount);
|
|
|
+ $item['timestamp'] = $timestamp;
|
|
|
+ $item['title'] = $content->plaintext;
|
|
|
+ $item['id'] = self::URI . $content->href;
|
|
|
+ $item['uri'] = self::URI . $content->href;
|
|
|
+ $item['author'] = $torrentInfo->find('a[class=user]', 0)->plaintext;
|
|
|
+ $item['seeders'] = $torrentInfo->find('font[class=green]', 0)->plaintext;
|
|
|
+ $item['leechers'] = $torrentInfo->find('font[class=red]', 0)->plaintext;
|
|
|
+ $item['size'] = $torrentInfo->find('td', 3)->plaintext;
|
|
|
+ $item['content'] = 'Uploaded by ' . $item['author']
|
|
|
+ . ' , Size ' . $item['size']
|
|
|
+ . '<br>seeders: '
|
|
|
+ . $item['seeders']
|
|
|
+ . ' | leechers: '
|
|
|
+ . $item['leechers']
|
|
|
+ . '<br><a href="'
|
|
|
+ . $item['id']
|
|
|
+ . '">info page</a>';
|
|
|
|
|
|
- for($items = 1;$items < count($itemsChunk);$items++) {
|
|
|
- $item = array();
|
|
|
- $cols = explode('<td', $itemsChunk[$items]);
|
|
|
- preg_match('~(?<=href=\"/).*?(?=\")~', $cols[1], $matches);
|
|
|
- $item['id'] = self::URI . $matches[0];
|
|
|
- preg_match('~(?<=href=\").*?(?=\")~', $cols[4], $matches);
|
|
|
- $item['uri'] = $matches[0];
|
|
|
- $item['timestamp'] = $timestamp;
|
|
|
- preg_match('~(?<=href=\"/users/).*?(?=\")~', $cols[3], $matches);
|
|
|
- $item['author'] = $matches[0];
|
|
|
- preg_match('~(?<=/\">).*?(?=</a>)~', $cols[1], $matches);
|
|
|
- $item['title'] = $matches[0];
|
|
|
- preg_match('~(?<=green\">)\d+(?=</font>)~', $cols[8], $matches);
|
|
|
- $item['seeders'] = $matches[0];
|
|
|
- preg_match('~(?<=red\">)\d+(?=</font>)~', $cols[9], $matches);
|
|
|
- $item['leechers'] = $matches[0];
|
|
|
- preg_match('~(?<=>).*?(?=</td>)~', $cols[5], $matches);
|
|
|
- $item['size'] = $matches[0];
|
|
|
- $item['content'] = 'Uploaded by ' . $item['author']
|
|
|
- . ' , Size ' . $item['size']
|
|
|
- . '<br>seeders: '
|
|
|
- . $item['seeders']
|
|
|
- . ' | leechers: '
|
|
|
- . $item['leechers']
|
|
|
- . '<br><a href="'
|
|
|
- . $item['id']
|
|
|
- . '">info page</a>';
|
|
|
- if(isset($item['title']))
|
|
|
- $this->items[] = $item;
|
|
|
- }
|
|
|
- }
|
|
|
+ $this->items[] = $item;
|
|
|
+
|
|
|
+ $cursorCount++;
|
|
|
}
|
|
|
}
|
|
|
}
|