tmdbId, $input->imdbId ); return $cache->get($cacheId, function (ItemInterface $item) use ($input, $request) { $item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0)); $results = $this->getMovieOptionsHandler->handle($input->toCommand()); if ($request->headers->get('Turbo-Frame')) { return $this->sendFragmentResponse($results, $request); } 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, Request $request): 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, $request) { $item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0)); $results = $this->getTvShowOptionsHandler->handle($input->toCommand()); if ($request->headers->get('Turbo-Frame')) { return $this->sendFragmentResponse($results, $request); } 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] ) ); } } private function sendFragmentResponse(ResultInterface $result, Request $request): Response { $request->setRequestFormat(TurboBundle::STREAM_FORMAT); return $this->renderBlock( 'torrentio/fragments.html.twig', $request->query->get('block'), [ 'results' => $result, 'target' => $request->query->get('target') ] ); } }