1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-04 18:29:40 +02:00
ampache/modules/Tmdb/Factory/PeopleFactory.php
Afterster d842ebbb00 Add art on Videos
Add videos support to Subsonic and UPnP APIs
Update Tmdb module
2014-07-06 20:46:46 +02:00

206 lines
5.4 KiB
PHP

<?php
/**
* This file is part of the Tmdb PHP API created by Michael Roterman.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @package Tmdb
* @author Michael Roterman <michael@wtfz.net>
* @copyright (c) 2013, Michael Roterman
* @version 0.0.1
*/
namespace Tmdb\Factory;
use Tmdb\Common\ObjectHydrator;
use Tmdb\Factory\Common\ChangeFactory;
use Tmdb\Model\Collection\People;
use Tmdb\Model\Common\ExternalIds;
use Tmdb\Model\Person\CastMember;
use Tmdb\Model\Person\CrewMember;
use Tmdb\Model\Person;
class PeopleFactory extends AbstractFactory
{
/**
* @var ImageFactory
*/
private $imageFactory;
/**
* @var ChangeFactory
*/
private $changeFactory;
/**
* Constructor
*/
public function __construct()
{
$this->imageFactory = new ImageFactory();
$this->changeFactory = new ChangeFactory();
}
/**
* @param array $data
* @param Person\AbstractMember|null $person
*
* @return Person|CrewMember|CastMember
*/
public function create(array $data = array(), $person = null)
{
if (!is_object($person)) {
if (array_key_exists('character', $data)) {
$person = new CastMember();
}
if (array_key_exists('job', $data)) {
$person = new CrewMember();
}
if (null === $person) {
$person = new Person();
}
}
if (array_key_exists('profile_path', $data)) {
$person->setProfileImage($this->getImageFactory()->createFromPath($data['profile_path'], 'profile_path'));
}
if ($person instanceof Person) {
/** Images */
if (array_key_exists('images', $data)) {
$person->setImages($this->getImageFactory()->createCollectionFromPeople($data['images']));
}
/** Credits */
$this->applyCredits($data, $person);
}
if (array_key_exists('changes', $data)) {
$person->setChanges($this->getChangeFactory()->createCollection($data['changes']));
}
/** External ids */
if (array_key_exists('external_ids', $data)) {
$person->setExternalIds(
$this->hydrate(new ExternalIds(), $data['external_ids'])
);
}
return $this->hydrate($person, $data);
}
/**
* Apply credits
*
* @param array $data
* @param Person $person
*/
protected function applyCredits(array $data, Person $person)
{
$hydrator = new ObjectHydrator();
$types = array('movie_credits', 'tv_credits', 'combined_credits');
foreach ($types as $type) {
if (array_key_exists($type, $data)) {
$method = $hydrator->camelize(sprintf('get_%s', $type));
if (array_key_exists('cast', $data[$type])) {
$cast = $this->createGenericCollection(
$data[$type]['cast'],
new Person\MovieCredit()
);
foreach ($cast as $member) {
$member->setPosterImage($this->getPosterImageForCredit($member->getPosterPath()));
}
$person->$method()->setCast($cast);
}
if (array_key_exists('crew', $data[$type])) {
$crew = $this->createGenericCollection(
$data[$type]['crew'],
new Person\MovieCredit()
);
foreach ($crew as $member) {
$member->setPosterImage($this->getPosterImageForCredit($member->getPosterPath()));
}
$person->$method()->setCrew($crew);
}
}
}
}
protected function getPosterImageForCredit($posterPath)
{
return $this->getImageFactory()->createFromPath($posterPath, 'poster_path');
}
/**
* {@inheritdoc}
*/
public function createCollection(array $data = array(), $person = null, $collection = null)
{
if (!$collection) {
$collection = new People();
}
if (array_key_exists('results', $data)) {
$data = $data['results'];
}
if (is_object($person)) {
$class = get_class($person);
} else {
$class = '\Tmdb\Model\Person';
}
foreach ($data as $item) {
$collection->add(null, $this->create($item, new $class()));
}
return $collection;
}
/**
* @param \Tmdb\Factory\ImageFactory $imageFactory
* @return $this
*/
public function setImageFactory($imageFactory)
{
$this->imageFactory = $imageFactory;
return $this;
}
/**
* @return \Tmdb\Factory\ImageFactory
*/
public function getImageFactory()
{
return $this->imageFactory;
}
/**
* @param \Tmdb\Factory\Common\ChangeFactory $changeFactory
* @return $this
*/
public function setChangeFactory($changeFactory)
{
$this->changeFactory = $changeFactory;
return $this;
}
/**
* @return \Tmdb\Factory\Common\ChangeFactory
*/
public function getChangeFactory()
{
return $this->changeFactory;
}
}