chore(MonitorTvShowHandler): only evaluates episides starting in the current season and forward

This commit is contained in:
2025-09-19 22:16:28 -05:00
parent 2237a45d6f
commit fd46abf58f

View File

@@ -30,7 +30,8 @@ readonly class MonitorTvShowHandler implements HandlerInterface
private MediaFiles $mediaFiles,
private LoggerInterface $logger,
private TmdbClient $tmdb,
) {}
) {
}
public function handle(CommandInterface $command): ResultInterface
{
@@ -41,25 +42,24 @@ readonly class MonitorTvShowHandler implements HandlerInterface
$downloadedEpisodes = $this->mediaFiles
->getEpisodes($monitor->getTitle())
->map(fn($episode) => (object)(new PTN())->parse($episode))
->filter(fn ($episode) =>
property_exists($episode, 'episode')
->filter(fn($episode) => property_exists($episode, 'episode')
&& property_exists($episode, 'season')
&& null !== $episode->episode
&& null !== $episode->season
)
;
);
$this->logger->info('> [MonitorTvShowHandler] Found ' . count($downloadedEpisodes) . ' downloaded episodes for title: ' . $monitor->getTitle());
// Compare against list from TMDB
$episodesInShow = Map::from(
$this->tmdb->tvshowDetails($monitor->getImdbId())->episodes
)->flat(1);
)->flat(1)
->filter(fn(TmdbEpisodeDto $episode) => $episode->seasonNumber >= $monitor->getSeason())
->values();
$this->logger->info('> [MonitorTvShowHandler] Found ' . count($episodesInShow) . ' episodes for title: ' . $monitor->getTitle());
$episodeMonitors = [];
if ($downloadedEpisodes->count() !== $episodesInShow->count()) {
// Dispatch Episode commands for each missing Episode
foreach ($episodesInShow as $episode) {
/** @var TmdbEpisodeDto $episode */
@@ -113,7 +113,6 @@ readonly class MonitorTvShowHandler implements HandlerInterface
$this->monitorTvEpisodeHandler->handle($command);
$this->logger->info('> [MonitorTvShowHandler] ...Dispatching MonitorTvEpisodeCommand');
}
}
// Set the status to Active, so it will be re-executed.
$monitor->setStatus('Active');
@@ -130,8 +129,10 @@ readonly class MonitorTvShowHandler implements HandlerInterface
);
}
private function episodeReleasedAfterMonitorCreated(string|DateTimeImmutable $monitorStartDate, TmdbEpisodeDto $episodeInShow): bool
{
private function episodeReleasedAfterMonitorCreated(
string|DateTimeImmutable $monitorStartDate,
TmdbEpisodeDto $episodeInShow
): bool {
$monitorStartDate = Carbon::parse($monitorStartDate)->setTime(0, 0);
$episodeAirDate = Carbon::parse($episodeInShow->airDate);
return $episodeAirDate >= $monitorStartDate;