├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── bin └── scene-release-renamer ├── composer.json ├── composer.lock ├── phpunit.xml ├── src ├── Command │ └── RenamerCommand.php ├── Console.php └── Release.php ├── tests └── ReleaseTest.php └── utils ├── debug.php ├── populate-tests.php ├── releases.json └── releases.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # OS generated files # 2 | ###################### 3 | .DS_Store 4 | .DS_Store? 5 | ._* 6 | .Spotlight-V100 7 | .Trashes 8 | ehthumbs.db 9 | Thumbs.db 10 | 11 | /vendor/ 12 | 13 | *.mov 14 | *.avi 15 | *.mkv 16 | *.mp4 17 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - '7.1' 5 | 6 | install: 7 | - composer install 8 | 9 | addons: 10 | code_climate: 11 | repo_token: 8023799c9911249afedc10382b471e6559183b03eaa4d560fc7bc13317945e30 12 | 13 | before_install: 14 | - sudo apt-get -qq update 15 | - sudo apt-get install -y mediainfo 16 | 17 | after_success: 18 | - vendor/bin/test-reporter 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Tobias 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Scene Release Parser 2 | 3 | [![Build Status](https://travis-ci.org/thcolin/scene-release-parser.svg?branch=master)](https://travis-ci.org/thcolin/scene-release-parser) 4 | [![Code Climate](https://codeclimate.com/github/thcolin/scene-release-parser/badges/gpa.svg)](https://codeclimate.com/github/thcolin/scene-release-parser) 5 | [![Test Coverage](https://codeclimate.com/github/thcolin/scene-release-parser/badges/coverage.svg)](https://codeclimate.com/github/thcolin/scene-release-parser/coverage) 6 | 7 | PHP Library parsing a scene release name to retrieve title and tags (original from [majestixx/scene-release-parser-php-lib](https://github.com/majestixx/scene-release-parser-php-lib)). 8 | 9 | The library is made of one class : `thcolin\SceneReleaseParser\Release`, the constructor will try to extract all the tags from the release name and creates `getters` for each one, remaining parts will construct the title of the media (movie or tv show). 10 | 11 | ## Installation 12 | Install with composer : 13 | ``` 14 | composer require thcolin/scene-release-parser dev-master 15 | ``` 16 | 17 | ## Release Example : 18 | Easiest way to start using the lib is to instantiating a new `Release` object with a scene release name as first argument, it will retrieve all the tags and the name : 19 | 20 | ```php 21 | use thcolin\SceneReleaseParser\Release; 22 | 23 | // Optionals arguments 24 | $strict = true; // if no tags found, it will throw an exception 25 | $defaults = []; // defaults values for : language, resolution and year 26 | 27 | $Release = new Release("Mr.Robot.S01E05.PROPER.VOSTFR.720p.WEB-DL.DD5.1.H264-ARK01", $strict, $defaults); 28 | 29 | // TYPE 30 | echo($Release -> getType()); // tvshow (::TVSHOW) 31 | 32 | // TITLE 33 | echo($Release -> getTitle()); // Mr Robot 34 | 35 | // LANGUAGE 36 | echo($Release -> getLanguage()); // VOSTFR 37 | 38 | // YEAR 39 | echo($Release -> getYear()); // null (no tag in the release name) 40 | echo($Release -> guessYear()); // 2015 (year of the system) 41 | echo($Release -> guess() -> getYear()); // 2015 (year of the system) 42 | 43 | // RESOLUTION 44 | echo($Release -> getResolution()); // 720p 45 | 46 | // SOURCE 47 | echo($Release -> getSource()); // WEB 48 | 49 | // DUB 50 | echo($Release -> getDub()); // null (no tag in the release name) 51 | 52 | // ENCODING 53 | echo($Release -> getEncoding()); // h264 54 | 55 | // GROUP 56 | echo($Release -> getGroup()); // ARK01 57 | 58 | // FLAGS 59 | print_r($Release -> getFlags()); // [PROPER, DD5.1] 60 | 61 | // SCORE 62 | echo($Release -> getScore()); // 7 (bigger is better, max : 7) 63 | 64 | // ONLY TVSHOW 65 | echo($Release -> getSeason()); // 1 66 | echo($Release -> getEpisode()); // 5 67 | ``` 68 | 69 | ## Guess 70 | Unknown informations of a current `Release` can be guessed : 71 | 72 | ```php 73 | use thcolin\SceneReleaseParser\Release; 74 | 75 | $Release = new Release("Bataille a Seattle BDRip", false, [ 76 | 'language' => 'FRENCH' // default to Release::LANGUAGE_DEFAULT (VO) 77 | ]); 78 | 79 | // LANGUAGE 80 | echo($Release -> getLanguage()); // null 81 | echo($Release -> guessLanguage()); // FRENCH 82 | 83 | // RESOLUTION 84 | echo($Release -> getResolution()); // null 85 | echo($Release -> guessResolution()); // SD 86 | 87 | // YEAR 88 | echo($Release -> getYear()); // null 89 | echo($Release -> guessYear()); // 2017 (current year) 90 | 91 | // Will set guessed values to the Release 92 | $Release -> guess(); 93 | 94 | // LANGUAGE 95 | echo($Release -> getLanguage()); // FRENCH 96 | 97 | // RESOLUTION 98 | echo($Release -> getResolution()); // SD 99 | 100 | // YEAR 101 | echo($Release -> getYear()); // 2017 (current year) 102 | ``` 103 | 104 | ## Analyze 105 | For best results, you can directly analyze a `file`, the method will use `mediainfo` : 106 | 107 | ```php 108 | use thcolin\SceneReleaseParser\Release; 109 | 110 | // Mhor\MediaInfo::setConfig arguments (default to empty) 111 | $mediainfo = [ 112 | // Optional, just for example 113 | 'command' => '/usr/local/bin/mediainfo' 114 | ]; 115 | 116 | $Release = Release::analyze('/home/downloads/Bataille a Seattle BDRip.avi', $mediainfo); 117 | 118 | // RELEASE 119 | echo($Release -> getRelease(Release::GENERATED_RELEASE)): // Bataille.A.Seattle.FRENCH.720p.BDRip.x264-NOTEAM 120 | 121 | // RESOLUTION 122 | echo($Release -> getResolution()); // 720p 123 | 124 | // ENCODING 125 | echo($Release -> getEncoding()); // x264 126 | 127 | // LANGUAGE 128 | echo($Release -> getLanguage()); // FRENCH 129 | ``` 130 | 131 | ## Bin 132 | Inside `bin` folder, you got a `scene-release-renamer` executable, which require a `` argument (default to current working directory). It will scan ``, searching for video files (avi, mp4, mkv, mov) and folders to rename (if dirty) with valid generated scene release name. Scene release name will be constructed with current file name and `mediainfo` parsed informations (if available). If errors comes up, you'll be able to fix them manually. 133 | 134 | ### Usage 135 | ``` 136 | php bin/scene-release-renamer [--non-verbose] [--non-interactive] [--non-invasive] [--mediainfo=/usr/local/bin/mediainfo] [--default-(language|resolution|year)=value] 137 | ``` 138 | 139 | ## Results : 140 | | Original | Generated | 141 | | -------- | --------- | 142 | | Benjamin Button [x264] [HD 720p] [LUCN] [FR].mp4 | Benjamin.Button.FRENCH.720p.HDRip.x264-NOTEAM.mp4 | 143 | | Jamais entre amis (2015) [1080p] MULTI (VFQ-VOA) Bluray x264 AC3-PopHD (Sleeping with Other People).mkv | Jamais.Entre.Amis.2015.MULTI.1080p.BLURAY.x264.AC3-PopHD.mkv | 144 | | La Vie rêvée de Walter Mitty [1080p] MULTi 2013 BluRay x264-Pop (The Secret Life Of Walter Mitty) .mkv | La.Vie.Rêvée.De.Walter.Mitty.2013.MULTI.1080p.BLURAY.x264-Pop.mkv | 145 | | Le Nouveau Stagiaire (2015) The Intern - Multi 1080p - x264 AAC 5.1 - CCATS.mkv | Le.Nouveau.Stagiaire.2015.MULTI.1080p.x264-CCATS.mkv | 146 | | Le prestige (2006) (The Prestige) 720p x264 AAC 5.1 MULTI [NOEX].mkv | Le.Prestige.2006.MULTI.720p.x264-NOTEAM.mkv | 147 | | Les 4 Fantastiques 2015 Truefrench 720p x264 AAC PIXEL.mp4 | Les.4.Fantastiques.2015.TRUEFRENCH.720p.x264-NOTEAM.mp4 | 148 | | One.For.the.Money.2012.1080p.HDrip.French.x264 (by kimo).mkv | One.For.The.Money.2012.FRENCH.1080p.HDRip.x264-NOTEAM.mkv | 149 | | Tower Heist [1080p] MULTI 2011 BluRay x264-Pop .Le casse De Central Park. .mkv | Tower.Heist.2011.MULTI.1080p.BLURAY.x264-Pop.mkv | 150 | 151 | ## Tests 152 | Use PHPUnit, there is a script to generate the json data for the tests in the folder `/utils`, it will take the release names from the `releases.txt` file in the same folder. Use it to generate the data needed for the tests, but before testing, make sure all the datas generated are valid, if not this would be useless. 153 | 154 | ## Bugs 155 | | Original | Generated | 156 | | -------- | --------- | 157 | | The Shawshank Redemption (1994) MULTi (VFQ-VO-VFF) 1080p BluRay x264-PopHD (Les Évadés) | The.Shawshank.1994.MULTI.1080p.BLURAY.x264-NOTEAM | 158 | | La ligne Verte (1999) MULTi-VF2 [1080p] BluRay x264-PopHD (The Green Mile) | La.Ligne.1999.MULTI.1080p.BLURAY.x264-PopHD | 159 | 160 | ## TODO 161 | * `Release->guessResolution()` should consider `$Release->source` 162 | * Add `Release::LANGUAGE_*` constants 163 | * Use them in `ReleaseTest` 164 | * And `README ## Guess` 165 | * Add `boolean $flags` for `Release::__toString` 166 | * implement option in `Release::getRelease` too 167 | * if `true` will add `Release->flags` to generated release name 168 | * Resolve CodeCoverage issues 169 | 170 | -------------------------------------------------------------------------------- /bin/scene-release-renamer: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | run(); 10 | 11 | ?> 12 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "thcolin/scene-release-parser", 3 | "type": "library", 4 | "license": "MIT", 5 | "authors": [ 6 | { 7 | "name": "thcolin", 8 | "email": "th.colin3@gmail.com" 9 | } 10 | ], 11 | "autoload": { 12 | "psr-4": { 13 | "thcolin\\SceneReleaseParser\\": "src/" 14 | } 15 | }, 16 | "require": { 17 | "mhor/php-mediainfo": "~2.1", 18 | "symfony/console": "^3.2", 19 | "symfony/framework-bundle": "^3.2" 20 | }, 21 | "require-dev": { 22 | "codeclimate/php-test-reporter": "dev-master", 23 | "phpunit/phpunit": "^6.2" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ./tests/ 6 | 7 | 8 | 9 | 10 | ./vendor 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/Command/RenamerCommand.php: -------------------------------------------------------------------------------- 1 | setName('renamer') 20 | -> setDescription('Rename scene releases media files with "mediainfo" informations') 21 | -> addOption('non-verbose', null, InputOption::VALUE_NONE, "The app will not show you ignored targets") 22 | -> addOption('non-interactive', null, InputOption::VALUE_NONE, "The app will not ask you to correct unhandleable targets") 23 | -> addOption('non-invasive', null, InputOption::VALUE_NONE, "The app will not really rename targets") 24 | -> addOption('default-language', null, InputOption::VALUE_REQUIRED, "Default language to use") 25 | -> addOption('default-resolution', null, InputOption::VALUE_REQUIRED, "Default resolution to use") 26 | -> addOption('default-year', null, InputOption::VALUE_REQUIRED, "Default year to use") 27 | -> addOption('mediainfo', null, InputOption::VALUE_REQUIRED, "Mediainfo bin path") 28 | -> addArgument('path', InputArgument::OPTIONAL, 'Path you want to analyze (default is current working directory)', '.'); 29 | } 30 | 31 | protected function execute(InputInterface $input, OutputInterface $output){ 32 | $verbose = !$input -> getOption('non-verbose'); 33 | $interactive = !$input -> getOption('non-interactive'); 34 | $invasive = !$input -> getOption('non-invasive'); 35 | 36 | $path = realpath($input -> getArgument('path')); 37 | 38 | if(!$path){ 39 | throw new Exception('Incorrect path : "'.$input -> getArgument('path').'"'); 40 | } else if(!is_writable($path)){ 41 | throw new Exception('Unwritable path : "'.$input -> getArgument('path').'" (look at permissions)'); 42 | } 43 | 44 | $mediainfo = []; 45 | 46 | if($input -> getOption('mediainfo')){ 47 | $mediainfo['command'] = $input -> getOption('mediainfo'); 48 | } 49 | 50 | $defaults = []; 51 | 52 | foreach(['language', 'resolution', 'year'] as $key){ 53 | $value = $input -> getOption('default-'.$key); 54 | 55 | if($value){ 56 | $defaults[$key] = $value; 57 | } 58 | } 59 | 60 | $output -> write('Scanning : '.$path.''); 61 | 62 | $scandir = scandir($path); 63 | $targets = []; 64 | $ignored = []; 65 | $results = [ 66 | 'renamed' => 0, 67 | 'untouched' => 0, 68 | 'errors' => 0 69 | ]; 70 | 71 | foreach($scandir as $key => $filename){ 72 | $filepath = $path.'/'.$filename; 73 | $basename = pathinfo($filename, PATHINFO_FILENAME); 74 | $ext = pathinfo($filename, PATHINFO_EXTENSION); 75 | 76 | if(in_array($filename, ['.', '..']) || substr($filename, 0, 1) === '.'){ 77 | unset($scandir[$key]); 78 | continue; 79 | } 80 | 81 | if(is_file($filepath) && in_array($ext, ['mp4', 'avi', 'mkv', 'mov'])){ 82 | $targets[$basename] = $filepath; 83 | } else if(is_dir($filepath)){ 84 | $targets[$basename] = $filepath; 85 | } else{ 86 | $ignored[$basename] = $filepath; 87 | } 88 | } 89 | 90 | $output -> write("\x0D\x1B[2K"); 91 | $output -> writeln('Scanning : '.$path.' ('.count($targets).'/'.count($scandir).')'); 92 | 93 | if($verbose && count($ignored)){ 94 | $output -> writeln(''); 95 | $output -> writeln('Ignoring untargeted files and folders :'); 96 | 97 | foreach($ignored as $basename => $path){ 98 | $output -> writeln(' * '.$basename); 99 | } 100 | } 101 | 102 | if(!count($targets)){ 103 | throw new Exception('No scene release target (file or folder) found !'); 104 | } 105 | 106 | $output -> writeln(''); 107 | 108 | foreach($targets as $target => $path){ 109 | try{ 110 | try{ 111 | $release = Release::analyse($path, $mediainfo); 112 | } catch(Exception $e){ 113 | $release = new Release($target, true, $defaults); 114 | } 115 | 116 | $reset = !$release -> getYear(); 117 | $release -> guess(); 118 | 119 | if($reset){ 120 | $release -> setYear(null); 121 | } 122 | 123 | if($target === $release -> __toString()){ 124 | if($verbose){ 125 | $output -> writeln('Ignoring valid scene release file : '.$path.''); 126 | } 127 | 128 | $results['untouched']++; 129 | continue; 130 | } 131 | 132 | $question = new Question('Rename '.$target.' to '.$release -> __toString().' ? [Y/n'.($interactive ? '/c':'').'] ', 'Y'); 133 | $answer = $this -> getHelper('question') -> ask($input, $output, $question); 134 | 135 | if(in_array($answer, ['n', 'N'])){ 136 | $results['untouched']++; 137 | continue; 138 | } else if(in_array($answer, ['c', 'C']) && $interactive){ 139 | $release = $this -> correct($input, $output, $release); 140 | } else { 141 | $output -> write(str_repeat("\x1B[1A\x1B[2K", 1)); 142 | } 143 | } catch(Exception $e){ 144 | if($interactive){ 145 | $output -> writeln('Unhandleable target which need manual corrections : '.$target.''); 146 | $release = new Release($target, false, $defaults); 147 | $reset = !$release -> getYear(); 148 | $release -> guess(); 149 | 150 | if($reset){ 151 | $release -> setYear(null); 152 | } 153 | 154 | $release = $this -> correct($input, $output, $release); 155 | } else{ 156 | $results['untouched']++; 157 | continue; 158 | } 159 | } 160 | 161 | if(!is_writable($path)){ 162 | $output -> writeln('Target '.$target.' can\'t be renamed because of permissions'); 163 | $results['errors']++; 164 | } else{ 165 | $output -> writeln('Target '.$target.' renamed to '.$release -> __toString().''); 166 | 167 | if($invasive){ 168 | $filepath = dirname($path).'/'.$release -> __toString().(pathinfo($path, PATHINFO_EXTENSION) ? '.'.pathinfo($path, PATHINFO_EXTENSION) : ''); 169 | rename($path, $filepath); 170 | } 171 | 172 | $results['renamed']++; 173 | } 174 | } 175 | 176 | $output -> writeln(''); 177 | $output -> writeln('Results :'); 178 | $output -> writeln(' * '.$results['renamed'].' targets renamed'); 179 | $output -> writeln(' * '.$results['untouched'].' targets untouched'); 180 | $output -> writeln(' * '.$results['errors'].' targets thrown errors'); 181 | } 182 | 183 | protected function correct(InputInterface $input, OutputInterface $output, Release $release){ 184 | $done = false; 185 | 186 | do{ 187 | $output->writeln(''); 188 | $output->writeln('Release : '.$release -> __toString().' :'); 189 | 190 | $choices = [ 191 | 'title' => ($release -> getTitle() ? $release -> getTitle() : 'null'), 192 | 'year' => ($release -> getYear() ? $release -> getYear() : 'null'), 193 | 'language' => ($release -> getLanguage() ? $release -> getLanguage() : 'null'), 194 | 'resolution' => ($release -> getResolution() ? $release -> getResolution() : 'null'), 195 | 'source' => ($release -> getSource() ? $release -> getSource() : 'null'), 196 | 'dub' => ($release -> getDub() ? $release -> getDub() : 'null'), 197 | 'encoding' => ($release -> getEncoding() ? $release -> getEncoding() : 'null'), 198 | 'group' => ($release -> getGroup() ? $release -> getGroup() : 'null'), 199 | 'season' => ($release -> getSeason() ? $release -> getSeason() : 'null'), 200 | 'episode' => ($release -> getEpisode() ? $release -> getEpisode() : 'null') 201 | ]; 202 | 203 | $question = new ChoiceQuestion('Which property do you want to edit ? ', $choices); 204 | $question -> setValidator(function($answer) use ($choices){ 205 | if(!$answer){ 206 | return null; 207 | } 208 | 209 | if(!in_array($answer, array_keys($choices))){ 210 | throw new Exception('Select a valid property to edit in : '.implode(', ', array_keys($choices))); 211 | } 212 | 213 | return $answer; 214 | }); 215 | $answer = $this->getHelper('question')->ask($input, $output, $question); 216 | 217 | switch($answer){ 218 | case 'title': 219 | $question = new Question('Replace old title : '); 220 | $question -> setAutocompleterValues([$release -> getTitle()]); 221 | $question -> setValidator(function($answer){ 222 | if(strlen($answer) === 0){ 223 | throw new Exception('A title is expected'); 224 | } 225 | 226 | return $answer; 227 | }); 228 | $value = $this->getHelper('question')->ask($input, $output, $question); 229 | $release -> setTitle($value); 230 | break; 231 | case 'year': 232 | $question = new Question('Replace old year : '); 233 | $question -> setAutocompleterValues([$release -> getYear()]); 234 | $question -> setValidator(function($answer){ 235 | if(!$answer){ 236 | return null; 237 | } 238 | 239 | $answer = intval($answer); 240 | 241 | if($answer < 1900){ 242 | throw new Exception('The year should be a 4 digit number'); 243 | } 244 | 245 | return $answer; 246 | }); 247 | $value = $this->getHelper('question')->ask($input, $output, $question); 248 | $release -> setYear($value); 249 | break; 250 | case 'language': 251 | $values = array_keys(Release::$languageStatic); 252 | $question = new Question('Replace old language : '); 253 | $question -> setAutocompleterValues($values); 254 | $question -> setValidator(function($answer) use ($values){ 255 | if(!$answer){ 256 | return null; 257 | } 258 | 259 | $answer = strtoupper($answer); 260 | 261 | if(!in_array($answer, $values)){ 262 | throw new Exception('The language should be one of : '.implode(', ', $values)); 263 | } 264 | 265 | return $answer; 266 | }); 267 | $value = $this->getHelper('question')->ask($input, $output, $question); 268 | $release -> setLanguage($value); 269 | break; 270 | case 'resolution': 271 | $values = array_keys(Release::$resolutionStatic); 272 | $question = new ChoiceQuestion('Select resolution : ', $values); 273 | $question -> setAutocompleterValues($values); 274 | $question -> setValidator(function($answer) use ($values){ 275 | if(!$answer){ 276 | return null; 277 | } 278 | 279 | if(!in_array($answer, $values)){ 280 | throw new Exception('The resolution should be one of : '.implode(', ', $values)); 281 | } 282 | 283 | return $answer; 284 | }); 285 | $value = $this->getHelper('question')->ask($input, $output, $question); 286 | $release -> setResolution($value); 287 | break; 288 | case 'source': 289 | $values = array_keys(Release::$sourceStatic); 290 | $question = new ChoiceQuestion('Select source : ', $values); 291 | $question -> setAutocompleterValues($values); 292 | $question -> setValidator(function($answer) use ($values){ 293 | if(!$answer){ 294 | return null; 295 | } 296 | 297 | if(!in_array($answer, $values)){ 298 | throw new Exception('The source should be one of : '.implode(', ', $values)); 299 | } 300 | 301 | return $answer; 302 | }); 303 | $value = $this->getHelper('question')->ask($input, $output, $question); 304 | $release -> setSource($value); 305 | break; 306 | case 'dub': 307 | $values = array_keys(Release::$dubStatic); 308 | $question = new ChoiceQuestion('Select dub : ', $values); 309 | $question -> setAutocompleterValues($values); 310 | $question -> setValidator(function($answer) use ($values){ 311 | if(!$answer){ 312 | return null; 313 | } 314 | 315 | if(!in_array($answer, $values)){ 316 | throw new Exception('The dub should be one of : '.implode(', ', $values)); 317 | } 318 | 319 | return $answer; 320 | }); 321 | $value = $this->getHelper('question')->ask($input, $output, $question); 322 | $release -> setDub($value); 323 | break; 324 | case 'encoding': 325 | $values = array_keys(Release::$encodingStatic); 326 | $question = new ChoiceQuestion('Select encoding : ', $values); 327 | $question -> setAutocompleterValues($values); 328 | $question -> setValidator(function($answer) use ($values){ 329 | if(!$answer){ 330 | return null; 331 | } 332 | 333 | if(!in_array($answer, $values)){ 334 | throw new Exception('The encoding should be one of : '.implode(', ', $values)); 335 | } 336 | 337 | return $answer; 338 | }); 339 | $value = $this->getHelper('question')->ask($input, $output, $question); 340 | $release -> setEncoding($value); 341 | break; 342 | case 'group': 343 | $question = new Question('Replace old group : '); 344 | $question -> setAutocompleterValues([$release -> getGroup()]); 345 | $value = $this->getHelper('question')->ask($input, $output, $question); 346 | $release -> setGroup($value); 347 | break; 348 | case 'season': 349 | $question = new Question('Replace old season # : '); 350 | $question -> setAutocompleterValues([$release -> getSeason()]); 351 | $question -> setValidator(function($answer){ 352 | if(!$answer){ 353 | return null; 354 | } 355 | 356 | $answer = intval($answer); 357 | 358 | if($answer === 0){ 359 | throw new Exception('The season should be a number'); 360 | } 361 | 362 | return $answer; 363 | }); 364 | $value = $this->getHelper('question')->ask($input, $output, $question); 365 | $release -> setSeason($value); 366 | break; 367 | case 'episode': 368 | $question = new Question('Replace old episode # : '); 369 | $question -> setAutocompleterValues([$release -> getEpisode()]); 370 | $question -> setValidator(function($answer){ 371 | if(!$answer){ 372 | return null; 373 | } 374 | 375 | $answer = intval($answer); 376 | 377 | if($answer === 0){ 378 | throw new Exception('The episode should be a number'); 379 | } 380 | 381 | return $answer; 382 | }); 383 | $value = $this->getHelper('question')->ask($input, $output, $question); 384 | $release -> setEpisode($value); 385 | break; 386 | default: 387 | $done = true; 388 | break; 389 | } 390 | } while(!$done); 391 | 392 | $output -> writeln(''); 393 | 394 | return $release; 395 | } 396 | 397 | } 398 | 399 | ?> 400 | -------------------------------------------------------------------------------- /src/Console.php: -------------------------------------------------------------------------------- 1 | setArguments(); 24 | 25 | return $inputDefinition; 26 | } 27 | 28 | } 29 | 30 | ?> 31 | -------------------------------------------------------------------------------- /src/Release.php: -------------------------------------------------------------------------------- 1 | [ 55 | 'cam', 56 | 'camrip', 57 | 'cam-rip', 58 | 'ts', 59 | 'telesync', 60 | 'pdvd' 61 | ], 62 | self::SOURCE_TC => [ 63 | 'tc', 64 | 'telecine' 65 | ], 66 | self::SOURCE_DVDRIP => [ 67 | 'dvdrip', 68 | 'dvd-rip' 69 | ], 70 | self::SOURCE_DVDSCR => [ 71 | 'dvdscr', 72 | 'dvd-scr', 73 | 'dvdscreener', 74 | 'screener', 75 | 'scr', 76 | 'DDC' 77 | ], 78 | self::SOURCE_BDSCR => [ 79 | 'bluray-scr', 80 | 'bdscr' 81 | ], 82 | self::SOURCE_WEB_DL => [ 83 | 'webtv', 84 | 'web-tv', 85 | 'webdl', 86 | 'web-dl', 87 | 'webrip', 88 | 'web-rip', 89 | 'webhd', 90 | 'web' 91 | ], 92 | self::SOURCE_BDRIP => [ 93 | 'bdrip', 94 | 'bd-rip', 95 | 'brrip', 96 | 'br-rip' 97 | ], 98 | self::SOURCE_DVD_R => [ 99 | 'dvd', 100 | 'dvdr', 101 | 'dvd-r', 102 | 'dvd-5', 103 | 'dvd-9', 104 | 'r6-dvd' 105 | ], 106 | self::SOURCE_R5 => [ 107 | 'r5' 108 | ], 109 | self::SOURCE_HDRIP => [ 110 | 'hdrip', 111 | 'hdlight', 112 | 'mhd', 113 | 'hd' 114 | ], 115 | self::SOURCE_BLURAY => [ 116 | 'bluray', 117 | 'blu-ray', 118 | 'bdr' 119 | ], 120 | self::SOURCE_PDTV => [ 121 | 'pdtv' 122 | ], 123 | self::SOURCE_SDTV => [ 124 | 'sdtv', 125 | 'dsr', 126 | 'dsrip', 127 | 'satrip', 128 | 'dthrip', 129 | 'dvbrip' 130 | ], 131 | self::SOURCE_HDTV => [ 132 | 'hdtv', 133 | 'hdtvrip', 134 | 'hdtv-rip' 135 | ] 136 | ]; 137 | 138 | public static $encodingStatic = [ 139 | self::ENCODING_DIVX => [ 140 | 'divx' 141 | ], 142 | self::ENCODING_XVID => [ 143 | 'xvid' 144 | ], 145 | self::ENCODING_X264 => [ 146 | 'x264', 147 | 'x.264' 148 | ], 149 | self::ENCODING_X265 => [ 150 | 'x265', 151 | 'x.265' 152 | ], 153 | self::ENCODING_H264 => [ 154 | 'h264', 155 | 'h.264' 156 | ] 157 | ]; 158 | 159 | public static $resolutionStatic = [ 160 | self::RESOLUTION_SD => [ 161 | 'sd' 162 | ], 163 | self::RESOLUTION_720P => [ 164 | '720p' 165 | ], 166 | self::RESOLUTION_1080P => [ 167 | '1080p' 168 | ] 169 | ]; 170 | 171 | public static $dubStatic = [ 172 | self::DUB_DUBBED => [ 173 | 'dubbed' 174 | ], 175 | self::DUB_AC3 => [ 176 | 'ac3.dubbed', 177 | 'ac3' 178 | ], 179 | self::DUB_MD => [ 180 | 'md', 181 | 'microdubbed', 182 | 'micro-dubbed' 183 | ], 184 | self::DUB_LD => [ 185 | 'ld', 186 | 'linedubbed', 187 | 'line-dubbed' 188 | ] 189 | ]; 190 | 191 | public static $languageStatic = [ 192 | 'FRENCH' => [ 193 | 'FRENCH', 194 | 'Français', 195 | 'Francais', 196 | 'FR' 197 | ], 198 | 'TRUEFRENCH' => [ 199 | 'TRUEFRENCH', 200 | 'VFF' 201 | ], 202 | 'VFQ' => 'VFQ', 203 | 'VOSTFR' => [ 204 | 'STFR', 205 | 'VOSTFR', 206 | ], 207 | 'PERSIAN' => 'PERSIAN', 208 | 'AMHARIC' => 'AMHARIC', 209 | 'ARABIC' => 'ARABIC', 210 | 'CAMBODIAN' => 'CAMBODIAN', 211 | 'CHINESE' => 'CHINESE', 212 | 'CREOLE' => 'CREOLE', 213 | 'DANISH' => 'DANISH', 214 | 'DUTCH' => 'DUTCH', 215 | 'ENGLISH' => [ 216 | 'ENGLISH', 217 | 'EN', 218 | 'VOA' 219 | ], 220 | 'ESTONIAN' => 'ESTONIAN', 221 | 'FILIPINO' => 'FILIPINO', 222 | 'FINNISH' => 'FINNISH', 223 | 'FLEMISH' => 'FLEMISH', 224 | 'GERMAN' => 'GERMAN', 225 | 'GREEK' => 'GREEK', 226 | 'HEBREW' => 'HEBREW', 227 | 'INDONESIAN' => 'INDONESIAN', 228 | 'IRISH' => 'IRISH', 229 | 'ITALIAN' => 'ITALIAN', 230 | 'JAPANESE' => 'JAPANESE', 231 | 'KOREAN' => 'KOREAN', 232 | 'LAOTIAN' => 'LAOTIAN', 233 | 'LATVIAN' => 'LATVIAN', 234 | 'LITHUANIAN' => 'LITHUANIAN', 235 | 'MALAY' => 'MALAY', 236 | 'MALAYSIAN' => 'MALAYSIAN', 237 | 'MAORI' => 'MAORI', 238 | 'NORWEGIAN' => 'NORWEGIAN', 239 | 'PASHTO' => 'PASHTO', 240 | 'POLISH' => 'POLISH', 241 | 'PORTUGUESE' => 'PORTUGUESE', 242 | 'ROMANIAN' => 'ROMANIAN', 243 | 'RUSSIAN' => 'RUSSIAN', 244 | 'SPANISH' => 'SPANISH', 245 | 'SWAHILI' => 'SWAHILI', 246 | 'SWEDISH' => 'SWEDISH', 247 | 'SWISS' => 'SWISS', 248 | 'TAGALOG' => 'TAGALOG', 249 | 'TAJIK' => 'TAJIK', 250 | 'THAI' => 'THAI', 251 | 'TURKISH' => 'TURKISH', 252 | 'UKRAINIAN' => 'UKRAINIAN', 253 | 'VIETNAMESE' => 'VIETNAMESE', 254 | 'WELSH' => 'WELSH', 255 | self::LANGUAGE_MULTI => 'MULTI' 256 | ]; 257 | 258 | public static $flagsStatic = [ 259 | 'PROPER' => 'PROPER', 260 | 'FASTSUB' => 'FASTSUB', 261 | 'LIMITED' => 'LIMITED', 262 | 'SUBFRENCH' => 'SUBFRENCH', 263 | 'SUBFORCED' => 'SUBFORCED', 264 | 'LIMITED' => 'LIMITED', 265 | 'EXTENDED' => 'EXTENDED', 266 | 'THEATRICAL' => 'THEATRICAL', 267 | 'WORKPRINT' => [ 268 | 'WORKPRINT', 269 | 'WP' 270 | ], 271 | 'FANSUB' => 'FANSUB', 272 | 'REPACK' => 'REPACK', 273 | 'UNRATED' => 'UNRATED', 274 | 'NFOFIX' => 'NFOFIX', 275 | 'NTSC' => 'NTSC', 276 | 'PAL' => 'PAL', 277 | 'INTERNAL' => [ 278 | 'INTERNAL', 279 | 'INT' 280 | ], 281 | 'FESTIVAL' => 'FESTIVAL', 282 | 'STV' => 'STV', 283 | 'LIMITED' => 'LIMITED', 284 | 'RERIP' => 'RERIP', 285 | 'RETAIL' => 'RETAIL', 286 | 'REMASTERED' => 'REMASTERED', 287 | 'UNRATED' => 'UNRATED', 288 | 'RATED' => 'RATED', 289 | 'CHRONO' => 'CHRONO', 290 | 'HDLIGHT' => 'HDLIGHT', 291 | 'UNCUT' => 'UNCUT', 292 | 'UNCENSORED' => 'UNCENSORED', 293 | 'COMPLETE' => 'COMPLETE', 294 | 'UNTOUCHED' => 'UNTOUCHED', 295 | 'DC' => 'DC', 296 | 'DUBBED' => 'DUBBED', 297 | 'SUBBED' => 'SUBBED', 298 | 'REMUX' => 'REMUX', 299 | 'DUAL' => 'DUAL', 300 | 'FINAL' => 'FINAL', 301 | 'COLORIZED' => 'COLORIZED', 302 | 'WS' => 'WS', 303 | 'DL' => 'DL', 304 | 'DOLBY DIGITAL' => 'DOLBY DIGITAL', 305 | 'DTS' => 'DTS', 306 | 'AAC' => 'AAC', 307 | 'DTS-HD' => 'DTS-HD', 308 | 'DTS-MA' => 'DTS-MA', 309 | 'TRUEHD' => 'TRUEHD', 310 | '3D' => '3D', 311 | 'HSBS' => 'HSBS', 312 | 'HOU' => 'HOU', 313 | 'DOC' => 'DOC', 314 | 'RERIP' => [ 315 | 'rerip', 316 | 're-rip' 317 | ], 318 | 'DD5.1' => [ 319 | 'dd5.1', 320 | 'dd51', 321 | 'dd5-1', 322 | '5.1', 323 | '5-1' 324 | ], 325 | 'READNFO' => [ 326 | 'READ.NFO', 327 | 'READ-NFO', 328 | 'READNFO' 329 | ] 330 | ]; 331 | 332 | protected $release = null; 333 | protected $strict = true; 334 | protected $defaults = []; 335 | protected $type = null; 336 | protected $title = null; 337 | protected $year = 0; 338 | protected $language = null; 339 | protected $resolution = null; 340 | protected $source = null; 341 | protected $dub = null; 342 | protected $encoding = null; 343 | protected $group = null; 344 | protected $flags = []; 345 | 346 | protected $season = 0; 347 | protected $episode = 0; 348 | 349 | public function __construct($name, $strict = true, $defaults = []){ 350 | foreach($defaults as $key => $default){ 351 | $const = $key.'Static'; 352 | 353 | if(property_exists(get_class(), $const) && !in_array($default, array_keys(self::$$const))){ 354 | trigger_error('Default "'.$key.'" should be a value from Release::$'.$const); 355 | } 356 | } 357 | 358 | $this -> strict = $strict; 359 | $this -> defaults = $defaults; 360 | 361 | // CLEAN 362 | $cleaned = $this -> clean($name); 363 | 364 | $this -> original = $name; 365 | $this -> release = $cleaned; 366 | $title = $cleaned; 367 | 368 | // LANGUAGE 369 | $language = $this -> parseLanguage($title); 370 | $this -> setLanguage($language); 371 | 372 | // SOURCE 373 | $source = $this -> parseSource($title); 374 | $this -> setSource($source); 375 | 376 | // ENCODING 377 | $encoding = $this -> parseEncoding($title); 378 | $this -> setEncoding($encoding); 379 | 380 | // RESOLUTION 381 | $resolution = $this -> parseResolution($title); 382 | $this -> setResolution($resolution); 383 | 384 | // DUB 385 | $dub = $this -> parseDub($title); 386 | $this -> setDub($dub); 387 | 388 | // YEAR 389 | $year = $this -> parseYear($title); 390 | $this -> setYear($year); 391 | 392 | // FLAGS 393 | $flags = $this -> parseFlags($title); 394 | $this -> setFlags($flags); 395 | 396 | // TYPE 397 | $type = $this -> parseType($title); 398 | $this -> setType($type); 399 | 400 | // GROUP 401 | $group = $this -> parseGroup($title); 402 | $this -> setGroup($group); 403 | 404 | // TITLE 405 | $title = $this -> parseTitle($title); 406 | $this -> setTitle($title); 407 | } 408 | 409 | public function __toString(){ 410 | $arrays = []; 411 | foreach([ 412 | $this -> getTitle(), 413 | $this -> getYear(), 414 | ($this -> getSeason() ? 'S'.sprintf('%02d', $this -> getSeason()):''). 415 | ($this -> getEpisode() ? 'E'.sprintf('%02d', $this -> getEpisode()):''), 416 | ($this -> getLanguage() !== self::LANGUAGE_DEFAULT ? $this -> getLanguage():''), 417 | ($this -> getResolution() !== self::RESOLUTION_SD ? $this -> getResolution():''), 418 | $this -> getSource(), 419 | $this -> getEncoding(), 420 | $this -> getDub() 421 | ] as $array){ 422 | if(is_array($array)){ 423 | $arrays[] = implode('.', $array); 424 | } else if($array){ 425 | $arrays[] = $array; 426 | } 427 | } 428 | return preg_replace('#\s+#', '.', implode('.', $arrays)).'-'.($this -> getGroup() ? $this -> getGroup():'NOTEAM'); 429 | } 430 | 431 | public static function analyse($path, $config = []){ 432 | if(!is_file($path)){ 433 | throw new InvalidArgumentException("File '".$path."' not found"); 434 | } 435 | 436 | // MEDIAINFO 437 | $mediainfo = new MediaInfo(); 438 | 439 | foreach($config as $key => $value){ 440 | $mediainfo -> setConfig($key, $value); 441 | } 442 | 443 | $container = $mediainfo -> getInfo($path); 444 | 445 | // RELEASE 446 | $basename = pathinfo($path, PATHINFO_FILENAME); 447 | $release = new Release($basename, false); 448 | 449 | foreach($container -> getVideos() as $video){ 450 | // CODEC 451 | if($codec = $video -> get('encoded_library_name')){ 452 | switch($codec){ 453 | case 'DivX': 454 | $release -> setEncoding(self::ENCODING_DIVX); 455 | continue; 456 | break; 457 | case 'x264': 458 | $release -> setEncoding(self::ENCODING_X264); 459 | continue; 460 | break; 461 | case 'x265': 462 | $release -> setEncoding(self::ENCODING_X265); 463 | continue; 464 | break; 465 | } 466 | } 467 | 468 | if($codec = $video -> get('writing_library_name')){ 469 | switch($codec){ 470 | case 'DivX': 471 | $release -> setEncoding(self::ENCODING_DIVX); 472 | continue; 473 | break; 474 | case 'x264': 475 | $release -> setEncoding(self::ENCODING_X264); 476 | continue; 477 | break; 478 | case 'x265': 479 | $release -> setEncoding(self::ENCODING_X265); 480 | continue; 481 | break; 482 | } 483 | } 484 | 485 | if($codec = $video -> get('codec_cc')){ 486 | switch($codec){ 487 | case 'DIVX': 488 | $release -> setEncoding(self::ENCODING_DIVX); 489 | continue; 490 | break; 491 | case 'XVID': 492 | $release -> setEncoding(self::ENCODING_XVID); 493 | continue; 494 | break; 495 | case 'hvc1': 496 | $release -> setEncoding(self::ENCODING_X265); 497 | continue; 498 | break; 499 | } 500 | } 501 | 502 | if(!$release -> getEncoding()){ 503 | if($codec = $video -> get('internet_media_type')){ 504 | switch($codec){ 505 | case 'video/H264': 506 | $release -> setEncoding(self::ENCODING_H264); 507 | continue; 508 | break; 509 | } 510 | } 511 | } 512 | 513 | // RESOLUTION 514 | if(!$release -> getResolution()){ 515 | $height = $video -> get('height') -> getAbsoluteValue(); 516 | $width = $video -> get('width') -> getAbsoluteValue(); 517 | 518 | if($height >= 1000 || $width >= 1900){ 519 | $release -> setResolution(self::RESOLUTION_1080P); 520 | } else if($height >= 700 || $width >= 1200){ 521 | $release -> setResolution(self::RESOLUTION_720P); 522 | } else{ 523 | $release -> setResolution(self::RESOLUTION_SD); 524 | } 525 | } 526 | } 527 | 528 | // LANGUAGE 529 | $audios = $container -> getAudios(); 530 | 531 | if(count($audios) > 1){ 532 | $release -> setLanguage(self::LANGUAGE_MULTI); 533 | } else if(count($audios) > 0){ 534 | $languages = $audios[0] -> get('language'); 535 | if($languages){ 536 | $release -> setLanguage(strtoupper($languages[1])); 537 | } 538 | } 539 | 540 | if(!$release -> getLanguage()){ 541 | // default : VO 542 | $release -> setLanguage(self::LANGUAGE_DEFAULT); 543 | } 544 | 545 | return $release; 546 | } 547 | 548 | public function getRelease($mode = self::ORIGINAL_RELEASE){ 549 | switch($mode){ 550 | case self::GENERATED_RELEASE: 551 | return $this -> __toString(); 552 | break; 553 | default: 554 | return $this -> release; 555 | break; 556 | } 557 | } 558 | 559 | private function clean($name){ 560 | $release = str_replace(['[', ']', '(', ')', ',', ';', ':', '!'], ' ', $name); 561 | $release = preg_replace('#[\s]+#', ' ', $release); 562 | $release = str_replace(' ', '.', $release); 563 | 564 | return $release; 565 | } 566 | 567 | public function guess(){ 568 | $release = $this; 569 | 570 | if(!isset($release -> year)){ 571 | $release -> setYear($release -> guessYear()); 572 | } 573 | 574 | if(!isset($release -> resolution)){ 575 | $release -> setResolution($release -> guessResolution()); 576 | } 577 | 578 | if(!isset($release -> language)){ 579 | $release -> setLanguage($release -> guessLanguage()); 580 | } 581 | 582 | return $release; 583 | } 584 | 585 | private function parseAttribute(&$title, $attribute){ 586 | if(!in_array($attribute, [self::SOURCE, self::ENCODING, self::RESOLUTION, self::DUB])){ 587 | throw new InvalidArgumentException(); 588 | } 589 | 590 | $attributes = $attribute.'Static'; 591 | 592 | foreach(self::$$attributes as $key => $patterns){ 593 | if(!is_array($patterns)){ 594 | $patterns = [$patterns]; 595 | } 596 | 597 | foreach($patterns as $pattern){ 598 | $title = preg_replace('#[\.|\-]'.preg_quote($pattern).'([\.|\-| ]|$)#i', '$1', $title, 1, $replacements); 599 | if($replacements > 0){ 600 | return $key; 601 | } 602 | } 603 | } 604 | 605 | return null; 606 | } 607 | 608 | public function getType(){ 609 | return $this -> type; 610 | } 611 | 612 | private function parseType(&$title){ 613 | $type = null; 614 | 615 | $title = preg_replace_callback('#[\.\-]S(\d+)[\.\-]?(E(\d+))?([\.\-])#i', function($matches) use (&$type){ 616 | $type = self::TVSHOW; 617 | // 01 -> 1 (numeric) 618 | $this -> setSeason(intval($matches[1])); 619 | 620 | if($matches[3]){ 621 | $this -> setEpisode(intval($matches[3])); 622 | } 623 | return $matches[4]; 624 | }, $title, 1, $count); 625 | 626 | if($count == 0){ 627 | // Not a Release 628 | if( 629 | $this -> strict && 630 | !isset($this -> resolution) && 631 | !isset($this -> source) && 632 | !isset($this -> dub) && 633 | !isset($this -> encoding) 634 | ){ 635 | throw new InvalidArgumentException('This is not a correct Scene Release name'); 636 | } 637 | 638 | // movie 639 | $type = self::MOVIE; 640 | } 641 | 642 | return $type; 643 | } 644 | 645 | public function setType($type){ 646 | $this -> type = $type; 647 | } 648 | 649 | public function getTitle(){ 650 | return $this -> title; 651 | } 652 | 653 | private function parseTitle(&$title){ 654 | $array = []; 655 | $return = ''; 656 | $title = preg_replace('#\.?\-\.#', '.', $title); 657 | $title = preg_replace('#\(.*?\)#', '', $title); 658 | $title = preg_replace('#\.+#', '.', $title); 659 | $positions = explode('.', $this -> release); 660 | 661 | foreach(array_intersect($positions, explode('.', $title)) as $key => $value){ 662 | $last = isset($last) ? $last:0; 663 | 664 | if($key - $last > 1){ 665 | $return = implode(' ', $array); 666 | break; 667 | } 668 | 669 | $array[] = $value; 670 | $return = implode(' ', $array); 671 | $last = $key; 672 | } 673 | 674 | $return = ucwords(strtolower($return)); 675 | $return = trim($return); 676 | 677 | return $return; 678 | } 679 | 680 | public function setTitle($title){ 681 | $this -> title = $title; 682 | } 683 | 684 | public function getSeason(){ 685 | return $this -> season; 686 | } 687 | 688 | public function setSeason($season){ 689 | $this -> season = $season; 690 | } 691 | 692 | public function getEpisode(){ 693 | return $this -> episode; 694 | } 695 | 696 | public function setEpisode($episode){ 697 | $this -> episode = $episode; 698 | } 699 | 700 | public function getLanguage(){ 701 | return $this -> language; 702 | } 703 | 704 | private function parseLanguage(&$title){ 705 | $languages = []; 706 | 707 | foreach(self::$languageStatic as $langue => $patterns){ 708 | if(!is_array($patterns)){ 709 | $patterns = [$patterns]; 710 | } 711 | 712 | foreach($patterns as $pattern){ 713 | $title = preg_replace('#[\.|\-]'.preg_quote($pattern).'([\.|\-]|$)#i', '$1', $title, 1, $replacements); 714 | if($replacements > 0){ 715 | $languages[] = $langue; 716 | break; 717 | } 718 | } 719 | } 720 | 721 | if(count($languages) == 1){ 722 | return $languages[0]; 723 | } else if(count($languages) > 1){ 724 | return self::LANGUAGE_MULTI; 725 | } else{ 726 | return null; 727 | } 728 | } 729 | 730 | public function guessLanguage(){ 731 | if($this -> language){ 732 | return $this -> language; 733 | } else if(isset($this -> defaults['language'])){ 734 | return $this -> defaults['language']; 735 | } else { 736 | return self::LANGUAGE_DEFAULT; 737 | } 738 | } 739 | 740 | public function setLanguage($language){ 741 | $this -> language = $language; 742 | } 743 | 744 | public function getResolution(){ 745 | return $this -> resolution; 746 | } 747 | 748 | private function parseResolution(&$title){ 749 | return $this -> parseAttribute($title, self::RESOLUTION); 750 | } 751 | 752 | public function guessResolution(){ 753 | if($this -> resolution){ 754 | return $this -> resolution; 755 | } else if($this->getSource() == self::SOURCE_BLURAY || $this->getSource() == self::SOURCE_BDSCR){ 756 | return self::RESOLUTION_1080P; 757 | } else if(isset($this -> defaults['resolution'])){ 758 | return $this -> defaults['resolution']; 759 | } else { 760 | return self::RESOLUTION_SD; 761 | } 762 | } 763 | 764 | public function setResolution($resolution){ 765 | $this -> resolution = $resolution; 766 | } 767 | 768 | public function getSource(){ 769 | return $this -> source; 770 | } 771 | 772 | private function parseSource(&$title){ 773 | return $this -> parseAttribute($title, self::SOURCE); 774 | } 775 | 776 | public function setSource($source){ 777 | $this -> source = $source; 778 | } 779 | 780 | public function getDub(){ 781 | return $this -> dub; 782 | } 783 | 784 | private function parseDub(&$title){ 785 | return $this -> parseAttribute($title, self::DUB); 786 | } 787 | 788 | public function setDub($dub){ 789 | $this -> dub = $dub; 790 | } 791 | 792 | public function getEncoding(){ 793 | return $this -> encoding; 794 | } 795 | 796 | private function parseEncoding(&$title){ 797 | return $this -> parseAttribute($title, self::ENCODING); 798 | } 799 | 800 | public function setEncoding($encoding){ 801 | $this -> encoding = $encoding; 802 | } 803 | 804 | public function getYear(){ 805 | return $this -> year; 806 | } 807 | 808 | private function parseYear(&$title){ 809 | $year = null; 810 | 811 | $title = preg_replace_callback('#[\.|\-](\d{4})([\.|\-])?#', function($matches) use (&$year){ 812 | if(isset($matches[1])){ 813 | $year = $matches[1]; 814 | } 815 | 816 | return (isset($matches[2]) ? $matches[2]:''); 817 | }, $title, 1); 818 | 819 | return $year; 820 | } 821 | 822 | public function guessYear(){ 823 | if($this -> year){ 824 | return $this -> year; 825 | } else if(isset($this -> defaults['year'])){ 826 | return $this -> defaults['year']; 827 | } else { 828 | return date('Y'); 829 | } 830 | } 831 | 832 | public function setYear($year){ 833 | $this -> year = $year; 834 | } 835 | 836 | public function getGroup(){ 837 | return $this -> group; 838 | } 839 | 840 | private function parseGroup(&$title){ 841 | $group = null; 842 | 843 | $title = preg_replace_callback('#\-([a-zA-Z0-9_\.]+)$#', function($matches) use (&$group){ 844 | if(strlen($matches[1]) > 12){ 845 | preg_match('#(\w+)#', $matches[1], $matches); 846 | } 847 | 848 | $group = preg_replace('#^\.+|\.+$#', '', $matches[1]); 849 | return ''; 850 | }, $title); 851 | 852 | return $group; 853 | } 854 | 855 | public function setGroup($group){ 856 | $this -> group = $group; 857 | } 858 | 859 | public function getFlags(){ 860 | return $this -> flags; 861 | } 862 | 863 | private function parseFlags(&$title){ 864 | $flags = []; 865 | 866 | foreach(self::$flagsStatic as $key => $patterns){ 867 | if(!is_array($patterns)){ 868 | $patterns = [$patterns]; 869 | } 870 | 871 | foreach($patterns as $pattern){ 872 | $title = preg_replace('#[\.|\-]'.preg_quote($pattern).'([\.|\-]|$)#i', '$1', $title, 1, $replacements); 873 | if($replacements > 0){ 874 | $flags[] = $key; 875 | } 876 | } 877 | } 878 | 879 | return $flags; 880 | } 881 | 882 | public function setFlags($flags){ 883 | $this -> flags = (is_array($flags) ? $flags:[$flags]); 884 | } 885 | 886 | public function getScore(){ 887 | $score = 0; 888 | 889 | $score += ($this -> getTitle() ? 1:0); 890 | $score += ($this -> getYear() ? 1:0); 891 | $score += ($this -> getLanguage() ? 1:0); 892 | $score += ($this -> getResolution() ? 1:0); 893 | $score += ($this -> getSource() ? 1:0); 894 | $score += ($this -> getEncoding() ? 1:0); 895 | $score += ($this -> getDub() ? 1:0); 896 | 897 | return $score; 898 | } 899 | 900 | } 901 | 902 | ?> 903 | -------------------------------------------------------------------------------- /tests/ReleaseTest.php: -------------------------------------------------------------------------------- 1 | $element){ 23 | $element['object'] = new Release($key); 24 | $this -> elements[] = $element; 25 | } 26 | } 27 | 28 | public function testAnalyseSuccess(){ 29 | $elements = [ 30 | 'https://www.quirksmode.org/html5/videos/big_buck_bunny.mp4' => [ 31 | 'encoding' => Release::ENCODING_H264, 32 | 'resolution' => Release::RESOLUTION_SD, 33 | 'language' => 'ENGLISH' 34 | ], 35 | 'https://samples.mplayerhq.hu/V-codecs/h264/bbc-africa_m720p.mov' => [ 36 | 'encoding' => Release::ENCODING_H264, 37 | 'resolution' => Release::RESOLUTION_720P, 38 | 'language' => 'ENGLISH' 39 | ], 40 | 'https://cinelerra-cv.org/footage/rassegna2.avi' => [ 41 | 'encoding' => Release::ENCODING_DIVX, 42 | 'resolution' => Release::RESOLUTION_SD, 43 | 'language' => 'VO' 44 | ], 45 | 'https://samples.mplayerhq.hu/V-codecs/XVID/old/green.avi' => [ 46 | 'encoding' => Release::ENCODING_XVID, 47 | 'resolution' => Release::RESOLUTION_SD, 48 | 'language' => 'VO' 49 | ], 50 | 'http://samples.mplayerhq.hu/Matroska/x264_no-b-frames.mkv' => [ 51 | 'encoding' => Release::ENCODING_X264, 52 | 'resolution' => Release::RESOLUTION_720P, 53 | 'language' => 'VO' 54 | ], 55 | 'https://s3.amazonaws.com/x265.org/video/Tears_400_x265.mp4' => [ 56 | 'encoding' => Release::ENCODING_X265, 57 | 'resolution' => Release::RESOLUTION_1080P, 58 | 'language' => 'VO' 59 | ], 60 | ]; 61 | 62 | foreach($elements as $url => $element){ 63 | $basename = basename($url); 64 | 65 | if(!is_dir(__DIR__.'/tmp/')){ 66 | mkdir(__DIR__.'/tmp/'); 67 | } 68 | 69 | if(!is_file(__DIR__.'/tmp/'.$basename)){ 70 | file_put_contents(__DIR__.'/tmp/'.$basename, fopen($url, 'r')); 71 | } 72 | 73 | $config = []; 74 | 75 | if(defined('__MEDIAINFO_BIN__')){ 76 | $config['command'] = __MEDIAINFO_BIN__; 77 | } 78 | 79 | $release = Release::analyse(__DIR__.'/tmp/'.$basename, $config); 80 | 81 | $this -> assertEquals($element['encoding'], $release -> getEncoding(), $url); 82 | $this -> assertEquals($element['resolution'], $release -> getResolution(), $url); 83 | $this -> assertEquals($element['language'], $release -> getLanguage(), $url); 84 | } 85 | } 86 | 87 | public function testGetType(){ 88 | foreach($this -> elements as $element){ 89 | $this -> assertEquals($element['type'], $element['object'] -> getType(), json_encode($element)); 90 | } 91 | } 92 | 93 | public function testGetTitle(){ 94 | foreach($this -> elements as $element){ 95 | $this -> assertEquals($element['title'], $element['object'] -> getTitle(), json_encode($element)); 96 | } 97 | } 98 | 99 | public function testGetGeneratedRelease(){ 100 | foreach($this -> elements as $element){ 101 | if(isset($element['generated'])){ 102 | $this -> assertEquals($element['generated'], $element['object'] -> getRelease(Release::GENERATED_RELEASE), json_encode($element)); 103 | $this -> assertEquals($element['generated'], $element['object'] -> __toString(), json_encode($element)); 104 | } 105 | } 106 | } 107 | 108 | public function testGetOriginalRelease(){ 109 | foreach($this -> elements as $element){ 110 | if(isset($element['generated'])){ 111 | $this -> assertEquals($element['original'], $element['object'] -> getRelease(), json_encode($element)); 112 | } 113 | } 114 | } 115 | 116 | public function testGetYear(){ 117 | foreach($this -> elements as $element){ 118 | if(isset($element['year'])){ 119 | $this -> assertEquals($element['year'], $element['object'] -> getYear(), json_encode($element)); 120 | } 121 | } 122 | } 123 | 124 | public function testGetLanguage(){ 125 | foreach($this -> elements as $element){ 126 | if(isset($element['language'])){ 127 | $this -> assertEquals($element['language'], $element['object'] -> getLanguage(), json_encode($element)); 128 | } 129 | } 130 | } 131 | 132 | public function testGetResolution(){ 133 | foreach($this -> elements as $element){ 134 | if(isset($element['resolution'])){ 135 | $this -> assertEquals($element['resolution'], $element['object'] -> getResolution(), json_encode($element)); 136 | } 137 | } 138 | } 139 | 140 | public function testGetSource(){ 141 | foreach($this -> elements as $element){ 142 | if(isset($element['source'])){ 143 | $this -> assertEquals($element['source'], $element['object'] -> getSource(), json_encode($element)); 144 | } 145 | } 146 | } 147 | 148 | public function testGetDub(){ 149 | foreach($this -> elements as $element){ 150 | if(isset($element['dub'])){ 151 | $this -> assertEquals($element['dub'], $element['object'] -> getDub(), json_encode($element)); 152 | } 153 | } 154 | } 155 | 156 | public function testGetEncoding(){ 157 | foreach($this -> elements as $element){ 158 | if(isset($element['encoding'])){ 159 | $this -> assertEquals($element['encoding'], $element['object'] -> getEncoding(), json_encode($element)); 160 | } 161 | } 162 | } 163 | 164 | public function testGetGroup(){ 165 | foreach($this -> elements as $element){ 166 | if(isset($element['group'])){ 167 | $this -> assertEquals($element['group'], $element['object'] -> getGroup(), json_encode($element)); 168 | } 169 | } 170 | } 171 | 172 | public function testGetFlags(){ 173 | foreach($this -> elements as $element){ 174 | if(isset($element['flags'])){ 175 | $this -> assertEquals($element['flags'], $element['object'] -> getFlags(), json_encode($element)); 176 | } 177 | } 178 | } 179 | 180 | public function testGetSeason(){ 181 | foreach($this -> elements as $element){ 182 | if(isset($element['season'])){ 183 | $this -> assertEquals($element['season'], $element['object'] -> getSeason(), json_encode($element)); 184 | } 185 | } 186 | } 187 | 188 | public function testGetEpisode(){ 189 | foreach($this -> elements as $element){ 190 | if(isset($element['episode'])){ 191 | $this -> assertEquals($element['episode'], $element['object'] -> getEpisode(), json_encode($element)); 192 | } 193 | } 194 | } 195 | 196 | public function testGetScore(){ 197 | foreach($this -> elements as $element){ 198 | if(isset($element['score'])){ 199 | $this -> assertEquals($element['score'], $element['object'] -> getScore(), json_encode($element)); 200 | } 201 | } 202 | } 203 | 204 | public function testUnitGuess(){ 205 | foreach($this -> elements as $element){ 206 | if(isset($element['guess'])){ 207 | foreach($element['guess'] as $guess => $value){ 208 | switch($guess){ 209 | case 'year': 210 | $this -> assertEquals(date('Y'), $element['object'] -> guessYear(), json_encode($element)); 211 | break; 212 | case 'language': 213 | $this -> assertEquals($value, $element['object'] -> guessLanguage(), json_encode($element)); 214 | break; 215 | case 'resolution': 216 | $this -> assertEquals($value, $element['object'] -> guessResolution(), json_encode($element)); 217 | break; 218 | } 219 | } 220 | } 221 | } 222 | } 223 | 224 | public function testGlobalGuess(){ 225 | foreach($this -> elements as $element){ 226 | if(isset($element['guess'])){ 227 | foreach($element['guess'] as $guess => $value){ 228 | switch($guess){ 229 | case 'year': 230 | $this -> assertEquals(null, $element['object'] -> getYear(), json_encode($element)); 231 | break; 232 | case 'language': 233 | $this -> assertEquals(null, $element['object'] -> getLanguage(), json_encode($element)); 234 | break; 235 | case 'resolution': 236 | $this -> assertEquals(null, $element['object'] -> getResolution(), json_encode($element)); 237 | break; 238 | } 239 | } 240 | 241 | foreach($element['guess'] as $guess => $value){ 242 | switch($guess){ 243 | case 'year': 244 | $this -> assertEquals(date('Y'), $element['object'] -> guessYear(), json_encode($element)); 245 | $this -> assertEquals(date('Y'), $element['object'] -> guess() -> getYear(), json_encode($element)); 246 | break; 247 | case 'language': 248 | $this -> assertEquals($value, $element['object'] -> guessLanguage(), json_encode($element)); 249 | $this -> assertEquals($value, $element['object'] -> guess() -> getLanguage(), json_encode($element)); 250 | break; 251 | case 'resolution': 252 | $this -> assertEquals($value, $element['object'] -> guessResolution(), json_encode($element)); 253 | $this -> assertEquals($value, $element['object'] -> guess() -> getResolution(), json_encode($element)); 254 | break; 255 | } 256 | } 257 | } 258 | } 259 | } 260 | 261 | public function testConstructStrictFail(){ 262 | $this -> expectException(InvalidArgumentException::class); 263 | $release = new Release('This is not a good scene release name'); 264 | } 265 | 266 | public function testConstructStrictSuccess(){ 267 | $release = new Release('This is not a good scene release name', false); 268 | $this->assertInstanceOf('thcolin\SceneReleaseParser\Release', $release); 269 | } 270 | 271 | public function testConstructDefaultsSuccess(){ 272 | $release = new Release('This is not a good scene release name', false, ['language' => 'FRENCH']); 273 | $this -> assertEquals($release -> guessLanguage(), 'FRENCH'); 274 | } 275 | 276 | public function testConstructDefaultsNotice(){ 277 | $this -> expectException(Notice::class); 278 | $release = new Release('This is not a good scene release name', false, ['language' => 'UNKNOWN']); 279 | } 280 | 281 | } 282 | 283 | ?> 284 | -------------------------------------------------------------------------------- /utils/debug.php: -------------------------------------------------------------------------------- 1 | generated = $Release->__toString(); 9 | var_dump($Release); 10 | -------------------------------------------------------------------------------- /utils/populate-tests.php: -------------------------------------------------------------------------------- 1 | $Release -> getRelease(), 20 | 'generated' => $Release -> __toString(), 21 | 'title' => utf8_encode($Release -> getTitle()), 22 | 'type' => utf8_encode($Release -> getType()) 23 | ]; 24 | 25 | if($year = $Release -> getYear()){ 26 | $element['year'] = utf8_encode($year); 27 | } else{ 28 | $element['guess']['year'] = $Release -> guessYear(); 29 | } 30 | 31 | if($language = $Release -> getLanguage()){ 32 | $element['language'] = utf8_encode($language); 33 | } else{ 34 | $element['guess']['language'] = $Release -> guessLanguage(); 35 | } 36 | 37 | if($resolution = $Release -> getResolution()){ 38 | $element['resolution'] = utf8_encode($resolution); 39 | } else{ 40 | $element['guess']['resolution'] = $Release -> guessResolution(); 41 | } 42 | 43 | if($source = $Release -> getSource()){ 44 | $element['source'] = utf8_encode($source); 45 | } 46 | 47 | if($dub = $Release -> getDub()){ 48 | $element['dub'] = utf8_encode($dub); 49 | } 50 | 51 | if($encoding = $Release -> getEncoding()){ 52 | $element['encoding'] = utf8_encode($encoding); 53 | } 54 | 55 | if($group = $Release -> getGroup()){ 56 | $element['group'] = utf8_encode($group); 57 | } 58 | 59 | if($flags = $Release -> getFlags()){ 60 | $element['flags'] = $flags; 61 | } 62 | 63 | if($season = $Release -> getSeason()){ 64 | $element['season'] = intval($season); 65 | } 66 | 67 | if($episode = $Release -> getEpisode()){ 68 | $element['episode'] = intval($episode); 69 | } 70 | 71 | if($score = $Release -> getScore()){ 72 | $element['score'] = intval($score); 73 | } 74 | 75 | $elements[$release] = $element; 76 | } 77 | 78 | file_put_contents(__DIR__.'/releases.json', json_encode($elements, JSON_PRETTY_PRINT)); 79 | 80 | ?> 81 | -------------------------------------------------------------------------------- /utils/releases.json: -------------------------------------------------------------------------------- 1 | { 2 | "12.Monkeys.S01E01.FRENCH.HDTV.x264-AZR": { 3 | "original": "12.Monkeys.S01E01.FRENCH.HDTV.x264-AZR", 4 | "generated": "12.Monkeys.S01E01.FRENCH.HDTV.x264-AZR", 5 | "title": "12 Monkeys", 6 | "type": "tvshow", 7 | "guess": { 8 | "year": "2017", 9 | "resolution": "SD" 10 | }, 11 | "language": "FRENCH", 12 | "source": "HDTV", 13 | "encoding": "x264", 14 | "group": "AZR", 15 | "season": 1, 16 | "episode": 1, 17 | "score": 4 18 | }, 19 | "Mr.Robot.S01.PROPER.VOSTFR.720p.WEB-DL.DD5.1.H264-ARK01": { 20 | "original": "Mr.Robot.S01.PROPER.VOSTFR.720p.WEB-DL.DD5.1.H264-ARK01", 21 | "generated": "Mr.Robot.S01.VOSTFR.720p.WEB-DL.h264-ARK01", 22 | "title": "Mr Robot", 23 | "type": "tvshow", 24 | "guess": { 25 | "year": "2017" 26 | }, 27 | "language": "VOSTFR", 28 | "resolution": "720p", 29 | "source": "WEB-DL", 30 | "encoding": "h264", 31 | "group": "ARK01", 32 | "flags": [ 33 | "PROPER", 34 | "DD5.1" 35 | ], 36 | "season": 1, 37 | "score": 5 38 | }, 39 | "Nights.In.Rodanthe.TRUEFRENCH.DVDRip.XviD-UNSKiLLED": { 40 | "original": "Nights.In.Rodanthe.TRUEFRENCH.DVDRip.XviD-UNSKiLLED", 41 | "generated": "Nights.In.Rodanthe.TRUEFRENCH.DVDRip.XviD-UNSKiLLED", 42 | "title": "Nights In Rodanthe", 43 | "type": "movie", 44 | "guess": { 45 | "year": "2017", 46 | "resolution": "SD" 47 | }, 48 | "language": "TRUEFRENCH", 49 | "source": "DVDRip", 50 | "encoding": "XviD", 51 | "group": "UNSKiLLED", 52 | "score": 4 53 | }, 54 | "Arrow.S03E01.FASTSUB.VOSTFR.HDTV.x264-ADDiCTiON": { 55 | "original": "Arrow.S03E01.FASTSUB.VOSTFR.HDTV.x264-ADDiCTiON", 56 | "generated": "Arrow.S03E01.VOSTFR.HDTV.x264-ADDiCTiON", 57 | "title": "Arrow", 58 | "type": "tvshow", 59 | "guess": { 60 | "year": "2017", 61 | "resolution": "SD" 62 | }, 63 | "language": "VOSTFR", 64 | "source": "HDTV", 65 | "encoding": "x264", 66 | "group": "ADDiCTiON", 67 | "flags": [ 68 | "FASTSUB" 69 | ], 70 | "season": 3, 71 | "episode": 1, 72 | "score": 4 73 | }, 74 | "Orange.Mecanique.MULTI.DVDRIP.x264.AAC-ECKOES": { 75 | "original": "Orange.Mecanique.MULTI.DVDRIP.x264.AAC-ECKOES", 76 | "generated": "Orange.Mecanique.MULTI.DVDRip.x264-ECKOES", 77 | "title": "Orange Mecanique", 78 | "type": "movie", 79 | "guess": { 80 | "year": "2017", 81 | "resolution": "SD" 82 | }, 83 | "language": "MULTI", 84 | "source": "DVDRip", 85 | "encoding": "x264", 86 | "group": "ECKOES", 87 | "flags": [ 88 | "AAC" 89 | ], 90 | "score": 4 91 | }, 92 | "Arthur.Newman.2012.FRENCH.BDRip.x264-Ryotox": { 93 | "original": "Arthur.Newman.2012.FRENCH.BDRip.x264-Ryotox", 94 | "generated": "Arthur.Newman.2012.FRENCH.BDRip.x264-Ryotox", 95 | "title": "Arthur Newman", 96 | "type": "movie", 97 | "year": "2012", 98 | "language": "FRENCH", 99 | "guess": { 100 | "resolution": "SD" 101 | }, 102 | "source": "BDRip", 103 | "encoding": "x264", 104 | "group": "Ryotox", 105 | "score": 5 106 | }, 107 | "Palo.Alto.2013.LIMITED.VOSTFR.BRRip.x264.AC3-S.V": { 108 | "original": "Palo.Alto.2013.LIMITED.VOSTFR.BRRip.x264.AC3-S.V", 109 | "generated": "Palo.Alto.2013.VOSTFR.BDRip.x264.AC3-S.V", 110 | "title": "Palo Alto", 111 | "type": "movie", 112 | "year": "2013", 113 | "language": "VOSTFR", 114 | "guess": { 115 | "resolution": "SD" 116 | }, 117 | "source": "BDRip", 118 | "dub": "AC3", 119 | "encoding": "x264", 120 | "group": "S.V", 121 | "flags": [ 122 | "LIMITED" 123 | ], 124 | "score": 6 125 | }, 126 | "Barbecue.2014.FRENCH.DVDRiP.XViD-ARTEFAC": { 127 | "original": "Barbecue.2014.FRENCH.DVDRiP.XViD-ARTEFAC", 128 | "generated": "Barbecue.2014.FRENCH.DVDRip.XviD-ARTEFAC", 129 | "title": "Barbecue", 130 | "type": "movie", 131 | "year": "2014", 132 | "language": "FRENCH", 133 | "guess": { 134 | "resolution": "SD" 135 | }, 136 | "source": "DVDRip", 137 | "encoding": "XviD", 138 | "group": "ARTEFAC", 139 | "score": 5 140 | }, 141 | "Peter.Pan.TRUEFRENCH.DVDRip.XviD.AC3-LiberTeam": { 142 | "original": "Peter.Pan.TRUEFRENCH.DVDRip.XviD.AC3-LiberTeam", 143 | "generated": "Peter.Pan.TRUEFRENCH.DVDRip.XviD.AC3-LiberTeam", 144 | "title": "Peter Pan", 145 | "type": "movie", 146 | "guess": { 147 | "year": "2017", 148 | "resolution": "SD" 149 | }, 150 | "language": "TRUEFRENCH", 151 | "source": "DVDRip", 152 | "dub": "AC3", 153 | "encoding": "XviD", 154 | "group": "LiberTeam", 155 | "score": 5 156 | }, 157 | "Big.Eyes.2014.FRENCH.BDRip.XviD-GLUPS": { 158 | "original": "Big.Eyes.2014.FRENCH.BDRip.XviD-GLUPS", 159 | "generated": "Big.Eyes.2014.FRENCH.BDRip.XviD-GLUPS", 160 | "title": "Big Eyes", 161 | "type": "movie", 162 | "year": "2014", 163 | "language": "FRENCH", 164 | "guess": { 165 | "resolution": "SD" 166 | }, 167 | "source": "BDRip", 168 | "encoding": "XviD", 169 | "group": "GLUPS", 170 | "score": 5 171 | }, 172 | "Blended.2014.FRENCH.BRRIP XVID AC3-lecorse": { 173 | "original": "Blended.2014.FRENCH.BRRIP.XVID.AC3-lecorse", 174 | "generated": "Blended.2014.FRENCH.BDRip.XviD.AC3-lecorse", 175 | "title": "Blended", 176 | "type": "movie", 177 | "year": "2014", 178 | "language": "FRENCH", 179 | "guess": { 180 | "resolution": "SD" 181 | }, 182 | "source": "BDRip", 183 | "dub": "AC3", 184 | "encoding": "XviD", 185 | "group": "lecorse", 186 | "score": 6 187 | }, 188 | "Pitch.Perfect.2.2015.FRENCH.BDRip.x264-COUAC": { 189 | "original": "Pitch.Perfect.2.2015.FRENCH.BDRip.x264-COUAC", 190 | "generated": "Pitch.Perfect.2.2015.FRENCH.BDRip.x264-COUAC", 191 | "title": "Pitch Perfect 2", 192 | "type": "movie", 193 | "year": "2015", 194 | "language": "FRENCH", 195 | "guess": { 196 | "resolution": "SD" 197 | }, 198 | "source": "BDRip", 199 | "encoding": "x264", 200 | "group": "COUAC", 201 | "score": 5 202 | }, 203 | "Blue. Valentine 2010 French DvDRip Xvid-FwD": { 204 | "original": "Blue..Valentine.2010.French.DvDRip.Xvid-FwD", 205 | "generated": "Blue.2010.FRENCH.DVDRip.XviD-FwD", 206 | "title": "Blue", 207 | "type": "movie", 208 | "year": "2010", 209 | "language": "FRENCH", 210 | "guess": { 211 | "resolution": "SD" 212 | }, 213 | "source": "DVDRip", 214 | "encoding": "XviD", 215 | "group": "FwD", 216 | "score": 5 217 | }, 218 | "Pixels.2015.FRENCH.BDRip.x264-VENUE": { 219 | "original": "Pixels.2015.FRENCH.BDRip.x264-VENUE", 220 | "generated": "Pixels.2015.FRENCH.BDRip.x264-VENUE", 221 | "title": "Pixels", 222 | "type": "movie", 223 | "year": "2015", 224 | "language": "FRENCH", 225 | "guess": { 226 | "resolution": "SD" 227 | }, 228 | "source": "BDRip", 229 | "encoding": "x264", 230 | "group": "VENUE", 231 | "score": 5 232 | }, 233 | "Camp.X-Ray.2014.FRENCH.BDRip.x264-PRiDEHD": { 234 | "original": "Camp.X-Ray.2014.FRENCH.BDRip.x264-PRiDEHD", 235 | "generated": "Camp.X-ray.2014.FRENCH.BDRip.x264-PRiDEHD", 236 | "title": "Camp X-ray", 237 | "type": "movie", 238 | "year": "2014", 239 | "language": "FRENCH", 240 | "guess": { 241 | "resolution": "SD" 242 | }, 243 | "source": "BDRip", 244 | "encoding": "x264", 245 | "group": "PRiDEHD", 246 | "score": 5 247 | }, 248 | "Pixels.2015.FRENCH.DVDRip.XviD-SVR": { 249 | "original": "Pixels.2015.FRENCH.DVDRip.XviD-SVR", 250 | "generated": "Pixels.2015.FRENCH.DVDRip.XviD-SVR", 251 | "title": "Pixels", 252 | "type": "movie", 253 | "year": "2015", 254 | "language": "FRENCH", 255 | "guess": { 256 | "resolution": "SD" 257 | }, 258 | "source": "DVDRip", 259 | "encoding": "XviD", 260 | "group": "SVR", 261 | "score": 5 262 | }, 263 | "Platoon.1986.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY": { 264 | "original": "Platoon.1986.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY", 265 | "generated": "Platoon.1986.FRENCH.BDRip.x264.AC3-FUNKY", 266 | "title": "Platoon", 267 | "type": "movie", 268 | "year": "1986", 269 | "language": "FRENCH", 270 | "guess": { 271 | "resolution": "SD" 272 | }, 273 | "source": "BDRip", 274 | "dub": "AC3", 275 | "encoding": "x264", 276 | "group": "FUNKY", 277 | "flags": [ 278 | "SUBFORCED" 279 | ], 280 | "score": 6 281 | }, 282 | "Captain.Phillips.2013.FRENCH.DVDRip.x264-TiCKETS": { 283 | "original": "Captain.Phillips.2013.FRENCH.DVDRip.x264-TiCKETS", 284 | "generated": "Captain.Phillips.2013.FRENCH.DVDRip.x264-TiCKETS", 285 | "title": "Captain Phillips", 286 | "type": "movie", 287 | "year": "2013", 288 | "language": "FRENCH", 289 | "guess": { 290 | "resolution": "SD" 291 | }, 292 | "source": "DVDRip", 293 | "encoding": "x264", 294 | "group": "TiCKETS", 295 | "score": 5 296 | }, 297 | "Celeste.and.Jesse.Forever.2012.VOSTFR.BDRiP.XviD-NIKOo": { 298 | "original": "Celeste.and.Jesse.Forever.2012.VOSTFR.BDRiP.XviD-NIKOo", 299 | "generated": "Celeste.And.Jesse.Forever.2012.VOSTFR.BDRip.XviD-NIKOo", 300 | "title": "Celeste And Jesse Forever", 301 | "type": "movie", 302 | "year": "2012", 303 | "language": "VOSTFR", 304 | "guess": { 305 | "resolution": "SD" 306 | }, 307 | "source": "BDRip", 308 | "encoding": "XviD", 309 | "group": "NIKOo", 310 | "score": 5 311 | }, 312 | "Pompeii.2014.TRUEFRENCH.BRRip.XviD-DesTroY": { 313 | "original": "Pompeii.2014.TRUEFRENCH.BRRip.XviD-DesTroY", 314 | "generated": "Pompeii.2014.TRUEFRENCH.BDRip.XviD-DesTroY", 315 | "title": "Pompeii", 316 | "type": "movie", 317 | "year": "2014", 318 | "language": "TRUEFRENCH", 319 | "guess": { 320 | "resolution": "SD" 321 | }, 322 | "source": "BDRip", 323 | "encoding": "XviD", 324 | "group": "DesTroY", 325 | "score": 5 326 | }, 327 | "Chef.2014.FRENCH.BDRiP.x264-PRiDEHD": { 328 | "original": "Chef.2014.FRENCH.BDRiP.x264-PRiDEHD", 329 | "generated": "Chef.2014.FRENCH.BDRip.x264-PRiDEHD", 330 | "title": "Chef", 331 | "type": "movie", 332 | "year": "2014", 333 | "language": "FRENCH", 334 | "guess": { 335 | "resolution": "SD" 336 | }, 337 | "source": "BDRip", 338 | "encoding": "x264", 339 | "group": "PRiDEHD", 340 | "score": 5 341 | }, 342 | "Quand.Harry.Rencontre.Sally.FRENCH.DVDRiP.XviD-Shane": { 343 | "original": "Quand.Harry.Rencontre.Sally.FRENCH.DVDRiP.XviD-Shane", 344 | "generated": "Quand.Harry.Rencontre.Sally.FRENCH.DVDRip.XviD-Shane", 345 | "title": "Quand Harry Rencontre Sally", 346 | "type": "movie", 347 | "guess": { 348 | "year": "2017", 349 | "resolution": "SD" 350 | }, 351 | "language": "FRENCH", 352 | "source": "DVDRip", 353 | "encoding": "XviD", 354 | "group": "Shane", 355 | "score": 4 356 | }, 357 | "Qu.Est.Ce.Qu.On.a.Fait.au.Bon.Dieu.2014.FRENCH.720p.mHD.x264-ExPLiCiT": { 358 | "original": "Qu.Est.Ce.Qu.On.a.Fait.au.Bon.Dieu.2014.FRENCH.720p.mHD.x264-ExPLiCiT", 359 | "generated": "Qu.Est.Ce.Qu.On.A.Fait.Au.Bon.Dieu.2014.FRENCH.720p.HDRip.x264-ExPLiCiT", 360 | "title": "Qu Est Ce Qu On A Fait Au Bon Dieu", 361 | "type": "movie", 362 | "year": "2014", 363 | "language": "FRENCH", 364 | "resolution": "720p", 365 | "source": "HDRip", 366 | "encoding": "x264", 367 | "group": "ExPLiCiT", 368 | "score": 6 369 | }, 370 | "Rush.2013.FRENCH.BDRip.x264-Thursday16th": { 371 | "original": "Rush.2013.FRENCH.BDRip.x264-Thursday16th", 372 | "generated": "Rush.2013.FRENCH.BDRip.x264-Thursday16th", 373 | "title": "Rush", 374 | "type": "movie", 375 | "year": "2013", 376 | "language": "FRENCH", 377 | "guess": { 378 | "resolution": "SD" 379 | }, 380 | "source": "BDRip", 381 | "encoding": "x264", 382 | "group": "Thursday16th", 383 | "score": 5 384 | }, 385 | "Serena.2014.FRENCH.DVDRip.x264-FUTiL": { 386 | "original": "Serena.2014.FRENCH.DVDRip.x264-FUTiL", 387 | "generated": "Serena.2014.FRENCH.DVDRip.x264-FUTiL", 388 | "title": "Serena", 389 | "type": "movie", 390 | "year": "2014", 391 | "language": "FRENCH", 392 | "guess": { 393 | "resolution": "SD" 394 | }, 395 | "source": "DVDRip", 396 | "encoding": "x264", 397 | "group": "FUTiL", 398 | "score": 5 399 | }, 400 | "Dope.2015.SUBFORCED.FRENCH.BRRip.XviD-SVR": { 401 | "original": "Dope.2015.SUBFORCED.FRENCH.BRRip.XviD-SVR", 402 | "generated": "Dope.2015.FRENCH.BDRip.XviD-SVR", 403 | "title": "Dope", 404 | "type": "movie", 405 | "year": "2015", 406 | "language": "FRENCH", 407 | "guess": { 408 | "resolution": "SD" 409 | }, 410 | "source": "BDRip", 411 | "encoding": "XviD", 412 | "group": "SVR", 413 | "flags": [ 414 | "SUBFORCED" 415 | ], 416 | "score": 5 417 | }, 418 | "Serendipity.2001.FRENCH.BRRip.x264.AC3-CHARTAIR": { 419 | "original": "Serendipity.2001.FRENCH.BRRip.x264.AC3-CHARTAIR", 420 | "generated": "Serendipity.2001.FRENCH.BDRip.x264.AC3-CHARTAIR", 421 | "title": "Serendipity", 422 | "type": "movie", 423 | "year": "2001", 424 | "language": "FRENCH", 425 | "guess": { 426 | "resolution": "SD" 427 | }, 428 | "source": "BDRip", 429 | "dub": "AC3", 430 | "encoding": "x264", 431 | "group": "CHARTAIR", 432 | "score": 6 433 | }, 434 | "Drinking.Buddies.2013.LIMITED.DVDRip.x264-NODLABS": { 435 | "original": "Drinking.Buddies.2013.LIMITED.DVDRip.x264-NODLABS", 436 | "generated": "Drinking.Buddies.2013.DVDRip.x264-NODLABS", 437 | "title": "Drinking Buddies", 438 | "type": "movie", 439 | "year": "2013", 440 | "guess": { 441 | "language": "VO", 442 | "resolution": "SD" 443 | }, 444 | "source": "DVDRip", 445 | "encoding": "x264", 446 | "group": "NODLABS", 447 | "flags": [ 448 | "LIMITED" 449 | ], 450 | "score": 4 451 | }, 452 | "Shrek.Tetralogie.TRUEFRENCH.DVDRIP.XVID.AC3.5.1-lanesra13": { 453 | "original": "Shrek.Tetralogie.TRUEFRENCH.DVDRIP.XVID.AC3.5.1-lanesra13", 454 | "generated": "Shrek.Tetralogie.TRUEFRENCH.DVDRip.XviD.AC3-lanesra13", 455 | "title": "Shrek Tetralogie", 456 | "type": "movie", 457 | "guess": { 458 | "year": "2017", 459 | "resolution": "SD" 460 | }, 461 | "language": "TRUEFRENCH", 462 | "source": "DVDRip", 463 | "dub": "AC3", 464 | "encoding": "XviD", 465 | "group": "lanesra13", 466 | "flags": [ 467 | "DD5.1" 468 | ], 469 | "score": 5 470 | }, 471 | "Dumb.And.Dumber.FRENCH.BRRip.XviD-LKT": { 472 | "original": "Dumb.And.Dumber.FRENCH.BRRip.XviD-LKT", 473 | "generated": "Dumb.And.Dumber.FRENCH.BDRip.XviD-LKT", 474 | "title": "Dumb And Dumber", 475 | "type": "movie", 476 | "guess": { 477 | "year": "2017", 478 | "resolution": "SD" 479 | }, 480 | "language": "FRENCH", 481 | "source": "BDRip", 482 | "encoding": "XviD", 483 | "group": "LKT", 484 | "score": 4 485 | }, 486 | "Silver.Linings.Playbook.2012.TRUEFRENCH.BDRip.x264.AC3-TKS": { 487 | "original": "Silver.Linings.Playbook.2012.TRUEFRENCH.BDRip.x264.AC3-TKS", 488 | "generated": "Silver.Linings.Playbook.2012.TRUEFRENCH.BDRip.x264.AC3-TKS", 489 | "title": "Silver Linings Playbook", 490 | "type": "movie", 491 | "year": "2012", 492 | "language": "TRUEFRENCH", 493 | "guess": { 494 | "resolution": "SD" 495 | }, 496 | "source": "BDRip", 497 | "dub": "AC3", 498 | "encoding": "x264", 499 | "group": "TKS", 500 | "score": 6 501 | }, 502 | "Eden.Lost.in.Music.2014.FRENCH.BDRip.x264-MELBA": { 503 | "original": "Eden.Lost.in.Music.2014.FRENCH.BDRip.x264-MELBA", 504 | "generated": "Eden.Lost.In.Music.2014.FRENCH.BDRip.x264-MELBA", 505 | "title": "Eden Lost In Music", 506 | "type": "movie", 507 | "year": "2014", 508 | "language": "FRENCH", 509 | "guess": { 510 | "resolution": "SD" 511 | }, 512 | "source": "BDRip", 513 | "encoding": "x264", 514 | "group": "MELBA", 515 | "score": 5 516 | }, 517 | "Sin.City.A.Dame.to.Kill.For.2014.FRENCH.BDRip.x264.AC3-GLUPS": { 518 | "original": "Sin.City.A.Dame.to.Kill.For.2014.FRENCH.BDRip.x264.AC3-GLUPS", 519 | "generated": "Sin.City.A.Dame.To.Kill.For.2014.FRENCH.BDRip.x264.AC3-GLUPS", 520 | "title": "Sin City A Dame To Kill For", 521 | "type": "movie", 522 | "year": "2014", 523 | "language": "FRENCH", 524 | "guess": { 525 | "resolution": "SD" 526 | }, 527 | "source": "BDRip", 528 | "dub": "AC3", 529 | "encoding": "x264", 530 | "group": "GLUPS", 531 | "score": 6 532 | }, 533 | "Endless Love 2014 FRENCH 720p BluRay x264-CARPEDIEM": { 534 | "original": "Endless.Love.2014.FRENCH.720p.BluRay.x264-CARPEDIEM", 535 | "generated": "Endless.Love.2014.FRENCH.720p.BLURAY.x264-CARPEDIEM", 536 | "title": "Endless Love", 537 | "type": "movie", 538 | "year": "2014", 539 | "language": "FRENCH", 540 | "resolution": "720p", 541 | "source": "BLURAY", 542 | "encoding": "x264", 543 | "group": "CARPEDIEM", 544 | "score": 6 545 | }, 546 | "Source.Code.2011.FRENCH.BRRip.x264.AC3-FUNKY": { 547 | "original": "Source.Code.2011.FRENCH.BRRip.x264.AC3-FUNKY", 548 | "generated": "Source.Code.2011.FRENCH.BDRip.x264.AC3-FUNKY", 549 | "title": "Source Code", 550 | "type": "movie", 551 | "year": "2011", 552 | "language": "FRENCH", 553 | "guess": { 554 | "resolution": "SD" 555 | }, 556 | "source": "BDRip", 557 | "dub": "AC3", 558 | "encoding": "x264", 559 | "group": "FUNKY", 560 | "score": 6 561 | }, 562 | "Enemy.2013.LIMITED.FRENCH.SUBFORCED.BRRip.x264.AC3-SP3CTR3": { 563 | "original": "Enemy.2013.LIMITED.FRENCH.SUBFORCED.BRRip.x264.AC3-SP3CTR3", 564 | "generated": "Enemy.2013.FRENCH.BDRip.x264.AC3-SP3CTR3", 565 | "title": "Enemy", 566 | "type": "movie", 567 | "year": "2013", 568 | "language": "FRENCH", 569 | "guess": { 570 | "resolution": "SD" 571 | }, 572 | "source": "BDRip", 573 | "dub": "AC3", 574 | "encoding": "x264", 575 | "group": "SP3CTR3", 576 | "flags": [ 577 | "LIMITED", 578 | "SUBFORCED" 579 | ], 580 | "score": 6 581 | }, 582 | "Sous.Les.Jupes.Des.Filles.2014.FRENCH.BDRip.XviD-GLUPS": { 583 | "original": "Sous.Les.Jupes.Des.Filles.2014.FRENCH.BDRip.XviD-GLUPS", 584 | "generated": "Sous.Les.Jupes.Des.Filles.2014.FRENCH.BDRip.XviD-GLUPS", 585 | "title": "Sous Les Jupes Des Filles", 586 | "type": "movie", 587 | "year": "2014", 588 | "language": "FRENCH", 589 | "guess": { 590 | "resolution": "SD" 591 | }, 592 | "source": "BDRip", 593 | "encoding": "XviD", 594 | "group": "GLUPS", 595 | "score": 5 596 | }, 597 | "Eureka.S05.FRENCH.LD.DVDRiP.XViD-EPZ": { 598 | "original": "Eureka.S05.FRENCH.LD.DVDRiP.XViD-EPZ", 599 | "generated": "Eureka.S05.FRENCH.DVDRip.XviD.LD-EPZ", 600 | "title": "Eureka", 601 | "type": "tvshow", 602 | "guess": { 603 | "year": "2017", 604 | "resolution": "SD" 605 | }, 606 | "language": "FRENCH", 607 | "source": "DVDRip", 608 | "dub": "LD", 609 | "encoding": "XviD", 610 | "group": "EPZ", 611 | "season": 5, 612 | "score": 5 613 | }, 614 | "Exam.2009.LiMiTED.FRENCH.DVDRip.XviD": { 615 | "original": "Exam.2009.LiMiTED.FRENCH.DVDRip.XviD", 616 | "generated": "Exam.2009.FRENCH.DVDRip.XviD-NOTEAM", 617 | "title": "Exam", 618 | "type": "movie", 619 | "year": "2009", 620 | "language": "FRENCH", 621 | "guess": { 622 | "resolution": "SD" 623 | }, 624 | "source": "DVDRip", 625 | "encoding": "XviD", 626 | "flags": [ 627 | "LIMITED" 628 | ], 629 | "score": 5 630 | }, 631 | "Ex.Machina.2015.FRENCH.SUBFORCED.BRRip.XviD.AC3-CHARTAIR": { 632 | "original": "Ex.Machina.2015.FRENCH.SUBFORCED.BRRip.XviD.AC3-CHARTAIR", 633 | "generated": "Ex.Machina.2015.FRENCH.BDRip.XviD.AC3-CHARTAIR", 634 | "title": "Ex Machina", 635 | "type": "movie", 636 | "year": "2015", 637 | "language": "FRENCH", 638 | "guess": { 639 | "resolution": "SD" 640 | }, 641 | "source": "BDRip", 642 | "dub": "AC3", 643 | "encoding": "XviD", 644 | "group": "CHARTAIR", 645 | "flags": [ 646 | "SUBFORCED" 647 | ], 648 | "score": 6 649 | }, 650 | "Factotum.FRENCH.DVDRiP.XviD-ZANBiC": { 651 | "original": "Factotum.FRENCH.DVDRiP.XviD-ZANBiC", 652 | "generated": "Factotum.FRENCH.DVDRip.XviD-ZANBiC", 653 | "title": "Factotum", 654 | "type": "movie", 655 | "guess": { 656 | "year": "2017", 657 | "resolution": "SD" 658 | }, 659 | "language": "FRENCH", 660 | "source": "DVDRip", 661 | "encoding": "XviD", 662 | "group": "ZANBiC", 663 | "score": 4 664 | }, 665 | "Still.Alice.2014.TRUEFRENCH.BDRip.XviD-DesTroY": { 666 | "original": "Still.Alice.2014.TRUEFRENCH.BDRip.XviD-DesTroY", 667 | "generated": "Still.Alice.2014.TRUEFRENCH.BDRip.XviD-DesTroY", 668 | "title": "Still Alice", 669 | "type": "movie", 670 | "year": "2014", 671 | "language": "TRUEFRENCH", 672 | "guess": { 673 | "resolution": "SD" 674 | }, 675 | "source": "BDRip", 676 | "encoding": "XviD", 677 | "group": "DesTroY", 678 | "score": 5 679 | }, 680 | "Fish.Tank.2009.FRENCH.BRRip.x264.AC3-SALEM": { 681 | "original": "Fish.Tank.2009.FRENCH.BRRip.x264.AC3-SALEM", 682 | "generated": "Fish.Tank.2009.FRENCH.BDRip.x264.AC3-SALEM", 683 | "title": "Fish Tank", 684 | "type": "movie", 685 | "year": "2009", 686 | "language": "FRENCH", 687 | "guess": { 688 | "resolution": "SD" 689 | }, 690 | "source": "BDRip", 691 | "dub": "AC3", 692 | "encoding": "x264", 693 | "group": "SALEM", 694 | "score": 6 695 | }, 696 | "Taken.3.2014.EXTENDED.FRENCH.BDRip.XviD-GLUPS": { 697 | "original": "Taken.3.2014.EXTENDED.FRENCH.BDRip.XviD-GLUPS", 698 | "generated": "Taken.3.2014.FRENCH.BDRip.XviD-GLUPS", 699 | "title": "Taken 3", 700 | "type": "movie", 701 | "year": "2014", 702 | "language": "FRENCH", 703 | "guess": { 704 | "resolution": "SD" 705 | }, 706 | "source": "BDRip", 707 | "encoding": "XviD", 708 | "group": "GLUPS", 709 | "flags": [ 710 | "EXTENDED" 711 | ], 712 | "score": 5 713 | }, 714 | "Ted.2012.TRUEFRENCH.720p.BluRay.x264.AC3": { 715 | "original": "Ted.2012.TRUEFRENCH.720p.BluRay.x264.AC3", 716 | "generated": "Ted.2012.TRUEFRENCH.720p.BLURAY.x264.AC3-NOTEAM", 717 | "title": "Ted", 718 | "type": "movie", 719 | "year": "2012", 720 | "language": "TRUEFRENCH", 721 | "resolution": "720p", 722 | "source": "BLURAY", 723 | "dub": "AC3", 724 | "encoding": "x264", 725 | "score": 7 726 | }, 727 | "Furious.Seven.2015.EXTENDED.TRUEFRENCH.BDRip.x264.AC3-GLUPS": { 728 | "original": "Furious.Seven.2015.EXTENDED.TRUEFRENCH.BDRip.x264.AC3-GLUPS", 729 | "generated": "Furious.Seven.2015.TRUEFRENCH.BDRip.x264.AC3-GLUPS", 730 | "title": "Furious Seven", 731 | "type": "movie", 732 | "year": "2015", 733 | "language": "TRUEFRENCH", 734 | "guess": { 735 | "resolution": "SD" 736 | }, 737 | "source": "BDRip", 738 | "dub": "AC3", 739 | "encoding": "x264", 740 | "group": "GLUPS", 741 | "flags": [ 742 | "EXTENDED" 743 | ], 744 | "score": 6 745 | }, 746 | "Ted.2.2015.UNRATED.FRENCH.720p.WEB-DL.DD5.1.H264": { 747 | "original": "Ted.2.2015.UNRATED.FRENCH.720p.WEB-DL.DD5.1.H264", 748 | "generated": "Ted.2.2015.FRENCH.720p.WEB-DL.h264-NOTEAM", 749 | "title": "Ted 2", 750 | "type": "movie", 751 | "year": "2015", 752 | "language": "FRENCH", 753 | "resolution": "720p", 754 | "source": "WEB-DL", 755 | "encoding": "h264", 756 | "flags": [ 757 | "UNRATED", 758 | "DD5.1" 759 | ], 760 | "score": 6 761 | }, 762 | "Fury.2014.FRENCH.BDRip.x264-ROUGH": { 763 | "original": "Fury.2014.FRENCH.BDRip.x264-ROUGH", 764 | "generated": "Fury.2014.FRENCH.BDRip.x264-ROUGH", 765 | "title": "Fury", 766 | "type": "movie", 767 | "year": "2014", 768 | "language": "FRENCH", 769 | "guess": { 770 | "resolution": "SD" 771 | }, 772 | "source": "BDRip", 773 | "encoding": "x264", 774 | "group": "ROUGH", 775 | "score": 5 776 | }, 777 | "Gravity.2013.FRENCH.BRRip.XviD.AC3-S.V": { 778 | "original": "Gravity.2013.FRENCH.BRRip.XviD.AC3-S.V", 779 | "generated": "Gravity.2013.FRENCH.BDRip.XviD.AC3-S.V", 780 | "title": "Gravity", 781 | "type": "movie", 782 | "year": "2013", 783 | "language": "FRENCH", 784 | "guess": { 785 | "resolution": "SD" 786 | }, 787 | "source": "BDRip", 788 | "dub": "AC3", 789 | "encoding": "XviD", 790 | "group": "S.V", 791 | "score": 6 792 | }, 793 | "The.100.S01E01.FASTSUB.VOSTFR.HDTV.XviD-ADDiCTiON": { 794 | "original": "The.100.S01E01.FASTSUB.VOSTFR.HDTV.XviD-ADDiCTiON", 795 | "generated": "The.100.S01E01.VOSTFR.HDTV.XviD-ADDiCTiON", 796 | "title": "The 100", 797 | "type": "tvshow", 798 | "guess": { 799 | "year": "2017", 800 | "resolution": "SD" 801 | }, 802 | "language": "VOSTFR", 803 | "source": "HDTV", 804 | "encoding": "XviD", 805 | "group": "ADDiCTiON", 806 | "flags": [ 807 | "FASTSUB" 808 | ], 809 | "season": 1, 810 | "episode": 1, 811 | "score": 4 812 | }, 813 | "Green.Zone.2010.TRUEFRENCH.SUBFORCED.DVDRIP.XVID-KNOB": { 814 | "original": "Green.Zone.2010.TRUEFRENCH.SUBFORCED.DVDRIP.XVID-KNOB", 815 | "generated": "Green.Zone.2010.TRUEFRENCH.DVDRip.XviD-KNOB", 816 | "title": "Green Zone", 817 | "type": "movie", 818 | "year": "2010", 819 | "language": "TRUEFRENCH", 820 | "guess": { 821 | "resolution": "SD" 822 | }, 823 | "source": "DVDRip", 824 | "encoding": "XviD", 825 | "group": "KNOB", 826 | "flags": [ 827 | "SUBFORCED" 828 | ], 829 | "score": 5 830 | }, 831 | "The.Angriest.Man.in.Brooklyn.2014.FRENCH.BDRip.x264-PRiDEHD": { 832 | "original": "The.Angriest.Man.in.Brooklyn.2014.FRENCH.BDRip.x264-PRiDEHD", 833 | "generated": "The.Angriest.Man.In.Brooklyn.2014.FRENCH.BDRip.x264-PRiDEHD", 834 | "title": "The Angriest Man In Brooklyn", 835 | "type": "movie", 836 | "year": "2014", 837 | "language": "FRENCH", 838 | "guess": { 839 | "resolution": "SD" 840 | }, 841 | "source": "BDRip", 842 | "encoding": "x264", 843 | "group": "PRiDEHD", 844 | "score": 5 845 | }, 846 | "Hannibal.2001.TRUEFRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY": { 847 | "original": "Hannibal.2001.TRUEFRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY", 848 | "generated": "Hannibal.2001.TRUEFRENCH.BDRip.x264.AC3-FUNKY", 849 | "title": "Hannibal", 850 | "type": "movie", 851 | "year": "2001", 852 | "language": "TRUEFRENCH", 853 | "guess": { 854 | "resolution": "SD" 855 | }, 856 | "source": "BDRip", 857 | "dub": "AC3", 858 | "encoding": "x264", 859 | "group": "FUNKY", 860 | "flags": [ 861 | "SUBFORCED" 862 | ], 863 | "score": 6 864 | }, 865 | "The.Drop.2014.FRENCH.BDRip.x264-PRiDEHD": { 866 | "original": "The.Drop.2014.FRENCH.BDRip.x264-PRiDEHD", 867 | "generated": "The.Drop.2014.FRENCH.BDRip.x264-PRiDEHD", 868 | "title": "The Drop", 869 | "type": "movie", 870 | "year": "2014", 871 | "language": "FRENCH", 872 | "guess": { 873 | "resolution": "SD" 874 | }, 875 | "source": "BDRip", 876 | "encoding": "x264", 877 | "group": "PRiDEHD", 878 | "score": 5 879 | }, 880 | "HappyThankYouMorePlease.2010.HDRip.AC3": { 881 | "original": "HappyThankYouMorePlease.2010.HDRip.AC3", 882 | "generated": "Happythankyoumoreplease.2010.HDRip.AC3-NOTEAM", 883 | "title": "Happythankyoumoreplease", 884 | "type": "movie", 885 | "year": "2010", 886 | "guess": { 887 | "language": "VO", 888 | "resolution": "SD" 889 | }, 890 | "source": "HDRip", 891 | "dub": "AC3", 892 | "score": 4 893 | }, 894 | "The.Gambler.2014.FRENCH.BDRip.x264-VENUE": { 895 | "original": "The.Gambler.2014.FRENCH.BDRip.x264-VENUE", 896 | "generated": "The.Gambler.2014.FRENCH.BDRip.x264-VENUE", 897 | "title": "The Gambler", 898 | "type": "movie", 899 | "year": "2014", 900 | "language": "FRENCH", 901 | "guess": { 902 | "resolution": "SD" 903 | }, 904 | "source": "BDRip", 905 | "encoding": "x264", 906 | "group": "VENUE", 907 | "score": 5 908 | }, 909 | "The.Last.Man.On.Earth.S01E01.FASTSUB.VOSTFR.HDTV.XviD-ADDiCTiON": { 910 | "original": "The.Last.Man.On.Earth.S01E01.FASTSUB.VOSTFR.HDTV.XviD-ADDiCTiON", 911 | "generated": "The.Last.Man.On.Earth.S01E01.VOSTFR.HDTV.XviD-ADDiCTiON", 912 | "title": "The Last Man On Earth", 913 | "type": "tvshow", 914 | "guess": { 915 | "year": "2017", 916 | "resolution": "SD" 917 | }, 918 | "language": "VOSTFR", 919 | "source": "HDTV", 920 | "encoding": "XviD", 921 | "group": "ADDiCTiON", 922 | "flags": [ 923 | "FASTSUB" 924 | ], 925 | "season": 1, 926 | "episode": 1, 927 | "score": 4 928 | }, 929 | "Hector.and.the.Search.for.Happiness.2014.FRENCH.DVDRiP.XviD.AC3-S.V": { 930 | "original": "Hector.and.the.Search.for.Happiness.2014.FRENCH.DVDRiP.XviD.AC3-S.V", 931 | "generated": "Hector.And.The.Search.For.Happiness.2014.FRENCH.DVDRip.XviD.AC3-S.V", 932 | "title": "Hector And The Search For Happiness", 933 | "type": "movie", 934 | "year": "2014", 935 | "language": "FRENCH", 936 | "guess": { 937 | "resolution": "SD" 938 | }, 939 | "source": "DVDRip", 940 | "dub": "AC3", 941 | "encoding": "XviD", 942 | "group": "S.V", 943 | "score": 6 944 | }, 945 | "The.Longest.Ride.2015.FRENCH.720p.BluRay.x264.AC3-BUITONIO": { 946 | "original": "The.Longest.Ride.2015.FRENCH.720p.BluRay.x264.AC3-BUITONIO", 947 | "generated": "The.Longest.Ride.2015.FRENCH.720p.BLURAY.x264.AC3-BUITONIO", 948 | "title": "The Longest Ride", 949 | "type": "movie", 950 | "year": "2015", 951 | "language": "FRENCH", 952 | "resolution": "720p", 953 | "source": "BLURAY", 954 | "dub": "AC3", 955 | "encoding": "x264", 956 | "group": "BUITONIO", 957 | "score": 7 958 | }, 959 | "Horrible.Bosses.2.2014.THEATRICAL.FRENCH.BDRip.XviD.AC3-DesTroY": { 960 | "original": "Horrible.Bosses.2.2014.THEATRICAL.FRENCH.BDRip.XviD.AC3-DesTroY", 961 | "generated": "Horrible.Bosses.2.2014.FRENCH.BDRip.XviD.AC3-DesTroY", 962 | "title": "Horrible Bosses 2", 963 | "type": "movie", 964 | "year": "2014", 965 | "language": "FRENCH", 966 | "guess": { 967 | "resolution": "SD" 968 | }, 969 | "source": "BDRip", 970 | "dub": "AC3", 971 | "encoding": "XviD", 972 | "group": "DesTroY", 973 | "flags": [ 974 | "THEATRICAL" 975 | ], 976 | "score": 6 977 | }, 978 | "The.Longest.Ride.2015.FRENCH.BDRip.x264-VENUE": { 979 | "original": "The.Longest.Ride.2015.FRENCH.BDRip.x264-VENUE", 980 | "generated": "The.Longest.Ride.2015.FRENCH.BDRip.x264-VENUE", 981 | "title": "The Longest Ride", 982 | "type": "movie", 983 | "year": "2015", 984 | "language": "FRENCH", 985 | "guess": { 986 | "resolution": "SD" 987 | }, 988 | "source": "BDRip", 989 | "encoding": "x264", 990 | "group": "VENUE", 991 | "score": 5 992 | }, 993 | "How.Do.You.Know.2010.TRUEFRENCH.DVDRip.XviD-LiberTeam": { 994 | "original": "How.Do.You.Know.2010.TRUEFRENCH.DVDRip.XviD-LiberTeam", 995 | "generated": "How.Do.You.Know.2010.TRUEFRENCH.DVDRip.XviD-LiberTeam", 996 | "title": "How Do You Know", 997 | "type": "movie", 998 | "year": "2010", 999 | "language": "TRUEFRENCH", 1000 | "guess": { 1001 | "resolution": "SD" 1002 | }, 1003 | "source": "DVDRip", 1004 | "encoding": "XviD", 1005 | "group": "LiberTeam", 1006 | "score": 5 1007 | }, 1008 | "The.Man.In.The.High.Castle.S01E01.Pilot.720p.WEBRip.DD5.1.x264-FtDL": { 1009 | "original": "The.Man.In.The.High.Castle.S01E01.Pilot.720p.WEBRip.DD5.1.x264-FtDL", 1010 | "generated": "The.Man.In.The.High.Castle.S01E01.720p.WEB-DL.x264-FtDL", 1011 | "title": "The Man In The High Castle", 1012 | "type": "tvshow", 1013 | "guess": { 1014 | "year": "2017", 1015 | "language": "VO" 1016 | }, 1017 | "resolution": "720p", 1018 | "source": "WEB-DL", 1019 | "encoding": "x264", 1020 | "group": "FtDL", 1021 | "flags": [ 1022 | "DD5.1" 1023 | ], 1024 | "season": 1, 1025 | "episode": 1, 1026 | "score": 4 1027 | }, 1028 | "How.to.Train.Your.Dragon.2.2014.FRENCH.BDRip.x264-PRiDEHD": { 1029 | "original": "How.to.Train.Your.Dragon.2.2014.FRENCH.BDRip.x264-PRiDEHD", 1030 | "generated": "How.To.Train.Your.Dragon.2.2014.FRENCH.BDRip.x264-PRiDEHD", 1031 | "title": "How To Train Your Dragon 2", 1032 | "type": "movie", 1033 | "year": "2014", 1034 | "language": "FRENCH", 1035 | "guess": { 1036 | "resolution": "SD" 1037 | }, 1038 | "source": "BDRip", 1039 | "encoding": "x264", 1040 | "group": "PRiDEHD", 1041 | "score": 5 1042 | }, 1043 | "The.Master.2012.FRENCH.BDRiP.XViD-AViTECH": { 1044 | "original": "The.Master.2012.FRENCH.BDRiP.XViD-AViTECH", 1045 | "generated": "The.Master.2012.FRENCH.BDRip.XviD-AViTECH", 1046 | "title": "The Master", 1047 | "type": "movie", 1048 | "year": "2012", 1049 | "language": "FRENCH", 1050 | "guess": { 1051 | "resolution": "SD" 1052 | }, 1053 | "source": "BDRip", 1054 | "encoding": "XviD", 1055 | "group": "AViTECH", 1056 | "score": 5 1057 | }, 1058 | "The.Maze.Runner.2014.TRUEFRENCH.BDRip.XviD-GLUPS": { 1059 | "original": "The.Maze.Runner.2014.TRUEFRENCH.BDRip.XviD-GLUPS", 1060 | "generated": "The.Maze.Runner.2014.TRUEFRENCH.BDRip.XviD-GLUPS", 1061 | "title": "The Maze Runner", 1062 | "type": "movie", 1063 | "year": "2014", 1064 | "language": "TRUEFRENCH", 1065 | "guess": { 1066 | "resolution": "SD" 1067 | }, 1068 | "source": "BDRip", 1069 | "encoding": "XviD", 1070 | "group": "GLUPS", 1071 | "score": 5 1072 | }, 1073 | "Inherent.Vice.2014.FRENCH.BRRip.XviD-DesTroY": { 1074 | "original": "Inherent.Vice.2014.FRENCH.BRRip.XviD-DesTroY", 1075 | "generated": "Inherent.Vice.2014.FRENCH.BDRip.XviD-DesTroY", 1076 | "title": "Inherent Vice", 1077 | "type": "movie", 1078 | "year": "2014", 1079 | "language": "FRENCH", 1080 | "guess": { 1081 | "resolution": "SD" 1082 | }, 1083 | "source": "BDRip", 1084 | "encoding": "XviD", 1085 | "group": "DesTroY", 1086 | "score": 5 1087 | }, 1088 | "The Spirit 2009 TRUEFRENCH DVDRiP XViD AC3-FwD": { 1089 | "original": "The.Spirit.2009.TRUEFRENCH.DVDRiP.XViD.AC3-FwD", 1090 | "generated": "The.Spirit.2009.TRUEFRENCH.DVDRip.XviD.AC3-FwD", 1091 | "title": "The Spirit", 1092 | "type": "movie", 1093 | "year": "2009", 1094 | "language": "TRUEFRENCH", 1095 | "guess": { 1096 | "resolution": "SD" 1097 | }, 1098 | "source": "DVDRip", 1099 | "dub": "AC3", 1100 | "encoding": "XviD", 1101 | "group": "FwD", 1102 | "score": 6 1103 | }, 1104 | "La.French.2014.FRENCH.BRRip.x264.AC3-DesTroY": { 1105 | "original": "La.French.2014.FRENCH.BRRip.x264.AC3-DesTroY", 1106 | "generated": "La.2014.FRENCH.BDRip.x264.AC3-DesTroY", 1107 | "title": "La", 1108 | "type": "movie", 1109 | "year": "2014", 1110 | "language": "FRENCH", 1111 | "guess": { 1112 | "resolution": "SD" 1113 | }, 1114 | "source": "BDRip", 1115 | "dub": "AC3", 1116 | "encoding": "x264", 1117 | "group": "DesTroY", 1118 | "score": 6 1119 | }, 1120 | "The Ten 2011 TRUEFRENCH SUBFORCED DVDRIP XVID-FwD": { 1121 | "original": "The.Ten.2011.TRUEFRENCH.SUBFORCED.DVDRIP.XVID-FwD", 1122 | "generated": "The.Ten.2011.TRUEFRENCH.DVDRip.XviD-FwD", 1123 | "title": "The Ten", 1124 | "type": "movie", 1125 | "year": "2011", 1126 | "language": "TRUEFRENCH", 1127 | "guess": { 1128 | "resolution": "SD" 1129 | }, 1130 | "source": "DVDRip", 1131 | "encoding": "XviD", 1132 | "group": "FwD", 1133 | "flags": [ 1134 | "SUBFORCED" 1135 | ], 1136 | "score": 5 1137 | }, 1138 | "La.Planete.Des.Singes.L'affrontement.TRUEFRENCH.720p.x264.HDLIGHT": { 1139 | "original": "La.Planete.Des.Singes.L'affrontement.TRUEFRENCH.720p.x264.HDLIGHT", 1140 | "generated": "La.Planete.Des.Singes.L'affrontement.TRUEFRENCH.720p.HDRip.x264-NOTEAM", 1141 | "title": "La Planete Des Singes L'affrontement", 1142 | "type": "movie", 1143 | "guess": { 1144 | "year": "2017" 1145 | }, 1146 | "language": "TRUEFRENCH", 1147 | "resolution": "720p", 1148 | "source": "HDRip", 1149 | "encoding": "x264", 1150 | "score": 5 1151 | }, 1152 | "The.Wind.Rises.2013.FRENCH.BRRip.x264.AC3-DesTroY": { 1153 | "original": "The.Wind.Rises.2013.FRENCH.BRRip.x264.AC3-DesTroY", 1154 | "generated": "The.Wind.Rises.2013.FRENCH.BDRip.x264.AC3-DesTroY", 1155 | "title": "The Wind Rises", 1156 | "type": "movie", 1157 | "year": "2013", 1158 | "language": "FRENCH", 1159 | "guess": { 1160 | "resolution": "SD" 1161 | }, 1162 | "source": "BDRip", 1163 | "dub": "AC3", 1164 | "encoding": "x264", 1165 | "group": "DesTroY", 1166 | "score": 6 1167 | }, 1168 | "La.Veritable.Histoire.Du.Petit.Chaperon.Rouge.FRENCH.DVDRiP.XviD": { 1169 | "original": "La.Veritable.Histoire.Du.Petit.Chaperon.Rouge.FRENCH.DVDRiP.XviD", 1170 | "generated": "La.Veritable.Histoire.Du.Petit.Chaperon.Rouge.FRENCH.DVDRip.XviD-NOTEAM", 1171 | "title": "La Veritable Histoire Du Petit Chaperon Rouge", 1172 | "type": "movie", 1173 | "guess": { 1174 | "year": "2017", 1175 | "resolution": "SD" 1176 | }, 1177 | "language": "FRENCH", 1178 | "source": "DVDRip", 1179 | "encoding": "XviD", 1180 | "score": 4 1181 | }, 1182 | "The.Worlds.End.2013.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY": { 1183 | "original": "The.Worlds.End.2013.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY", 1184 | "generated": "The.Worlds.End.2013.FRENCH.BDRip.x264.AC3-FUNKY", 1185 | "title": "The Worlds End", 1186 | "type": "movie", 1187 | "year": "2013", 1188 | "language": "FRENCH", 1189 | "guess": { 1190 | "resolution": "SD" 1191 | }, 1192 | "source": "BDRip", 1193 | "dub": "AC3", 1194 | "encoding": "x264", 1195 | "group": "FUNKY", 1196 | "flags": [ 1197 | "SUBFORCED" 1198 | ], 1199 | "score": 6 1200 | }, 1201 | "La.Vie.D.Adele.2013.FRENCH.WORKPRINT.XViD-ATN": { 1202 | "original": "La.Vie.D.Adele.2013.FRENCH.WORKPRINT.XViD-ATN", 1203 | "generated": "La.Vie.D.Adele.2013.FRENCH.XviD-ATN", 1204 | "title": "La Vie D Adele", 1205 | "type": "movie", 1206 | "year": "2013", 1207 | "language": "FRENCH", 1208 | "guess": { 1209 | "resolution": "SD" 1210 | }, 1211 | "encoding": "XviD", 1212 | "group": "ATN", 1213 | "flags": [ 1214 | "WORKPRINT" 1215 | ], 1216 | "score": 4 1217 | }, 1218 | "Tomorrowland.2015.TRUEFRENCH.720p.WEB-DL.AC3.x264-TonTon": { 1219 | "original": "Tomorrowland.2015.TRUEFRENCH.720p.WEB-DL.AC3.x264-TonTon", 1220 | "generated": "Tomorrowland.2015.TRUEFRENCH.720p.WEB-DL.x264.AC3-TonTon", 1221 | "title": "Tomorrowland", 1222 | "type": "movie", 1223 | "year": "2015", 1224 | "language": "TRUEFRENCH", 1225 | "resolution": "720p", 1226 | "source": "WEB-DL", 1227 | "dub": "AC3", 1228 | "encoding": "x264", 1229 | "group": "TonTon", 1230 | "score": 7 1231 | }, 1232 | "Les.Gorilles.2014.TRUEFRENCH.WEBRip.XviD-SVR": { 1233 | "original": "Les.Gorilles.2014.TRUEFRENCH.WEBRip.XviD-SVR", 1234 | "generated": "Les.Gorilles.2014.TRUEFRENCH.WEB-DL.XviD-SVR", 1235 | "title": "Les Gorilles", 1236 | "type": "movie", 1237 | "year": "2014", 1238 | "language": "TRUEFRENCH", 1239 | "guess": { 1240 | "resolution": "SD" 1241 | }, 1242 | "source": "WEB-DL", 1243 | "encoding": "XviD", 1244 | "group": "SVR", 1245 | "score": 5 1246 | }, 1247 | "Total.recall.1990.FRENCH.BRRIP.X264.AC3-KENPACHI": { 1248 | "original": "Total.recall.1990.FRENCH.BRRIP.X264.AC3-KENPACHI", 1249 | "generated": "Total.Recall.1990.FRENCH.BDRip.x264.AC3-KENPACHI", 1250 | "title": "Total Recall", 1251 | "type": "movie", 1252 | "year": "1990", 1253 | "language": "FRENCH", 1254 | "guess": { 1255 | "resolution": "SD" 1256 | }, 1257 | "source": "BDRip", 1258 | "dub": "AC3", 1259 | "encoding": "x264", 1260 | "group": "KENPACHI", 1261 | "score": 6 1262 | }, 1263 | "Liberal.Arts.2012.FANSUB.VOSTFR.BRRiP.XviD-NIKOo": { 1264 | "original": "Liberal.Arts.2012.FANSUB.VOSTFR.BRRiP.XviD-NIKOo", 1265 | "generated": "Liberal.Arts.2012.VOSTFR.BDRip.XviD-NIKOo", 1266 | "title": "Liberal Arts", 1267 | "type": "movie", 1268 | "year": "2012", 1269 | "language": "VOSTFR", 1270 | "guess": { 1271 | "resolution": "SD" 1272 | }, 1273 | "source": "BDRip", 1274 | "encoding": "XviD", 1275 | "group": "NIKOo", 1276 | "flags": [ 1277 | "FANSUB" 1278 | ], 1279 | "score": 5 1280 | }, 1281 | "Transformers.Age.Of.Extinction.2014.TRUEFRENCH.DVDRip.x264.AC3-DesTroY": { 1282 | "original": "Transformers.Age.Of.Extinction.2014.TRUEFRENCH.DVDRip.x264.AC3-DesTroY", 1283 | "generated": "Transformers.Age.Of.Extinction.2014.TRUEFRENCH.DVDRip.x264.AC3-DesTroY", 1284 | "title": "Transformers Age Of Extinction", 1285 | "type": "movie", 1286 | "year": "2014", 1287 | "language": "TRUEFRENCH", 1288 | "guess": { 1289 | "resolution": "SD" 1290 | }, 1291 | "source": "DVDRip", 1292 | "dub": "AC3", 1293 | "encoding": "x264", 1294 | "group": "DesTroY", 1295 | "score": 6 1296 | }, 1297 | "Un Peu.Beaucoup.Aveuglement.2014.FRENCH.WEB-DL.1080p.x264-SVR": { 1298 | "original": "Un.Peu.Beaucoup.Aveuglement.2014.FRENCH.WEB-DL.1080p.x264-SVR", 1299 | "generated": "Un.Peu.Beaucoup.Aveuglement.2014.FRENCH.1080p.WEB-DL.x264-SVR", 1300 | "title": "Un Peu Beaucoup Aveuglement", 1301 | "type": "movie", 1302 | "year": "2014", 1303 | "language": "FRENCH", 1304 | "resolution": "1080p", 1305 | "source": "WEB-DL", 1306 | "encoding": "x264", 1307 | "group": "SVR", 1308 | "score": 6 1309 | }, 1310 | "Magic.In.The.Moonlight.2014.FRENCH.BRRip.x264.AC3-DesTroY": { 1311 | "original": "Magic.In.The.Moonlight.2014.FRENCH.BRRip.x264.AC3-DesTroY", 1312 | "generated": "Magic.In.The.Moonlight.2014.FRENCH.BDRip.x264.AC3-DesTroY", 1313 | "title": "Magic In The Moonlight", 1314 | "type": "movie", 1315 | "year": "2014", 1316 | "language": "FRENCH", 1317 | "guess": { 1318 | "resolution": "SD" 1319 | }, 1320 | "source": "BDRip", 1321 | "dub": "AC3", 1322 | "encoding": "x264", 1323 | "group": "DesTroY", 1324 | "score": 6 1325 | }, 1326 | "Manhattan.S01E01.FRENCH.HDTV.x264-CaCoLaC": { 1327 | "original": "Manhattan.S01E01.FRENCH.HDTV.x264-CaCoLaC", 1328 | "generated": "Manhattan.S01E01.FRENCH.HDTV.x264-CaCoLaC", 1329 | "title": "Manhattan", 1330 | "type": "tvshow", 1331 | "guess": { 1332 | "year": "2017", 1333 | "resolution": "SD" 1334 | }, 1335 | "language": "FRENCH", 1336 | "source": "HDTV", 1337 | "encoding": "x264", 1338 | "group": "CaCoLaC", 1339 | "season": 1, 1340 | "episode": 1, 1341 | "score": 4 1342 | }, 1343 | "Ma.Premiere.Fois.2012.FRENCH.720p.BluRay.x264-CARPEDIEM": { 1344 | "original": "Ma.Premiere.Fois.2012.FRENCH.720p.BluRay.x264-CARPEDIEM", 1345 | "generated": "Ma.Premiere.Fois.2012.FRENCH.720p.BLURAY.x264-CARPEDIEM", 1346 | "title": "Ma Premiere Fois", 1347 | "type": "movie", 1348 | "year": "2012", 1349 | "language": "FRENCH", 1350 | "resolution": "720p", 1351 | "source": "BLURAY", 1352 | "encoding": "x264", 1353 | "group": "CARPEDIEM", 1354 | "score": 6 1355 | }, 1356 | "Marvels.Agent.Carter.S01E01.FASTSUB.VOSTFR.720p.HDTV.x264-ADDiCTiON": { 1357 | "original": "Marvels.Agent.Carter.S01E01.FASTSUB.VOSTFR.720p.HDTV.x264-ADDiCTiON", 1358 | "generated": "Marvels.Agent.Carter.S01E01.VOSTFR.720p.HDTV.x264-ADDiCTiON", 1359 | "title": "Marvels Agent Carter", 1360 | "type": "tvshow", 1361 | "guess": { 1362 | "year": "2017" 1363 | }, 1364 | "language": "VOSTFR", 1365 | "resolution": "720p", 1366 | "source": "HDTV", 1367 | "encoding": "x264", 1368 | "group": "ADDiCTiON", 1369 | "flags": [ 1370 | "FASTSUB" 1371 | ], 1372 | "season": 1, 1373 | "episode": 1, 1374 | "score": 5 1375 | }, 1376 | "Veronica Mars 2014 TRUEFRENCH BDRip XviD AC3-FrIeNdS": { 1377 | "original": "Veronica.Mars.2014.TRUEFRENCH.BDRip.XviD.AC3-FrIeNdS", 1378 | "generated": "Veronica.Mars.2014.TRUEFRENCH.BDRip.XviD.AC3-FrIeNdS", 1379 | "title": "Veronica Mars", 1380 | "type": "movie", 1381 | "year": "2014", 1382 | "language": "TRUEFRENCH", 1383 | "guess": { 1384 | "resolution": "SD" 1385 | }, 1386 | "source": "BDRip", 1387 | "dub": "AC3", 1388 | "encoding": "XviD", 1389 | "group": "FrIeNdS", 1390 | "score": 6 1391 | }, 1392 | "Marvels.Agent.Carter.S01E01.VOSTFR.720p.HDTV.x264-LTL": { 1393 | "original": "Marvels.Agent.Carter.S01E01.VOSTFR.720p.HDTV.x264-LTL", 1394 | "generated": "Marvels.Agent.Carter.S01E01.VOSTFR.720p.HDTV.x264-LTL", 1395 | "title": "Marvels Agent Carter", 1396 | "type": "tvshow", 1397 | "guess": { 1398 | "year": "2017" 1399 | }, 1400 | "language": "VOSTFR", 1401 | "resolution": "720p", 1402 | "source": "HDTV", 1403 | "encoding": "x264", 1404 | "group": "LTL", 1405 | "season": 1, 1406 | "episode": 1, 1407 | "score": 5 1408 | }, 1409 | "Marvels.Agent.Carter.S01E02.VOSTFR.720p.HDTV.x264-LTL": { 1410 | "original": "Marvels.Agent.Carter.S01E02.VOSTFR.720p.HDTV.x264-LTL", 1411 | "generated": "Marvels.Agent.Carter.S01E02.VOSTFR.720p.HDTV.x264-LTL", 1412 | "title": "Marvels Agent Carter", 1413 | "type": "tvshow", 1414 | "guess": { 1415 | "year": "2017" 1416 | }, 1417 | "language": "VOSTFR", 1418 | "resolution": "720p", 1419 | "source": "HDTV", 1420 | "encoding": "x264", 1421 | "group": "LTL", 1422 | "season": 1, 1423 | "episode": 2, 1424 | "score": 5 1425 | }, 1426 | "Water.For.Elephants.2011.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY": { 1427 | "original": "Water.For.Elephants.2011.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY", 1428 | "generated": "Water.For.Elephants.2011.FRENCH.BDRip.x264.AC3-FUNKY", 1429 | "title": "Water For Elephants", 1430 | "type": "movie", 1431 | "year": "2011", 1432 | "language": "FRENCH", 1433 | "guess": { 1434 | "resolution": "SD" 1435 | }, 1436 | "source": "BDRip", 1437 | "dub": "AC3", 1438 | "encoding": "x264", 1439 | "group": "FUNKY", 1440 | "flags": [ 1441 | "SUBFORCED" 1442 | ], 1443 | "score": 6 1444 | }, 1445 | "Marvels.Agent.Carter.S01E03.VOSTFR.720p.WEB-DL.DD5.1.H.264-LTL": { 1446 | "original": "Marvels.Agent.Carter.S01E03.VOSTFR.720p.WEB-DL.DD5.1.H.264-LTL", 1447 | "generated": "Marvels.Agent.Carter.S01E03.VOSTFR.720p.WEB-DL.h264-LTL", 1448 | "title": "Marvels Agent Carter", 1449 | "type": "tvshow", 1450 | "guess": { 1451 | "year": "2017" 1452 | }, 1453 | "language": "VOSTFR", 1454 | "resolution": "720p", 1455 | "source": "WEB-DL", 1456 | "encoding": "h264", 1457 | "group": "LTL", 1458 | "flags": [ 1459 | "DD5.1" 1460 | ], 1461 | "season": 1, 1462 | "episode": 3, 1463 | "score": 5 1464 | }, 1465 | "Weeds.S01.REPACK.MULTI.720p.BluRay.x264-DWS": { 1466 | "original": "Weeds.S01.REPACK.MULTI.720p.BluRay.x264-DWS", 1467 | "generated": "Weeds.S01.MULTI.720p.BLURAY.x264-DWS", 1468 | "title": "Weeds", 1469 | "type": "tvshow", 1470 | "guess": { 1471 | "year": "2017" 1472 | }, 1473 | "language": "MULTI", 1474 | "resolution": "720p", 1475 | "source": "BLURAY", 1476 | "encoding": "x264", 1477 | "group": "DWS", 1478 | "flags": [ 1479 | "REPACK" 1480 | ], 1481 | "season": 1, 1482 | "score": 5 1483 | }, 1484 | "Marvels.Agent.Carter.S01.VOSTFR.720p.WEB-DL.DD5.1.H.264-SEEHD": { 1485 | "original": "Marvels.Agent.Carter.S01.VOSTFR.720p.WEB-DL.DD5.1.H.264-SEEHD", 1486 | "generated": "Marvels.Agent.Carter.S01.VOSTFR.720p.WEB-DL.h264-SEEHD", 1487 | "title": "Marvels Agent Carter", 1488 | "type": "tvshow", 1489 | "guess": { 1490 | "year": "2017" 1491 | }, 1492 | "language": "VOSTFR", 1493 | "resolution": "720p", 1494 | "source": "WEB-DL", 1495 | "encoding": "h264", 1496 | "group": "SEEHD", 1497 | "flags": [ 1498 | "DD5.1" 1499 | ], 1500 | "season": 1, 1501 | "score": 5 1502 | }, 1503 | "While.Were.Young.2014.FRENCH.BDRip.x264-PRiDEHD": { 1504 | "original": "While.Were.Young.2014.FRENCH.BDRip.x264-PRiDEHD", 1505 | "generated": "While.Were.Young.2014.FRENCH.BDRip.x264-PRiDEHD", 1506 | "title": "While Were Young", 1507 | "type": "movie", 1508 | "year": "2014", 1509 | "language": "FRENCH", 1510 | "guess": { 1511 | "resolution": "SD" 1512 | }, 1513 | "source": "BDRip", 1514 | "encoding": "x264", 1515 | "group": "PRiDEHD", 1516 | "score": 5 1517 | }, 1518 | "White.Bird.In.A.Blizzard.2014.LiMiTED.FRENCH.DVDRip.XviD.AC3-DesTroY": { 1519 | "original": "White.Bird.In.A.Blizzard.2014.LiMiTED.FRENCH.DVDRip.XviD.AC3-DesTroY", 1520 | "generated": "White.Bird.In.A.Blizzard.2014.FRENCH.DVDRip.XviD.AC3-DesTroY", 1521 | "title": "White Bird In A Blizzard", 1522 | "type": "movie", 1523 | "year": "2014", 1524 | "language": "FRENCH", 1525 | "guess": { 1526 | "resolution": "SD" 1527 | }, 1528 | "source": "DVDRip", 1529 | "dub": "AC3", 1530 | "encoding": "XviD", 1531 | "group": "DesTroY", 1532 | "flags": [ 1533 | "LIMITED" 1534 | ], 1535 | "score": 6 1536 | }, 1537 | "Meet Bill 2012 TRUEFRENCH DvDRiP Xvid-TFTD": { 1538 | "original": "Meet.Bill.2012.TRUEFRENCH.DvDRiP.Xvid-TFTD", 1539 | "generated": "Meet.Bill.2012.TRUEFRENCH.DVDRip.XviD-TFTD", 1540 | "title": "Meet Bill", 1541 | "type": "movie", 1542 | "year": "2012", 1543 | "language": "TRUEFRENCH", 1544 | "guess": { 1545 | "resolution": "SD" 1546 | }, 1547 | "source": "DVDRip", 1548 | "encoding": "XviD", 1549 | "group": "TFTD", 1550 | "score": 5 1551 | }, 1552 | "Wild.Child.2008.TRUEFRENCH.BRRip.XviD.AC3-LiberTeam": { 1553 | "original": "Wild.Child.2008.TRUEFRENCH.BRRip.XviD.AC3-LiberTeam", 1554 | "generated": "Wild.Child.2008.TRUEFRENCH.BDRip.XviD.AC3-LiberTeam", 1555 | "title": "Wild Child", 1556 | "type": "movie", 1557 | "year": "2008", 1558 | "language": "TRUEFRENCH", 1559 | "guess": { 1560 | "resolution": "SD" 1561 | }, 1562 | "source": "BDRip", 1563 | "dub": "AC3", 1564 | "encoding": "XviD", 1565 | "group": "LiberTeam", 1566 | "score": 6 1567 | }, 1568 | "Mommy.2014.FRENCH.BDRip.x264-PRiDEHD": { 1569 | "original": "Mommy.2014.FRENCH.BDRip.x264-PRiDEHD", 1570 | "generated": "Mommy.2014.FRENCH.BDRip.x264-PRiDEHD", 1571 | "title": "Mommy", 1572 | "type": "movie", 1573 | "year": "2014", 1574 | "language": "FRENCH", 1575 | "guess": { 1576 | "resolution": "SD" 1577 | }, 1578 | "source": "BDRip", 1579 | "encoding": "x264", 1580 | "group": "PRiDEHD", 1581 | "score": 5 1582 | }, 1583 | "With.This.Ring.2015.RERiP.FRENCH.DVDRip.x264.AC3-DesTroY": { 1584 | "original": "With.This.Ring.2015.RERiP.FRENCH.DVDRip.x264.AC3-DesTroY", 1585 | "generated": "With.This.Ring.2015.FRENCH.DVDRip.x264.AC3-DesTroY", 1586 | "title": "With This Ring", 1587 | "type": "movie", 1588 | "year": "2015", 1589 | "language": "FRENCH", 1590 | "guess": { 1591 | "resolution": "SD" 1592 | }, 1593 | "source": "DVDRip", 1594 | "dub": "AC3", 1595 | "encoding": "x264", 1596 | "group": "DesTroY", 1597 | "flags": [ 1598 | "RERIP" 1599 | ], 1600 | "score": 6 1601 | }, 1602 | "Women.In.Trouble.2011.TRUEFRENCH.DVDRiP.XViD-UTT": { 1603 | "original": "Women.In.Trouble.2011.TRUEFRENCH.DVDRiP.XViD-UTT", 1604 | "generated": "Women.In.Trouble.2011.TRUEFRENCH.DVDRip.XviD-UTT", 1605 | "title": "Women In Trouble", 1606 | "type": "movie", 1607 | "year": "2011", 1608 | "language": "TRUEFRENCH", 1609 | "guess": { 1610 | "resolution": "SD" 1611 | }, 1612 | "source": "DVDRip", 1613 | "encoding": "XviD", 1614 | "group": "UTT", 1615 | "score": 5 1616 | }, 1617 | "Lone.Survivor.2013.FANSUB.VOSTFR.DVDSCR.XVID.AC3-NIKOo": { 1618 | "original": "Lone.Survivor.2013.FANSUB.VOSTFR.DVDSCR.XVID.AC3-NIKOo", 1619 | "generated": "Lone.Survivor.2013.VOSTFR.DVDScr.XviD.AC3-NIKOo", 1620 | "title": "Lone Survivor", 1621 | "type": "movie", 1622 | "year": "2013", 1623 | "language": "VOSTFR", 1624 | "guess": { 1625 | "resolution": "SD" 1626 | }, 1627 | "source": "DVDScr", 1628 | "dub": "AC3", 1629 | "encoding": "XviD", 1630 | "group": "NIKOo", 1631 | "flags": [ 1632 | "FANSUB" 1633 | ], 1634 | "score": 6 1635 | }, 1636 | "Benjamin Button [x264] [HD 720p] [LUCN] [FR]": { 1637 | "original": "Benjamin.Button.x264.HD.720p.LUCN.FR.", 1638 | "generated": "Benjamin.Button.FRENCH.720p.HDRip.x264-NOTEAM", 1639 | "title": "Benjamin Button", 1640 | "type": "movie", 1641 | "guess": { 1642 | "year": "2017" 1643 | }, 1644 | "language": "FRENCH", 1645 | "resolution": "720p", 1646 | "source": "HDRip", 1647 | "encoding": "x264", 1648 | "score": 5 1649 | }, 1650 | "Jamais entre amis (2015) [1080p] MULTI (VFQ-VOA) Bluray x264 AC3-PopHD (Sleeping with Other People)": { 1651 | "original": "Jamais.entre.amis.2015.1080p.MULTI.VFQ-VOA.Bluray.x264.AC3-PopHD.Sleeping.with.Other.People.", 1652 | "generated": "Jamais.Entre.Amis.2015.MULTI.1080p.BLURAY.x264.AC3-PopHD", 1653 | "title": "Jamais Entre Amis", 1654 | "type": "movie", 1655 | "year": "2015", 1656 | "language": "MULTI", 1657 | "resolution": "1080p", 1658 | "source": "BLURAY", 1659 | "dub": "AC3", 1660 | "encoding": "x264", 1661 | "group": "PopHD", 1662 | "score": 7 1663 | }, 1664 | "La Vie revee de Walter Mitty [1080p] MULTi 2013 BluRay x264-Pop (The Secret Life Of Walter Mitty)": { 1665 | "original": "La.Vie.revee.de.Walter.Mitty.1080p.MULTi.2013.BluRay.x264-Pop.The.Secret.Life.Of.Walter.Mitty.", 1666 | "generated": "La.Vie.Revee.De.Walter.Mitty.2013.MULTI.1080p.BLURAY.x264-Pop", 1667 | "title": "La Vie Revee De Walter Mitty", 1668 | "type": "movie", 1669 | "year": "2013", 1670 | "language": "MULTI", 1671 | "resolution": "1080p", 1672 | "source": "BLURAY", 1673 | "encoding": "x264", 1674 | "group": "Pop", 1675 | "score": 6 1676 | }, 1677 | "Le Nouveau Stagiaire (2015) The Intern - Multi 1080p - x264 AAC 5.1 - CCATS": { 1678 | "original": "Le.Nouveau.Stagiaire.2015.The.Intern.-.Multi.1080p.-.x264.AAC.5.1.-.CCATS", 1679 | "generated": "Le.Nouveau.Stagiaire.2015.MULTI.1080p.x264-CCATS", 1680 | "title": "Le Nouveau Stagiaire", 1681 | "type": "movie", 1682 | "year": "2015", 1683 | "language": "MULTI", 1684 | "resolution": "1080p", 1685 | "encoding": "x264", 1686 | "group": "CCATS", 1687 | "flags": [ 1688 | "AAC", 1689 | "DD5.1" 1690 | ], 1691 | "score": 5 1692 | }, 1693 | "Le prestige (2006) (The Prestige) 720p x264 AAC 5.1 MULTI [NOEX]": { 1694 | "original": "Le.prestige.2006.The.Prestige.720p.x264.AAC.5.1.MULTI.NOEX.", 1695 | "generated": "Le.Prestige.2006.MULTI.720p.x264-NOTEAM", 1696 | "title": "Le Prestige", 1697 | "type": "movie", 1698 | "year": "2006", 1699 | "language": "MULTI", 1700 | "resolution": "720p", 1701 | "encoding": "x264", 1702 | "flags": [ 1703 | "AAC", 1704 | "DD5.1" 1705 | ], 1706 | "score": 5 1707 | }, 1708 | "Les 4 Fantastiques 2015 Truefrench 720p x264 AAC PIXEL": { 1709 | "original": "Les.4.Fantastiques.2015.Truefrench.720p.x264.AAC.PIXEL", 1710 | "generated": "Les.4.Fantastiques.2015.TRUEFRENCH.720p.x264-NOTEAM", 1711 | "title": "Les 4 Fantastiques", 1712 | "type": "movie", 1713 | "year": "2015", 1714 | "language": "TRUEFRENCH", 1715 | "resolution": "720p", 1716 | "encoding": "x264", 1717 | "flags": [ 1718 | "AAC" 1719 | ], 1720 | "score": 5 1721 | }, 1722 | "One.For.the.Money.2012.1080p.HDrip.French.x264 (by kimo)": { 1723 | "original": "One.For.the.Money.2012.1080p.HDrip.French.x264.by.kimo.", 1724 | "generated": "One.For.The.Money.2012.FRENCH.1080p.HDRip.x264-NOTEAM", 1725 | "title": "One For The Money", 1726 | "type": "movie", 1727 | "year": "2012", 1728 | "language": "FRENCH", 1729 | "resolution": "1080p", 1730 | "source": "HDRip", 1731 | "encoding": "x264", 1732 | "score": 6 1733 | }, 1734 | "Star Wars Episode 1 La Menace fantome 1999 Truefrench BDrip x264-BBer": { 1735 | "original": "Star.Wars.Episode.1.La.Menace.fantome.1999.Truefrench.BDrip.x264-BBer", 1736 | "generated": "Star.Wars.Episode.1.La.Menace.Fantome.1999.TRUEFRENCH.BDRip.x264-BBer", 1737 | "title": "Star Wars Episode 1 La Menace Fantome", 1738 | "type": "movie", 1739 | "year": "1999", 1740 | "language": "TRUEFRENCH", 1741 | "guess": { 1742 | "resolution": "SD" 1743 | }, 1744 | "source": "BDRip", 1745 | "encoding": "x264", 1746 | "group": "BBer", 1747 | "score": 5 1748 | }, 1749 | "Star Wars Episode 2 L'Attaque des clones 2002 Truefrench BDrip x264-BBer": { 1750 | "original": "Star.Wars.Episode.2.L'Attaque.des.clones.2002.Truefrench.BDrip.x264-BBer", 1751 | "generated": "Star.Wars.Episode.2.L'attaque.Des.Clones.2002.TRUEFRENCH.BDRip.x264-BBer", 1752 | "title": "Star Wars Episode 2 L'attaque Des Clones", 1753 | "type": "movie", 1754 | "year": "2002", 1755 | "language": "TRUEFRENCH", 1756 | "guess": { 1757 | "resolution": "SD" 1758 | }, 1759 | "source": "BDRip", 1760 | "encoding": "x264", 1761 | "group": "BBer", 1762 | "score": 5 1763 | }, 1764 | "Star Wars Episode 3 La Revanche des Sith 2005 Truefrench BDrip x264-BBer": { 1765 | "original": "Star.Wars.Episode.3.La.Revanche.des.Sith.2005.Truefrench.BDrip.x264-BBer", 1766 | "generated": "Star.Wars.Episode.3.La.Revanche.Des.Sith.2005.TRUEFRENCH.BDRip.x264-BBer", 1767 | "title": "Star Wars Episode 3 La Revanche Des Sith", 1768 | "type": "movie", 1769 | "year": "2005", 1770 | "language": "TRUEFRENCH", 1771 | "guess": { 1772 | "resolution": "SD" 1773 | }, 1774 | "source": "BDRip", 1775 | "encoding": "x264", 1776 | "group": "BBer", 1777 | "score": 5 1778 | }, 1779 | "Star Wars Episode 4 Un Nouvel espoir 1977 Truefrench BDrip x264-BBer": { 1780 | "original": "Star.Wars.Episode.4.Un.Nouvel.espoir.1977.Truefrench.BDrip.x264-BBer", 1781 | "generated": "Star.Wars.Episode.4.Un.Nouvel.Espoir.1977.TRUEFRENCH.BDRip.x264-BBer", 1782 | "title": "Star Wars Episode 4 Un Nouvel Espoir", 1783 | "type": "movie", 1784 | "year": "1977", 1785 | "language": "TRUEFRENCH", 1786 | "guess": { 1787 | "resolution": "SD" 1788 | }, 1789 | "source": "BDRip", 1790 | "encoding": "x264", 1791 | "group": "BBer", 1792 | "score": 5 1793 | }, 1794 | "Star Wars Episode 5 L'Empire contre-attaque 1980 Truefrench BDrip x264-BBer": { 1795 | "original": "Star.Wars.Episode.5.L'Empire.contre-attaque.1980.Truefrench.BDrip.x264-BBer", 1796 | "generated": "Star.Wars.Episode.5.L'empire.Contre-attaque.1980.TRUEFRENCH.BDRip.x264-BBer", 1797 | "title": "Star Wars Episode 5 L'empire Contre-attaque", 1798 | "type": "movie", 1799 | "year": "1980", 1800 | "language": "TRUEFRENCH", 1801 | "guess": { 1802 | "resolution": "SD" 1803 | }, 1804 | "source": "BDRip", 1805 | "encoding": "x264", 1806 | "group": "BBer", 1807 | "score": 5 1808 | }, 1809 | "Star Wars Episode 6 Le Retour du Jedi 1983 Truefrench BDrip x264-BBer": { 1810 | "original": "Star.Wars.Episode.6.Le.Retour.du.Jedi.1983.Truefrench.BDrip.x264-BBer", 1811 | "generated": "Star.Wars.Episode.6.Le.Retour.Du.Jedi.1983.TRUEFRENCH.BDRip.x264-BBer", 1812 | "title": "Star Wars Episode 6 Le Retour Du Jedi", 1813 | "type": "movie", 1814 | "year": "1983", 1815 | "language": "TRUEFRENCH", 1816 | "guess": { 1817 | "resolution": "SD" 1818 | }, 1819 | "source": "BDRip", 1820 | "encoding": "x264", 1821 | "group": "BBer", 1822 | "score": 5 1823 | }, 1824 | "Star.Wars.Episode.I.The.Phantom.Menace.1999.MULTi.1080p.BluRay.x264-LOST": { 1825 | "original": "Star.Wars.Episode.I.The.Phantom.Menace.1999.MULTi.1080p.BluRay.x264-LOST", 1826 | "generated": "Star.Wars.Episode.I.The.Phantom.Menace.1999.MULTI.1080p.BLURAY.x264-LOST", 1827 | "title": "Star Wars Episode I The Phantom Menace", 1828 | "type": "movie", 1829 | "year": "1999", 1830 | "language": "MULTI", 1831 | "resolution": "1080p", 1832 | "source": "BLURAY", 1833 | "encoding": "x264", 1834 | "group": "LOST", 1835 | "score": 6 1836 | }, 1837 | "Tower Heist [1080p] MULTI 2011 BluRay x264-Pop .Le casse De Central Park.": { 1838 | "original": "Tower.Heist.1080p.MULTI.2011.BluRay.x264-Pop..Le.casse.De.Central.Park.", 1839 | "generated": "Tower.Heist.2011.MULTI.1080p.BLURAY.x264-Pop", 1840 | "title": "Tower Heist", 1841 | "type": "movie", 1842 | "year": "2011", 1843 | "language": "MULTI", 1844 | "resolution": "1080p", 1845 | "source": "BLURAY", 1846 | "encoding": "x264", 1847 | "group": "Pop", 1848 | "score": 6 1849 | }, 1850 | "Elektra 2005 [J.Garner, T.Stamp] BRRIP-H264-720P & AC3-5.1-VFF-STFR [Calinos1]": { 1851 | "original": "Elektra.2005.J.Garner.T.Stamp.BRRIP-H264-720P.&.AC3-5.1-VFF-STFR.Calinos1.", 1852 | "generated": "Elektra.2005.MULTI.720p.BDRip.h264.AC3-NOTEAM", 1853 | "title": "Elektra", 1854 | "type": "movie", 1855 | "year": "2005", 1856 | "language": "MULTI", 1857 | "resolution": "720p", 1858 | "source": "BDRip", 1859 | "dub": "AC3", 1860 | "encoding": "h264", 1861 | "flags": [ 1862 | "DD5.1" 1863 | ], 1864 | "score": 7 1865 | }, 1866 | "Scary Movie 1 (2000) - 1080p FR EN x264 ac3 mHDgz": { 1867 | "original": "Scary.Movie.1.2000.-.1080p.FR.EN.x264.ac3.mHDgz", 1868 | "generated": "Scary.Movie.1.2000.MULTI.1080p.x264.AC3-mHDgz", 1869 | "title": "Scary Movie 1", 1870 | "type": "movie", 1871 | "year": "2000", 1872 | "language": "MULTI", 1873 | "resolution": "1080p", 1874 | "dub": "AC3", 1875 | "encoding": "x264", 1876 | "group": "mHDgz", 1877 | "score": 6 1878 | }, 1879 | "Kiss the blood off my hands - (Norman FOSTER) - 1948 - VOSTFR - Dvdrip-x264 - kerfiche": { 1880 | "original": "Kiss.the.blood.off.my.hands.-.Norman.FOSTER.-.1948.-.VOSTFR.-.Dvdrip-x264.-.kerfiche", 1881 | "generated": "Kiss.The.Blood.Off.My.Hands.1948.VOSTFR.DVDRip.x264-kerfiche", 1882 | "title": "Kiss The Blood Off My Hands", 1883 | "type": "movie", 1884 | "year": "1948", 1885 | "language": "VOSTFR", 1886 | "guess": { 1887 | "resolution": "SD" 1888 | }, 1889 | "source": "DVDRip", 1890 | "encoding": "x264", 1891 | "group": "kerfiche", 1892 | "score": 5 1893 | }, 1894 | "Faster, Pussycat ! Kill ! Kill !. 1965.Russ Meyer.VOSTFR.Blu-Ray 720p.Liosaa (RU) \/ Popo": { 1895 | "original": "Faster.Pussycat.Kill.Kill...1965.Russ.Meyer.VOSTFR.Blu-Ray.720p.Liosaa.RU.\/.Popo", 1896 | "generated": "Faster.Pussycat.Kill.Kill.1965.VOSTFR.720p.BLURAY-NOTEAM", 1897 | "title": "Faster Pussycat Kill Kill", 1898 | "type": "movie", 1899 | "year": "1965", 1900 | "language": "VOSTFR", 1901 | "resolution": "720p", 1902 | "source": "BLURAY", 1903 | "score": 5 1904 | }, 1905 | "Tammy.Voll.abgefahren.German.DL.AC3.Dubbed.720p.WebHD.h264-PsO": { 1906 | "original": "Tammy.Voll.abgefahren.German.DL.AC3.Dubbed.720p.WebHD.h264-PsO", 1907 | "generated": "Tammy.Voll.Abgefahren.GERMAN.720p.WEB-DL.h264.DUBBED-PsO", 1908 | "title": "Tammy Voll Abgefahren", 1909 | "type": "movie", 1910 | "guess": { 1911 | "year": "2017" 1912 | }, 1913 | "language": "GERMAN", 1914 | "resolution": "720p", 1915 | "source": "WEB-DL", 1916 | "dub": "DUBBED", 1917 | "encoding": "h264", 1918 | "group": "PsO", 1919 | "flags": [ 1920 | "DL" 1921 | ], 1922 | "score": 6 1923 | }, 1924 | "22.Jump.Street.GERMAN.DL.AC3.Dubbed.1080p.BluRay.x264-SOV": { 1925 | "original": "22.Jump.Street.GERMAN.DL.AC3.Dubbed.1080p.BluRay.x264-SOV", 1926 | "generated": "22.Jump.Street.GERMAN.1080p.BLURAY.x264.DUBBED-SOV", 1927 | "title": "22 Jump Street", 1928 | "type": "movie", 1929 | "guess": { 1930 | "year": "2017" 1931 | }, 1932 | "language": "GERMAN", 1933 | "resolution": "1080p", 1934 | "source": "BLURAY", 1935 | "dub": "DUBBED", 1936 | "encoding": "x264", 1937 | "group": "SOV", 1938 | "flags": [ 1939 | "DL" 1940 | ], 1941 | "score": 6 1942 | }, 1943 | "The.Purge.Anarchy.German.DL.AC3.Dubbed.1080p.BluRay.x264-Pleaders": { 1944 | "original": "The.Purge.Anarchy.German.DL.AC3.Dubbed.1080p.BluRay.x264-Pleaders", 1945 | "generated": "The.Purge.Anarchy.GERMAN.1080p.BLURAY.x264.DUBBED-Pleaders", 1946 | "title": "The Purge Anarchy", 1947 | "type": "movie", 1948 | "guess": { 1949 | "year": "2017" 1950 | }, 1951 | "language": "GERMAN", 1952 | "resolution": "1080p", 1953 | "source": "BLURAY", 1954 | "dub": "DUBBED", 1955 | "encoding": "x264", 1956 | "group": "Pleaders", 1957 | "flags": [ 1958 | "DL" 1959 | ], 1960 | "score": 6 1961 | }, 1962 | "Ein.Leben.fuer.den.Tod.German.2010.LD.DVDRip.XviD-KLASSiGER": { 1963 | "original": "Ein.Leben.fuer.den.Tod.German.2010.LD.DVDRip.XviD-KLASSiGER", 1964 | "generated": "Ein.Leben.Fuer.Den.Tod.2010.GERMAN.DVDRip.XviD.LD-KLASSiGER", 1965 | "title": "Ein Leben Fuer Den Tod", 1966 | "type": "movie", 1967 | "year": "2010", 1968 | "language": "GERMAN", 1969 | "guess": { 1970 | "resolution": "SD" 1971 | }, 1972 | "source": "DVDRip", 1973 | "dub": "LD", 1974 | "encoding": "XviD", 1975 | "group": "KLASSiGER", 1976 | "score": 6 1977 | }, 1978 | "Mr.Peabody.And.Sherman.2014.NTSC.DVDR-JFKDVD": { 1979 | "original": "Mr.Peabody.And.Sherman.2014.NTSC.DVDR-JFKDVD", 1980 | "generated": "Mr.Peabody.And.Sherman.2014.DVD-R-JFKDVD", 1981 | "title": "Mr Peabody And Sherman", 1982 | "type": "movie", 1983 | "year": "2014", 1984 | "guess": { 1985 | "language": "VO", 1986 | "resolution": "SD" 1987 | }, 1988 | "source": "DVD-R", 1989 | "group": "JFKDVD", 1990 | "flags": [ 1991 | "NTSC" 1992 | ], 1993 | "score": 3 1994 | }, 1995 | "Angriff.der.Urzeitmonster.German.2006.COMPLETE.PAL.DVDR-MOViEiT": { 1996 | "original": "Angriff.der.Urzeitmonster.German.2006.COMPLETE.PAL.DVDR-MOViEiT", 1997 | "generated": "Angriff.Der.Urzeitmonster.2006.GERMAN.DVD-R-MOViEiT", 1998 | "title": "Angriff Der Urzeitmonster", 1999 | "type": "movie", 2000 | "year": "2006", 2001 | "language": "GERMAN", 2002 | "guess": { 2003 | "resolution": "SD" 2004 | }, 2005 | "source": "DVD-R", 2006 | "group": "MOViEiT", 2007 | "flags": [ 2008 | "PAL", 2009 | "COMPLETE" 2010 | ], 2011 | "score": 4 2012 | }, 2013 | "Anflug.Alpha.1.German.1971.COMPLETE.PAL.DVDR-MOViEiT": { 2014 | "original": "Anflug.Alpha.1.German.1971.COMPLETE.PAL.DVDR-MOViEiT", 2015 | "generated": "Anflug.Alpha.1.1971.GERMAN.DVD-R-MOViEiT", 2016 | "title": "Anflug Alpha 1", 2017 | "type": "movie", 2018 | "year": "1971", 2019 | "language": "GERMAN", 2020 | "guess": { 2021 | "resolution": "SD" 2022 | }, 2023 | "source": "DVD-R", 2024 | "group": "MOViEiT", 2025 | "flags": [ 2026 | "PAL", 2027 | "COMPLETE" 2028 | ], 2029 | "score": 4 2030 | }, 2031 | "Wer.spinnt.denn.da.Herr.Doktor.1982.German.1080p.BluRay.x264-iFPD": { 2032 | "original": "Wer.spinnt.denn.da.Herr.Doktor.1982.German.1080p.BluRay.x264-iFPD", 2033 | "generated": "Wer.Spinnt.Denn.Da.Herr.Doktor.1982.GERMAN.1080p.BLURAY.x264-iFPD", 2034 | "title": "Wer Spinnt Denn Da Herr Doktor", 2035 | "type": "movie", 2036 | "year": "1982", 2037 | "language": "GERMAN", 2038 | "resolution": "1080p", 2039 | "source": "BLURAY", 2040 | "encoding": "x264", 2041 | "group": "iFPD", 2042 | "score": 6 2043 | }, 2044 | "The.Sugarland.Express.1974.MULTi.1080p.BluRay.x264-ULSHD": { 2045 | "original": "The.Sugarland.Express.1974.MULTi.1080p.BluRay.x264-ULSHD", 2046 | "generated": "The.Sugarland.Express.1974.MULTI.1080p.BLURAY.x264-ULSHD", 2047 | "title": "The Sugarland Express", 2048 | "type": "movie", 2049 | "year": "1974", 2050 | "language": "MULTI", 2051 | "resolution": "1080p", 2052 | "source": "BLURAY", 2053 | "encoding": "x264", 2054 | "group": "ULSHD", 2055 | "score": 6 2056 | }, 2057 | "Hannah.Arendt.2012.DUAL.COMPLETE.BLURAY-SharpHD": { 2058 | "original": "Hannah.Arendt.2012.DUAL.COMPLETE.BLURAY-SharpHD", 2059 | "generated": "Hannah.Arendt.2012.BLURAY-SharpHD", 2060 | "title": "Hannah Arendt", 2061 | "type": "movie", 2062 | "year": "2012", 2063 | "guess": { 2064 | "language": "VO", 2065 | "resolution": "1080p" 2066 | }, 2067 | "source": "BLURAY", 2068 | "group": "SharpHD", 2069 | "flags": [ 2070 | "COMPLETE", 2071 | "DUAL" 2072 | ], 2073 | "score": 3 2074 | }, 2075 | "The.Rover.2014.DUAL.COMPLETE.BLURAY-XORBiTANT": { 2076 | "original": "The.Rover.2014.DUAL.COMPLETE.BLURAY-XORBiTANT", 2077 | "generated": "The.Rover.2014.BLURAY-XORBiTANT", 2078 | "title": "The Rover", 2079 | "type": "movie", 2080 | "year": "2014", 2081 | "guess": { 2082 | "language": "VO", 2083 | "resolution": "1080p" 2084 | }, 2085 | "source": "BLURAY", 2086 | "group": "XORBiTANT", 2087 | "flags": [ 2088 | "COMPLETE", 2089 | "DUAL" 2090 | ], 2091 | "score": 3 2092 | }, 2093 | "Transformers.Dark.Of.The.Moon.2011.3D.MULTi.1080p.BluRay.x264-LUNETTES": { 2094 | "original": "Transformers.Dark.Of.The.Moon.2011.3D.MULTi.1080p.BluRay.x264-LUNETTES", 2095 | "generated": "Transformers.Dark.Of.The.Moon.2011.MULTI.1080p.BLURAY.x264-LUNETTES", 2096 | "title": "Transformers Dark Of The Moon", 2097 | "type": "movie", 2098 | "year": "2011", 2099 | "language": "MULTI", 2100 | "resolution": "1080p", 2101 | "source": "BLURAY", 2102 | "encoding": "x264", 2103 | "group": "LUNETTES", 2104 | "flags": [ 2105 | "3D" 2106 | ], 2107 | "score": 6 2108 | }, 2109 | "Looters.Tooters.and.Sawn.Off.Shooters.2014.DVDRiP.X264-TASTE": { 2110 | "original": "Looters.Tooters.and.Sawn.Off.Shooters.2014.DVDRiP.X264-TASTE", 2111 | "generated": "Looters.Tooters.And.Sawn.Off.Shooters.2014.DVDRip.x264-TASTE", 2112 | "title": "Looters Tooters And Sawn Off Shooters", 2113 | "type": "movie", 2114 | "year": "2014", 2115 | "guess": { 2116 | "language": "VO", 2117 | "resolution": "SD" 2118 | }, 2119 | "source": "DVDRip", 2120 | "encoding": "x264", 2121 | "group": "TASTE", 2122 | "score": 4 2123 | }, 2124 | "The.Mask.1994.iNTERNAL.BDRip.x264-LiBRARiANS": { 2125 | "original": "The.Mask.1994.iNTERNAL.BDRip.x264-LiBRARiANS", 2126 | "generated": "The.Mask.1994.BDRip.x264-LiBRARiANS", 2127 | "title": "The Mask", 2128 | "type": "movie", 2129 | "year": "1994", 2130 | "guess": { 2131 | "language": "VO", 2132 | "resolution": "SD" 2133 | }, 2134 | "source": "BDRip", 2135 | "encoding": "x264", 2136 | "group": "LiBRARiANS", 2137 | "flags": [ 2138 | "INTERNAL" 2139 | ], 2140 | "score": 4 2141 | }, 2142 | "Dumb.And.Dumber.1994.iNTERNAL.BDRip.x264-LiBRARiANS": { 2143 | "original": "Dumb.And.Dumber.1994.iNTERNAL.BDRip.x264-LiBRARiANS", 2144 | "generated": "Dumb.And.Dumber.1994.BDRip.x264-LiBRARiANS", 2145 | "title": "Dumb And Dumber", 2146 | "type": "movie", 2147 | "year": "1994", 2148 | "guess": { 2149 | "language": "VO", 2150 | "resolution": "SD" 2151 | }, 2152 | "source": "BDRip", 2153 | "encoding": "x264", 2154 | "group": "LiBRARiANS", 2155 | "flags": [ 2156 | "INTERNAL" 2157 | ], 2158 | "score": 4 2159 | }, 2160 | "Nurse.3D.2013.German.DL.720p.BluRay.x264-PussyFoot": { 2161 | "original": "Nurse.3D.2013.German.DL.720p.BluRay.x264-PussyFoot", 2162 | "generated": "Nurse.2013.GERMAN.720p.BLURAY.x264-PussyFoot", 2163 | "title": "Nurse", 2164 | "type": "movie", 2165 | "year": "2013", 2166 | "language": "GERMAN", 2167 | "resolution": "720p", 2168 | "source": "BLURAY", 2169 | "encoding": "x264", 2170 | "group": "PussyFoot", 2171 | "flags": [ 2172 | "DL", 2173 | "3D" 2174 | ], 2175 | "score": 6 2176 | }, 2177 | "Free.Birds.Esst.uns.an.einem.anderen.Tag.3D.HSBS.German.DL.1080p.BluRay.x264-EXQUiSiTE": { 2178 | "original": "Free.Birds.Esst.uns.an.einem.anderen.Tag.3D.HSBS.German.DL.1080p.BluRay.x264-EXQUiSiTE", 2179 | "generated": "Free.Birds.Esst.Uns.An.Einem.Anderen.Tag.GERMAN.1080p.BLURAY.x264-EXQUiSiTE", 2180 | "title": "Free Birds Esst Uns An Einem Anderen Tag", 2181 | "type": "movie", 2182 | "guess": { 2183 | "year": "2017" 2184 | }, 2185 | "language": "GERMAN", 2186 | "resolution": "1080p", 2187 | "source": "BLURAY", 2188 | "encoding": "x264", 2189 | "group": "EXQUiSiTE", 2190 | "flags": [ 2191 | "DL", 2192 | "3D", 2193 | "HSBS" 2194 | ], 2195 | "score": 5 2196 | }, 2197 | "Friday.The.13th.Part.III.3D.1982.iNTERNAL.BDRip.x264-MARS": { 2198 | "original": "Friday.The.13th.Part.III.3D.1982.iNTERNAL.BDRip.x264-MARS", 2199 | "generated": "Friday.The.13th.Part.Iii.1982.BDRip.x264-MARS", 2200 | "title": "Friday The 13th Part Iii", 2201 | "type": "movie", 2202 | "year": "1982", 2203 | "guess": { 2204 | "language": "VO", 2205 | "resolution": "SD" 2206 | }, 2207 | "source": "BDRip", 2208 | "encoding": "x264", 2209 | "group": "MARS", 2210 | "flags": [ 2211 | "INTERNAL", 2212 | "3D" 2213 | ], 2214 | "score": 4 2215 | }, 2216 | "Edge.of.Tomorrow.3D.HOU.German.DL.1080p.BluRay.x264-EXQUiSiTE": { 2217 | "original": "Edge.of.Tomorrow.3D.HOU.German.DL.1080p.BluRay.x264-EXQUiSiTE", 2218 | "generated": "Edge.Of.Tomorrow.GERMAN.1080p.BLURAY.x264-EXQUiSiTE", 2219 | "title": "Edge Of Tomorrow", 2220 | "type": "movie", 2221 | "guess": { 2222 | "year": "2017" 2223 | }, 2224 | "language": "GERMAN", 2225 | "resolution": "1080p", 2226 | "source": "BLURAY", 2227 | "encoding": "x264", 2228 | "group": "EXQUiSiTE", 2229 | "flags": [ 2230 | "DL", 2231 | "3D", 2232 | "HOU" 2233 | ], 2234 | "score": 5 2235 | }, 2236 | "Rules.of.Engagement.S05E24.German.DVDRip.x264-iNTENTiON": { 2237 | "original": "Rules.of.Engagement.S05E24.German.DVDRip.x264-iNTENTiON", 2238 | "generated": "Rules.Of.Engagement.S05E24.GERMAN.DVDRip.x264-iNTENTiON", 2239 | "title": "Rules Of Engagement", 2240 | "type": "tvshow", 2241 | "guess": { 2242 | "year": "2017", 2243 | "resolution": "SD" 2244 | }, 2245 | "language": "GERMAN", 2246 | "source": "DVDRip", 2247 | "encoding": "x264", 2248 | "group": "iNTENTiON", 2249 | "season": 5, 2250 | "episode": 24, 2251 | "score": 4 2252 | }, 2253 | "Shortland.Street.S23E180.720p.HDTV.x264-FiHTV": { 2254 | "original": "Shortland.Street.S23E180.720p.HDTV.x264-FiHTV", 2255 | "generated": "Shortland.Street.S23E180.720p.HDTV.x264-FiHTV", 2256 | "title": "Shortland Street", 2257 | "type": "tvshow", 2258 | "guess": { 2259 | "year": "2017", 2260 | "language": "VO" 2261 | }, 2262 | "resolution": "720p", 2263 | "source": "HDTV", 2264 | "encoding": "x264", 2265 | "group": "FiHTV", 2266 | "season": 23, 2267 | "episode": 180, 2268 | "score": 4 2269 | }, 2270 | "Police.Ten.7.S21E35.REPACK.720p.HDTV.x264-FiHTV": { 2271 | "original": "Police.Ten.7.S21E35.REPACK.720p.HDTV.x264-FiHTV", 2272 | "generated": "Police.Ten.7.S21E35.720p.HDTV.x264-FiHTV", 2273 | "title": "Police Ten 7", 2274 | "type": "tvshow", 2275 | "guess": { 2276 | "year": "2017", 2277 | "language": "VO" 2278 | }, 2279 | "resolution": "720p", 2280 | "source": "HDTV", 2281 | "encoding": "x264", 2282 | "group": "FiHTV", 2283 | "flags": [ 2284 | "REPACK" 2285 | ], 2286 | "season": 21, 2287 | "episode": 35, 2288 | "score": 4 2289 | }, 2290 | "Die.Hoehle.der.Loewen.S01E08.German.HDTVRip.x264-SotW": { 2291 | "original": "Die.Hoehle.der.Loewen.S01E08.German.HDTVRip.x264-SotW", 2292 | "generated": "Die.Hoehle.Der.Loewen.S01E08.GERMAN.HDTV.x264-SotW", 2293 | "title": "Die Hoehle Der Loewen", 2294 | "type": "tvshow", 2295 | "guess": { 2296 | "year": "2017", 2297 | "resolution": "SD" 2298 | }, 2299 | "language": "GERMAN", 2300 | "source": "HDTV", 2301 | "encoding": "x264", 2302 | "group": "SotW", 2303 | "season": 1, 2304 | "episode": 8, 2305 | "score": 4 2306 | }, 2307 | "Supernatural.S09E08.Endlich.wieder.Jungfrau.GERMAN.DUBBED.DL.720p.BluRay.x264-TVP": { 2308 | "original": "Supernatural.S09E08.Endlich.wieder.Jungfrau.GERMAN.DUBBED.DL.720p.BluRay.x264-TVP", 2309 | "generated": "Supernatural.S09E08.GERMAN.720p.BLURAY.x264.DUBBED-TVP", 2310 | "title": "Supernatural", 2311 | "type": "tvshow", 2312 | "guess": { 2313 | "year": "2017" 2314 | }, 2315 | "language": "GERMAN", 2316 | "resolution": "720p", 2317 | "source": "BLURAY", 2318 | "dub": "DUBBED", 2319 | "encoding": "x264", 2320 | "group": "TVP", 2321 | "flags": [ 2322 | "DL" 2323 | ], 2324 | "season": 9, 2325 | "episode": 8, 2326 | "score": 6 2327 | }, 2328 | "No.Foreigners.Here.100.Percent.British.S01E03.PDTV.x264-C4TV": { 2329 | "original": "No.Foreigners.Here.100.Percent.British.S01E03.PDTV.x264-C4TV", 2330 | "generated": "No.Foreigners.Here.100.Percent.British.S01E03.PDTV.x264-C4TV", 2331 | "title": "No Foreigners Here 100 Percent British", 2332 | "type": "tvshow", 2333 | "guess": { 2334 | "year": "2017", 2335 | "language": "VO", 2336 | "resolution": "SD" 2337 | }, 2338 | "source": "PDTV", 2339 | "encoding": "x264", 2340 | "group": "C4TV", 2341 | "season": 1, 2342 | "episode": 3, 2343 | "score": 3 2344 | }, 2345 | "2012.AC3.720p.BluRay.x264-XXL": { 2346 | "original": "2012.AC3.720p.BluRay.x264-XXL", 2347 | "generated": "2012.720p.BLURAY.x264.AC3-XXL", 2348 | "title": "2012", 2349 | "type": "movie", 2350 | "guess": { 2351 | "year": "2017", 2352 | "language": "VO" 2353 | }, 2354 | "resolution": "720p", 2355 | "source": "BLURAY", 2356 | "dub": "AC3", 2357 | "encoding": "x264", 2358 | "group": "XXL", 2359 | "score": 5 2360 | }, 2361 | "Snowpiercer.2013.German.AC3.MD.1080p.BluRay.x264-HuNTER": { 2362 | "original": "Snowpiercer.2013.German.AC3.MD.1080p.BluRay.x264-HuNTER", 2363 | "generated": "Snowpiercer.2013.GERMAN.1080p.BLURAY.x264.AC3-HuNTER", 2364 | "title": "Snowpiercer", 2365 | "type": "movie", 2366 | "year": "2013", 2367 | "language": "GERMAN", 2368 | "resolution": "1080p", 2369 | "source": "BLURAY", 2370 | "dub": "AC3", 2371 | "encoding": "x264", 2372 | "group": "HuNTER", 2373 | "score": 7 2374 | }, 2375 | "Noah.German.2014.LD.1080p.BluRay.x264-HCS": { 2376 | "original": "Noah.German.2014.LD.1080p.BluRay.x264-HCS", 2377 | "generated": "Noah.2014.GERMAN.1080p.BLURAY.x264.LD-HCS", 2378 | "title": "Noah", 2379 | "type": "movie", 2380 | "year": "2014", 2381 | "language": "GERMAN", 2382 | "resolution": "1080p", 2383 | "source": "BLURAY", 2384 | "dub": "LD", 2385 | "encoding": "x264", 2386 | "group": "HCS", 2387 | "score": 7 2388 | } 2389 | } -------------------------------------------------------------------------------- /utils/releases.txt: -------------------------------------------------------------------------------- 1 | 12.Monkeys.S01E01.FRENCH.HDTV.x264-AZR 2 | Mr.Robot.S01.PROPER.VOSTFR.720p.WEB-DL.DD5.1.H264-ARK01 3 | Nights.In.Rodanthe.TRUEFRENCH.DVDRip.XviD-UNSKiLLED 4 | Arrow.S03E01.FASTSUB.VOSTFR.HDTV.x264-ADDiCTiON 5 | Orange.Mecanique.MULTI.DVDRIP.x264.AAC-ECKOES 6 | Arthur.Newman.2012.FRENCH.BDRip.x264-Ryotox 7 | Palo.Alto.2013.LIMITED.VOSTFR.BRRip.x264.AC3-S.V 8 | Barbecue.2014.FRENCH.DVDRiP.XViD-ARTEFAC 9 | Peter.Pan.TRUEFRENCH.DVDRip.XviD.AC3-LiberTeam 10 | Big.Eyes.2014.FRENCH.BDRip.XviD-GLUPS 11 | Blended.2014.FRENCH.BRRIP XVID AC3-lecorse 12 | Pitch.Perfect.2.2015.FRENCH.BDRip.x264-COUAC 13 | Blue. Valentine 2010 French DvDRip Xvid-FwD 14 | Pixels.2015.FRENCH.BDRip.x264-VENUE 15 | Camp.X-Ray.2014.FRENCH.BDRip.x264-PRiDEHD 16 | Pixels.2015.FRENCH.DVDRip.XviD-SVR 17 | Platoon.1986.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY 18 | Captain.Phillips.2013.FRENCH.DVDRip.x264-TiCKETS 19 | Celeste.and.Jesse.Forever.2012.VOSTFR.BDRiP.XviD-NIKOo 20 | Pompeii.2014.TRUEFRENCH.BRRip.XviD-DesTroY 21 | Chef.2014.FRENCH.BDRiP.x264-PRiDEHD 22 | Quand.Harry.Rencontre.Sally.FRENCH.DVDRiP.XviD-Shane 23 | Qu.Est.Ce.Qu.On.a.Fait.au.Bon.Dieu.2014.FRENCH.720p.mHD.x264-ExPLiCiT 24 | Rush.2013.FRENCH.BDRip.x264-Thursday16th 25 | Serena.2014.FRENCH.DVDRip.x264-FUTiL 26 | Dope.2015.SUBFORCED.FRENCH.BRRip.XviD-SVR 27 | Serendipity.2001.FRENCH.BRRip.x264.AC3-CHARTAIR 28 | Drinking.Buddies.2013.LIMITED.DVDRip.x264-NODLABS 29 | Shrek.Tetralogie.TRUEFRENCH.DVDRIP.XVID.AC3.5.1-lanesra13 30 | Dumb.And.Dumber.FRENCH.BRRip.XviD-LKT 31 | Silver.Linings.Playbook.2012.TRUEFRENCH.BDRip.x264.AC3-TKS 32 | Eden.Lost.in.Music.2014.FRENCH.BDRip.x264-MELBA 33 | Sin.City.A.Dame.to.Kill.For.2014.FRENCH.BDRip.x264.AC3-GLUPS 34 | Endless Love 2014 FRENCH 720p BluRay x264-CARPEDIEM 35 | Source.Code.2011.FRENCH.BRRip.x264.AC3-FUNKY 36 | Enemy.2013.LIMITED.FRENCH.SUBFORCED.BRRip.x264.AC3-SP3CTR3 37 | Sous.Les.Jupes.Des.Filles.2014.FRENCH.BDRip.XviD-GLUPS 38 | Eureka.S05.FRENCH.LD.DVDRiP.XViD-EPZ 39 | Exam.2009.LiMiTED.FRENCH.DVDRip.XviD 40 | Ex.Machina.2015.FRENCH.SUBFORCED.BRRip.XviD.AC3-CHARTAIR 41 | Factotum.FRENCH.DVDRiP.XviD-ZANBiC 42 | Still.Alice.2014.TRUEFRENCH.BDRip.XviD-DesTroY 43 | Fish.Tank.2009.FRENCH.BRRip.x264.AC3-SALEM 44 | Taken.3.2014.EXTENDED.FRENCH.BDRip.XviD-GLUPS 45 | Ted.2012.TRUEFRENCH.720p.BluRay.x264.AC3 46 | Furious.Seven.2015.EXTENDED.TRUEFRENCH.BDRip.x264.AC3-GLUPS 47 | Ted.2.2015.UNRATED.FRENCH.720p.WEB-DL.DD5.1.H264 48 | Fury.2014.FRENCH.BDRip.x264-ROUGH 49 | Gravity.2013.FRENCH.BRRip.XviD.AC3-S.V 50 | The.100.S01E01.FASTSUB.VOSTFR.HDTV.XviD-ADDiCTiON 51 | Green.Zone.2010.TRUEFRENCH.SUBFORCED.DVDRIP.XVID-KNOB 52 | The.Angriest.Man.in.Brooklyn.2014.FRENCH.BDRip.x264-PRiDEHD 53 | Hannibal.2001.TRUEFRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY 54 | The.Drop.2014.FRENCH.BDRip.x264-PRiDEHD 55 | HappyThankYouMorePlease.2010.HDRip.AC3 56 | The.Gambler.2014.FRENCH.BDRip.x264-VENUE 57 | The.Last.Man.On.Earth.S01E01.FASTSUB.VOSTFR.HDTV.XviD-ADDiCTiON 58 | Hector.and.the.Search.for.Happiness.2014.FRENCH.DVDRiP.XviD.AC3-S.V 59 | The.Longest.Ride.2015.FRENCH.720p.BluRay.x264.AC3-BUITONIO 60 | Horrible.Bosses.2.2014.THEATRICAL.FRENCH.BDRip.XviD.AC3-DesTroY 61 | The.Longest.Ride.2015.FRENCH.BDRip.x264-VENUE 62 | How.Do.You.Know.2010.TRUEFRENCH.DVDRip.XviD-LiberTeam 63 | The.Man.In.The.High.Castle.S01E01.Pilot.720p.WEBRip.DD5.1.x264-FtDL 64 | How.to.Train.Your.Dragon.2.2014.FRENCH.BDRip.x264-PRiDEHD 65 | The.Master.2012.FRENCH.BDRiP.XViD-AViTECH 66 | The.Maze.Runner.2014.TRUEFRENCH.BDRip.XviD-GLUPS 67 | Inherent.Vice.2014.FRENCH.BRRip.XviD-DesTroY 68 | The Spirit 2009 TRUEFRENCH DVDRiP XViD AC3-FwD 69 | La.French.2014.FRENCH.BRRip.x264.AC3-DesTroY 70 | The Ten 2011 TRUEFRENCH SUBFORCED DVDRIP XVID-FwD 71 | La.Planete.Des.Singes.L'affrontement.TRUEFRENCH.720p.x264.HDLIGHT 72 | The.Wind.Rises.2013.FRENCH.BRRip.x264.AC3-DesTroY 73 | La.Veritable.Histoire.Du.Petit.Chaperon.Rouge.FRENCH.DVDRiP.XviD 74 | The.Worlds.End.2013.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY 75 | La.Vie.D.Adele.2013.FRENCH.WORKPRINT.XViD-ATN 76 | Tomorrowland.2015.TRUEFRENCH.720p.WEB-DL.AC3.x264-TonTon 77 | Les.Gorilles.2014.TRUEFRENCH.WEBRip.XviD-SVR 78 | Total.recall.1990.FRENCH.BRRIP.X264.AC3-KENPACHI 79 | Liberal.Arts.2012.FANSUB.VOSTFR.BRRiP.XviD-NIKOo 80 | Transformers.Age.Of.Extinction.2014.TRUEFRENCH.DVDRip.x264.AC3-DesTroY 81 | Un Peu.Beaucoup.Aveuglement.2014.FRENCH.WEB-DL.1080p.x264-SVR 82 | Magic.In.The.Moonlight.2014.FRENCH.BRRip.x264.AC3-DesTroY 83 | Manhattan.S01E01.FRENCH.HDTV.x264-CaCoLaC 84 | Ma.Premiere.Fois.2012.FRENCH.720p.BluRay.x264-CARPEDIEM 85 | Marvels.Agent.Carter.S01E01.FASTSUB.VOSTFR.720p.HDTV.x264-ADDiCTiON 86 | Veronica Mars 2014 TRUEFRENCH BDRip XviD AC3-FrIeNdS 87 | Marvels.Agent.Carter.S01E01.VOSTFR.720p.HDTV.x264-LTL 88 | Marvels.Agent.Carter.S01E02.VOSTFR.720p.HDTV.x264-LTL 89 | Water.For.Elephants.2011.FRENCH.SUBFORCED.BRRip.x264.AC3-FUNKY 90 | Marvels.Agent.Carter.S01E03.VOSTFR.720p.WEB-DL.DD5.1.H.264-LTL 91 | Weeds.S01.REPACK.MULTI.720p.BluRay.x264-DWS 92 | Marvels.Agent.Carter.S01.VOSTFR.720p.WEB-DL.DD5.1.H.264-SEEHD 93 | While.Were.Young.2014.FRENCH.BDRip.x264-PRiDEHD 94 | White.Bird.In.A.Blizzard.2014.LiMiTED.FRENCH.DVDRip.XviD.AC3-DesTroY 95 | Meet Bill 2012 TRUEFRENCH DvDRiP Xvid-TFTD 96 | Wild.Child.2008.TRUEFRENCH.BRRip.XviD.AC3-LiberTeam 97 | Mommy.2014.FRENCH.BDRip.x264-PRiDEHD 98 | With.This.Ring.2015.RERiP.FRENCH.DVDRip.x264.AC3-DesTroY 99 | Women.In.Trouble.2011.TRUEFRENCH.DVDRiP.XViD-UTT 100 | Lone.Survivor.2013.FANSUB.VOSTFR.DVDSCR.XVID.AC3-NIKOo 101 | Benjamin Button [x264] [HD 720p] [LUCN] [FR] 102 | Jamais entre amis (2015) [1080p] MULTI (VFQ-VOA) Bluray x264 AC3-PopHD (Sleeping with Other People) 103 | La Vie revee de Walter Mitty [1080p] MULTi 2013 BluRay x264-Pop (The Secret Life Of Walter Mitty) 104 | Le Nouveau Stagiaire (2015) The Intern - Multi 1080p - x264 AAC 5.1 - CCATS 105 | Le prestige (2006) (The Prestige) 720p x264 AAC 5.1 MULTI [NOEX] 106 | Les 4 Fantastiques 2015 Truefrench 720p x264 AAC PIXEL 107 | One.For.the.Money.2012.1080p.HDrip.French.x264 (by kimo) 108 | Star Wars Episode 1 La Menace fantome 1999 Truefrench BDrip x264-BBer 109 | Star Wars Episode 2 L'Attaque des clones 2002 Truefrench BDrip x264-BBer 110 | Star Wars Episode 3 La Revanche des Sith 2005 Truefrench BDrip x264-BBer 111 | Star Wars Episode 4 Un Nouvel espoir 1977 Truefrench BDrip x264-BBer 112 | Star Wars Episode 5 L'Empire contre-attaque 1980 Truefrench BDrip x264-BBer 113 | Star Wars Episode 6 Le Retour du Jedi 1983 Truefrench BDrip x264-BBer 114 | Star.Wars.Episode.I.The.Phantom.Menace.1999.MULTi.1080p.BluRay.x264-LOST 115 | Tower Heist [1080p] MULTI 2011 BluRay x264-Pop .Le casse De Central Park. 116 | Elektra 2005 [J.Garner, T.Stamp] BRRIP-H264-720P & AC3-5.1-VFF-STFR [Calinos1] 117 | Scary Movie 1 (2000) - 1080p FR EN x264 ac3 mHDgz 118 | Kiss the blood off my hands - (Norman FOSTER) - 1948 - VOSTFR - Dvdrip-x264 - kerfiche 119 | Faster, Pussycat ! Kill ! Kill !. 1965.Russ Meyer.VOSTFR.Blu-Ray 720p.Liosaa (RU) / Popo 120 | Tammy.Voll.abgefahren.German.DL.AC3.Dubbed.720p.WebHD.h264-PsO 121 | 22.Jump.Street.GERMAN.DL.AC3.Dubbed.1080p.BluRay.x264-SOV 122 | The.Purge.Anarchy.German.DL.AC3.Dubbed.1080p.BluRay.x264-Pleaders 123 | Ein.Leben.fuer.den.Tod.German.2010.LD.DVDRip.XviD-KLASSiGER 124 | Mr.Peabody.And.Sherman.2014.NTSC.DVDR-JFKDVD 125 | Angriff.der.Urzeitmonster.German.2006.COMPLETE.PAL.DVDR-MOViEiT 126 | Anflug.Alpha.1.German.1971.COMPLETE.PAL.DVDR-MOViEiT 127 | Wer.spinnt.denn.da.Herr.Doktor.1982.German.1080p.BluRay.x264-iFPD 128 | The.Sugarland.Express.1974.MULTi.1080p.BluRay.x264-ULSHD 129 | Hannah.Arendt.2012.DUAL.COMPLETE.BLURAY-SharpHD 130 | The.Rover.2014.DUAL.COMPLETE.BLURAY-XORBiTANT 131 | Transformers.Dark.Of.The.Moon.2011.3D.MULTi.1080p.BluRay.x264-LUNETTES 132 | Looters.Tooters.and.Sawn.Off.Shooters.2014.DVDRiP.X264-TASTE 133 | The.Mask.1994.iNTERNAL.BDRip.x264-LiBRARiANS 134 | Dumb.And.Dumber.1994.iNTERNAL.BDRip.x264-LiBRARiANS 135 | Nurse.3D.2013.German.DL.720p.BluRay.x264-PussyFoot 136 | Free.Birds.Esst.uns.an.einem.anderen.Tag.3D.HSBS.German.DL.1080p.BluRay.x264-EXQUiSiTE 137 | Friday.The.13th.Part.III.3D.1982.iNTERNAL.BDRip.x264-MARS 138 | Edge.of.Tomorrow.3D.HOU.German.DL.1080p.BluRay.x264-EXQUiSiTE 139 | Rules.of.Engagement.S05E24.German.DVDRip.x264-iNTENTiON 140 | Shortland.Street.S23E180.720p.HDTV.x264-FiHTV 141 | Police.Ten.7.S21E35.REPACK.720p.HDTV.x264-FiHTV 142 | Die.Hoehle.der.Loewen.S01E08.German.HDTVRip.x264-SotW 143 | Supernatural.S09E08.Endlich.wieder.Jungfrau.GERMAN.DUBBED.DL.720p.BluRay.x264-TVP 144 | No.Foreigners.Here.100.Percent.British.S01E03.PDTV.x264-C4TV 145 | 2012.AC3.720p.BluRay.x264-XXL 146 | Snowpiercer.2013.German.AC3.MD.1080p.BluRay.x264-HuNTER 147 | Noah.German.2014.LD.1080p.BluRay.x264-HCS 148 | --------------------------------------------------------------------------------