From 7927d7371934ae19a6f4f19a8730412dd01fb2cb Mon Sep 17 00:00:00 2001 From: teromene Date: Tue, 17 Apr 2018 15:25:02 +0200 Subject: [PATCH] Rewrote DemonoidBridge. Fixes #626. --- bridges/DemonoidBridge.php | 256 ++++++++++++++++++++----------------- 1 file changed, 138 insertions(+), 118 deletions(-) diff --git a/bridges/DemonoidBridge.php b/bridges/DemonoidBridge.php index 2a539bd1..bfbb785c 100644 --- a/bridges/DemonoidBridge.php +++ b/bridges/DemonoidBridge.php @@ -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'); + if(!empty($this->getInput('q'))) { + + $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.'); + + } 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.'); + + } elseif(!empty($this->getInput('userid'))) { + + $html = getSimpleHTMLDOM( + self::URI . + 'files/?uid=' . + rawurlencode($this->getInput('userid')) . + '&seeded=2' + ) or returnServerError('Could not request Demonoid.'); + + } else { + returnServerError('Invalid parameters !'); } - $critList = $this->getInput('crit'); - $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; + 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; } - - if(preg_match('~No torrents found~', $html)) { - returnServerError('No result for query ' . $keywords); - } - - $bigTable = explode('', $html)[1]; - $last50 = explode('', $bigTable)[0]; - $dateChunk = explode('added_today', $last50); - $item = array (); - - for($block = 1;$block < count($dateChunk);$block++) { - preg_match('~(?<=>Add).*?(?=<)~', $dateChunk[$block], $dateStr); + $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']); } - - $itemsChunk = explode('', $dateChunk[$block]); - - for($items = 1;$items < count($itemsChunk);$items++) { - $item = array(); - $cols = explode(').*?(?=)~', $cols[1], $matches); - $item['title'] = $matches[0]; - preg_match('~(?<=green\">)\d+(?=)~', $cols[8], $matches); - $item['seeders'] = $matches[0]; - preg_match('~(?<=red\">)\d+(?=)~', $cols[9], $matches); - $item['leechers'] = $matches[0]; - preg_match('~(?<=>).*?(?=)~', $cols[5], $matches); - $item['size'] = $matches[0]; - $item['content'] = 'Uploaded by ' . $item['author'] - . ' , Size ' . $item['size'] - . '
seeders: ' - . $item['seeders'] - . ' | leechers: ' - . $item['leechers'] - . '
info page'; - if(isset($item['title'])) - $this->items[] = $item; - } + $cursorCount++; } + + $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'] + . '
seeders: ' + . $item['seeders'] + . ' | leechers: ' + . $item['leechers'] + . '
info page'; + + $this->items[] = $item; + + $cursorCount++; } } }