diff --git a/src/Monitor/Action/Handler/MonitorTvSeasonHandler.php b/src/Monitor/Action/Handler/MonitorTvSeasonHandler.php index 94eb6a8..9c2fa3a 100644 --- a/src/Monitor/Action/Handler/MonitorTvSeasonHandler.php +++ b/src/Monitor/Action/Handler/MonitorTvSeasonHandler.php @@ -39,6 +39,12 @@ readonly class MonitorTvSeasonHandler implements HandlerInterface $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 + ) ->rekey(fn($episode) => $episode->episode); $this->logger->info('> [MonitorTvSeasonHandler] Found ' . count($downloadedEpisodes) . ' downloaded episodes for title: ' . $monitor->getTitle()); @@ -55,40 +61,41 @@ readonly class MonitorTvSeasonHandler implements HandlerInterface // Dispatch Episode commands for each missing Episode foreach ($episodesInSeason as $episode) { - $monitorCheck = $this->monitorRepository->findOneBy([ - 'imdbId' => $monitor->getImdbId(), - 'title' => $monitor->getTitle(), - 'monitorType' => 'tvepisode', - 'season' => $monitor->getSeason(), - 'episode' => $episode['episode_number'], - 'status' => ['New', 'Active', 'In Progress'] - ]); - - $this->logger->info('> [MonitorTvSeasonHandler] Monitor exists for season ' . $monitor->getSeason() . ' episode ' . $episode['episode_number'] . ' for title: ' . $monitor->getTitle() . ' ? ' . (null !== $monitorCheck ? 'YES' : 'NO')); - - if (!array_key_exists($episode['episode_number'], $downloadedEpisodes->toArray()) - && null === $monitorCheck - ) { - $episodeMonitor = (new Monitor()) - ->setParent($monitor) - ->setUser($monitor->getUser()) - ->setTmdbId($monitor->getTmdbId()) - ->setImdbId($monitor->getImdbId()) - ->setTitle($monitor->getTitle()) - ->setMonitorType('tvepisode') - ->setSeason($monitor->getSeason()) - ->setEpisode($episode['episode_number']) - ->setCreatedAt(new DateTimeImmutable()) - ->setSearchCount(0) - ->setStatus('New'); - - $this->monitorRepository->getEntityManager()->persist($episodeMonitor); - $this->monitorRepository->getEntityManager()->flush(); - - $command = new MonitorTvEpisodeCommand($episodeMonitor->getId()); - $this->monitorTvEpisodeHandler->handle($command); - $this->logger->info('> [MonitorTvSeasonHandler] Dispatching MonitorTvEpisodeCommand for season ' . $episodeMonitor->getSeason() . ' episode ' . $episodeMonitor->getEpisode() . ' for title: ' . $monitor->getTitle()); + // Check if the episode is already downloaded + $episodeExists = $this->episodeExists($episode, $downloadedEpisodes); + $this->logger->info('> [MonitorTvSeasonHandler] Episode exists for season ' . $episode['season_number'] . ' episode ' . $episode['episode_number'] . ' for title: ' . $monitor->getTitle() . ' ? ' . (true === $episodeExists ? 'YES' : 'NO')); + if (true === $episodeExists) { + $this->logger->info('> [MonitorTvSeasonHandler] Episode exists for title: ' . $monitor->getTitle() . ', skipping'); + continue; } + + // Check for existing monitors + $monitorExists = $this->monitorExists($monitor, $episode); + $this->logger->info('> [MonitorTvSeasonHandler] Monitor exists for season ' . $episode['season_number'] . ' episode ' . $episode['episode_number'] . ' for title: ' . $monitor->getTitle() . ' ? ' . (true === $monitorExists ? 'YES' : 'NO')); + if (true === $monitorExists) { + $this->logger->info('> [MonitorTvSeasonHandler] Monitor exists for title: ' . $monitor->getTitle() . ', skipping'); + continue; + } + + $episodeMonitor = (new Monitor()) + ->setParent($monitor) + ->setUser($monitor->getUser()) + ->setTmdbId($monitor->getTmdbId()) + ->setImdbId($monitor->getImdbId()) + ->setTitle($monitor->getTitle()) + ->setMonitorType('tvepisode') + ->setSeason($monitor->getSeason()) + ->setEpisode($episode['episode_number']) + ->setCreatedAt(new DateTimeImmutable()) + ->setSearchCount(0) + ->setStatus('New'); + + $this->monitorRepository->getEntityManager()->persist($episodeMonitor); + $this->monitorRepository->getEntityManager()->flush(); + + $command = new MonitorTvEpisodeCommand($episodeMonitor->getId()); + $this->monitorTvEpisodeHandler->handle($command); + $this->logger->info('> [MonitorTvSeasonHandler] Dispatching MonitorTvEpisodeCommand for season ' . $episodeMonitor->getSeason() . ' episode ' . $episodeMonitor->getEpisode() . ' for title: ' . $monitor->getTitle()); } } else { $monitor->setStatus('Complete'); @@ -106,4 +113,24 @@ readonly class MonitorTvSeasonHandler implements HandlerInterface ] ); } + + private function episodeExists(array $episodeInShow, Map $downloadedEpisodes): bool + { + return $downloadedEpisodes->filter( + fn (object $episode) => $episode->episode === $episodeInShow['episode_number'] + && $episode->season === $episodeInShow['season_number'] + )->count() > 0; + } + + private function monitorExists(Monitor $monitor, array $episode): bool + { + return $this->monitorRepository->findOneBy([ + 'imdbId' => $monitor->getImdbId(), + 'title' => $monitor->getTitle(), + 'monitorType' => 'tvepisode', + 'season' => $episode['season_number'], + 'episode' => $episode['episode_number'], + 'status' => ['New', 'Active', 'In Progress'] + ]) !== null; + } }