fix: tvshow monitor
This commit is contained in:
@@ -38,13 +38,21 @@ readonly class MonitorTvShowHandler implements HandlerInterface
|
|||||||
// Check current episodes
|
// Check current episodes
|
||||||
$downloadedEpisodes = $this->mediaFiles
|
$downloadedEpisodes = $this->mediaFiles
|
||||||
->getEpisodes($monitor->getTitle())
|
->getEpisodes($monitor->getTitle())
|
||||||
->map(fn($episode) => (object) (new PTN())->parse($episode));
|
->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
|
||||||
|
)
|
||||||
|
;
|
||||||
$this->logger->info('> [MonitorTvShowHandler] Found ' . count($downloadedEpisodes) . ' downloaded episodes for title: ' . $monitor->getTitle());
|
$this->logger->info('> [MonitorTvShowHandler] Found ' . count($downloadedEpisodes) . ' downloaded episodes for title: ' . $monitor->getTitle());
|
||||||
|
|
||||||
// Compare against list from TMDB
|
// Compare against list from TMDB
|
||||||
$episodesInShow = Map::from(
|
$episodesInShow = Map::from(
|
||||||
$this->tmdb->tvDetails($monitor->getTmdbId())->episodes
|
$this->tmdb->tvDetails($monitor->getTmdbId())->episodes
|
||||||
)->flat(1);
|
)->flat(1);
|
||||||
|
|
||||||
$this->logger->info('> [MonitorTvShowHandler] Found ' . count($episodesInShow) . ' episodes for title: ' . $monitor->getTitle());
|
$this->logger->info('> [MonitorTvShowHandler] Found ' . count($episodesInShow) . ' episodes for title: ' . $monitor->getTitle());
|
||||||
|
|
||||||
if ($downloadedEpisodes->count() !== $episodesInShow->count()) {
|
if ($downloadedEpisodes->count() !== $episodesInShow->count()) {
|
||||||
@@ -54,20 +62,23 @@ readonly class MonitorTvShowHandler implements HandlerInterface
|
|||||||
|
|
||||||
// Dispatch Episode commands for each missing Episode
|
// Dispatch Episode commands for each missing Episode
|
||||||
foreach ($episodesInShow as $episode) {
|
foreach ($episodesInShow as $episode) {
|
||||||
$monitorCheck = $this->monitorRepository->findOneBy([
|
// Check if the episode is already downloaded
|
||||||
'imdbId' => $monitor->getImdbId(),
|
$episodeExists = $this->episodeExists($episode, $downloadedEpisodes);
|
||||||
'title' => $monitor->getTitle(),
|
$this->logger->info('> [MonitorTvShowHandler] Episode exists for season ' . $episode['season_number'] . ' episode ' . $episode['episode_number'] . ' for title: ' . $monitor->getTitle() . ' ? ' . (true === $episodeExists ? 'YES' : 'NO'));
|
||||||
'monitorType' => 'tvepisode',
|
if (true === $episodeExists) {
|
||||||
'season' => $monitor->getSeason(),
|
$this->logger->info('> [MonitorTvShowHandler] Episode exists for title: ' . $monitor->getTitle() . ', skipping');
|
||||||
'episode' => $episode['episode_number'],
|
continue;
|
||||||
'status' => ['New', 'Active', 'In Progress']
|
}
|
||||||
]);
|
|
||||||
|
|
||||||
$this->logger->info('> [MonitorTvShowHandler] Monitor exists for season ' . $monitor->getSeason() . ' episode ' . $episode['episode_number'] . ' for title: ' . $monitor->getTitle() . ' ? ' . (null !== $monitorCheck ? 'YES' : 'NO'));
|
// Check for existing monitors
|
||||||
|
$monitorExists = $this->monitorExists($monitor, $episode);
|
||||||
|
$this->logger->info('> [MonitorTvShowHandler] 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('> [MonitorTvShowHandler] Monitor exists for title: ' . $monitor->getTitle() . ', skipping');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (!array_key_exists($episode['episode_number'], $downloadedEpisodes->toArray())
|
// Create the monitor
|
||||||
&& null === $monitorCheck
|
|
||||||
) {
|
|
||||||
$episodeMonitor = (new Monitor())
|
$episodeMonitor = (new Monitor())
|
||||||
->setParent($monitor)
|
->setParent($monitor)
|
||||||
->setUser($monitor->getUser())
|
->setUser($monitor->getUser())
|
||||||
@@ -75,7 +86,7 @@ readonly class MonitorTvShowHandler implements HandlerInterface
|
|||||||
->setImdbId($monitor->getImdbId())
|
->setImdbId($monitor->getImdbId())
|
||||||
->setTitle($monitor->getTitle())
|
->setTitle($monitor->getTitle())
|
||||||
->setMonitorType('tvepisode')
|
->setMonitorType('tvepisode')
|
||||||
->setSeason($monitor->getSeason())
|
->setSeason($episode['season_number'])
|
||||||
->setEpisode($episode['episode_number'])
|
->setEpisode($episode['episode_number'])
|
||||||
->setCreatedAt(new DateTimeImmutable())
|
->setCreatedAt(new DateTimeImmutable())
|
||||||
->setSearchCount(0)
|
->setSearchCount(0)
|
||||||
@@ -84,11 +95,11 @@ readonly class MonitorTvShowHandler implements HandlerInterface
|
|||||||
$this->monitorRepository->getEntityManager()->persist($episodeMonitor);
|
$this->monitorRepository->getEntityManager()->persist($episodeMonitor);
|
||||||
$this->monitorRepository->getEntityManager()->flush();
|
$this->monitorRepository->getEntityManager()->flush();
|
||||||
|
|
||||||
|
// Immediately run the monitor
|
||||||
$command = new MonitorTvEpisodeCommand($episodeMonitor->getId());
|
$command = new MonitorTvEpisodeCommand($episodeMonitor->getId());
|
||||||
$this->monitorTvEpisodeHandler->handle($command);
|
$this->monitorTvEpisodeHandler->handle($command);
|
||||||
$this->logger->info('> [MonitorTvShowHandler] Dispatching MonitorTvEpisodeCommand for season ' . $episodeMonitor->getSeason() . ' episode ' . $episodeMonitor->getEpisode() . ' for title: ' . $monitor->getTitle());
|
$this->logger->info('> [MonitorTvShowHandler] Dispatching MonitorTvEpisodeCommand for season ' . $episodeMonitor->getSeason() . ' episode ' . $episodeMonitor->getEpisode() . ' for title: ' . $monitor->getTitle());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$monitor->setStatus('Complete');
|
$monitor->setStatus('Complete');
|
||||||
}
|
}
|
||||||
@@ -104,4 +115,24 @@ readonly class MonitorTvShowHandler 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ final class MonitorList extends AbstractController
|
|||||||
return $this->asPaginator($this->monitorRepository->createQueryBuilder('m')
|
return $this->asPaginator($this->monitorRepository->createQueryBuilder('m')
|
||||||
->andWhere('m.status IN (:statuses)')
|
->andWhere('m.status IN (:statuses)')
|
||||||
->andWhere('(m.title LIKE :term OR m.imdbId LIKE :term OR m.monitorType LIKE :term OR m.status LIKE :term)')
|
->andWhere('(m.title LIKE :term OR m.imdbId LIKE :term OR m.monitorType LIKE :term OR m.status LIKE :term)')
|
||||||
->setParameter('statuses', ['New', 'In Progress'])
|
->setParameter('statuses', ['New', 'In Progress', 'Active'])
|
||||||
->setParameter('term', '%'.$this->term.'%')
|
->setParameter('term', '%'.$this->term.'%')
|
||||||
->orderBy('m.id', 'DESC')
|
->orderBy('m.id', 'DESC')
|
||||||
->getQuery()
|
->getQuery()
|
||||||
|
|||||||
Reference in New Issue
Block a user