├── .gitignore ├── .scrutinizer.yml ├── .travis.yml ├── README.md ├── composer.json ├── lib └── Axon │ ├── Search.php │ └── Search │ ├── Exception │ ├── ConnectionException.php │ └── UnexpectedResponseException.php │ ├── Model │ └── Torrent.php │ └── Provider │ ├── AbstractProvider.php │ ├── EztvProvider.php │ ├── KickassProvider.php │ ├── PirateBayProvider.php │ ├── ProviderInterface.php │ └── YifyProvider.php ├── phpunit.xml.dist └── tests ├── Axon └── Tests │ ├── Search │ ├── Model │ │ └── TorrentTest.php │ └── Provider │ │ ├── EztvProviderTest.php │ │ ├── KickassProviderTest.php │ │ ├── PirateBayProviderTest.php │ │ └── YifyProviderTest.php │ └── SearchTest.php ├── bootstrap.php └── fixtures └── search ├── eztv.html ├── kat.html ├── tpb.html └── yify.json /.gitignore: -------------------------------------------------------------------------------- 1 | vendor/ 2 | composer.lock 3 | composer.phar 4 | phpunit.xml 5 | -------------------------------------------------------------------------------- /.scrutinizer.yml: -------------------------------------------------------------------------------- 1 | tools: 2 | external_code_coverage: true 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: [5.4, 5.5] 4 | 5 | before_script: 6 | - composer install --dev --prefer-source 7 | 8 | script: 9 | phpunit --coverage-text 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Axon 2 | 3 | [![Build Status](https://travis-ci.org/kleiram/Axon.svg?branch=master)](https://travis-ci.org/kleiram/Axon) 4 | [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/kleiram/Axon/badges/quality-score.png?s=8441141c26d504c5f74522e06ee266889d61e47f)](https://scrutinizer-ci.com/g/kleiram/Axon/) 5 | [![SensioLabsInsight](https://insight.sensiolabs.com/projects/02520173-4779-49a9-b6b1-a31f51e04f55/mini.png)](https://insight.sensiolabs.com/projects/02520173-4779-49a9-b6b1-a31f51e04f55) 6 | 7 | Axon is a library for searching various torrent tracker sites for torrents using 8 | a simple API. 9 | 10 | ## Installation 11 | 12 | Installation is really simple when using [Composer](http://getcomposer.org): 13 | 14 | ```json 15 | { 16 | "require": { 17 | "kleiram/axon": "dev-master" 18 | } 19 | } 20 | ``` 21 | 22 | And you're all set! 23 | 24 | ## Usage 25 | 26 | The following code is an example of how to use Axon: 27 | 28 | ```php 29 | // Create a new Axon instance 30 | $axon = new Axon\Search(); 31 | 32 | // Add a couple of providers to the stack 33 | $axon->registerProvider(new Axon\Search\Provider\YifyProvider()); 34 | $axon->registerProvider(new Axon\Search\Provider\KickassProvider()); 35 | $axon->registerProvider(new Axon\Search\Provider\PirateBayProvider()); 36 | $axon->registerProvider(new Axon\Search\Provider\EztvProvider()); 37 | 38 | // Start searching! 39 | $torrents = $axon->search('Iron Man 3'); 40 | ``` 41 | 42 | Torrents are automatically filtered (by hash) so duplicate search results are 43 | very rare. 44 | 45 | Check the [`lib/Axon/Search/Providers`](https://github.com/kleiram/axon/tree/master/lib/Axon/Search/Providers) 46 | directory for more providers. 47 | 48 | ### Supported providers 49 | 50 | Currently, the following tracker sites are supported: 51 | 52 | - [YIFY Torrents](https://github.com/kleiram/axon/blob/master/lib/Axon/Search/Provider/YifyProvider.php) 53 | - [Kickass Torrents](https://github.com/kleiram/axon/blob/master/lib/Axon/Search/Provider/KickassProvider.php) 54 | - [The Pirate Bay](https://github.com/kleiram/axon/blob/master/lib/Axon/Search/Provider/PirateBayProvider.php) 55 | - [EZTV](https://github.com/kleiram/axon/blob/master/lib/Axon/Search/Provider/EztvProvider.php) 56 | - And working on more! 57 | 58 | ## Changelog 59 | 60 | ``` 61 | Version Changes 62 | 63 | 0.1.0 - Initial release 64 | ``` 65 | 66 | ## License 67 | 68 | ``` 69 | Copyright (c) 2014, Ramon Kleiss 70 | All rights reserved. 71 | 72 | Redistribution and use in source and binary forms, with or without 73 | modification, are permitted provided that the following conditions are met: 74 | 75 | 1. Redistributions of source code must retain the above copyright notice, this 76 | list of conditions and the following disclaimer. 77 | 2. Redistributions in binary form must reproduce the above copyright notice, 78 | this list of conditions and the following disclaimer in the documentation 79 | and/or other materials provided with the distribution. 80 | 81 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 82 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 83 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 84 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 85 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 86 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 87 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 88 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 89 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 90 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 91 | 92 | The views and conclusions contained in the software and documentation are those 93 | of the authors and should not be interpreted as representing official policies, 94 | either expressed or implied, of the FreeBSD Project. 95 | ``` 96 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kleiram/axon", 3 | "description": "Easy torrent search engine using multiple torrent sites", 4 | "keywords": ["kickass", "piratebay", "torrent", "download"], 5 | "type": "library", 6 | "license": "BSD-2-Clause", 7 | "authors": [ 8 | { 9 | "name": "Ramon Kleiss", 10 | "email": "ramonkleiss@gmail.com" 11 | } 12 | ], 13 | "require": { 14 | "php": ">=5.4", 15 | "kriswallsmith/buzz": "v0.10", 16 | "symfony/property-access": "~2.4", 17 | "symfony/dom-crawler": "~2.4", 18 | "symfony/css-selector": "~2.4", 19 | "brianium/nomnom": "~1.0" 20 | }, 21 | "autoload": { 22 | "psr-0": { 23 | "Axon": "lib/" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/Axon/Search.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class Search 13 | { 14 | /** 15 | * @var ProviderInterface[] 16 | */ 17 | protected $providers; 18 | 19 | /** 20 | * Constructor 21 | */ 22 | public function __construct() 23 | { 24 | $this->providers = array(); 25 | } 26 | 27 | /** 28 | * @param ProviderInterface $provider 29 | */ 30 | public function registerProvider(ProviderInterface $provider) 31 | { 32 | $this->providers[$provider->getName()] = $provider; 33 | } 34 | 35 | /** 36 | * @param string $query 37 | * @param integer|null $page 38 | * 39 | * @return Torrent[] 40 | */ 41 | public function search($query, $page = null) 42 | { 43 | $results = array(); 44 | 45 | array_walk($this->providers, function ($provider) use ($query, $page, &$results) { 46 | $results = array_merge($results, $provider->search($query, $page)); 47 | }); 48 | 49 | return $this->filter($results); 50 | } 51 | 52 | /** 53 | * @param Torrent[] $torrents 54 | * 55 | * @return Torrent[] 56 | */ 57 | public function filter(array $torrents) 58 | { 59 | $hashses = array(); 60 | 61 | return array_filter($torrents, function ($torrent) use (&$hashes) { 62 | if (isset($hashes[$torrent->getHash()])) { 63 | return false; 64 | } 65 | 66 | return ($hashes[$torrent->getHash()] = true); 67 | }); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /lib/Axon/Search/Exception/ConnectionException.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | class ConnectionException extends \RuntimeException 8 | { 9 | } 10 | -------------------------------------------------------------------------------- /lib/Axon/Search/Exception/UnexpectedResponseException.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | class UnexpectedResponseException extends \UnexpectedValueException 8 | { 9 | } 10 | -------------------------------------------------------------------------------- /lib/Axon/Search/Model/Torrent.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | class Torrent 10 | { 11 | /** 12 | * @var string 13 | */ 14 | protected $name; 15 | 16 | /** 17 | * @var string 18 | */ 19 | protected $hash; 20 | 21 | /** 22 | * @var integer 23 | */ 24 | protected $size; 25 | 26 | /** 27 | * @var integer 28 | */ 29 | protected $seeds; 30 | 31 | /** 32 | * @var integer 33 | */ 34 | protected $peers; 35 | 36 | /** 37 | * @param string $name 38 | */ 39 | public function setName($name) 40 | { 41 | $this->name = trim((string) $name); 42 | } 43 | 44 | /** 45 | * @return string|null 46 | */ 47 | public function getName() 48 | { 49 | return $this->name; 50 | } 51 | 52 | /** 53 | * @param string $hash 54 | */ 55 | public function setHash($hash) 56 | { 57 | $this->hash = strtoupper((string) $hash); 58 | } 59 | 60 | /** 61 | * @return string|null 62 | */ 63 | public function getHash() 64 | { 65 | return $this->hash; 66 | } 67 | 68 | /** 69 | * @param integer $size 70 | */ 71 | public function setSize($size) 72 | { 73 | $this->size = (integer) $size; 74 | } 75 | 76 | /** 77 | * @return integer|null 78 | */ 79 | public function getSize() 80 | { 81 | return $this->size; 82 | } 83 | 84 | /** 85 | * @param integer $seeds 86 | */ 87 | public function setSeeds($seeds) 88 | { 89 | $this->seeds = (integer) $seeds; 90 | } 91 | 92 | /** 93 | * @return integer|null 94 | */ 95 | public function getSeeds() 96 | { 97 | return $this->seeds; 98 | } 99 | 100 | /** 101 | * @param integer $peers 102 | */ 103 | public function setPeers($peers) 104 | { 105 | $this->peers = (integer) $peers; 106 | } 107 | 108 | /** 109 | * @return integer 110 | */ 111 | public function getPeers() 112 | { 113 | return $this->peers; 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /lib/Axon/Search/Provider/AbstractProvider.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | abstract class AbstractProvider implements ProviderInterface 13 | { 14 | /** 15 | * @var Browser 16 | */ 17 | protected $browser; 18 | 19 | /** 20 | * @param Browser $browser 21 | */ 22 | public function __construct(Browser $browser = null) 23 | { 24 | $this->browser = $browser ?: new Browser(); 25 | } 26 | 27 | /** 28 | * {@inheritDoc} 29 | */ 30 | abstract public function getName(); 31 | 32 | /** 33 | * {@inheritDoc} 34 | * 35 | * @throws ConnectionException 36 | * @throws UnexpectedResponseException 37 | */ 38 | public function search($query, $page = null) 39 | { 40 | $url = $this->getUrl($query, $page); 41 | 42 | try { 43 | $response = $this->browser->get($url); 44 | } catch (\Exception $e) { 45 | throw new ConnectionException(sprintf( 46 | 'Could not connect to "%s"', 47 | $url 48 | ), 0, $e); 49 | } 50 | 51 | if ($response->getStatusCode() != 200) { 52 | throw new UnexpectedResponseException(sprintf( 53 | 'Unexpected response: %s (%d)', 54 | $response->getReasonPhrase(), 55 | $response->getStatusCode() 56 | )); 57 | } 58 | 59 | return $this->transformResponse($response->getContent()); 60 | } 61 | 62 | /** 63 | * @param string $query 64 | * @param integer|null $page 65 | * 66 | * @return string 67 | */ 68 | abstract public function getUrl($query, $page); 69 | 70 | /** 71 | * @param string $rawResponse 72 | * 73 | * @return Torrent[] 74 | */ 75 | abstract protected function transformResponse($rawResponse); 76 | } 77 | -------------------------------------------------------------------------------- /lib/Axon/Search/Provider/EztvProvider.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | class EztvProvider implements ProviderInterface 15 | { 16 | /** 17 | * @var string 18 | */ 19 | const DEFAULT_HOST = 'eztv.it'; 20 | 21 | /** 22 | * @var string 23 | */ 24 | const DEFAULT_PATH = '/search'; 25 | 26 | /** 27 | * @var Browser 28 | */ 29 | protected $browser; 30 | 31 | /** 32 | * Constructor 33 | * 34 | * @param Browser $browser 35 | */ 36 | public function __construct(Browser $browser = null) 37 | { 38 | $this->browser = $browser ?: new Browser(); 39 | } 40 | 41 | /** 42 | * {@inheritDoc} 43 | */ 44 | public function getName() 45 | { 46 | return 'EZTV'; 47 | } 48 | 49 | /** 50 | * {@inheritDoc} 51 | */ 52 | public function getCanonicalName() 53 | { 54 | return 'eztv'; 55 | } 56 | 57 | /** 58 | * {@inheritDoc} 59 | */ 60 | public function search($query, $page = null) 61 | { 62 | try { 63 | $response = $this->browser->post( 64 | $this->getUrl(), 65 | array(), 66 | $this->getQuery($query) 67 | ); 68 | } catch (\Exception $e) { 69 | throw new ConnectionException(sprintf( 70 | 'Could not connect to "%s"', 71 | $this->getUrl() 72 | ), 0, $e); 73 | } 74 | 75 | if ($response->getStatusCode() != 200) { 76 | throw new UnexpectedResponseException(sprintf( 77 | 'Unexpected response: %s (%d)', 78 | $response->getReasonPhrase(), 79 | $response->getStatusCode() 80 | )); 81 | } 82 | 83 | return $this->transformResponse($response->getContent()); 84 | } 85 | 86 | /** 87 | * @return string 88 | */ 89 | public function getUrl() 90 | { 91 | return sprintf('http://%s%s/', self::DEFAULT_HOST, self::DEFAULT_PATH); 92 | } 93 | 94 | /** 95 | * @param string $html 96 | * 97 | * @return Torrent[] 98 | */ 99 | protected function transformResponse($html) 100 | { 101 | $crawler = new Crawler($html); 102 | 103 | return $crawler->filter('tr.forum_header_border')->each(function ($node) { 104 | $magnet = $node->filter('a.magnet')->first()->attr('href'); 105 | preg_match('/btih:([0-9A-Za-z]+)&/', $magnet, $matches); 106 | $hash = $matches[1]; 107 | 108 | $size = $node->filter('a.epinfo')->attr('title'); 109 | preg_match('/\(([0-9\.]+) ([A-Za-z]+)\)/', $size, $matches); 110 | $size = $matches[1]; 111 | $unit = $matches[2]; 112 | 113 | $converter = new Nomnom($size); 114 | 115 | $torrent = new Torrent(); 116 | $torrent->setName($node->filter('td.forum_thread_post')->eq(1)->text()); 117 | $torrent->setHash($hash); 118 | $torrent->setSize($converter->from($unit)->to('B')); 119 | 120 | return $torrent; 121 | }); 122 | } 123 | 124 | /** 125 | * @param string $query 126 | * 127 | * @return string 128 | */ 129 | protected function getQuery($query) 130 | { 131 | return http_build_query(array( 132 | 'SearchString' => $query, 133 | 'SearchString1' => null, 134 | 'search' => 'Search' 135 | )); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /lib/Axon/Search/Provider/KickassProvider.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class KickassProvider extends AbstractProvider 12 | { 13 | /** 14 | * @var string 15 | */ 16 | const DEFAULT_HOST = 'kickass.to'; 17 | 18 | /** 19 | * @var string 20 | */ 21 | const DEFAULT_PATH = '/usearch'; 22 | 23 | /** 24 | * {@inheritDoc} 25 | */ 26 | public function getName() 27 | { 28 | return 'Kickass'; 29 | } 30 | 31 | /** 32 | * {@inheritDoc} 33 | */ 34 | public function getCanonicalName() 35 | { 36 | return 'kickass'; 37 | } 38 | 39 | /** 40 | * @param string $query 41 | * @param integer|null $page 42 | * 43 | * @return string 44 | */ 45 | public function getUrl($query, $page) 46 | { 47 | if (is_integer($page)) { 48 | return sprintf( 49 | 'http://%s%s/%s/%s/?field=seeders&order=desc', 50 | self::DEFAULT_HOST, 51 | self::DEFAULT_PATH, 52 | $query, 53 | $page 54 | ); 55 | } else { 56 | return sprintf( 57 | 'http://%s%s/%s/?field=seeders&order=desc', 58 | self::DEFAULT_HOST, 59 | self::DEFAULT_PATH, 60 | $query 61 | ); 62 | } 63 | } 64 | 65 | /** 66 | * @param string $rawResponse 67 | * 68 | * @return Torrent[] 69 | */ 70 | protected function transformResponse($rawResponse) 71 | { 72 | $crawler = new Crawler(gzdecode($rawResponse)); 73 | 74 | return $crawler->filter('tr[id^="torrent_"]')->each(function ($node) { 75 | $magnet = $node->filter('a.imagnet')->attr('href'); 76 | preg_match('/btih:([0-9A-Za-z]+)&/', $magnet, $matches); 77 | $hash = $matches[1]; 78 | 79 | $size = $node->filter('td.nobr')->text(); 80 | preg_match('/([0-9\.]+) ([A-Za-z]+)/', $size, $matches); 81 | $size = $matches[1]; 82 | $unit = $matches[2]; 83 | 84 | $converter = new Nomnom($size); 85 | $torrent = new Torrent(); 86 | $torrent->setName($node->filter('a.cellMainLink')->text()); 87 | $torrent->setHash($hash); 88 | $torrent->setSize($converter->from($unit)->to('B')); 89 | $torrent->setSeeds($node->filter('td.green')->text()); 90 | $torrent->setPeers($node->filter('td.red')->text()); 91 | 92 | return $torrent; 93 | }); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/Axon/Search/Provider/PirateBayProvider.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class PirateBayProvider extends AbstractProvider 12 | { 13 | /** 14 | * @var string 15 | */ 16 | const DEFAULT_HOST = 'thepiratebay.se'; 17 | 18 | /** 19 | * @var string 20 | */ 21 | const DEFAULT_PATH = '/search'; 22 | 23 | /** 24 | * {@inheritDoc} 25 | */ 26 | public function getName() 27 | { 28 | return 'The Pirate Bay'; 29 | } 30 | 31 | /** 32 | * {@inheritDoc} 33 | */ 34 | public function getCanonicalName() 35 | { 36 | return 'thepiratebay'; 37 | } 38 | 39 | /** 40 | * @param string $query 41 | * @param integer|null $page 42 | * 43 | * @return string 44 | */ 45 | public function getUrl($query, $page = null) 46 | { 47 | if (!is_integer($page)) { 48 | $page = 1; 49 | } 50 | 51 | return sprintf( 52 | 'http://%s%s/%s/%d/7/0', 53 | self::DEFAULT_HOST, 54 | self::DEFAULT_PATH, 55 | rawurlencode($query), 56 | ($page - 1) 57 | ); 58 | } 59 | 60 | /** 61 | * @param string $rawResponse 62 | * 63 | * @return Torrent[] 64 | * 65 | * @throws UnexpectedResponseException 66 | */ 67 | protected function transformResponse($rawResponse) 68 | { 69 | $crawler = new Crawler($rawResponse); 70 | 71 | return $crawler->filter('#searchResult tr:not(.header)')->each(function ($node) { 72 | $magnet = $node->filter('a[href^="magnet"]')->attr('href'); 73 | preg_match('/btih:([0-9A-Za-z]+)&/', $magnet, $matches); 74 | $hash = $matches[1]; 75 | 76 | $detDesc = $node->filter('.detDesc')->text(); 77 | 78 | preg_match('/Size ([0-9\.]+)/', $detDesc, $matches); 79 | $size = $matches[1]; 80 | 81 | preg_match('/([A-Za-z]+),/', $detDesc, $matches); 82 | $unit = str_replace('i', '', $matches[1]); 83 | 84 | $converter = new Nomnom($size); 85 | $torrent = new Torrent(); 86 | $torrent->setName($node->filter('a.detLink')->text()); 87 | $torrent->setHash($hash); 88 | $torrent->setSize($converter->from($unit)->to('B')); 89 | $torrent->setSeeds($node->filter('td[align="right"]')->first()->text()); 90 | $torrent->setPeers($node->filter('td[align="right"]')->last()->text()); 91 | 92 | return $torrent; 93 | }); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /lib/Axon/Search/Provider/ProviderInterface.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | interface ProviderInterface 12 | { 13 | /** 14 | * Get the name of the provider 15 | * 16 | * @return string 17 | */ 18 | public function getName(); 19 | 20 | /** 21 | * Get the canonical name of the provider 22 | * 23 | * @return string 24 | */ 25 | public function getCanonicalName(); 26 | 27 | /** 28 | * Perform a search query on the provider for the specific query and page 29 | * 30 | * @param string $query 31 | * @param integer|null $page 32 | * 33 | * @return Torrent[] 34 | */ 35 | public function search($query, $page = null); 36 | } 37 | -------------------------------------------------------------------------------- /lib/Axon/Search/Provider/YifyProvider.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class YifyProvider extends AbstractProvider 13 | { 14 | /** 15 | * @var string 16 | */ 17 | const DEFAULT_HOST = 'yts.re'; 18 | 19 | /** 20 | * @var string 21 | */ 22 | const DEFAULT_PATH = '/api/list.json'; 23 | 24 | /** 25 | * {@inheritDoc} 26 | */ 27 | public function getName() 28 | { 29 | return 'YIFY Torrents'; 30 | } 31 | 32 | /** 33 | * {@inheritDoc} 34 | */ 35 | public function getCanonicalName() 36 | { 37 | return 'yts'; 38 | } 39 | 40 | /** 41 | * Generate the url for a search query 42 | * 43 | * @param string $query 44 | * @param integer|null $page 45 | */ 46 | public function getUrl($query, $page = null) 47 | { 48 | $url = sprintf( 49 | 'http://%s%s?keywords=%s', 50 | self::DEFAULT_HOST, 51 | self::DEFAULT_PATH, 52 | rawurlencode($query) 53 | ); 54 | 55 | if (is_integer($page)) { 56 | $url .= sprintf('&set=%d', $page); 57 | } 58 | 59 | return $url; 60 | } 61 | 62 | /** 63 | * @param string $rawResponse 64 | * 65 | * @return Torrent[] 66 | */ 67 | protected function transformResponse($rawResponse) 68 | { 69 | if (!($stdClass = json_decode($rawResponse))) { 70 | throw new UnexpectedResponseException( 71 | 'Could not parse response' 72 | ); 73 | } 74 | 75 | return array_map(function ($result) { 76 | $torrent = new Torrent(); 77 | $torrent->setName($result->MovieTitle); 78 | $torrent->setHash($result->TorrentHash); 79 | $torrent->setSize($result->SizeByte); 80 | $torrent->setSeeds($result->TorrentSeeds); 81 | $torrent->setPeers($result->TorrentPeers); 82 | 83 | return $torrent; 84 | }, $stdClass->MovieList); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ./tests/Axon/ 5 | 6 | 7 | 8 | 9 | 10 | ./lib/Axon/ 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tests/Axon/Tests/Search/Model/TorrentTest.php: -------------------------------------------------------------------------------- 1 | torrent = new Torrent(); 13 | } 14 | 15 | /** 16 | * @test 17 | */ 18 | public function shouldBeNulledOnWhenInitialized() 19 | { 20 | $this->assertNull($this->torrent->getName()); 21 | $this->assertNull($this->torrent->getHash()); 22 | $this->assertNull($this->torrent->getSize()); 23 | $this->assertNull($this->torrent->getSeeds()); 24 | $this->assertNull($this->torrent->getPeers()); 25 | } 26 | 27 | /** 28 | * @test 29 | */ 30 | public function shouldGetAndSetName() 31 | { 32 | $this->torrent->setName('foo'); 33 | 34 | $this->assertEquals('foo', $this->torrent->getName()); 35 | } 36 | 37 | /** 38 | * @test 39 | */ 40 | public function shouldGetAndSetHash() 41 | { 42 | $this->torrent->setHash('foo'); 43 | 44 | $this->assertEquals('FOO', $this->torrent->getHash()); 45 | } 46 | 47 | /** 48 | * @test 49 | */ 50 | public function shouldGetAndSetSize() 51 | { 52 | $this->torrent->setSize(1337); 53 | 54 | $this->assertEquals(1337, $this->torrent->getSize()); 55 | } 56 | 57 | /** 58 | * @test 59 | */ 60 | public function shouldGetAndSetSeeds() 61 | { 62 | $this->torrent->setSeeds(1); 63 | 64 | $this->assertEquals(1, $this->torrent->getSeeds()); 65 | } 66 | 67 | /** 68 | * @test 69 | */ 70 | public function shouldGetAndSetPeers() 71 | { 72 | $this->torrent->setPeers(1); 73 | 74 | $this->assertEquals(1, $this->torrent->getPeers()); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /tests/Axon/Tests/Search/Provider/EztvProviderTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf( 16 | 'Axon\Search\Provider\ProviderInterface', 17 | $provider 18 | ); 19 | } 20 | 21 | /** 22 | * @test 23 | */ 24 | public function shouldHaveName() 25 | { 26 | $provider = new EztvProvider(); 27 | 28 | $this->assertInternalType('string', $provider->getName()); 29 | } 30 | 31 | /** 32 | * @test 33 | */ 34 | public function shouldHaveCanonicalName() 35 | { 36 | $provider = new EztvProvider(); 37 | 38 | $this->assertInternalType('string', $provider->getCanonicalName()); 39 | } 40 | 41 | /** 42 | * @test 43 | */ 44 | public function shouldSearch() 45 | { 46 | $response = $this->getMock('Buzz\Message\Response'); 47 | $response 48 | ->expects($this->once()) 49 | ->method('getStatusCode') 50 | ->will($this->returnValue(200)); 51 | 52 | $response 53 | ->expects($this->once()) 54 | ->method('getContent') 55 | ->will($this->returnValue(file_get_contents(__DIR__.'/../../../../fixtures/search/eztv.html'))); 56 | 57 | $browser = $this->getMock('Buzz\Browser'); 58 | $browser 59 | ->expects($this->once()) 60 | ->method('post') 61 | ->with( 62 | 'http://eztv.it/search/', 63 | array(), 64 | http_build_query(array( 65 | 'SearchString' => 'foo', 66 | 'search' => 'Search' 67 | )) 68 | ) 69 | ->will($this->returnValue($response)); 70 | 71 | $provider = new EztvProvider($browser); 72 | $torrents = $provider->search('foo'); 73 | 74 | $this->assertInternalType('array', $torrents); 75 | $this->assertCount(191, $torrents); 76 | 77 | $this->assertEquals('How I Met Your Mother S09E23-E24 HDTV x264-EXCELLENCE', $torrents[0]->getName()); 78 | $this->assertEquals('HZWZ3U6ZZKQ3MAV4D52YXUWINH5AKCJ7', $torrents[0]->getHash()); 79 | $this->assertEquals(401830000, $torrents[0]->getSize()); 80 | $this->assertNull($torrents[0]->getSeeds()); 81 | $this->assertNull($torrents[0]->getPeers()); 82 | } 83 | 84 | /** 85 | * @test 86 | * @expectedException Axon\Search\Exception\ConnectionException 87 | */ 88 | public function shouldThrowExceptionOnConnectionError() 89 | { 90 | $browser = $this->getMock('Buzz\Browser'); 91 | $browser 92 | ->expects($this->any()) 93 | ->method('post') 94 | ->will($this->throwException(new \RuntimeException())); 95 | 96 | $provider = new EztvProvider($browser); 97 | $provider->search('foo'); 98 | } 99 | 100 | /** 101 | * @test 102 | * @expectedException Axon\Search\Exception\UnexpectedResponseException 103 | */ 104 | public function shouldThrowExceptionOnUnexpectedResponse() 105 | { 106 | $response = $this->getMock('Buzz\Message\Response'); 107 | $response 108 | ->expects($this->any()) 109 | ->method('getStatusCode') 110 | ->will($this->returnValue(400)); 111 | 112 | $response 113 | ->expects($this->any()) 114 | ->method('getReasonPhrase') 115 | ->will($this->returnValue('foo')); 116 | 117 | $browser = $this->getMock('Buzz\Browser'); 118 | $browser 119 | ->expects($this->once()) 120 | ->method('post') 121 | ->will($this->returnValue($response)); 122 | 123 | $provider = new EztvProvider($browser); 124 | $provider->search('foo'); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /tests/Axon/Tests/Search/Provider/KickassProviderTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf( 16 | 'Axon\Search\Provider\ProviderInterface', 17 | $provider 18 | ); 19 | } 20 | 21 | /** 22 | * @test 23 | */ 24 | public function shouldHaveName() 25 | { 26 | $provider = new KickassProvider(); 27 | 28 | $this->assertInternalType('string', $provider->getName()); 29 | } 30 | 31 | /** 32 | * @test 33 | */ 34 | public function shouldHaveCanonicalName() 35 | { 36 | $provider = new KickassProvider(); 37 | 38 | $this->assertInternalType('string', $provider->getCanonicalName()); 39 | } 40 | 41 | /** 42 | * @test 43 | */ 44 | public function shouldSearch() 45 | { 46 | $response = $this->getMock('Buzz\Message\Response'); 47 | $response 48 | ->expects($this->any()) 49 | ->method('getStatusCode') 50 | ->will($this->returnValue(200)); 51 | 52 | $response 53 | ->expects($this->once()) 54 | ->method('getContent') 55 | ->will($this->returnValue(gzencode(file_get_contents(__DIR__.'/../../../../fixtures/search/kat.html')))); 56 | 57 | $browser = $this->getMock('Buzz\Browser'); 58 | $browser 59 | ->expects($this->once()) 60 | ->method('get') 61 | ->will($this->returnValue($response)); 62 | 63 | $provider = new KickassProvider($browser); 64 | $torrents = $provider->search('foo'); 65 | 66 | $this->assertInternalType('array', $torrents); 67 | $this->assertCount(25, $torrents); 68 | $this->assertInstanceOf('Axon\Search\Model\Torrent', $torrents[0]); 69 | $this->assertEquals('Iron Man 3 (2013) 1080p BrRip x264 - YIFY', $torrents[0]->getName()); 70 | $this->assertEquals('70B487B9E21E2869AF831397851F45A00D3EA7CA', $torrents[0]->getHash()); 71 | $this->assertEquals(1950000000, $torrents[0]->getSize()); 72 | $this->assertEquals(3038, $torrents[0]->getSeeds()); 73 | $this->assertEquals(321, $torrents[0]->getPeers()); 74 | } 75 | 76 | /** 77 | * @test 78 | * @expectedException Axon\Search\Exception\ConnectionException 79 | */ 80 | public function shouldThrowExceptionOnConnectionError() 81 | { 82 | $browser = $this->getMock('Buzz\Browser'); 83 | $browser 84 | ->expects($this->once()) 85 | ->method('get') 86 | ->will($this->throwException(new \Exception())); 87 | 88 | $provider = new KickassProvider($browser); 89 | $provider->search('foo'); 90 | } 91 | 92 | /** 93 | * @test 94 | * @expectedException Axon\Search\Exception\UnexpectedResponseException 95 | */ 96 | public function shouldThrowExceptionOnUnexpectedResponse() 97 | { 98 | $response = $this->getMock('Buzz\Message\Response'); 99 | $response 100 | ->expects($this->any()) 101 | ->method('getStatusCode') 102 | ->will($this->returnValue(400)); 103 | 104 | $response 105 | ->expects($this->any()) 106 | ->method('getReasonPhrase') 107 | ->will($this->returnValue('foo')); 108 | 109 | $browser = $this->getMock('Buzz\Browser'); 110 | $browser 111 | ->expects($this->any()) 112 | ->method('get') 113 | ->will($this->returnValue($response)); 114 | 115 | $provider = new KickassProvider($browser); 116 | $provider->search('foo'); 117 | } 118 | 119 | /** 120 | * @test 121 | * @dataProvider urlProvider 122 | */ 123 | public function shouldGenerateCorrectUrl($query, $page, $expected) 124 | { 125 | $provider = new KickassProvider(); 126 | 127 | $this->assertEquals($expected, $provider->getUrl($query, $page)); 128 | } 129 | 130 | public function urlProvider() 131 | { 132 | return array( 133 | array('foo', null, 'http://kickass.to/usearch/foo/?field=seeders&order=desc'), 134 | array('foo', 1, 'http://kickass.to/usearch/foo/1/?field=seeders&order=desc'), 135 | ); 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /tests/Axon/Tests/Search/Provider/PirateBayProviderTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf( 16 | 'Axon\Search\Provider\ProviderInterface', 17 | $provider 18 | ); 19 | } 20 | 21 | /** 22 | * @test 23 | */ 24 | public function shouldHaveName() 25 | { 26 | $provider = new PirateBayProvider(); 27 | 28 | $this->assertInternalType('string', $provider->getName()); 29 | } 30 | 31 | /** 32 | * @test 33 | */ 34 | public function shouldHaveCanonicalName() 35 | { 36 | $provider = new PirateBayProvider(); 37 | 38 | $this->assertInternalType('string', $provider->getCanonicalName()); 39 | } 40 | 41 | /** 42 | * @test 43 | */ 44 | public function shouldSearch() 45 | { 46 | $response = $this->getMock('Buzz\Message\Response'); 47 | $response 48 | ->expects($this->once()) 49 | ->method('getStatusCode') 50 | ->will($this->returnValue(200)); 51 | 52 | $response 53 | ->expects($this->once()) 54 | ->method('getContent') 55 | ->will($this->returnValue(file_get_contents(__DIR__.'/../../../../fixtures/search/tpb.html'))); 56 | 57 | $browser = $this->getMock('Buzz\Browser'); 58 | $browser 59 | ->expects($this->once()) 60 | ->method('get') 61 | ->will($this->returnValue($response)); 62 | 63 | $provider = new PirateBayProvider($browser); 64 | $torrents = $provider->search('foo'); 65 | 66 | $this->assertInternalType('array', $torrents); 67 | $this->assertCount(30, $torrents); 68 | $this->assertInstanceOf('Axon\Search\Model\Torrent', $torrents[0]); 69 | $this->assertEquals('Iron Man 3 (2013) 1080p BrRip x264 - YIFY', $torrents[0]->getName()); 70 | $this->assertEquals('70B487B9E21E2869AF831397851F45A00D3EA7CA', $torrents[0]->getHash()); 71 | $this->assertEquals(1950000000, $torrents[0]->getSize()); 72 | $this->assertEquals(2437, $torrents[0]->getSeeds()); 73 | $this->assertEquals(267, $torrents[0]->getPeers()); 74 | } 75 | 76 | /** 77 | * @test 78 | * @expectedException Axon\Search\Exception\ConnectionException 79 | */ 80 | public function shouldThrowExceptionOnConnectionError() 81 | { 82 | $browser = $this->getMock('Buzz\Browser'); 83 | $browser 84 | ->expects($this->once()) 85 | ->method('get') 86 | ->will($this->throwException(new \Exception())); 87 | 88 | $provider = new PirateBayProvider($browser); 89 | $provider->search('foo'); 90 | } 91 | 92 | /** 93 | * @test 94 | * @expectedException Axon\Search\Exception\UnexpectedResponseException 95 | */ 96 | public function shouldThrowExceptionOnUnexpectedResponse() 97 | { 98 | $response = $this->getMock('Buzz\Message\Response'); 99 | $response 100 | ->expects($this->any()) 101 | ->method('getStatusCode') 102 | ->will($this->returnValue(400)); 103 | 104 | $response 105 | ->expects($this->any()) 106 | ->method('getReasonPhrase') 107 | ->will($this->returnValue('foo')); 108 | 109 | $browser = $this->getMock('Buzz\Browser'); 110 | $browser 111 | ->expects($this->any()) 112 | ->method('get') 113 | ->will($this->returnValue($response)); 114 | 115 | $provider = new PirateBayProvider($browser); 116 | $provider->search('foo'); 117 | } 118 | 119 | /** 120 | * @test 121 | * @dataProvider urlProvider 122 | */ 123 | public function shouldGenerateUrl($query, $page, $expected) 124 | { 125 | $provider = new PirateBayProvider(); 126 | 127 | $this->assertEquals($expected, $provider->getUrl($query, $page)); 128 | } 129 | 130 | public function urlProvider() 131 | { 132 | return array( 133 | array('foo', null, 'http://thepiratebay.se/search/foo/0/7/0'), 134 | array('foo', 2, 'http://thepiratebay.se/search/foo/1/7/0'), 135 | array('foo bar', null, 'http://thepiratebay.se/search/foo%20bar/0/7/0'), 136 | ); 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /tests/Axon/Tests/Search/Provider/YifyProviderTest.php: -------------------------------------------------------------------------------- 1 | assertInstanceOf( 16 | 'Axon\Search\Provider\ProviderInterface', 17 | $provider 18 | ); 19 | } 20 | 21 | /** 22 | * @test 23 | */ 24 | public function shouldHaveName() 25 | { 26 | $provider = new YifyProvider(); 27 | 28 | $this->assertInternalType('string', $provider->getName()); 29 | } 30 | 31 | /** 32 | * @test 33 | */ 34 | public function shouldHaveCanonicalName() 35 | { 36 | $provider = new YifyProvider(); 37 | 38 | $this->assertInternalType('string', $provider->getCanonicalName()); 39 | } 40 | 41 | /** 42 | * @test 43 | */ 44 | public function shouldSearch() 45 | { 46 | $response = $this->getMock('Buzz\Message\Response'); 47 | $response 48 | ->expects($this->any()) 49 | ->method('getStatusCode') 50 | ->will($this->returnValue(200)); 51 | 52 | $response 53 | ->expects($this->any()) 54 | ->method('getContent') 55 | ->will($this->returnValue(file_get_contents(__DIR__.'/../../../../fixtures/search/yify.json'))); 56 | 57 | $browser = $this->getMock('Buzz\Browser'); 58 | $browser 59 | ->expects($this->once()) 60 | ->method('get') 61 | ->will($this->returnValue($response)); 62 | 63 | $provider = new YifyProvider($browser); 64 | $torrents = $provider->search('Iron Man'); 65 | 66 | $this->assertInternalType('array', $torrents); 67 | $this->assertCount(1, $torrents); 68 | $this->assertInstanceOf('Axon\Search\Model\Torrent', $torrents[0]); 69 | $this->assertEquals('Iron Man 3 (2013) 3D', $torrents[0]->getName()); 70 | $this->assertEquals('48DBBFDCB66409CF7B209A9C560A87EA4CB4459C', $torrents[0]->getHash()); 71 | $this->assertEquals(2093796557, $torrents[0]->getSize()); 72 | $this->assertEquals(227, $torrents[0]->getSeeds()); 73 | $this->assertEquals(42, $torrents[0]->getPeers()); 74 | } 75 | 76 | /** 77 | * @test 78 | * @expectedException Axon\Search\Exception\ConnectionException 79 | */ 80 | public function shouldThrowExceptionOnConnectionError() 81 | { 82 | $browser = $this->getMock('Buzz\Browser'); 83 | $browser 84 | ->expects($this->once()) 85 | ->method('get') 86 | ->will($this->throwException(new \Exception())); 87 | 88 | $provider = new YifyProvider($browser); 89 | $provider->search('foo'); 90 | } 91 | 92 | /** 93 | * @test 94 | * @expectedException Axon\Search\Exception\UnexpectedResponseException 95 | */ 96 | public function shouldThrowExceptionOnUnexpectedStatusCode() 97 | { 98 | $response = $this->getMock('Buzz\Message\Response'); 99 | $response 100 | ->expects($this->any()) 101 | ->method('getStatusCode') 102 | ->will($this->returnValue(400)); 103 | 104 | $response 105 | ->expects($this->any()) 106 | ->method('getReasonPhrase') 107 | ->will($this->returnValue('foo')); 108 | 109 | $browser = $this->getMock('Buzz\Browser'); 110 | $browser 111 | ->expects($this->once()) 112 | ->method('get') 113 | ->will($this->returnValue($response)); 114 | 115 | $provider = new YifyProvider($browser); 116 | $provider->search('foo'); 117 | } 118 | 119 | /** 120 | * @test 121 | * @expectedException Axon\Search\Exception\UnexpectedResponseException 122 | */ 123 | public function shouldThrowExceptionOnInvalidResponse() 124 | { 125 | $response = $this->getMock('Buzz\Message\Response'); 126 | $response 127 | ->expects($this->any()) 128 | ->method('getStatusCode') 129 | ->will($this->returnValue(200)); 130 | 131 | $response 132 | ->expects($this->any()) 133 | ->method('getContent') 134 | ->will($this->returnValue('foo bar baz')); 135 | 136 | $browser = $this->getMock('Buzz\Browser'); 137 | $browser 138 | ->expects($this->once()) 139 | ->method('get') 140 | ->will($this->returnValue($response)); 141 | 142 | $provider = new YifyProvider($browser); 143 | $provider->search('foo'); 144 | } 145 | 146 | /** 147 | * @test 148 | * @dataProvider urlProvider 149 | */ 150 | public function shouldGenerateCorrectUrl($query, $page, $expected) 151 | { 152 | $provider = new YifyProvider(); 153 | 154 | $this->assertEquals( 155 | $expected, 156 | $provider->getUrl($query, $page) 157 | ); 158 | } 159 | 160 | public function urlProvider() 161 | { 162 | return array( 163 | array('foo', null, 'http://yts.re/api/list.json?keywords=foo'), 164 | array('foo', 1, 'http://yts.re/api/list.json?keywords=foo&set=1'), 165 | array('foo bar', null, 'http://yts.re/api/list.json?keywords=foo%20bar'), 166 | ); 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /tests/Axon/Tests/SearchTest.php: -------------------------------------------------------------------------------- 1 | getMock('Axon\Search\Provider\ProviderInterface'); 19 | $provider 20 | ->expects($this->once()) 21 | ->method('search') 22 | ->with('foo', null) 23 | ->will($this->returnValue($torrents)); 24 | 25 | $provider 26 | ->expects($this->any()) 27 | ->method('getName') 28 | ->will($this->returnValue('test')); 29 | 30 | $search = new Search(); 31 | $search->registerProvider($provider); 32 | $result = $search->search('foo'); 33 | 34 | $this->assertEquals($torrents, $result); 35 | } 36 | 37 | /** 38 | * @test 39 | */ 40 | public function shouldFilterDuplicateResults() 41 | { 42 | $torrents = array( 43 | new Torrent(), 44 | new Torrent() 45 | ); 46 | 47 | $torrents[0]->setHash('foo'); 48 | $torrents[1]->setHash('foo'); 49 | 50 | $provider = $this->getMock('Axon\Search\Provider\ProviderInterface'); 51 | $provider 52 | ->expects($this->once()) 53 | ->method('search') 54 | ->will($this->returnValue($torrents)); 55 | 56 | $provider 57 | ->expects($this->any()) 58 | ->method('getName') 59 | ->will($this->returnValue('test')); 60 | 61 | $search = new Search(); 62 | $search->registerProvider($provider); 63 | $result = $search->search('foo'); 64 | 65 | $this->assertInternalType('array', $result); 66 | $this->assertCount(1, $result); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | add('Axon\Tests', __DIR__); 15 | -------------------------------------------------------------------------------- /tests/fixtures/search/kat.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Download Iron Man Torrents - KickassTorrents 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 22 | 23 | 26 | 27 | 30 | 31 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
52 |
53 |
54 |
55 |
56 |

 

57 |
58 | 59 | 60 | 61 | 62 |
63 |
64 |
65 |
66 |
67 |
68 | 76 |
77 |
78 |
79 | 80 | 81 |
82 |
83 | 84 |
85 | 88 | Advanced search  89 |
90 |
91 |
92 |
93 |
94 |
95 | 96 |
97 | 98 | 99 | 100 | 101 | 820 | 930 | 931 |
102 |
103 |
Advertising (remove)
104 |
105 |
106 | 107 |
108 | 111 |
112 |
113 |
114 |
115 |
116 |

117 | 118 |

119 | 120 |

121 |
122 | 123 |
124 | 130 |
    131 |
  • Release date:
  • 132 |
  • RottenTomatoes: 133 | 78% 134 | 79% 135 |
  • 136 |
137 | 139 |
140 | Download movie 141 |
142 | 145 |
146 |
147 | 148 | 149 |
150 | 172 |
173 |
174 | 175 |

Iron Man results 1-25 from 3817

176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | 788 | 806 | 807 | 808 | 809 | 810 | 811 | 812 |
torrent namesizefilesageseedleech
189 |
190 | 1490 191 | 192 | 193 | 194 |
195 |
196 | 197 | 198 |
199 | 200 | Iron Man 3 (2013) 1080p BrRip x264 - YIFY 201 | 202 | 203 | Posted by YIFY verified in Movies > Highres Movies 204 |
205 |
1.95 GB37 months3038321
214 |
215 | 1235 216 | 217 | 218 | 219 |
220 |
221 | 222 | 223 |
224 | 225 | Iron Man 3 (2013) DVDRip XviD-MAXSPEED 226 | 227 | 228 | Posted by piratepedia verified in Movies 229 |
230 |
1.37 GB87 months1619305
239 |
240 | 2367 241 | 242 | 243 | 244 |
245 |
246 | 247 | 248 | 255 |
1.81 GB510 months1222154
264 |
265 | 32 266 | 267 | 268 | 269 |
270 |
271 | 272 | 273 |
274 | 275 | Iron Man III 2013 TRUEFRENCH PROPER TS READNFO XviD-STVFRV 276 | 277 | 278 | Posted by AlexKid1337 verified in Movies 279 |
280 |
1.33 GB211 months1026185
289 |
290 | 23 291 | 292 | 293 | 294 |
295 |
296 | 297 | 298 |
299 | 300 | Iron Man 3 (2013) HDCAMRip 301 | 302 | 303 | Posted by RGSHARON verified in Movies 304 |
305 |
2.06 GB111 months904160
314 |
315 | 912 316 | 317 | 318 | 319 |
320 |
321 | 322 | 323 |
324 | 325 | Iron Man 3 2013 NEW Full Source CAM XViD-VAiN 326 | 327 | 328 | Posted by UsaBit verified in Movies 329 |
330 |
1.35 GB410 months867144
339 |
340 | 8 341 | 342 | 343 | 344 |
345 |
346 | 347 | 348 |
349 | 350 | Iron Man 3 2013 iTALiAN LD HDSCR 720p XviD-iDN_CreW 351 | 352 | 353 | Posted by MrPurko in Movies 354 |
355 |
1.77 GB49 months799559
364 |
365 | 525 366 | 367 | 368 | 369 |
370 |
371 | 372 | 373 |
374 | 375 | Iron Man 3 (2013) 720p BrRip x264 - YIFY 376 | 377 | 378 | Posted by YIFY verified in Movies > Highres Movies 379 |
380 |
925.5 MB37 months774107
389 |
390 | 12 391 | 392 | 393 | 394 |
395 |
396 | 397 | 398 |
399 | 400 | Iron Man 3 2013 R6 HDScr LINE XViD AC3 HQ Hive-CM8 401 | 402 | 403 | in Movies 404 |
405 |
1.79 GB29 months65035
414 |
415 | 416 | 417 | 418 | 419 |
420 |
421 | 422 | 423 |
424 | 425 | Iron Man 3 2013 iTALiAN MD CAM XviD-REV avi 426 | 427 | 428 | in Movies 429 |
430 |
1.36 GB111 months59444
439 |
440 | 1 441 | 442 | 443 | 444 |
445 |
446 | 447 | 448 |
449 | 450 | Iron Man 3 2013 FULL CAM NEW AUDIO XViD - JUSTICE 451 | 452 | 453 | Posted by Silmarillion verified in Movies 454 |
455 |
1.42 GB410 months529300
464 |
465 | 242 466 | 467 | 468 | 469 |
470 |
471 | 472 | 473 |
474 | 475 | Iron man 2 (2010) 1080p BrRip x264 - 1.60GB - YIFY 476 | 477 | 478 | Posted by YIFY verified in Movies > Highres Movies 479 |
480 |
1.6 GB61 year48095
489 |
490 | 3 491 | 492 | 493 | 494 |
495 |
496 | 497 | 498 |
499 | 500 | Iron Man 3 2013 CAMRip XviD AC3 -TODE 501 | 502 | 503 | Posted by SuPer_BONE verified in Movies 504 |
505 |
699.34 MB111 months474153
514 |
515 | 115 516 | 517 | 518 | 519 |
520 |
521 | 522 | 523 |
524 | 525 | Iron Man 3 (2013) HDTV 900MB Ganool 526 | 527 | 528 | Posted by UsaBit verified in Movies 529 |
530 |
900.14 MB19 months46822
539 |
540 | 10 541 | 542 | 543 | 544 |
545 |
546 | 547 | 548 |
549 | 550 | Iron Man 3 (2013) .avi MD CAM - ITA 551 | 552 | 553 | Posted by ddlng in Movies 554 |
555 |
1.36 GB111 months466132
564 |
565 | 3 566 | 567 | 568 | 569 |
570 |
571 | 572 | 573 |
574 | 575 | Iron Man [dvdrip][spanish] 576 | 577 | 578 | in Movies 579 |
580 |
1.69 GB12 years44956
589 |
590 | 246 591 | 592 | 593 | 594 |
595 |
596 | 597 | 598 |
599 | 600 | Iron Man (2008) 1080p BrRip x264 - 1.65GB - YIFY 601 | 602 | 603 | Posted by YIFY verified in Movies > Highres Movies 604 |
605 |
1.65 GB31 year429124
614 |
615 | 8 616 | 617 | 618 | 619 |
620 |
621 | 622 | 623 |
624 | 625 | Iron Man 3 2013 iTALiAN AC3 BRRip XviD-T4P3 avi 626 | 627 | 628 | in Movies 629 |
630 |
2.35 GB16 months41185
639 |
640 | 1515 641 | 642 | 643 | 644 |
645 |
646 | 647 | 648 |
649 | 650 | Iron Man 3 2013 CAM Xvid READ NFO UnKnOwN 651 | 652 | 653 | Posted by Obit11 verified in Movies 654 |
655 |
1.42 GB411 months40460
664 |
665 | 6 666 | 667 | 668 | 669 |
670 |
671 | 672 | 673 |
674 | 675 | Iron Man 3 2013 FRENCH R6 LD XviD-STARK 676 | 677 | 678 | Posted by AlexKid1337 verified in Movies 679 |
680 |
1.12 GB210 months37642
689 |
690 | 9 691 | 692 | 693 | 694 |
695 |
696 | 697 | 698 |
699 | 700 | Iron Man 3 (2013) TS Russian Dubbed 701 | 702 | 703 | Posted by RGSHARON verified in Movies > Dubbed Movies 704 |
705 |
2.05 GB110 months37283
714 |
715 | 849 716 | 717 | 718 | 719 |
720 |
721 | 722 | 723 | 730 |
1.3 GB31 year35543
739 |
740 | 5 741 | 742 | 743 | 744 |
745 |
746 | 747 | 748 | 755 |
680.44 MB310 months342109
764 |
765 | 13 766 | 767 | 768 | 769 |
770 |
771 | 772 | 773 |
774 | 775 | Iron Man 2 2010 iTALiAN iNTERNAL LD TS XviD-SiLENT[L D ] 776 | 777 | 778 | Posted by Survival verified in Movies 779 |
780 |
698.84 MB13 years30429
789 |
790 | 6 791 | 792 | 793 | 794 |
795 |
796 | 797 | 798 |
799 | 800 | Iron Man 3 TS XviD AC3 NOVA 801 | 802 | 803 | Posted by macmanda in Movies 804 |
805 |
2.06 GB210 months30290
813 |
814 | 12345153
815 |
816 |
817 | Search for "Iron Man" on Torrentz.eu 818 |
819 |
821 | 927 | 928 | 929 |
932 |
933 |
934 |
935 |
936 | 937 |
938 | 1023 |
1024 |
1025 | 1026 | 1049 | Report a bug 1050 |
1051 |
1052 | 1071 | 1081 | 1090 | 1091 | 1092 | -------------------------------------------------------------------------------- /tests/fixtures/search/tpb.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The Pirate Bay - The galaxy's most resilient bittorrent site 5 | 6 | 7 | 8 | 9 | 10 | 47 | 48 | 49 | 62 | 63 | 64 | 65 | 66 | 67 | 142 | 143 |

Search results: Iron Man Displaying hits from 1 to 30 (approx 1000 found)

144 |
145 |
146 | 147 |
148 |
149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 167 | 173 | 174 | 175 | 176 | 177 | 183 | 189 | 190 | 191 | 192 | 193 | 199 | 205 | 206 | 207 | 208 | 209 | 215 | 221 | 222 | 223 | 224 | 225 | 231 | 237 | 238 | 239 | 240 | 241 | 247 | 253 | 254 | 255 | 256 | 257 | 263 | 269 | 270 | 271 | 272 | 273 | 279 | 285 | 286 | 287 | 288 | 289 | 295 | 301 | 302 | 303 | 304 | 305 | 311 | 317 | 318 | 319 | 320 | 321 | 327 | 333 | 334 | 335 | 336 | 337 | 343 | 349 | 350 | 351 | 352 | 353 | 359 | 365 | 366 | 367 | 368 | 369 | 375 | 381 | 382 | 383 | 384 | 385 | 391 | 397 | 398 | 399 | 400 | 401 | 407 | 413 | 414 | 415 | 416 | 417 | 423 | 429 | 430 | 431 | 432 | 433 | 439 | 445 | 446 | 447 | 448 | 449 | 455 | 461 | 462 | 463 | 464 | 465 | 471 | 477 | 478 | 479 | 480 | 481 | 487 | 493 | 494 | 495 | 496 | 497 | 503 | 509 | 510 | 511 | 512 | 513 | 519 | 525 | 526 | 527 | 528 | 529 | 535 | 541 | 542 | 543 | 544 | 545 | 551 | 557 | 558 | 559 | 560 | 561 | 567 | 573 | 574 | 575 | 576 | 577 | 583 | 589 | 590 | 591 | 592 | 593 | 599 | 605 | 606 | 607 | 608 | 609 | 615 | 621 | 622 | 623 | 624 | 625 | 631 | 637 | 638 | 639 | 640 | 641 |
Type
Name (Order by: Uploaded, Size, ULed by, SE, LE)
View: Single / Double 
SELE
162 |
163 | Video
164 | (HD - Movies) 165 |
166 |
168 | 170 | Magnet linkThis torrent has 112 comments.This torrent has a cover imageVIP 171 | Uploaded 08-20 2013, Size 1.95 GiB, ULed by YIFY 172 | 2437267
178 |
179 | Video
180 | (Movies) 181 |
182 |
184 | 186 | Magnet linkThis torrent has 125 comments.This torrent has a cover imageVIP 187 | Uploaded 08-15 2013, Size 1.37 GiB, ULed by extremezone 188 | 1470267
194 |
195 | Video
196 | (Movies) 197 |
198 |
200 | 202 | Magnet linkThis torrent has 3 comments. 203 | Uploaded 08-17 2013, Size 2.16 GiB, ULed by Miguel223 204 | 81354
210 |
211 | Video
212 | (Movies) 213 |
214 |
216 | 218 | Magnet linkThis torrent has 176 comments.This torrent has a cover imageVIP 219 | Uploaded 05-20 2013, Size 1.81 GiB, ULed by scene4all 220 | 77587
226 |
227 | Video
228 | (HD - Movies) 229 |
230 |
232 | 234 | Magnet linkThis torrent has 58 comments.This torrent has a cover imageVIP 235 | Uploaded 08-20 2013, Size 925.5 MiB, ULed by YIFY 236 | 705106
242 |
243 | Video
244 | (Movies) 245 |
246 |
248 | 250 | Magnet linkThis torrent has 296 comments.This torrent has a cover imageVIP 251 | Uploaded 09-04 2010, Size 1.35 GiB, ULed by extremezone 252 | 26721
258 |
259 | Video
260 | (HD - Movies) 261 |
262 |
264 | 266 | Magnet linkThis torrent has 19 comments.This torrent has a cover imageVIP 267 | Uploaded 02-11 2012, Size 749.63 MiB, ULed by YIFY 268 | 24427
274 |
275 | Video
276 | (3D) 277 |
278 |
280 | 282 | Magnet linkThis torrent has 16 comments.This torrent has a cover imageVIP 283 | Uploaded 08-23 2013, Size 1.95 GiB, ULed by YIFY 284 | 22148
290 |
291 | Video
292 | (Movies) 293 |
294 |
296 | 298 | Magnet linkThis torrent has 90 comments.This torrent has a cover imageVIP 299 | Uploaded 05-12 2013, Size 1.86 GiB, ULed by .BONE. 300 | 20616
306 |
307 | Video
308 | (HD - Movies) 309 |
310 |
312 | 314 | Magnet linkThis torrent has 10 comments.This torrent has a cover imageVIP 315 | Uploaded 10-19 2013, Size 6.59 GiB, ULed by Zen_Bud 316 | 20591
322 |
323 | Video
324 | (HD - Movies) 325 |
326 |
328 | 330 | Magnet linkThis torrent has 9 comments.This torrent has a cover imageVIP 331 | Uploaded 12-09 2013, Size 2.66 GiB, ULed by dhjudasx 332 | 17729
338 |
339 | Video
340 | (HD - Movies) 341 |
342 |
344 | 346 | Magnet linkThis torrent has 22 comments.This torrent has a cover imageVIP 347 | Uploaded 09-09 2010, Size 698.59 MiB, ULed by YIFY 348 | 15731
354 |
355 | Video
356 | (HD - Movies) 357 |
358 |
360 | 362 | Magnet linkThis torrent has 22 comments.This torrent has a cover imageVIP 363 | Uploaded 08-15 2013, Size 4.42 GiB, ULed by BOZX 364 | 15622
370 |
371 | Video
372 | (HD - Movies) 373 |
374 |
376 | 378 | Magnet linkThis torrent has 32 comments.This torrent has a cover imageVIP 379 | Uploaded 08-20 2013, Size 12.06 GiB, ULed by BOZX 380 | 13628
386 |
387 | Video
388 | (Movies) 389 |
390 |
392 | 394 | Magnet linkThis torrent has 3 comments.This torrent has a cover image 395 | Uploaded 08-14 2013, Size 4.24 GiB, ULed by Anonymous 396 | 1310
402 |
403 | Video
404 | (HD - Movies) 405 |
406 |
408 | 410 | Magnet linkThis torrent has 36 comments.This torrent has a cover imageVIP 411 | Uploaded 06-24 2013, Size 900.14 MiB, ULed by .BONE. 412 | 1266
418 |
419 | Video
420 | (HD - Movies) 421 |
422 |
424 | 426 | Magnet linkThis torrent has 19 comments.This torrent has a cover imageVIP 427 | Uploaded 08-20 2013, Size 6.6 GiB, ULed by BOZX 428 | 10615
434 |
435 | Video
436 | (Movies) 437 |
438 |
440 | 442 | Magnet linkThis torrent has 2 comments.VIP 443 | Uploaded 11-26 2013, Size 1 GiB, ULed by SaM 444 | 9726
450 |
451 | Video
452 | (HD - Movies) 453 |
454 |
456 | 458 | Magnet linkThis torrent has 38 comments.This torrent has a cover imageVIP 459 | Uploaded 05-21 2013, Size 2.2 GiB, ULed by honey8ee 460 | 859
466 |
467 | Video
468 | (Movies) 469 |
470 |
472 | 474 | Magnet linkThis torrent has 3 comments.This torrent has a cover imageVIP 475 | Uploaded 08-16 2013, Size 1.36 GiB, ULed by Mr.Stifmeister 476 | 843
482 |
483 | Video
484 | (Movies) 485 |
486 |
488 | 490 | Magnet linkThis torrent has 1 comments.VIP 491 | Uploaded 12-12 2013, Size 701.99 MiB, ULed by Drarbg 492 | 823
498 |
499 | Video
500 | (HD - Movies) 501 |
502 |
504 | 506 | Magnet linkThis torrent has 42 comments.This torrent has a cover imageVIP 507 | Uploaded 08-14 2013, Size 3.89 GiB, ULed by BOZX 508 | 818
514 |
515 | Video
516 | (Movies) 517 |
518 |
520 | 522 | Magnet linkThis torrent has a cover imageVIP 523 | Uploaded 05-13 2013, Size 726 MiB, ULed by Koedje 524 | 8117
530 |
531 | Video
532 | (HD - Movies) 533 |
534 |
536 | 538 | Magnet linkThis torrent has 12 comments.This torrent has a cover image 539 | Uploaded 09-24 2013, Size 1.95 GiB, ULed by SpeedGeek 540 | 782
546 |
547 | Video
548 | (Movies) 549 |
550 |
552 | 554 | Magnet linkThis torrent has 36 comments.VIP 555 | Uploaded 07-14 2013, Size 1.69 GiB, ULed by HiGH-RG 556 | 747
562 |
563 | Video
564 | (Movies) 565 |
566 |
568 | 570 | Magnet linkThis torrent has 3 comments. 571 | Uploaded 05-14 2013, Size 1.37 GiB, ULed by Miguel223 572 | 721
578 |
579 | Video
580 | (3D) 581 |
582 |
584 | 586 | Magnet linkThis torrent has 9 comments.This torrent has a cover imageVIP 587 | Uploaded 08-22 2013, Size 12.61 GiB, ULed by BOZX 588 | 6941
594 |
595 | Video
596 | (HD - Movies) 597 |
598 |
600 | 602 | Magnet linkThis torrent has 12 comments.This torrent has a cover imageVIP 603 | Uploaded 08-22 2013, Size 3.46 GiB, ULed by condors369 604 | 6626
610 |
611 | Video
612 | (Movies) 613 |
614 |
616 |
Iron man 2 617 |
618 | Magnet link 619 | Uploaded 05-29 2013, Size 1.55 GiB, ULed by Miguel223 620 |
657
626 |
627 | Other
628 | (Comics) 629 |
630 |
632 | 634 | Magnet linkVIP 635 | Uploaded 03-19 14:48, Size 40.35 MiB, ULed by nemesis43 636 | 602
642 |
643 |
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Next  644 |
645 |
646 | 647 |
648 |
649 | 650 | 689 | 690 | 702 | 703 | 704 | -------------------------------------------------------------------------------- /tests/fixtures/search/yify.json: -------------------------------------------------------------------------------- 1 | { 2 | "MovieCount": 1, 3 | "MovieList": [ 4 | { 5 | "MovieID": "3891", 6 | "State": "OK", 7 | "MovieUrl": "http:\/\/yts.re\/movie\/Iron_Man_3_2013_3D", 8 | "MovieTitle": "Iron Man 3 (2013) 3D", 9 | "MovieTitleClean": "Iron Man 3", 10 | "MovieYear": "2013", 11 | "DateUploaded": "2013-08-23 17:48:57", 12 | "DateUploadedEpoch": 1377236937, 13 | "Quality": "3D", 14 | "CoverImage": "http:\/\/static.yts.re\/attachments\/Iron_Man_3_2013_3D\/poster_med.jpg", 15 | "ImdbCode": "tt1300854", 16 | "ImdbLink": "http:\/\/www.imdb.com\/title\/tt1300854\/", 17 | "Size": "1.95 GB", 18 | "SizeByte": "2093796557", 19 | "MovieRating": "7.5", 20 | "Genre": "Action", 21 | "Uploader": "YIFY", 22 | "UploaderUID": "16", 23 | "Downloaded": "123441", 24 | "TorrentSeeds": "227", 25 | "TorrentPeers": "42", 26 | "TorrentUrl": "http:\/\/yts.re\/download\/start\/Iron_Man_3_2013_1080p_3D_HSBS_BluRay_x264_YIFY_mp4.torrent", 27 | "TorrentHash": "48dbbfdcb66409cf7b209a9c560a87ea4cb4459c", 28 | "TorrentMagnetUrl": "magnet:?xt=urn:btih:48dbbfdcb66409cf7b209a9c560a87ea4cb4459c&dn=Iron+Man+3&tr=http:\/\/exodus.desync.com:6969\/announce&tr=udp:\/\/tracker.openbittorrent.com:80\/announce&tr=udp:\/\/tracker.1337x.org:80\/announce&tr=udp:\/\/exodus.desync.com:6969\/announce&tr=udp:\/\/tracker.yify-torrents.com\/announce" 29 | } 30 | ] 31 | } 32 | --------------------------------------------------------------------------------