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

@@ -6,9 +6,11 @@ use Aimeos\Map;
use App\Base\Enum\MediaType;
use App\Base\Util\ImdbMatcher;
use App\Tmdb\Dto\TmdbEpisodeDto;
use App\Tmdb\Dto\WatchProviderDto;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\Serializer\SerializerInterface;
use Tmdb\Api\Find;
use Tmdb\Client;
@@ -31,7 +33,7 @@ use Tmdb\Token\Api\BearerToken;
class TmdbClient
{
const POSTER_IMG_PATH = "https://image.tmdb.org/t/p/w500";
const APPEND_TO_RESPONSE = 'external_ids,credits,watch/providers';
const APPEND_TO_RESPONSE = 'external_ids,credits';
protected Client $client;
protected MovieRepository $movieRepository;
@@ -139,6 +141,50 @@ class TmdbClient
return $this->parseListOfResults($results);
}
public function discoverMovies(array $genres = [], int $page = 1, int $pageSize = 24, array $params = []): TmdbResult|Map
{
if (!empty($genres) && $genres[0] instanceof TmdbMovieGenre) {
$genres = array_map(fn ($genre) => $genre->value, $genres);
}
$results = $this->discoverRepository->getApi()->discoverMovies([
'page' => $page,
'page_size' => $pageSize,
'with_genres' => implode(',', $genres),
'with_original_language' => $this->originalLanguage,
'append_to_response' => static::APPEND_TO_RESPONSE,
]);
$results['results'] = Map::from($results['results'])->map(function ($result) {
$result['media_type'] = MediaType::Movie->value;
return $result;
});
return $this->parseListOfResults(
$results,
);
}
public function discoverTvshows(array $genres = [], int $page = 1, int $pageSize = 24, array $params = []): TmdbResult|Map
{
if (!empty($genres) && $genres[0] instanceof TmdbTvShowGenre) {
$genres = array_map(fn ($genre) => $genre->value, $genres);
}
$results = $this->discoverRepository->getApi()->discoverTv([
'page' => $page,
'page_size' => $pageSize,
'with_genres' => implode(',', $genres),
'with_original_language' => $this->originalLanguage,
'append_to_response' => static::APPEND_TO_RESPONSE,
]);
$results['results'] = Map::from($results['results'])->map(function ($result) {
$result['media_type'] = MediaType::TvShow->value;
return $result;
});
return $this->parseListOfResults(
$results,
);
}
public function movieDetails(string $imdbId): ?TmdbResult
{
$tmdbId = $this->findByImdbId($imdbId)['id'];
@@ -201,6 +247,14 @@ class TmdbClient
);
}
public function watchProviders(string $tmdbId, string $mediaType): Map
{
$results = $this->repos[$mediaType]->getApi()->getWatchProviders($tmdbId)['results']['US']['flatrate'];
return Map::from($results)->map(function ($result) {
return $this->serializer->denormalize($result, WatchProviderDto::class);
});
}
public function popularMovies(int $resultCount = 6): Map
{
$results = $this->discoverRepository->getApi()->discoverMovies([