array( 'latest_category'=>array( 'name'=>'Latest category', 'type'=>'list', 'required'=>true, 'title'=>'Select your category', 'defaultValue'=>'news', 'values'=>array( 'Hot Torrents'=>'hot_torrents', 'News'=>'news', 'Releases'=>'releases', 'Torrents'=>'torrents' ) ) ), /* * Get feeds for one of the "torrent" categories * Make sure to add new categories also to get_torrent_category_index($)! * Elements are sorted by name ascending! */ 'By "Torrent" category' => array( 'torrent_category'=>array( 'name'=>'Torrent category', 'type'=>'list', 'required'=>true, 'title'=>'Select your category', 'defaultValue'=>'anime', 'values'=>array( 'Adult'=>'adult', 'Anime'=>'anime', 'Books'=>'books', 'Games'=>'games', 'Movies'=>'movies', 'Music'=>'music', 'Other'=>'other', 'Series & TV'=>'series_tv', 'Software'=>'software' ) ), 'torrent_popularity'=>array( 'name'=>'Sort by popularity', 'type'=>'checkbox', 'title'=>'Activate to receive results by popularity' ) ), /* * Get feeds for a specific search request */ 'Search torrent by name' => array( 'search_name'=>array( 'name'=>'Name', 'required'=>true, 'title'=>'Insert your search query', 'exampleValue'=>'Bridge' ), 'search_category'=>array( 'name'=>'Category', 'type'=>'list', 'title'=>'Select your category', 'defaultValue'=>'all', 'values'=>array( 'Adult'=>'adult', 'All'=>'all', 'Anime'=>'anime', 'Books'=>'books', 'Games'=>'games', 'Movies'=>'movies', 'Music'=>'music', 'Other'=>'other', 'Series & TV'=>'series_tv', 'Software'=>'software' ) ) ) ); public function getURI(){ $uri=self::URI; switch($this->queriedContext){ case 'By "Latest" category': switch($this->getInput('latest_category')){ case 'hot_torrents': $uri .= 'statistic/hot/torrents'; break; case 'news': break; case 'releases': $uri .= 'releases.php'; break; case 'torrents': $uri .= 'latest.php'; break; } break; case 'By "Torrent" category': $uri .= $this->build_category_uri( $this->getInput('torrent_category'), $this->getInput('torrent_popularity') ); break; case 'Search torrent by name': $category=$this->getInput('search_category'); $uri .= $this->build_category_uri($category); if($category!=='movies') $uri .= '&ihq=' . urlencode($this->getInput('search_name')); break; } return $uri; } public function getName(){ switch($this->queriedContext){ case 'By "Latest" category': $categoryName = array_search( $this->getInput('latest_category'), self::PARAMETERS['By "Latest" category']['latest_category']['values'] ); $name = 'Latest '.$categoryName.' - ' . self::NAME; break; case 'By "Torrent" category': $categoryName = array_search( $this->getInput('torrent_category'), self::PARAMETERS['By "Torrent" category']['torrent_category']['values'] ); $name = 'Category: ' . $categoryName . ' - ' . self::NAME; break; case 'Search torrent by name': $categoryName = array_search( $this->getInput('search_category'), self::PARAMETERS['Search torrent by name']['search_category']['values'] ); $name = 'Search: "' . $this->getInput('search_name') . '" in category: ' . $categoryName . ' - ' . self::NAME; break; } return $name; } public function collectData(){ $html = $this->load_html($this->getURI()); switch($this->queriedContext){ case 'By "Latest" category': switch($this->getInput('latest_category')){ case 'hot_torrents': $this->get_latest_hot_torrents($html); break; case 'news': $this->get_latest_news($html); break; case 'releases': case 'torrents': $this->get_latest_torrents($html); break; } break; case 'By "Torrent" category': if($this->getInput('torrent_category') === 'movies'){ // This one is special (content wise) $this->get_movie_torrents($html); }else{ $this->get_latest_torrents($html); } break; case 'Search torrent by name': if( $this->getInput('search_category') === 'movies'){ // This one is special (content wise) $this->get_movie_torrents($html); } else { $this->get_latest_torrents($html); } break; } } public function getCacheDuration(){ return 300; // 5 minutes } #region Helper functions for "Movie Torrents" private function get_movie_torrents($html){ $container = $html->find('div#w0', 0); if(!$container) returnServerError('Unable to find torrent container!'); $torrents = $container->find('article'); if(!$torrents) returnServerError('Unable to find torrents!'); foreach($torrents as $torrent){ $anchor = $torrent->find('a', 0); if(!$anchor) returnServerError('Unable to find anchor!'); $date = $torrent->find('small', 0); if(!$date) returnServerError('Unable to find date!'); $item = array(); $item['uri'] = $this->fix_relative_uri($anchor->href); $item['title'] = $anchor->title; // $item['author'] = $item['timestamp'] = strtotime($date->plaintext); $item['content'] = $this->fix_relative_uri($torrent->innertext); $this->items[] = $item; } } #endregion #region Helper functions for "Latest Hot Torrents" private function get_latest_hot_torrents($html){ $container = $html->find('div#serps', 0); if(!$container) returnServerError('Unable to find torrent container!'); $torrents = $container->find('tr'); if(!$torrents) returnServerError('Unable to find torrents!'); // Remove first element (header row) $torrents = array_slice($torrents, 1); foreach($torrents as $torrent){ $cell = $torrent->find('td', 0); if(!$cell) returnServerError('Unable to find cell!'); $element = $cell->find('a', 0); if(!$element) returnServerError('Unable to find element!'); $item = array(); $item['uri'] = $element->href; $item['title'] = $element->plaintext; // $item['author'] = // $item['timestamp'] = // $item['content'] = $this->items[] = $item; } } #endregion #region Helper functions for "Latest News" private function get_latest_news($html){ $container = $html->find('div#postcontainer', 0); if(!$container) returnServerError('Unable to find post container!'); $posts = $container->find('div.index-post'); if(!$posts) returnServerError('Unable to find posts!'); foreach($posts as $post){ $item = array(); $item['uri'] = $this->latest_news_extract_uri($post); $item['title'] = $this->latest_news_extract_title($post); $item['author'] = $this->latest_news_extract_author($post); $item['timestamp'] = $this->latest_news_extract_timestamp($post); $item['content'] = $this->latest_news_extract_content($post); $this->items[] = $item; } } private function latest_news_extract_author($post){ $author = $post->find('small', 0); if(!$author) returnServerError('Unable to find author!'); // The author is hidden within a string like: 'Posted by {author} on {date}' preg_match('/Posted\sby\s(.*)\son/i', $author->innertext, $matches); return $matches[1]; } private function latest_news_extract_timestamp($post){ $date = $post->find('small', 0); if(!$date) returnServerError('Unable to find date!'); // The date is hidden within a string like: 'Posted by {author} on {date}' preg_match('/Posted\sby\s.*\son\s(.*)/i', $date->innertext, $matches); $timestamp = strtotime($matches[1]); // Make sure date is not in the future (dates are given like 'Nov. 20' without year) if($timestamp > time()){ $timestamp = strtotime('-1 year', $timestamp); } return $timestamp; } private function latest_news_extract_title($post){ $title = $post->find('a', 0); if(!$title) returnServerError('Unable to find title!'); return $title->plaintext; } private function latest_news_extract_uri($post){ $uri = $post->find('a', 0); if(!$uri) returnServerError('Unable to find uri!'); return $uri->href; } private function latest_news_extract_content($post){ $content = $post->find('div', 0); if(!$content) returnServerError('Unable to find content!'); // Remove