/** * @param $episodeFilename string show file name * @param $download boolean download the file? * * @return null|string */ public function findSubtitle($episodeFilename, $download) { $language = $this->config->getSubtitleLanguage(); if (!isset($this->languages[$language])) { printf("Missing language [%s].\n", $language); return null; } $episode = new Episode($episodeFilename); if (!isset($this->shows[$episode->sanitizedShowName])) { printf("Missing show [%s].\n", $episode->showName); return null; } $languageId = $this->languages[$language]; $showId = $this->shows[$episode->sanitizedShowName]; $url = $this->builder->getAddictedShowAjaxUrl($showId, $episode->season, $languageId); printf("Trying to get subtitles from [%s].\n", $url); $crawler = $this->client->request('GET', $url); $matchingSubtitles = $crawler->filter('div#season > table > tbody > tr.epeven')->reduce(function (Crawler $node) use($episode) { $children = $node->children(); $ep = $children->getNode(1)->nodeValue; $group = strtolower($children->getNode(4)->nodeValue); $status = strtolower($children->getNode(5)->nodeValue); return (int) $ep === (int) $episode->ep && $episode->inGroups($group) && strpos($status, '%') === false; }); if ($matchingSubtitles->count() == 0) { printf("Missing subtitles for show [%s] season [%s] episode [%s] \n and groups [%s].\n", $episode->showName, $episode->season, $episode->ep, implode(', ', $episode->groups)); return null; } $chosenSubtitle = $matchingSubtitles->first(); $downloadUri = $chosenSubtitle->children()->getNode(9)->firstChild->getAttribute('href'); $url = $this->builder->getSubtitleUrl($downloadUri); if ($download === false) { printf("Chosen subtitle [%s].\n", $url); return null; } printf("Downloading subtitle [%s].\n", $url); $headers = $this->builder->getRequestHeaders($showId); return $this->client->getClient()->get($url, ['headers' => $headers])->getBody()->getContents(); }