feat: movie monitoring

This commit is contained in:
2025-05-03 23:55:31 -05:00
parent 5688b3a0df
commit 9166b4bbc8
16 changed files with 477 additions and 353 deletions

View File

@@ -2,7 +2,6 @@
namespace App\Download\Action\Command;
use App\Download\Framework\Entity\MovieMonitor;
use OneToMany\RichBundle\Contract\CommandInterface;
class MonitorMovieCommand implements CommandInterface

View File

@@ -10,9 +10,11 @@ use App\Download\Service\MonitorOptionEvaluator;
use App\Torrentio\Action\Command\GetMovieOptionsCommand;
use App\Torrentio\Action\Handler\GetMovieOptionsHandler;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use OneToMany\RichBundle\Contract\CommandInterface;
use OneToMany\RichBundle\Contract\HandlerInterface;
use OneToMany\RichBundle\Contract\ResultInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Messenger\MessageBusInterface;
/** @implements HandlerInterface<MonitorMovieCommand> */
@@ -22,22 +24,31 @@ readonly class MonitorMovieHandler implements HandlerInterface
private MovieMonitorRepository $movieMonitorRepository,
private GetMovieOptionsHandler $getMovieOptionsHandler,
private MonitorOptionEvaluator $monitorOptionEvaluator,
private EntityManagerInterface $entityManager,
private MessageBusInterface $bus,
private LoggerInterface $logger,
) {}
public function handle(CommandInterface $command): ResultInterface
{
$this->logger->info('> [MonitorMovieHandler] Executing MonitorMovieHandler');
$monitor = $this->movieMonitorRepository->find($command->movieMonitorId);
$monitor->setStatus('In Progress');
$this->logger->info('> [MonitorMovieHandler] Searching for "' . $monitor->getTitle() . '" download options');
$results = $this->getMovieOptionsHandler->handle(
new GetMovieOptionsCommand($monitor->getTmdbId(), $monitor->getImdbId())
);
$this->logger->info('> [MonitorMovieHandler] Found ' . count($results->results) . ' download options');
$result = $this->monitorOptionEvaluator->evaluateOptions($monitor, $results->results);
if (null !== $result) {
$this->logger->info('> [MonitorMovieHandler] 1 result found: dispatching DownloadMediaCommand for "' . $result->title . '"');
$this->bus->dispatch(new DownloadMediaCommand(
$result->url,
$result->title,
$monitor->getTitle(),
$result->filename,
'movies',
$monitor->getImdbId(),
@@ -48,7 +59,7 @@ readonly class MonitorMovieHandler implements HandlerInterface
$monitor->setLastSearch(new DateTimeImmutable());
$monitor->setSearchCount($monitor->getSearchCount() + 1);
$this->movieMonitorRepository->getEntityManager()->flush();
$this->entityManager->flush();
return new MonitorMovieResult(
status: 'OK',

View File

@@ -14,18 +14,18 @@ class AddMovieMonitorInput implements InputInterface
#[SourceSecurity]
public string $userEmail,
#[SourceRoute('title')]
public string $title,
#[SourceRoute('tmdbId')]
public string $tmdbId,
#[SourceRoute('imdbId')]
public string $imdbId,
#[SourceRoute('title')]
public string $title,
) {}
public function toCommand(): CommandInterface
{
return new AddMovieMonitorCommand($this->userEmail, $this->title, $this->tmdbId, $this->imdbId);
return new AddMovieMonitorCommand($this->userEmail, $this->title, $this->imdbId, $this->tmdbId);
}
}