diff --git a/src/Monitor/Action/Handler/MonitorTvShowHandler.php b/src/Monitor/Action/Handler/MonitorTvShowHandler.php index f777718..132ca89 100644 --- a/src/Monitor/Action/Handler/MonitorTvShowHandler.php +++ b/src/Monitor/Action/Handler/MonitorTvShowHandler.php @@ -11,6 +11,7 @@ use App\Monitor\Framework\Entity\Monitor; use App\Monitor\Framework\Repository\MonitorRepository; use App\Tmdb\Dto\TmdbEpisodeDto; use App\Tmdb\TmdbClient; +use App\Tmdb\TmdbResult; use Carbon\Carbon; use DateTimeImmutable; use Doctrine\ORM\EntityManagerInterface; @@ -36,18 +37,14 @@ readonly class MonitorTvShowHandler implements HandlerInterface public function handle(CommandInterface $command): ResultInterface { $this->logger->info('> [MonitorTvShowHandler] Executing MonitorTvShowHandler'); + $monitor = $this->monitorRepository->find($command->monitorId); - $this->refreshData($monitor); + $showTmdbData = $this->tmdb->tvshowDetails($monitor->getImdbId()); + + $this->refreshData($monitor, $showTmdbData); // Check current episodes - $downloadedEpisodes = $this->mediaFiles - ->getEpisodes($monitor->getTitle()) - ->map(fn($episode) => (object)(new PTN())->parse($episode)) - ->filter(fn($episode) => property_exists($episode, 'episode') - && property_exists($episode, 'season') - && null !== $episode->episode - && null !== $episode->season - ); + $downloadedEpisodes = $this->getDownloadedEpisodes($monitor->getTitle(), $showTmdbData); $this->logger->info('> [MonitorTvShowHandler] Found ' . count($downloadedEpisodes) . ' downloaded episodes for title: ' . $monitor->getTitle()); @@ -130,6 +127,33 @@ readonly class MonitorTvShowHandler implements HandlerInterface ); } + private function getDownloadedEpisodes(string $title, TmdbResult $showTmdbData): Map + { + // Episodes in folder w/o the year + $downloadedEpisodes = $this->mediaFiles + ->getEpisodes($title) + ->map(fn($episode) => (object) new PTN()->parse($episode)) + ->filter(fn($episode) => + property_exists($episode, 'episode') + && property_exists($episode, 'season') + && null !== $episode->episode + && null !== $episode->season + ); + + return $downloadedEpisodes->concat( + // Episodes in folder w/ the year + $this->mediaFiles + ->getEpisodes(sprintf("%s (%s)", $title, $showTmdbData->year)) + ->map(fn($episode) => (object) new PTN()->parse($episode)) + ->filter(fn($episode) => + property_exists($episode, 'episode') + && property_exists($episode, 'season') + && null !== $episode->episode + && null !== $episode->season + ) + ); + } + private function episodeReleasedAfterMonitorCreated( string|DateTimeImmutable $monitorStartDate, TmdbEpisodeDto $episodeInShow @@ -159,11 +183,11 @@ readonly class MonitorTvShowHandler implements HandlerInterface ]) !== null; } - private function refreshData(Monitor $monitor) + private function refreshData(Monitor $monitor, TmdbResult $showTmdbData) { if (null === $monitor->getPoster()) { $this->logger->info('> [MonitorTvShowHandler] Refreshing poster for "' . $monitor->getTitle() . '"'); - $poster = $this->tmdb->tvshowDetails($monitor->getImdbId())->poster; + $poster = $showTmdbData->poster; if (null !== $poster && "" !== $poster) { $monitor->setPoster($poster); }