From 228d320edc014f639677fd1d36295cb9c380cabb Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Sat, 7 Jun 2025 19:19:12 -0500 Subject: [PATCH] feat: tv episode - existance indicator badge --- assets/icons/line-md/circle-twotone.svg | 1 + compose.yml | 2 + src/Controller/TorrentioController.php | 6 +-- src/Monitor/Service/MediaFiles.php | 22 +++++++++++ .../Handler/GetTvShowOptionsHandler.php | 9 ++++- .../Action/Result/GetTvShowOptionsResult.php | 2 + tailwind.config.js | 2 + templates/torrentio/tvshows.html.twig | 39 +++++++++++++++---- 8 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 assets/icons/line-md/circle-twotone.svg diff --git a/assets/icons/line-md/circle-twotone.svg b/assets/icons/line-md/circle-twotone.svg new file mode 100644 index 0000000..8c7a0f1 --- /dev/null +++ b/assets/icons/line-md/circle-twotone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/compose.yml b/compose.yml index 711d13a..9ebce80 100755 --- a/compose.yml +++ b/compose.yml @@ -18,6 +18,7 @@ services: restart: unless-stopped volumes: - $PWD:/app + - $PWD/var/download:/var/download - mercure_data:/data - mercure_config:/config tty: true @@ -34,6 +35,7 @@ services: restart: unless-stopped volumes: - $PWD:/app + - $PWD/var/download:/var/download tty: true command: php /app/bin/console messenger:consume async -vv --time-limit=3600 --limit=10 diff --git a/src/Controller/TorrentioController.php b/src/Controller/TorrentioController.php index ad40ee7..2d927b7 100644 --- a/src/Controller/TorrentioController.php +++ b/src/Controller/TorrentioController.php @@ -52,13 +52,13 @@ final class TorrentioController extends AbstractController $input->episode, ); - return $cache->get($cacheId, function (ItemInterface $item) use ($input) { - $item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0)); +// return $cache->get($cacheId, function (ItemInterface $item) use ($input) { +// $item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0)); $results = $this->getTvShowOptionsHandler->handle($input->toCommand()); return $this->render('torrentio/tvshows.html.twig', [ 'results' => $results, ]); - }); +// }); } #[Route('/torrentio/tvshows/clear/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_clear_torrentio_tvshows')] diff --git a/src/Monitor/Service/MediaFiles.php b/src/Monitor/Service/MediaFiles.php index e5eb36f..5f23a2a 100644 --- a/src/Monitor/Service/MediaFiles.php +++ b/src/Monitor/Service/MediaFiles.php @@ -3,9 +3,11 @@ namespace App\Monitor\Service; use Aimeos\Map; +use Nihilarr\PTN; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Finder\Finder; +use Symfony\Component\Finder\SplFileInfo; class MediaFiles { @@ -125,4 +127,24 @@ class MediaFiles return $path; } + + public function episodeExists(string $tvshowTitle, int $seasonNumber, int $episodeNumber) + { + $existingEpisodes = $this->getEpisodes($tvshowTitle, false); + + if ($existingEpisodes->isEmpty()) { + return false; + } + + /** @var SplFileInfo $episode */ + foreach ($existingEpisodes as $episode) { + $ptn = (object) (new PTN())->parse($episode->getFilename()); + + if ($ptn->season === $seasonNumber && $ptn->episode === $episodeNumber) { + return $episode; + } + } + + return false; + } } diff --git a/src/Torrentio/Action/Handler/GetTvShowOptionsHandler.php b/src/Torrentio/Action/Handler/GetTvShowOptionsHandler.php index 6e72d78..1ef80a8 100644 --- a/src/Torrentio/Action/Handler/GetTvShowOptionsHandler.php +++ b/src/Torrentio/Action/Handler/GetTvShowOptionsHandler.php @@ -2,6 +2,7 @@ namespace App\Torrentio\Action\Handler; +use App\Monitor\Service\MediaFiles; use App\Tmdb\Tmdb; use App\Torrentio\Action\Command\GetTvShowOptionsCommand; use App\Torrentio\Action\Result\GetTvShowOptionsResult; @@ -16,12 +17,18 @@ class GetTvShowOptionsHandler implements HandlerInterface public function __construct( private readonly Tmdb $tmdb, private readonly Torrentio $torrentio, + private readonly MediaFiles $mediaFiles, ) {} public function handle(CommandInterface $command): ResultInterface { + $media = $this->tmdb->episodeDetails($command->tmdbId, $command->season, $command->episode); + $parentShow = $this->tmdb->mediaDetails($command->imdbId, 'tvshows'); + $file = $this->mediaFiles->episodeExists($parentShow->title, $command->season, $command->episode); + return new GetTvShowOptionsResult( - media: $this->tmdb->episodeDetails($command->tmdbId, $command->season, $command->episode), + media: $media, + file: $file, season: $command->season, episode: $command->episode, results: $this->torrentio->fetchEpisodeResults( diff --git a/src/Torrentio/Action/Result/GetTvShowOptionsResult.php b/src/Torrentio/Action/Result/GetTvShowOptionsResult.php index d04bb81..d379c66 100644 --- a/src/Torrentio/Action/Result/GetTvShowOptionsResult.php +++ b/src/Torrentio/Action/Result/GetTvShowOptionsResult.php @@ -4,11 +4,13 @@ namespace App\Torrentio\Action\Result; use App\Tmdb\TmdbResult; use OneToMany\RichBundle\Contract\ResultInterface; +use Symfony\Component\Finder\SplFileInfo; class GetTvShowOptionsResult implements ResultInterface { public function __construct( public TmdbResult $media, + public bool|SplFileInfo $file, public string $season, public string $episode, public array $results diff --git a/tailwind.config.js b/tailwind.config.js index 1213e08..b040ed8 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -11,6 +11,8 @@ module.exports = { "bg-green-400", "bg-purple-400", "bg-orange-400", + "bg-blue-600", + "bg-rose-600" ], theme: { extend: {}, diff --git a/templates/torrentio/tvshows.html.twig b/templates/torrentio/tvshows.html.twig index 627c561..47e120b 100644 --- a/templates/torrentio/tvshows.html.twig +++ b/templates/torrentio/tvshows.html.twig @@ -8,23 +8,46 @@ {% endif %}
-

{{ results.episode }}. {{ results.media.title }}

+

+ {{ results.episode }}. {{ results.media.title }} +

{{ results.media.description }}

- {{ results.results|length }} results - {{ results.media.episodeAirDate }} + > + {{ results.results|length }} results + + + {% if results.file != false %} + + exists + + {% endif %} + + {% if results.file == false %} + + missing + + {% endif %} + + + {{ results.media.episodeAirDate }} + {# Clear Cache#}
- +
+ + + + +