77 lines
3.0 KiB
PHP
77 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Download\Action\Handler;
|
|
|
|
use App\Download\Action\Command\DownloadMediaCommand;
|
|
use App\Download\Action\Command\MonitorMovieCommand;
|
|
use App\Download\Action\Result\MonitorMovieResult;
|
|
use App\Download\Framework\Repository\MonitorRepository;
|
|
use App\Download\Service\MonitorOptionEvaluator;
|
|
use App\Torrentio\Action\Command\GetMovieOptionsCommand;
|
|
use App\Torrentio\Action\Command\GetTvShowOptionsCommand;
|
|
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> */
|
|
readonly class MonitorTvEpisodeHandler implements HandlerInterface
|
|
{
|
|
public function __construct(
|
|
private MonitorRepository $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('> [MonitorTvEpisodeHandler] Executing MonitorTvEpisodeHandler');
|
|
$monitor = $this->movieMonitorRepository->find($command->movieMonitorId);
|
|
$monitor->setStatus('In Progress');
|
|
|
|
$this->logger->info('> [MonitorTvEpisodeHandler] Searching for "' . $monitor->getTitle() . '" download options');
|
|
$results = $this->getMovieOptionsHandler->handle(
|
|
new GetTvShowOptionsCommand(
|
|
$monitor->getTmdbId(),
|
|
$monitor->getImdbId(),
|
|
$monitor->getSeason(),
|
|
$monitor->getEpisode())
|
|
);
|
|
|
|
$this->logger->info('> [MonitorTvEpisodeHandler] Found ' . count($results->results) . ' download options');
|
|
|
|
$result = $this->monitorOptionEvaluator->evaluateOptions($monitor, $results->results);
|
|
|
|
if (null !== $result) {
|
|
$this->logger->info('> [MonitorTvEpisodeHandler] 1 result found: dispatching DownloadMediaCommand for "' . $result->title . '"');
|
|
$this->bus->dispatch(new DownloadMediaCommand(
|
|
$result->url,
|
|
$monitor->getTitle(),
|
|
$result->filename,
|
|
'movies',
|
|
$monitor->getImdbId(),
|
|
));
|
|
$monitor->setStatus('Complete');
|
|
$monitor->setDownloadedAt(new DateTimeImmutable());
|
|
}
|
|
|
|
$monitor->setLastSearch(new DateTimeImmutable());
|
|
$monitor->setSearchCount($monitor->getSearchCount() + 1);
|
|
$this->entityManager->flush();
|
|
|
|
return new MonitorMovieResult(
|
|
status: 'OK',
|
|
result: [
|
|
'monitor' => $monitor,
|
|
]
|
|
);
|
|
}
|
|
}
|