From e54bcd44d8df4de110296dbda7df537de9cba36a Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Sun, 6 Jul 2025 15:37:29 -0500 Subject: [PATCH] wip: filters movie results, adds options to filter input --- .../controllers/movie_results_controller.js | 1 + .../controllers/result_filter_controller.js | 30 ++++++- src/Command/SeedDatabaseCommand.php | 33 ++++++++ .../Framework/Controller/ApiController.php | 78 ------------------- src/Torrentio/Result/ResultFactory.php | 2 + src/Torrentio/Result/TorrentioResult.php | 1 + templates/components/Filter.html.twig | 11 +++ .../torrentio/partial/option-table.html.twig | 9 ++- 8 files changed, 85 insertions(+), 80 deletions(-) diff --git a/assets/controllers/movie_results_controller.js b/assets/controllers/movie_results_controller.js index f4464de..29543e4 100644 --- a/assets/controllers/movie_results_controller.js +++ b/assets/controllers/movie_results_controller.js @@ -52,6 +52,7 @@ export default class extends Controller { "resolution": option.querySelector('#resolution').textContent.trim(), "codec": option.querySelector('#codec').textContent.trim(), "provider": option.querySelector('#provider').textContent.trim(), + "quality": option.dataset['quality'], "languages": JSON.parse(option.dataset['languages']), } diff --git a/assets/controllers/result_filter_controller.js b/assets/controllers/result_filter_controller.js index c0159ba..55aeba4 100644 --- a/assets/controllers/result_filter_controller.js +++ b/assets/controllers/result_filter_controller.js @@ -11,6 +11,7 @@ export default class extends Controller { languages = [] providers = [] + qualities = [] seasons = [] activeFilter = { @@ -18,10 +19,11 @@ export default class extends Controller { "codec": "", "language": "", "provider": "", + "quality": "", } static outlets = ['movie-results', 'tv-results', 'tv-episode-list'] - static targets = ['resolution', 'codec', 'language', 'provider', 'season', 'selectAll', 'downloadSelected'] + static targets = ['resolution', 'codec', 'language', 'provider', 'season', 'quality', 'selectAll', 'downloadSelected'] static values = { 'media-type': String, 'episodes': Array, @@ -49,6 +51,7 @@ export default class extends Controller { outlet.options.forEach((option) => { this.addLanguages(option, option.dataset); this.addProviders(option, option.dataset); + this.addQualities(option, option.dataset); }) await this.filter(); } @@ -105,6 +108,30 @@ export default class extends Controller { } + addQualities(option, props) { + if (!this.qualities.includes(props['quality'])) { + this.qualities.push(props['quality']); + } + + const preferred = this.qualityTarget.dataset.preferred; + if (preferred) { + this.qualityTarget.innerHTML = ''; + this.qualityTarget.innerHTML += ''; + } else { + this.qualityTarget.innerHTML = ''; + } + + this.qualityTarget.innerHTML += this.qualities.sort() + .map((quality) => { + const preferred = this.qualityTarget.dataset.preferred; + if (preferred === quality) { + return; + } + return '' + }) + .join(); + } + async filter() { const currentSeason = this.activeFilter['season']; @@ -114,6 +141,7 @@ export default class extends Controller { "codec": this.codecTarget.value, "language": this.languageTarget.value, "provider": this.providerTarget.value, + "quality": this.qualityTarget.value, } if ("movies" === this.mediaTypeValue) { diff --git a/src/Command/SeedDatabaseCommand.php b/src/Command/SeedDatabaseCommand.php index 042b2c4..341b25f 100644 --- a/src/Command/SeedDatabaseCommand.php +++ b/src/Command/SeedDatabaseCommand.php @@ -2,8 +2,10 @@ namespace App\Command; +use App\User\Framework\Entity\UserPreference; use App\User\Framework\Repository\PreferenceOptionRepository; use App\User\Framework\Repository\PreferencesRepository; +use App\User\Framework\Repository\UserRepository; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -18,14 +20,17 @@ class SeedDatabaseCommand extends Command { private PreferencesRepository $preferenceRepository; private PreferenceOptionRepository $preferenceOptionRepository; + private UserRepository $userRepository; public function __construct( PreferencesRepository $preferenceRepository, PreferenceOptionRepository $preferenceOptionRepository, + UserRepository $userRepository, ) { parent::__construct(); $this->preferenceRepository = $preferenceRepository; $this->preferenceOptionRepository = $preferenceOptionRepository; + $this->userRepository = $userRepository; } protected function execute(InputInterface $input, OutputInterface $output): int @@ -34,6 +39,7 @@ class SeedDatabaseCommand extends Command $this->seedPreferences($io); $this->seedPreferenceOptions($io); + $this->updateUserPreferences($io); return Command::SUCCESS; } @@ -60,6 +66,26 @@ class SeedDatabaseCommand extends Command $this->preferenceRepository->getEntityManager()->flush(); } + private function updateUserPreferences(SymfonyStyle $io) + { + $io->info('[SeedDatabaseCommand] > Updating user preferences...'); + $users = $this->userRepository->findAll(); + $preferences = $this->preferenceRepository->findAll(); + foreach ($users as $user) { + foreach ($preferences as $preference) { + if (false === $user->hasUserPreference($preference->getId())) { + $user->addUserPreference( + new UserPreference() + ->setPreference($preference) + ->setUser($user) + ->setPreferenceValue(null) + ); + } + } + } + $this->userRepository->getEntityManager()->flush(); + } + private function getPreferences(): array { return [ @@ -91,6 +117,13 @@ class SeedDatabaseCommand extends Command 'enabled' => true, 'type' => 'media', ], + [ + 'id' => 'quality', + 'name' => 'Quality', + 'description' => null, + 'enabled' => true, + 'type' => 'media', + ], [ 'id' => 'movie_folder', 'name' => 'Create new folder for Movies', diff --git a/src/Torrentio/Framework/Controller/ApiController.php b/src/Torrentio/Framework/Controller/ApiController.php index 9b76927..5c482d7 100644 --- a/src/Torrentio/Framework/Controller/ApiController.php +++ b/src/Torrentio/Framework/Controller/ApiController.php @@ -20,9 +20,6 @@ use Symfony\Contracts\Cache\ItemInterface; final class ApiController extends AbstractController { public function __construct( - private readonly GetMovieOptionsHandler $getMovieOptionsHandler, - private readonly GetTvShowOptionsHandler $getTvShowOptionsHandler, - private readonly Broadcaster $broadcaster, private readonly Torrentio $torrentio, ) {} @@ -38,79 +35,4 @@ final class ApiController extends AbstractController $this->torrentio->search($imdbId, 'movies', false), ); } - - #[Route('/torrentio/movies/{tmdbId}/{imdbId}', name: 'app_torrentio_movies')] - public function movieOptions(GetMovieOptionsInput $input, CacheInterface $cache): Response - { - $cacheId = sprintf( - "page.torrentio.movies.%s.%s", - $input->tmdbId, - $input->imdbId - ); - - return $cache->get($cacheId, function (ItemInterface $item) use ($input) { - $item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0)); - $results = $this->getMovieOptionsHandler->handle($input->toCommand()); - return $this->render('torrentio/movies.html.twig', [ - 'results' => $results, - ]); - }); - } - - #[Route('/torrentio/tvshows/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_torrentio_tvshows')] - public function tvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache): Response - { - $cacheId = sprintf( - "page.torrentio.tvshows.%s.%s.%s.%s", - $input->tmdbId, - $input->imdbId, - $input->season, - $input->episode, - ); - - try { -// 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, - ]); -// }); - } catch (TorrentioRateLimitException $exception) { - $this->broadcaster->alert('Warning', 'Torrentio has rate limited your requests. Please wait a few minutes before trying again.', 'warning'); - return $this->render('bare.html.twig', - [], - new Response('Too many requests', - Response::HTTP_TOO_MANY_REQUESTS, - ['Retry-After' => 4000] - ) - ); - } - } - - #[Route('/torrentio/tvshows/clear/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_clear_torrentio_tvshows')] - public function clearTvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache, Request $request): Response - { - $cacheId = sprintf( - "page.torrentio.tvshows.%s.%s.%s.%s", - $input->tmdbId, - $input->imdbId, - $input->season, - $input->episode, - ); - $cache->delete($cacheId); - - $this->broadcaster->alert( - title: 'Success', - message: 'Torrentio cache Cleared.' - ); - - 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, - ]); - }); - } } diff --git a/src/Torrentio/Result/ResultFactory.php b/src/Torrentio/Result/ResultFactory.php index fe4d4cc..6c428bb 100644 --- a/src/Torrentio/Result/ResultFactory.php +++ b/src/Torrentio/Result/ResultFactory.php @@ -22,6 +22,7 @@ class ResultFactory string $bingeGroup = "-" ) { $ptn = (object) (new PTN())->parse($title); +// dump($ptn); return new TorrentioResult( self::trimTitle($title), urldecode($url), @@ -34,6 +35,7 @@ class ResultFactory $bingeGroup, $ptn->resolution ?? "-", self::setCodec($ptn->codec ?? "-"), + $ptn->quality ?? "-", $ptn, substr(base64_encode($url), strlen($url) - 10), $ptn->episode ?? "-", diff --git a/src/Torrentio/Result/TorrentioResult.php b/src/Torrentio/Result/TorrentioResult.php index f731591..4aace39 100644 --- a/src/Torrentio/Result/TorrentioResult.php +++ b/src/Torrentio/Result/TorrentioResult.php @@ -16,6 +16,7 @@ class TorrentioResult public ?string $bingeGroup = "-", public ?string $resolution = "-", public ?string $codec = "-", + public ?string $quality = "-", public object|array $ptn = [], public ?string $key = "-", public ?string $episodeNumber = "-", diff --git a/templates/components/Filter.html.twig b/templates/components/Filter.html.twig index ca0cfb6..53c5dc8 100644 --- a/templates/components/Filter.html.twig +++ b/templates/components/Filter.html.twig @@ -55,6 +55,17 @@ > + {% if results.media.mediaType == "tvshows" %}