From 7b3d57b94a33ba95fd1f599ad53a50f6d312b413 Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Sat, 21 Jun 2025 23:26:55 -0500 Subject: [PATCH] fix: prepends episode/season number to filename if doesn't exist. should fix monitors repeatedly downloading episodes --- assets/controllers/download_button_controller.js | 2 ++ src/Download/Action/Input/DownloadMediaInput.php | 3 +++ .../Framework/Controller/ApiController.php | 8 ++++++++ src/Twig/Extensions/UtilExtension.php | 14 ++++++++++++++ templates/torrentio/partial/option-table.html.twig | 5 +++-- 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/assets/controllers/download_button_controller.js b/assets/controllers/download_button_controller.js index 75cd145..9f35315 100644 --- a/assets/controllers/download_button_controller.js +++ b/assets/controllers/download_button_controller.js @@ -12,6 +12,7 @@ export default class extends Controller { filename: String, mediaType: String, imdbId: String, + episodeId: String } download() { @@ -27,6 +28,7 @@ export default class extends Controller { filename: this.filenameValue, mediaType: this.mediaTypeValue, imdbId: this.imdbIdValue, + episodeId: this.episodeIdValue }) }) .then(res => res.json()) diff --git a/src/Download/Action/Input/DownloadMediaInput.php b/src/Download/Action/Input/DownloadMediaInput.php index ebb6a4d..cce60a4 100644 --- a/src/Download/Action/Input/DownloadMediaInput.php +++ b/src/Download/Action/Input/DownloadMediaInput.php @@ -26,6 +26,9 @@ class DownloadMediaInput implements InputInterface #[SourceRequest('imdbId')] public string $imdbId, + #[SourceRequest('episodeId', nullify: true)] + public ?string $episodeId = null, + public ?int $userId = null, public ?int $downloadId = null, diff --git a/src/Download/Framework/Controller/ApiController.php b/src/Download/Framework/Controller/ApiController.php index 5b94c5b..ca76fee 100644 --- a/src/Download/Framework/Controller/ApiController.php +++ b/src/Download/Framework/Controller/ApiController.php @@ -11,6 +11,7 @@ use App\Download\Action\Input\PauseDownloadInput; use App\Download\Action\Input\ResumeDownloadInput; use App\Download\Framework\Repository\DownloadRepository; use App\Util\Broadcaster; +use Nihilarr\PTN; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Messenger\MessageBusInterface; @@ -28,6 +29,13 @@ class ApiController extends AbstractController public function download( DownloadMediaInput $input, ): Response { + $ptn = (object) new Ptn()->parse($input->filename); + if ($input->mediaType === "tvshows" && + !property_exists($ptn, 'episode') && !property_exists($ptn, 'season') + ) { + $input->filename = $input->episodeId . '_' . $input->filename; + } + $download = $this->downloadRepository->insert( $this->getUser(), $input->url, diff --git a/src/Twig/Extensions/UtilExtension.php b/src/Twig/Extensions/UtilExtension.php index 144830b..fe80928 100644 --- a/src/Twig/Extensions/UtilExtension.php +++ b/src/Twig/Extensions/UtilExtension.php @@ -4,7 +4,10 @@ namespace App\Twig\Extensions; use App\Monitor\Framework\Entity\Monitor; use App\Monitor\Service\MediaFiles; +use App\Torrentio\Action\Result\GetTvShowOptionsResult; +use App\Torrentio\Result\TorrentioResult; use ChrisUllyott\FileSize; +use Tmdb\Model\Tv\Episode; use Twig\Attribute\AsTwigFilter; use Twig\Attribute\AsTwigFunction; @@ -45,4 +48,15 @@ class UtilExtension $path ); } + + #[AsTwigFilter('episode_id_from_results')] + public function episodeId($result): ?string + { + if (!$result instanceof GetTvShowOptionsResult) { + return null; + } + + return "S". str_pad($result->season, 2, "0", STR_PAD_LEFT) . + "E". str_pad($result->episode, 2, "0", STR_PAD_LEFT); + } } diff --git a/templates/torrentio/partial/option-table.html.twig b/templates/torrentio/partial/option-table.html.twig index bfc4d33..485dae2 100644 --- a/templates/torrentio/partial/option-table.html.twig +++ b/templates/torrentio/partial/option-table.html.twig @@ -34,7 +34,7 @@ {% for result in results.results %} - + {{ result.size }} @@ -60,7 +60,8 @@ title: results.media.title, filename: result.filename, mediaType: results.media.mediaType, - imdbId: results.media.imdbId + imdbId: results.media.imdbId, + episodeId: results|episode_id_from_results }) }} {{ stimulus_action('download_button', 'download', 'click') }} >