diff --git a/compose.yml b/compose.yml index a751135..0fba679 100755 --- a/compose.yml +++ b/compose.yml @@ -29,14 +29,14 @@ services: volumes: - ./:/var/www - ./var/download:/var/download - command: php ./bin/console messenger:consume async -v --time-limit=3600 --limit=10 + command: php ./bin/console messenger:consume async -vv --time-limit=3600 scheduler: build: . volumes: - ./:/var/www - ./var/download:/var/download - command: php ./bin/console messenger:consume scheduler_movie_monitor -v --time-limit=3600 + command: php ./bin/console messenger:consume scheduler_monitor -vv --time-limit=3600 mercure: image: dunglas/mercure diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index a443e9d..f2ba2b3 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -26,6 +26,9 @@ framework: # 'App\Message\YourMessage': async 'App\Download\Action\Command\DownloadMediaCommand': async 'App\Download\Action\Command\MonitorTvEpisodeCommand': async + 'App\Download\Action\Command\MonitorTvSeasonCommand': async + 'App\Download\Action\Command\MonitorTvShowCommand': async + 'App\Download\Action\Command\MonitorMovieCommand': async # when@test: # framework: diff --git a/src/Controller/DownloadController.php b/src/Controller/DownloadController.php index 72b7897..76b51af 100644 --- a/src/Controller/DownloadController.php +++ b/src/Controller/DownloadController.php @@ -34,10 +34,10 @@ class DownloadController extends AbstractController ) { $monitor = (new Monitor()) ->setUser($this->getUser()) - ->setTmdbId('95396') - ->setImdbId('tt11280740') - ->setTitle('Severance') - ->setMonitorType('tvshow') + ->setTmdbId('112442') + ->setImdbId('tt9288860') + ->setTitle('Trash Truck') + ->setMonitorType('tvseason') ->setSeason(1) ->setEpisode(null) ->setCreatedAt(new DateTimeImmutable()) @@ -46,8 +46,8 @@ class DownloadController extends AbstractController $this->monitorRepository->getEntityManager()->persist($monitor); $this->monitorRepository->getEntityManager()->flush(); - $command = new MonitorTvShowCommand($monitor->getId()); - $handler->handle($command); + $command = new MonitorTvSeasonCommand($monitor->getId()); +// $handler->handle($command); return $this->json([ 'status' => 200, 'message' => $command diff --git a/src/Download/Action/Handler/MonitorMovieHandler.php b/src/Download/Action/Handler/MonitorMovieHandler.php index 211c132..05c78b3 100644 --- a/src/Download/Action/Handler/MonitorMovieHandler.php +++ b/src/Download/Action/Handler/MonitorMovieHandler.php @@ -54,6 +54,8 @@ readonly class MonitorMovieHandler implements HandlerInterface )); $monitor->setStatus('Complete'); $monitor->setDownloadedAt(new DateTimeIMmutable()); + } else { + $monitor->setStatus('Active'); } $monitor->setLastSearch(new DateTimeImmutable()); diff --git a/src/Download/Action/Handler/MonitorTvEpisodeHandler.php b/src/Download/Action/Handler/MonitorTvEpisodeHandler.php index f38827b..470a6ac 100644 --- a/src/Download/Action/Handler/MonitorTvEpisodeHandler.php +++ b/src/Download/Action/Handler/MonitorTvEpisodeHandler.php @@ -10,6 +10,7 @@ use App\Download\Service\MonitorOptionEvaluator; use App\Torrentio\Action\Command\GetMovieOptionsCommand; use App\Torrentio\Action\Command\GetTvShowOptionsCommand; use App\Torrentio\Action\Handler\GetMovieOptionsHandler; +use App\Torrentio\Action\Handler\GetTvShowOptionsHandler; use DateTimeImmutable; use Doctrine\ORM\EntityManagerInterface; use OneToMany\RichBundle\Contract\CommandInterface; @@ -22,27 +23,29 @@ use Symfony\Component\Messenger\MessageBusInterface; readonly class MonitorTvEpisodeHandler implements HandlerInterface { public function __construct( - private MonitorRepository $movieMonitorRepository, - private GetMovieOptionsHandler $getMovieOptionsHandler, + private GetTvShowOptionsHandler $getTvShowOptionsHandler, private MonitorOptionEvaluator $monitorOptionEvaluator, private EntityManagerInterface $entityManager, private MessageBusInterface $bus, private LoggerInterface $logger, + private MonitorRepository $monitorRepository, ) {} public function handle(CommandInterface $command): ResultInterface { $this->logger->info('> [MonitorTvEpisodeHandler] Executing MonitorTvEpisodeHandler'); - $monitor = $this->movieMonitorRepository->find($command->movieMonitorId); + $monitor = $this->monitorRepository->find($command->movieMonitorId); $monitor->setStatus('In Progress'); + $this->monitorRepository->getEntityManager()->flush(); - $this->logger->info('> [MonitorTvEpisodeHandler] Searching for "' . $monitor->getTitle() . '" download options'); - $results = $this->getMovieOptionsHandler->handle( + $this->logger->info('> [MonitorTvEpisodeHandler] Searching for "' . $monitor->getTitle() . '" season ' . $monitor->getSeason() . ' episode ' . $monitor->getEpisode() . ' download options'); + $results = $this->getTvShowOptionsHandler->handle( new GetTvShowOptionsCommand( $monitor->getTmdbId(), $monitor->getImdbId(), $monitor->getSeason(), - $monitor->getEpisode()) + $monitor->getEpisode() + ) ); $this->logger->info('> [MonitorTvEpisodeHandler] Found ' . count($results->results) . ' download options'); @@ -50,16 +53,19 @@ readonly class MonitorTvEpisodeHandler implements HandlerInterface $result = $this->monitorOptionEvaluator->evaluateOptions($monitor, $results->results); if (null !== $result) { - $this->logger->info('> [MonitorTvEpisodeHandler] 1 result found: dispatching DownloadMediaCommand for "' . $result->title . '"'); + $this->logger->info('> [MonitorTvEpisodeHandler] 1 matching result found: dispatching DownloadMediaCommand for "' . $result->title . '"'); $this->bus->dispatch(new DownloadMediaCommand( $result->url, $monitor->getTitle(), $result->filename, - 'movies', + 'tvshows', $monitor->getImdbId(), )); $monitor->setStatus('Complete'); $monitor->setDownloadedAt(new DateTimeImmutable()); + } else { + $this->logger->info('> [MonitorTvEpisodeHandler] 0 matching results found, monitor will run at next interval'); + $monitor->setStatus('Active'); } $monitor->setLastSearch(new DateTimeImmutable()); diff --git a/src/Download/Action/Handler/MonitorTvSeasonHandler.php b/src/Download/Action/Handler/MonitorTvSeasonHandler.php index 02b09e1..5e0ec9c 100644 --- a/src/Download/Action/Handler/MonitorTvSeasonHandler.php +++ b/src/Download/Action/Handler/MonitorTvSeasonHandler.php @@ -29,13 +29,12 @@ readonly class MonitorTvSeasonHandler implements HandlerInterface { public function __construct( private MonitorRepository $monitorRepository, - private GetMovieOptionsHandler $getMovieOptionsHandler, - private MonitorOptionEvaluator $monitorOptionEvaluator, private EntityManagerInterface $entityManager, private MediaFiles $mediaFiles, private MessageBusInterface $bus, private LoggerInterface $logger, private Tmdb $tmdb, + private MonitorTvEpisodeHandler $monitorTvEpisodeHandler, ) {} public function handle(CommandInterface $command): ResultInterface @@ -59,30 +58,43 @@ readonly class MonitorTvSeasonHandler implements HandlerInterface // Dispatch Episode commands for each missing Episode foreach ($episodesInSeason as $episode) { - if (!array_key_exists($episode['episode_number'], $downloadedEpisodes->toArray())) { - $monitor = (new Monitor()) + $monitorCheck = $this->monitorRepository->findOneBy([ + 'imdbId' => $monitor->getImdbId(), + 'title' => $monitor->getTitle(), + 'monitorType' => 'tvepisode', + 'season' => $monitor->getSeason(), + 'episode' => $episode['episode_number'], + ]); + + $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()) ->setUser($monitor->getUser()) ->setTmdbId($monitor->getTmdbId()) ->setImdbId($monitor->getImdbId()) ->setTitle($monitor->getTitle()) - ->setMonitorType('tvseason') + ->setMonitorType('tvepisode') ->setSeason($monitor->getSeason()) ->setEpisode($episode['episode_number']) ->setCreatedAt(new DateTimeImmutable()) ->setSearchCount(0) ->setStatus('New'); - $this->monitorRepository->getEntityManager()->persist($monitor); + $this->monitorRepository->getEntityManager()->persist($episodeMonitor); $this->monitorRepository->getEntityManager()->flush(); - $command = new MonitorTvEpisodeCommand($monitor->getId()); - $this->bus->dispatch($command); - $this->logger->info('> [MonitorTvSeasonHandler] Dispatching MonitorTvEpisodeCommand for season ' . $monitor->getSeason() . ' episode ' . $monitor->getEpisode() . ' for title: ' . $monitor->getTitle()); + $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()); } } $monitor->setLastSearch(new DateTimeImmutable()); $monitor->setSearchCount($monitor->getSearchCount() + 1); + $monitor->setStatus('Complete'); $this->entityManager->flush(); return new MonitorMovieResult( diff --git a/src/Download/Action/Handler/MonitorTvShowHandler.php b/src/Download/Action/Handler/MonitorTvShowHandler.php index 0f06667..c377362 100644 --- a/src/Download/Action/Handler/MonitorTvShowHandler.php +++ b/src/Download/Action/Handler/MonitorTvShowHandler.php @@ -86,6 +86,7 @@ readonly class MonitorTvShowHandler implements HandlerInterface $monitor->setLastSearch(new DateTimeImmutable()); $monitor->setSearchCount($monitor->getSearchCount() + 1); + $monitor->setStatus('Complete'); $this->entityManager->flush(); return new MonitorTvEpisodeResult( diff --git a/src/Download/Framework/Scheduler/MonitorDispatcher.php b/src/Download/Framework/Scheduler/MonitorDispatcher.php index 50fafe5..a3689bd 100644 --- a/src/Download/Framework/Scheduler/MonitorDispatcher.php +++ b/src/Download/Framework/Scheduler/MonitorDispatcher.php @@ -2,8 +2,10 @@ namespace App\Download\Framework\Scheduler; -use App\Download\Action\Handler\MonitorMovieHandler; -use App\Download\Action\Handler\MonitorTvSeasonHandler; +use App\Download\Action\Command\MonitorMovieCommand; +use App\Download\Action\Command\MonitorTvEpisodeCommand; +use App\Download\Action\Command\MonitorTvSeasonCommand; +use App\Download\Action\Command\MonitorTvShowCommand; use App\Download\Framework\Repository\MonitorRepository; use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\MessageBusInterface; @@ -19,21 +21,24 @@ class MonitorDispatcher ) {} public function __invoke() { - $this->logger->info('[MonitorDispatcher] Executing MovieMonitorDispatcher'); + $this->logger->info('[MonitorDispatcher] Executing MonitorDispatcher'); $monitorHandlers = [ - 'movie' => MonitorMovieHandler::class, - 'tvepisode' => MonitorTvSeasonHandler::class, - 'tvseason' => MonitorTvSeasonHandler::class, - 'tvshow' => MonitorTvSeasonHandler::class, + 'movie' => MonitorMovieCommand::class, + 'tvepisode' => MonitorTvEpisodeCommand::class, + 'tvseason' => MonitorTvSeasonCommand::class, + 'tvshow' => MonitorTvShowCommand::class, ]; - $monitors = $this->monitorRepository->findBy(['status' => ['New', 'In Progress']]); + $monitors = $this->monitorRepository->findBy(['status' => ['New', 'Active']]); foreach ($monitors as $monitor) { - $handler = $monitorHandlers[$monitor->getMonitorType()]; - $this->logger->info('[MonitorDispatcher] Dispatching ' . $handler . ' for ' . $monitor->getTitle()); - $this->bus->dispatch(new $handler($monitor->getId())); + $monitor->setStatus('In Progress'); + $this->monitorRepository->getEntityManager()->flush(); + + $command = $monitorHandlers[$monitor->getMonitorType()]; + $this->logger->info('[MonitorDispatcher] Dispatching ' . $command . ' for ' . $monitor->getTitle()); + $this->bus->dispatch(new $command($monitor->getId())); } } } diff --git a/src/Download/Service/MonitorOptionEvaluator.php b/src/Download/Service/MonitorOptionEvaluator.php index 6083be8..b977cd7 100644 --- a/src/Download/Service/MonitorOptionEvaluator.php +++ b/src/Download/Service/MonitorOptionEvaluator.php @@ -16,7 +16,7 @@ class MonitorOptionEvaluator */ public function evaluateOptions(Monitor $monitor, array $results): ?TorrentioResult { - $sizeLow = 500; + $sizeLow = 000; $sizeHigh = 4096; $bestMatches = []; @@ -48,6 +48,11 @@ class MonitorOptionEvaluator ) { $matches[] = $result; } + + if (($userPreferences['codec'] === null ) + && ($userPreferences['resolution'] === null )) { + $matches[] = $result; + } } $sizeMatches = [];