From d63d477ed1d41e4ddf4f657c0614b5b78dad9925 Mon Sep 17 00:00:00 2001 From: Brock H Caldwell Date: Mon, 8 Sep 2025 15:59:20 -0500 Subject: [PATCH] chore: cleanup --- .../TmdbMovieResultDenormalizer.php | 6 +- .../Serializer/TmdbResultDenormalizer.php | 29 +++++++++- .../TmdbTvShowResultDenormalizer.php | 7 ++- src/Tmdb/TmdbResult.php | 6 ++ templates/components/TvEpisodeList.html.twig | 12 ++-- templates/search/fragments.html.twig | 8 +-- templates/search/result.html.twig | 56 +++++++++++++------ 7 files changed, 90 insertions(+), 34 deletions(-) diff --git a/src/Tmdb/Framework/Serializer/TmdbMovieResultDenormalizer.php b/src/Tmdb/Framework/Serializer/TmdbMovieResultDenormalizer.php index 3811ec9..0fdc939 100644 --- a/src/Tmdb/Framework/Serializer/TmdbMovieResultDenormalizer.php +++ b/src/Tmdb/Framework/Serializer/TmdbMovieResultDenormalizer.php @@ -22,7 +22,7 @@ class TmdbMovieResultDenormalizer extends TmdbResultDenormalizer implements Deno public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): TmdbResult|array|null { /** @var TmdbResult $result */ - $result = $this->normalizer->denormalize($data, TmdbResult::class, $format, $context); + $result = parent::denormalize($data, TmdbResult::class, $format, $context); if (array_key_exists('release_date', $data) && !in_array($data['release_date'], ['', null,])) { $airDate = (new \DateTime($data['release_date'])); @@ -34,9 +34,7 @@ class TmdbMovieResultDenormalizer extends TmdbResultDenormalizer implements Deno $result->premiereDate = $airDate; $result->poster = (null !== $data['poster_path']) ? self::POSTER_IMG_PATH . $data['poster_path'] : null; $result->year = (null !== $airDate) ? $airDate->format('Y') : null; - $result->mediaType = "movies"; - $result->stars = $this->getStars($data); - $result->directors = $this->getDirectors($data); + $result->mediaType = MediaType::Movie->value; return $result; } diff --git a/src/Tmdb/Framework/Serializer/TmdbResultDenormalizer.php b/src/Tmdb/Framework/Serializer/TmdbResultDenormalizer.php index 75b8fd0..784182d 100644 --- a/src/Tmdb/Framework/Serializer/TmdbResultDenormalizer.php +++ b/src/Tmdb/Framework/Serializer/TmdbResultDenormalizer.php @@ -23,7 +23,12 @@ class TmdbResultDenormalizer implements DenormalizerInterface public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): TmdbResult|array|null { - return $this->normalizer->denormalize($data, TmdbResult::class, $format, $context); + $result = $this->normalizer->denormalize($data, TmdbResult::class, $format, $context); + $result->stars = $this->getStars($data); + $result->directors = $this->getDirectors($data); + $result->producers = $this->getProducers($data); + $result->creators = $this->getCreators($data); + return $result; } protected function getStars(array $data): ?array @@ -49,6 +54,28 @@ class TmdbResultDenormalizer implements DenormalizerInterface ->toArray(); } + public function getCreators(array $data): ?array + { + if (!array_key_exists('credits', $data)) { + return null; + } + return Map::from($data['credits']['crew']) + ->filter(fn($item) => $item['job'] === 'Creator') + ->map(fn($item) => $this->normalizer->denormalize($item, CrewMemberDto::class)) + ->toArray(); + } + + public function getProducers(array $data): ?array + { + if (!array_key_exists('credits', $data)) { + return null; + } + return Map::from($data['credits']['crew']) + ->filter(fn($item) => $item['job'] === 'Producer') + ->map(fn($item) => $this->normalizer->denormalize($item, CrewMemberDto::class)) + ->toArray(); + } + public function getGenres(array $data, MediaType $mediaType): ?array { if (array_key_exists('genres', $data)) { diff --git a/src/Tmdb/Framework/Serializer/TmdbTvShowResultDenormalizer.php b/src/Tmdb/Framework/Serializer/TmdbTvShowResultDenormalizer.php index 06a9157..1cb275b 100644 --- a/src/Tmdb/Framework/Serializer/TmdbTvShowResultDenormalizer.php +++ b/src/Tmdb/Framework/Serializer/TmdbTvShowResultDenormalizer.php @@ -20,7 +20,7 @@ class TmdbTvShowResultDenormalizer extends TmdbResultDenormalizer implements Den public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): TmdbResult|array|null { /** @var TmdbResult $result */ - $result = $this->normalizer->denormalize($data, TmdbResult::class, $format, $context); + $result = parent::denormalize($data, TmdbResult::class, $format, $context); if (!in_array($data['first_air_date'], ['', null,])) { $airDate = (new \DateTime($data['first_air_date'])); @@ -28,11 +28,16 @@ class TmdbTvShowResultDenormalizer extends TmdbResultDenormalizer implements Den $airDate = null; } + if (array_key_exists('seasons', $data)) { + $result->numberSeasons = count($data['seasons']); + } + $result->title = $data['original_name']; $result->premiereDate = $airDate; $result->poster = (null !== $data['poster_path']) ? self::POSTER_IMG_PATH . $data['poster_path'] : null; $result->year = (null !== $airDate) ? $airDate->format('Y') : null; $result->mediaType = MediaType::TvShow->value; + return $result; } diff --git a/src/Tmdb/TmdbResult.php b/src/Tmdb/TmdbResult.php index 4c47d15..6a8fe38 100644 --- a/src/Tmdb/TmdbResult.php +++ b/src/Tmdb/TmdbResult.php @@ -26,7 +26,10 @@ class TmdbResult * @param GenreDto[]|null $genres * @param CastMemberDto[]|null $stars * @param CrewMemberDto[]|null $directors + * @param CrewMemberDto[]|null $creators + * @param CrewMemberDto[]|null $producers * @param int|null $runtime + * @param int|null $numberSeasons */ public function __construct( #[SerializedPath('[external_ids][imdb_id]')] @@ -49,6 +52,9 @@ class TmdbResult public ?array $genres = null, public ?array $stars = null, public ?array $directors = null, + public ?array $creators = null, + public ?array $producers = null, public ?int $runtime = null, + public ?int $numberSeasons = null, ) {} } diff --git a/templates/components/TvEpisodeList.html.twig b/templates/components/TvEpisodeList.html.twig index 112861e..0fcb12a 100644 --- a/templates/components/TvEpisodeList.html.twig +++ b/templates/components/TvEpisodeList.html.twig @@ -30,14 +30,14 @@ {{ episode.episodeNumber }}. {{ episode.name }}

{{ episode.description|truncate }}

-
- - + {{ episode.airDate|date(null, 'UTC') }} - + - + missing - +
diff --git a/templates/search/fragments.html.twig b/templates/search/fragments.html.twig index 390af7c..755ae10 100644 --- a/templates/search/fragments.html.twig +++ b/templates/search/fragments.html.twig @@ -12,20 +12,20 @@ - exists - + {% endif %} {% if result.exists == false %} - missing - + {% endif %} diff --git a/templates/search/result.html.twig b/templates/search/result.html.twig index a3f2ed1..5b5de6e 100644 --- a/templates/search/result.html.twig +++ b/templates/search/result.html.twig @@ -53,27 +53,47 @@

{{ results.media.description }} -

+

+
{% if results.media.stars != null %} - Starring: {{ results.media.stars|join(', ') }}
+ Starring: {{ results.media.stars|join(', ') }}
{% endif %} {% if results.media.directors != null %} - Directors: {{ results.media.directors|join(', ') }}
+ Directors: {{ results.media.directors|join(', ') }}
{% endif %} -

- {% if results.media.genres != null %} -
- {% for genre in results.media.genres %} - {{ genre }} - {% endfor %} -
+ {% if results.media.producers != null %} + Producers: {{ results.media.producers|join(', ') }}
+ {% endif %} + + {% if results.media.creators != null %} + Creators: {{ results.media.creators|join(', ') }}
+ {% endif %} + + {% if results.media.genres != null %} +
+ {% for genre in results.media.genres %} + {{ genre }} + {% endfor %} +
+ {% endif %} +
+ + {% if results.media.mediaType == "tvshows" %} +
+ + {{ results.media.numberSeasons }} season(s) + + + {{ results.media.premiereDate|date(null, 'UTC') }} + +
{% endif %} {% if "movies" == results.media.mediaType %} -
+
- results @@ -83,18 +103,18 @@ block: 'media_exists_badge', target: "meb_" ~ results.media.imdbId }) }}"> - + missing - + - - {{ results.media.episodeAirDate|date(null, 'UTC') }} - + + {{ results.media.episodeAirDate|date('n/j/Y', 'UTC') }} + - + {{ results.media.runtime }} minutes - +
{% endif %}