feat: new Discover section shows watch providers for results
Some checks failed
SonarQube Scan / SonarQube Trigger (pull_request) Failing after 24s
SonarQube Scan / SonarQube Trigger (push) Failing after 36s

This commit is contained in:
Brock H Caldwell
2025-11-11 23:08:20 -06:00
parent c2474942a1
commit 2effa0fb07
23 changed files with 616 additions and 80 deletions

View File

@@ -2,13 +2,18 @@
namespace App\Tmdb\Framework\Controller;
use App\Base\Enum\MediaType;
use App\Base\Util\ImdbMatcher;
use App\Library\Action\Result\LibrarySearchResult;
use App\Tmdb\TmdbClient;
use App\Tmdb\TmdbMovieGenre;
use App\Tmdb\TmdbResult;
use App\Tmdb\TmdbTvShowGenre;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\UX\Turbo\TurboBundle;
class ApiController extends AbstractController
{
@@ -47,4 +52,50 @@ class ApiController extends AbstractController
'results' => $results,
]);
}
#[Route('/api/tmdb/watch-providers/{mediaType}/{tmdbId}', name: 'api.tmdb.watch_providers', methods: ['GET'])]
public function watchProviders(string $mediaType, string $tmdbId, Request $request, TmdbClient $tmdb)
{
$result = $tmdb->watchProviders($tmdbId, $mediaType);
if ($request->headers->get('Turbo-Frame')) {
return $this->sendFragmentResponse(['providers' => $result], $request);
}
return $this->json($result);
}
#[Route('/api/tmdb/genre/{mediaType}/{genreId}', name: 'api.tmdb.genre', methods: ['GET'])]
public function genreResults(string $mediaType, string $genreId, Request $request, TmdbClient $tmdb)
{
$genre = TmdbMovieGenre::from($genreId);
$results['media_type'] = $mediaType;
$results['genre'] = $genre->name;
$results['genre_id'] = $genre->value;
$results['media'] = match($mediaType) {
MediaType::Movie->value => $tmdb->discoverMovies(
[TmdbMovieGenre::from($genre->value)],
),
MediaType::TvShow->value => $tmdb->discoverTvShows(
[TmdbTvShowGenre::from($genreId)]
)
};
if ($request->headers->get('Turbo-Frame')) {
return $this->sendFragmentResponse(['result' => $results], $request);
}
return $this->json($results);
}
private function sendFragmentResponse(mixed $result, Request $request): Response
{
$request->setRequestFormat(TurboBundle::STREAM_FORMAT);
return $this->renderBlock(
'discover/fragments.html.twig',
$request->query->get('block'),
[
'result' => $result,
'target' => $request->query->get('target')
]
);
}
}