?\[\]\\;\',.\/ ]+\s?\((19|20)\d\d\))/i', $nfoContent, $result)) { return null; } $releaseName = $result[0]; // Extract language $releaseName = $this->appendLanguageFromNfo($releaseName, $nfoContent); // Extract resolution $releaseName = $this->appendResolutionFromNfo($releaseName, $nfoContent); // Extract source $releaseName = $this->appendSourceFromNfo($releaseName, $nfoContent); // Extract video codec $releaseName = $this->appendVideoCodecFromNfo($releaseName, $nfoContent); // Extract audio codec $releaseName = $this->appendAudioCodecFromNfo($releaseName, $nfoContent); $releaseName .= '-NoGroup'; return NameFixResult::fromMatch($releaseName, 'Title (Year)', 'NFO'); } /** * Check NFO content for Game patterns. */ public function checkForGame(string $nfoContent): ?NameFixResult { $result = []; // Check for known game groups if (! preg_match('/ALiAS|BAT-TEAM|FAiRLiGHT|Game Type|Glamoury|HI2U|iTWINS|JAGUAR|(LARGE|MEDIUM)ISO|MAZE|nERv|PROPHET|PROFiT|PROCYON|RELOADED|REVOLVER|ROGUE|ViTALiTY/i', $nfoContent)) { return null; } // (c) pattern if (preg_match('/\w[\w.+&*\/\()\',;: -]+\(c\)[\-\w.\',;& ]+\w/i', $nfoContent, $result)) { $releaseName = str_replace(['(c)', '(C)'], '(GAMES) (c)', $result[0]); return NameFixResult::fromMatch($releaseName, 'PC Games (c)', 'NFO'); } // *ISO* pattern if (preg_match('/\w[\w.+&*\/()\',;: -]+\*ISO\*/i', $nfoContent, $result)) { $releaseName = str_replace('*ISO*', '*ISO* (PC GAMES)', $result[0]); return NameFixResult::fromMatch($releaseName, 'PC Games *ISO*', 'NFO'); } return null; } /** * Check NFO content for IGUANA supplier patterns. */ public function checkForIguana(string $nfoContent): ?NameFixResult { if (! preg_match('/Supplier.+?IGUANA/i', $nfoContent)) { return null; } $releaseName = ''; $result = []; if (preg_match('/\w[\-\w`~!@#$%^&*()+={}|:"<>?\[\]\\;\',.\/ ]+\s\((19|20)\d\d\)/i', $nfoContent, $result)) { $releaseName = $result[0]; } if (preg_match('/\s\[\*\] (English|Dutch|French|German|Spanish)\b/i', $nfoContent, $result)) { $releaseName .= '.'.$result[1]; } if (preg_match('/\s\[\*\] (DT?S [2567][._ -][0-2]( MONO)?)\b/i', $nfoContent, $result)) { $releaseName .= '.'.$result[2]; } if (preg_match('/Format.+(DVD([59R])?|[HX][._ -]?264)\b/i', $nfoContent, $result)) { $releaseName .= '.'.$result[1]; } if (preg_match('/\[(640x.+|1280x.+|1920x.+)\] Resolution\b/i', $nfoContent, $result)) { $res = match (true) { $result[1] === '640x.+' => '480p', $result[1] === '1280x.+' => '720p', $result[1] === '1920x.+' => '1080p', default => $result[1], }; $releaseName .= '.'.$res; } if ($releaseName !== '') { return NameFixResult::fromMatch($releaseName.'.IGUANA', 'IGUANA', 'NFO'); } return null; } /** * Append language from NFO content. */ protected function appendLanguageFromNfo(string $releaseName, string $nfoContent): string { $result = []; if (preg_match('/(idiomas|lang|language|langue|sprache).*?\b(?PBrazilian|Chinese|Croatian|Danish|DE|Deutsch|Dutch|Estonian|ES|English|Englisch|Finnish|Flemish|Francais|French|FR|German|Greek|Hebrew|Icelandic|Italian|Japenese|Japan|Japanese|Korean|Latin|Nordic|Norwegian|Polish|Portuguese|Russian|Serbian|Slovenian|Swedish|Spanisch|Spanish|Thai|Turkish)\b/i', $nfoContent, $result)) { $lang = match ($result['lang']) { 'DE' => 'GERMAN', 'Englisch' => 'ENGLISH', 'FR' => 'FRENCH', 'ES' => 'SPANISH', default => $result['lang'], }; $releaseName .= '.'.$lang; } return $releaseName; } /** * Append resolution from NFO content. */ protected function appendResolutionFromNfo(string $releaseName, string $nfoContent): string { $result = []; if (preg_match('/(frame size|(video )?res(olution)?|video).*?(?P(272|336|480|494|528|608|\(?640|688|704|720x480|810|816|820|1 ?080|1280( \@)?|1 ?920(x1080)?))/i', $nfoContent, $result)) { $res = match ($result['res']) { '272', '336', '480', '494', '608', '640', '(640', '688', '704', '720x480' => '480p', '1280x720', '1280', '1280 @' => '720p', '810', '816', '820', '1920', '1 920', '1080', '1 080', '1920x1080' => '1080p', '2160' => '2160p', default => $result['res'], }; $releaseName .= '.'.$res; } elseif (preg_match('/(largeur|width).*?(?P(\(?640|688|704|720|1280( \@)?|1 ?920))/i', $nfoContent, $result)) { $res = match ($result['res']) { '640', '(640', '688', '704', '720' => '480p', '1280 @', '1280' => '720p', '1920', '1 920' => '1080p', '2160' => '2160p', default => $result['res'], }; $releaseName .= '.'.$res; } return $releaseName; } /** * Append source from NFO content. */ protected function appendSourceFromNfo(string $releaseName, string $nfoContent): string { $result = []; if (preg_match('/source.*?\b(?PBD(-?(25|50|RIP))?|Blu-?Ray ?(3D)?|BRRIP|CAM(RIP)?|DBrip|DTV|DVD\-?(5|9|(R(IP)?|scr(eener)?))?|[HPS]D?(RIP|TV(RIP)?)?|NTSC|PAL|R5|Ripped |S?VCD|scr(eener)?|SAT(RIP)?|TS|VHS(RIP)?|VOD|WEB-DL)\b/i', $nfoContent, $result)) { $source = match ($result['source']) { 'BD' => 'Bluray.x264', 'CAMRIP' => 'CAM', 'DBrip' => 'BDRIP', 'DVD R1', 'NTSC', 'PAL', 'VOD' => 'DVD', 'HD' => 'HDTV', 'Ripped ' => 'DVDRIP', default => $result['source'], }; $releaseName .= '.'.$source; } elseif (preg_match('/(codec( (name|code))?|(original )?format|res(olution)|video( (codec|format|res))?|tv system|type|writing library).*?\b(?P