Browse Source

Rewrote DemonoidBridge. Fixes #626.

teromene 6 years ago
parent
commit
7927d73719
1 changed files with 136 additions and 116 deletions
  1. 136 116
      bridges/DemonoidBridge.php

+ 136 - 116
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');
-		}
-		$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++;
 		}
 	}
 }