feat: search results

This commit is contained in:
2025-04-20 23:47:12 -05:00
parent a4ad43cfe0
commit f5552e3ad7
20 changed files with 796 additions and 113 deletions

View File

@@ -2,7 +2,8 @@
namespace App\Tmdb;
use App\ValueObject\MediaResult;
use App\Enum\MediaType;
use App\Tmdb\TmdbResult;
use App\ValueObject\ResultFactory;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -31,7 +32,7 @@ use Tmdb\Repository\TvSeasonRepository;
use Tmdb\Token\Api\ApiToken;
use Tmdb\Token\Api\BearerToken;
class Client
class Tmdb
{
protected Client $client;
@@ -178,8 +179,8 @@ class Client
throw new \Exception("A media type must be set when parsing from an array.");
}
function parseTvShow(array $data, string $posterBasePath): MediaResult {
return new MediaResult(
function parseTvShow(array $data, string $posterBasePath): TmdbResult {
return new TmdbResult(
imdbId: $data['external_ids']['imdb_id'],
tvdbId: $data['id'],
title: $data['name'],
@@ -191,8 +192,8 @@ class Client
);
}
function parseMovie(array $data, string $posterBasePath): MediaResult {
return new MediaResult(
function parseMovie(array $data, string $posterBasePath): TmdbResult {
return new TmdbResult(
imdbId: $data['external_ids']['imdb_id'],
tvdbId: $data['id'],
title: $data['title'],
@@ -209,67 +210,80 @@ class Client
return $result;
}
private function parseFromObject($result)
private function parseFromObject($result): TmdbResult
{
$result->mediaType = $result instanceof Movie ? 'movies' : 'tvshows';
$mediaType = $result instanceof Movie ? MediaType::Movie->value : MediaType::TvShow->value;
$tmdbResult = new TmdbResult();
$tmdbResult->mediaType = $mediaType;
$tmdbResult->imdbId = $this->getImdbId($result->getId(), $mediaType);
$tmdbResult->title = $this->getTitle($result, $mediaType);
$tmdbResult->poster = self::POSTER_IMG_PATH . $result->getPosterImage();
$tmdbResult->year = $this->getReleaseDate($result, $mediaType);
$tmdbResult->description = $result->getOverview();
return $tmdbResult;
}
$externalIds = $this->cache->get("tmdb.externalIds.{$result->getId()}", function (ItemInterface $item) use ($result) {
if ($result instanceof Movie) {
$externalIds = $this->movieRepository->getExternalIds($result->getId());
} else {
$externalIds = $this->tvRepository->getExternalIds($result->getId());
}
return $externalIds;
public function getImdbId(string $tmdbId, $mediaType)
{
$externalIds = $this->cache->get("tmdb.externalIds.{$tmdbId}",
function (ItemInterface $item) use ($tmdbId, $mediaType) {
switch (MediaType::tryFrom($mediaType)->value) {
case MediaType::Movie->value:
return $this->movieRepository->getExternalIds($tmdbId);
case MediaType::TvShow->value:
return $this->tvRepository->getExternalIds($tmdbId);
default:
return null;
}
});
$images = $this->cache->get("tmdb.images.{$result->getId()}", function (ItemInterface $item) use ($result) {
if ($result instanceof Movie) {
$images = $this->movieRepository->getImages($result->getId());
} else {
$images = $this->tvRepository->getImages($result->getId());
}
return $images;
if (null === $externalIds) {
return null;
}
return $externalIds->getImdbId() !== "" ? $externalIds->getImdbId() : "null";
}
public function getImages($tmdbId, $mediaType)
{
return $this->cache->get("tmdb.images.{$tmdbId}",
function (ItemInterface $item) use ($tmdbId, $mediaType) {
switch (MediaType::tryFrom($mediaType)->value) {
case MediaType::Movie->value:
return $this->movieRepository->getImages($tmdbId);
case MediaType::TvShow->value:
return $this->tvRepository->getImages($tmdbId);
default:
return null;
}
});
}
if (null !== $externalIds) {
$imdbId = $externalIds->getImdbId() !== "" ? $externalIds->getImdbId() : "null";
if ("movies" === $result->mediaType) {
$result->setImdbId($imdbId);
} else {
$result->imdbId = $imdbId;
$result->title = $result->getName();
}
} else {
if ("movies" === $result->mediaType) {
$result->setImdbId("null");
} else {
$result->imdbId = "null";
}
private function getReleaseDate($result, $mediaType): string
{
switch (MediaType::tryFrom($mediaType)->value) {
case MediaType::Movie->value:
return ($result->getReleaseDate() instanceof \DateTime)
? $result->getReleaseDate()->format('Y')
: $result->getReleaseDate();
case MediaType::TvShow->value:
return ($result->getFirstAirDate() instanceof \DateTime)
? $result->getFirstAirDate()->format('Y')
: $result->getFirstAirDate();
default:
return "";
}
}
if ("movies" === $result->mediaType) {
if ($result->getReleaseDate() instanceof \DateTime) {
$result->year = $result->getReleaseDate()->format("Y");
} else {
$result->year = (new \DateTime($result->getReleaseDate()))->format('Y');
}
} else {
if ($result->getFirstAirDate() instanceof \DateTime) {
$result->year = $result->getFirstAirDate()->format("Y");
} else {
$result->year = (new \DateTime($result->getFirstAirDate()))->format('Y');
}
private function getTitle($result, $mediaType): string
{
switch (MediaType::tryFrom($mediaType)->value) {
case MediaType::Movie->value:
return $result->getTitle();
case MediaType::TvShow->value:
return $result->getName();
default:
return "";
}
/** @var Movie $result */
$result->setExternalIds($externalIds);
$result->setImages($images);
$result->getPosterImage()->setFilePath(
self::POSTER_IMG_PATH . $result->getPosterImage()->getFilePath()
);
return $result;
}
}