mirror of
				https://github.com/alchemy-fr/Phraseanet.git
				synced 2025-10-26 03:13:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			844 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			844 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /*
 | |
|  * This file is part of Phraseanet
 | |
|  *
 | |
|  * (c) 2005-2016 Alchemy
 | |
|  *
 | |
|  * For the full copyright and license information, please view the LICENSE
 | |
|  * file that was distributed with this source code.
 | |
|  */
 | |
| 
 | |
| use Symfony\Component\HttpFoundation\Request;
 | |
| 
 | |
| class Bridge_Api_Flickr extends Bridge_Api_Abstract implements Bridge_Api_Interface
 | |
| {
 | |
|     /**
 | |
|      *
 | |
|      * @var Phlickr_Api
 | |
|      */
 | |
|     protected $_api;
 | |
| 
 | |
|     const ELEMENT_TYPE_PHOTO = 'photo';
 | |
|     const CONTAINER_TYPE_PHOTOSET = 'photoset';
 | |
|     const AUTH_TYPE = 'Flickr';
 | |
|     const AUTH_PHOTO_SIZE = 15728640; //15 mo
 | |
|     const UPLOAD_STATE_DONE = 'done';
 | |
|     const UPLOAD_STATE_FAILED = 'failed';
 | |
|     const UPLOAD_STATE_FAILED_CONVERTING = 'failed_converting';
 | |
|     const UPLOAD_STATE_NOT_COMPLETED = 'not_completed';
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Array
 | |
|      */
 | |
|     public function connect()
 | |
|     {
 | |
|         $response = parent::connect();
 | |
|         $this->_api->setAuthToken($response['auth_token']);
 | |
| 
 | |
|         return $response;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Bridge_Api_Flickr
 | |
|      */
 | |
|     public function disconnect()
 | |
|     {
 | |
|         parent::disconnect();
 | |
|         $this->_api->setAuthToken(null);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_user_name()
 | |
|     {
 | |
|         $response = $this->_api->executeMethod('flickr.auth.checkToken');
 | |
|         if ( ! $response->isOk()) {
 | |
|             throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve FlickR username');
 | |
|         }
 | |
| 
 | |
|         return (string) $response->xml->auth->user['username'];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_user_id()
 | |
|     {
 | |
|         return $this->_api->getUserId();
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_name()
 | |
|     {
 | |
|         return 'Flickr';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_icon_url()
 | |
|     {
 | |
|         return '/assets/common/images/icons/flickr-small.gif';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_image_url()
 | |
|     {
 | |
|         return '/assets/common/images/icons/flickr.gif';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_terms_url()
 | |
|     {
 | |
|         return 'https://secure.flickr.com/services/api/tos/';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_url()
 | |
|     {
 | |
|         return 'https://secure.flickr.com/';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_infos()
 | |
|     {
 | |
|         return $this->translator->trans('Ce produit utilise l\'API Flickr mais n\'est ni soutenu, ni certifie par Flickr');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_default_element_type()
 | |
|     {
 | |
|         return self::ELEMENT_TYPE_PHOTO;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_default_container_type()
 | |
|     {
 | |
|         return self::CONTAINER_TYPE_PHOTOSET;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  type $element_id
 | |
|      * @param  type $object
 | |
|      * @return type
 | |
|      */
 | |
|     public function get_element_from_id($element_id, $object)
 | |
|     {
 | |
|         switch ($object) {
 | |
|             case self::ELEMENT_TYPE_PHOTO:
 | |
|                 $params = ['photo_id'   => $element_id];
 | |
|                 $th_response = $this->_api->executeMethod('flickr.photos.getInfo', $params);
 | |
| 
 | |
|                 if ( ! $th_response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve element infos for ' . $object . ' ' . $element_id);
 | |
| 
 | |
|                 $th_xml = $th_response->getXml();
 | |
| 
 | |
|                 return new Bridge_Api_Flickr_Element($th_xml, $this->get_user_id(), $object, false);
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ElementUnknown('Unknown element ' . $object);
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  type $object
 | |
|      * @param  type $element_id
 | |
|      * @return type
 | |
|      */
 | |
|     public function get_container_from_id($object, $element_id)
 | |
|     {
 | |
|         switch ($object) {
 | |
|             case self::CONTAINER_TYPE_PHOTOSET:
 | |
| 
 | |
|                 $params = ['photoset_id' => $element_id];
 | |
|                 $response = $this->_api->executeMethod('flickr.photoset.getInfo', $params);
 | |
| 
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve photoset infos for ' . $object);
 | |
| 
 | |
|                 $xml = $response->getXml();
 | |
|                 $primary_photo = $this->get_element_from_id((string) $xml->photo['id'], self::ELEMENT_TYPE_PHOTO);
 | |
| 
 | |
|                 return new Bridge_Api_Flickr_Container($xml, $this->get_user_id(), $object, $primary_photo->get_thumbnail());
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ElementUnknown('Unknown element ' . $object);
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param type $object
 | |
|      * @param type $offset_start
 | |
|      * @param type $quantity
 | |
|      */
 | |
|     public function list_containers($object, $offset_start = 0, $quantity = 10)
 | |
|     {
 | |
|         switch ($object) {
 | |
|             case self::CONTAINER_TYPE_PHOTOSET:
 | |
|                 $params = [];
 | |
|                 if ($quantity)
 | |
|                     $params['per_page'] = $quantity;
 | |
|                 $params['page'] = $quantity != 0 ? floor($offset_start / $quantity) + 1 : 1;
 | |
|                 $params['user_id'] = $user_id = $this->get_user_id();
 | |
|                 $response = $this->_api->executeMethod('flickr.photosets.getList', $params);
 | |
| 
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve container list ' . $object);
 | |
| 
 | |
|                 $photosets = new Bridge_Api_ContainerCollection();
 | |
|                 $xml = $response->getXml();
 | |
| 
 | |
|                 $photosets->set_current_page((int) $xml->photosets['page'])
 | |
|                     ->set_items_per_page((int) $xml->photosets['perpage'])
 | |
|                     ->set_total_items((int) $xml->photosets['total'])
 | |
|                     ->set_total_page((int) $xml->photosets['pages']);
 | |
| 
 | |
|                 foreach ($xml->photosets->children() as $child) {
 | |
|                     $primary_photo = $this->get_element_from_id((string) $child['primary'], self::ELEMENT_TYPE_PHOTO);
 | |
|                     $photosets->add_element(new Bridge_Api_Flickr_Container($child, $user_id, $object, $primary_photo->get_thumbnail()));
 | |
|                 }
 | |
|                 $photosets->set_total_items(count($photosets->get_elements()));
 | |
| 
 | |
|                 return $photosets;
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ObjectUnknown('Unknown object ' . $object);
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param string $object
 | |
|      * @param string $object_id
 | |
|      * @param array  $datas
 | |
|      */
 | |
|     public function update_element($object, $object_id, Array $datas)
 | |
|     {
 | |
|         $required_fields = ["title"];
 | |
|         foreach ($required_fields as $field) {
 | |
|             if ( ! array_key_exists($field, $datas) || trim($datas[$field]) === '')
 | |
|                 throw new Bridge_Exception_ActionMandatoryField("Le paramétre " . $field . " est manquant");
 | |
|         }
 | |
| 
 | |
|         $params = [
 | |
|             'title'       => $datas["title"]
 | |
|             , 'photo_id'    => $object_id
 | |
|             , 'description' => $datas["description"]
 | |
|         ];
 | |
| 
 | |
|         switch ($object) {
 | |
|             case self::ELEMENT_TYPE_PHOTO :
 | |
|                 $response = $this->_api->executeMethod('flickr.photos.setMeta', $params);
 | |
| 
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed();
 | |
| 
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ElementUnknown('Unknown element ' . $object);
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string                      $container_type
 | |
|      * @param  Request                     $request
 | |
|      * @return Bridge_Api_Flickr_Container
 | |
|      */
 | |
|     public function create_container($container_type, Request $request)
 | |
|     {
 | |
|         switch ($container_type) {
 | |
|             case self::CONTAINER_TYPE_PHOTOSET:
 | |
|                 $pid = $request->get('f_container_primary_photo');
 | |
|                 if (is_null($pid))
 | |
|                     throw new Bridge_Exception_ActionMandatoryField('You must define a default photo for the photoset');
 | |
| 
 | |
|                 $params = [
 | |
|                     'title'            => $request->get('title')
 | |
|                     , 'primary_photo_id' => $pid
 | |
|                     , 'description'      => $request->get('description')
 | |
|                 ];
 | |
| 
 | |
|                 $response = $this->_api->executeMethod('flickr.photosets.create', $params);
 | |
| 
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed();
 | |
| 
 | |
|                 $user_id = $this->get_user_id();
 | |
|                 $xml = $response->getXml();
 | |
| 
 | |
|                 $photoset = $xml->photoset;
 | |
|                 $primary_photo = $this->get_element_from_id($pid, self::ELEMENT_TYPE_PHOTO);
 | |
| 
 | |
|                 return new Bridge_Api_Flickr_Container($photoset, $user_id, $container_type, $primary_photo->get_thumbnail());
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ObjectUnknown('Unknown object ' . $container_type);
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string $element_type
 | |
|      * @param  string $element_id
 | |
|      * @param  string $destination
 | |
|      * @param  string $container_id
 | |
|      * @return Void
 | |
|      */
 | |
|     public function add_element_to_container($element_type, $element_id, $destination, $container_id)
 | |
|     {
 | |
|         switch ($element_type) {
 | |
|             case self::ELEMENT_TYPE_PHOTO:
 | |
|                 switch ($destination) {
 | |
|                     case self::CONTAINER_TYPE_PHOTOSET:
 | |
|                         $params = ['photo_id'    => $element_id, 'photoset_id' => $container_id];
 | |
|                         $response = $this->_api->executeMethod('flickr.photosets.addPhoto', $params);
 | |
| 
 | |
|                         if ( ! $response->isOk()) {
 | |
|                             //Already exists in photoset
 | |
|                             if ($response->err_code === 3) {
 | |
|                                 return;
 | |
|                             }
 | |
| 
 | |
|                             throw new Bridge_Exception_ApiConnectorRequestFailed();
 | |
|                         }
 | |
|                         break;
 | |
|                     default:
 | |
|                         throw new Bridge_Exception_ObjectUnknown('Unknown object ' . $destination);
 | |
|                         break;
 | |
|                 }
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ObjectUnknown('Unknown object ' . $element_type);
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string $object
 | |
|      * @param  string $object_id
 | |
|      * @return Void
 | |
|      */
 | |
|     public function delete_object($object, $object_id)
 | |
|     {
 | |
|         switch ($object) {
 | |
|             case self::ELEMENT_TYPE_PHOTO:
 | |
|                 $response = $this->_api->executeMethod(
 | |
|                     'flickr.photos.delete'
 | |
|                     , ['photo_id' => $object_id]
 | |
|                 );
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed();
 | |
|                 break;
 | |
|             case self::CONTAINER_TYPE_PHOTOSET:
 | |
|                 $response = $this->_api->executeMethod(
 | |
|                     'flickr.photosets.delete'
 | |
|                     , ['photoset_id' => $object_id]
 | |
|                 );
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed();
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ObjectUnknown('Unknown object ' . $object);
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string                       $type
 | |
|      * @param  int                          $offset_start
 | |
|      * @param  int                          $quantity
 | |
|      * @return Bridge_Api_ElementCollection
 | |
|      */
 | |
|     public function list_elements($type, $offset_start = 0, $quantity = 10)
 | |
|     {
 | |
|         switch ($type) {
 | |
|             case self::ELEMENT_TYPE_PHOTO:
 | |
|                 $params = [];
 | |
|                 //info to display during search
 | |
|                 $extras = [
 | |
|                     'description'
 | |
|                     , 'license'
 | |
|                     , 'date_upload'
 | |
|                     , 'date_taken'
 | |
|                     , 'owner_name'
 | |
|                     , 'last_update'
 | |
|                     , 'tags'
 | |
|                     , 'views'
 | |
|                     , 'url_sq'
 | |
|                     , 'url_t'
 | |
|                 ];
 | |
| 
 | |
|                 $params['user_id'] = $this->get_user_id();
 | |
|                 $params['extras'] = implode(",", $extras);
 | |
| 
 | |
|                 if ($quantity)
 | |
|                     $params['per_page'] = $quantity;
 | |
|                 $params['page'] = $quantity != 0 ? floor($offset_start / $quantity) + 1 : 1;
 | |
|                 $response = $this->_api->executeMethod('flickr.photos.search', $params);
 | |
| 
 | |
|                 $photos = new Bridge_Api_ElementCollection();
 | |
| 
 | |
|                 if ( ! $response->isOk())
 | |
|                     throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve element list ' . $type);
 | |
|                 $xml = $response->getXml();
 | |
|                 $photos->set_current_page((int) $xml->photos['page'])
 | |
|                     ->set_items_per_page((int) $xml->photos['perpage'])
 | |
|                     ->set_total_items((int) $xml->photos['total'])
 | |
|                     ->set_total_page((int) $xml->photos['pages']);
 | |
|                 foreach ($xml->photos->children() as $child) {
 | |
|                     $photos->add_element(new Bridge_Api_Flickr_Element($child, $params['user_id'], $type));
 | |
|                 }
 | |
| 
 | |
|                 return $photos;
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_ElementUnknown('Unknown element ' . $type);
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function get_element_status(Bridge_Element $element)
 | |
|     {
 | |
|         try {
 | |
|             $ticket = $this->checkTicket($element->get_dist_id(), $element->get_type());
 | |
|             if ($ticket["status"] == self::UPLOAD_STATE_DONE) {
 | |
|                 $this->get_element_from_id($ticket["dist_id"], $element->get_type());
 | |
|                 $element->set_dist_id($ticket["dist_id"]);
 | |
|             }
 | |
|         } catch (\Exception $e) {
 | |
|             return self::UPLOAD_STATE_FAILED;
 | |
|         }
 | |
| 
 | |
|         return $ticket["status"];
 | |
|     }
 | |
| 
 | |
|     public function map_connector_to_element_status($status)
 | |
|     {
 | |
|         switch ($status) {
 | |
|             case self::UPLOAD_STATE_DONE:
 | |
|                 return Bridge_Element::STATUS_DONE;
 | |
|                 break;
 | |
|             case self::UPLOAD_STATE_FAILED:
 | |
|                 return Bridge_Element::STATUS_ERROR;
 | |
|                 break;
 | |
|             default:
 | |
|                 return null;
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public function get_error_message_from_status($connector_status)
 | |
|     {
 | |
|         switch ($connector_status) {
 | |
|             case self::UPLOAD_STATE_FAILED:
 | |
|                 return $this->translator->trans('L\'upload a echoue');
 | |
|             default:
 | |
|             case self::UPLOAD_STATE_DONE:
 | |
|                 return '';
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  record_adapter $record
 | |
|      * @param  array          $options
 | |
|      * @return string         The new distant Id
 | |
|      */
 | |
|     public function upload(record_adapter $record, Array $options = [])
 | |
|     {
 | |
|         $uploader = new Phlickr_Uploader($this->_api);
 | |
| 
 | |
|         $privacy = $this->get_default_privacy();
 | |
|         $uploader->setPerms($privacy['public'], $privacy['friends'], $privacy['family']);
 | |
|         $type = $record->getType() == 'image' ? self::ELEMENT_TYPE_PHOTO : $record->getType();
 | |
|         switch ($type) {
 | |
|             case self::ELEMENT_TYPE_PHOTO :
 | |
|                 return $uploader->upload($record->get_hd_file()->getRealPath(), $options['title'], $options['description'], $options['tags'], true);
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Bridge_Exception_InvalidRecordType('Unknown format');
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Closure
 | |
|      */
 | |
|     public function acceptable_records()
 | |
|     {
 | |
|         return function (record_adapter $record) {
 | |
|                 return in_array($record->getType(), ['image']);
 | |
|             };
 | |
|     }
 | |
| 
 | |
|     protected function get_default_privacy()
 | |
|     {
 | |
|         $privacy = null;
 | |
|         $response = $this->_api->executeMethod('flickr.prefs.getPrivacy');
 | |
|         if ( ! $response->isOk())
 | |
|             throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve default privacy settings');
 | |
|         $xml = $response->getXml();
 | |
|         $privacy = (string) $xml->person['privacy'];
 | |
|         switch ($privacy) {
 | |
|             case '1':
 | |
|             default:
 | |
|                 $public = true;
 | |
|                 $friends = $family = false;
 | |
|                 break;
 | |
|             case '2':
 | |
|                 $friends = true;
 | |
|                 $public = $family = false;
 | |
|                 break;
 | |
|             case '3':
 | |
|                 $family = true;
 | |
|                 $public = $friends = false;
 | |
|                 break;
 | |
|             case '4':
 | |
|                 $friends = $family = true;
 | |
|                 $public = false;
 | |
|                 break;
 | |
|             case '5':
 | |
|                 $family = $friends = $public = false;
 | |
|                 break;
 | |
|         }
 | |
|         $ret = ['friends' => $friends, 'family'  => $family, 'public'  => $public];
 | |
| 
 | |
|         return $ret;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  string $type
 | |
|      * @return string
 | |
|      */
 | |
|     public function get_object_class_from_type($type)
 | |
|     {
 | |
|         switch ($type) {
 | |
|             case self::ELEMENT_TYPE_PHOTO:
 | |
|                 return self::OBJECT_CLASS_ELEMENT;
 | |
|                 break;
 | |
|             case self::CONTAINER_TYPE_PHOTOSET:
 | |
|                 return self::OBJECT_CLASS_CONTAINER;
 | |
|                 break;
 | |
|             default:
 | |
|                 throw new Exception('Unknown type');
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Array
 | |
|      */
 | |
|     public function get_element_types()
 | |
|     {
 | |
|         return [self::ELEMENT_TYPE_PHOTO => $this->translator->trans('Photos')];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Array
 | |
|      */
 | |
|     public function get_container_types()
 | |
|     {
 | |
|         return [self::CONTAINER_TYPE_PHOTOSET => $this->translator->trans('Photosets')];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns all categories for elements
 | |
|      * But there's not categories in FlickR.
 | |
|      * Just to satisfy the interface
 | |
|      *
 | |
|      * @return bridge_request_result;
 | |
|      */
 | |
|     public function get_category_list()
 | |
|     {
 | |
|         return [];
 | |
|     }
 | |
| 
 | |
|     public function is_configured()
 | |
|     {
 | |
|         if (!$this->conf->get(['main', 'bridge', 'flickr', 'enabled'])) {
 | |
|             return false;
 | |
|         }
 | |
|         if ('' === trim($this->conf->get(['main', 'bridge', 'flickr', 'client_id']))) {
 | |
|             return false;
 | |
|         }
 | |
|         if ('' === trim($this->conf->get(['main', 'bridge', 'flickr', 'client_secret']))) {
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Bridge_Api_Flickr
 | |
|      */
 | |
|     protected function initialize_transport()
 | |
|     {
 | |
|         $this->_api = new Phlickr_Api(
 | |
|             $this->conf->get(['main', 'bridge', 'flickr', 'client_id']),
 | |
|             $this->conf->get(['main', 'bridge', 'flickr', 'client_secret'])
 | |
|         );
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Bridge_Api_Flickr
 | |
|      */
 | |
|     protected function set_transport_authentication_params()
 | |
|     {
 | |
|         if ($this->_auth->is_connected()) {
 | |
|             $signatures = $this->_auth->get_auth_signatures();
 | |
|             $this->_api->setAuthToken($signatures['auth_token']);
 | |
|         }
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return Bridge_Api_Flickr
 | |
|      */
 | |
|     protected function set_auth_params()
 | |
|     {
 | |
|         $this->_auth->set_parameters(
 | |
|             [
 | |
|                 'flickr_client_id'     => $this->conf->get(['main', 'bridge', 'flickr', 'client_id'])
 | |
|                 , 'flickr_client_secret' => $this->conf->get(['main', 'bridge', 'flickr', 'client_secret'])
 | |
|                 , 'permissions'          => 'delete'
 | |
|             ]
 | |
|         );
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Not implmented
 | |
|      * @param  array          $datas
 | |
|      * @param  record_adapter $record
 | |
|      * @return array
 | |
|      */
 | |
|     public function check_upload_constraints(array $datas, record_adapter $record)
 | |
|     {
 | |
|         $errors = $this->check_record_constraints($record);
 | |
|         $check = function ($field) use (&$errors, $datas, $record) {
 | |
|                 $key = $record->getId();
 | |
|                 $name = $field['name'];
 | |
|                 $length = (int) $field['length'];
 | |
|                 $required = ! ! $field['required'];
 | |
| 
 | |
|                 if ( ! isset($datas[$name]) || trim($datas[$name]) === '') {
 | |
|                     if ($required)
 | |
|                         $errors[$name . '_' . $key] = $this->translator->trans("Ce champ est obligatoire");
 | |
|                 } elseif ($length !== 0) {
 | |
|                     if (mb_strlen($datas[$name]) > $length)
 | |
|                         $errors[$name . '_' . $key] = $this->translator->trans("Ce champ est trop long %length% caracteres max", ['%length%' => $length]);
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|         array_map($check, $this->get_fields());
 | |
| 
 | |
|         return $errors;
 | |
|     }
 | |
| 
 | |
|     public function check_update_constraints(Array $datas)
 | |
|     {
 | |
|         $errors = [];
 | |
|         $check = function ($field) use (&$errors, $datas) {
 | |
|                 $name = $field['name'];
 | |
|                 $length = (int) $field['length'];
 | |
|                 $required = ! ! $field['required'];
 | |
| 
 | |
|                 if ( ! isset($datas[$name]) || trim($datas[$name]) === '') {
 | |
|                     if ($required)
 | |
|                         $errors[$name] = $this->translator->trans("Ce champ est obligatoire");
 | |
|                 } elseif ($length !== 0) {
 | |
|                     if (mb_strlen($datas[$name]) > $length)
 | |
|                         $errors[$name] = $this->translator->trans("Ce champ est trop long %length% caracteres max", ['%length%' => $length]);
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|         array_map($check, $this->get_fields());
 | |
| 
 | |
|         return $errors;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns datas needed for an uploaded record
 | |
|      *
 | |
|      * @param Request $request
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function get_update_datas(Request $request)
 | |
|     {
 | |
|         $datas = [
 | |
|             'title'       => $request->get('modif_title', ''),
 | |
|             'description' => $request->get('modif_description', '')
 | |
|         ];
 | |
| 
 | |
|         return $datas;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns datas needed for an uploaded record
 | |
|      *
 | |
|      * @param Request        $request
 | |
|      * @param record_adapter $record
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     public function get_upload_datas(Request $request, record_adapter $record)
 | |
|     {
 | |
|         $key = $record->getId();
 | |
|         $datas = [
 | |
|             'title'       => $request->get('title_' . $key),
 | |
|             'description' => $request->get('description_' . $key),
 | |
|             'category'    => $request->get('category_' . $key),
 | |
|             'tags'        => $request->get('tags_' . $key),
 | |
|             'privacy'     => $request->get('privacy_' . $key),
 | |
|         ];
 | |
| 
 | |
|         return $datas;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return boolean
 | |
|      */
 | |
|     public function is_multiple_upload()
 | |
|     {
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     private function get_fields()
 | |
|     {
 | |
|         return [
 | |
|             [
 | |
|                 'name'     => 'title',
 | |
|                 'length'   => '100',
 | |
|                 'required' => true
 | |
|             ]
 | |
|             , [
 | |
|                 'name'     => 'description',
 | |
|                 'length'   => '500',
 | |
|                 'required' => false
 | |
|             ]
 | |
|             , [
 | |
|                 'name'     => 'tags',
 | |
|                 'length'   => '200',
 | |
|                 'required' => false
 | |
|             ]
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      *
 | |
|      * @param  record_adapter $record
 | |
|      * @return array
 | |
|      */
 | |
|     private function check_record_constraints(record_adapter $record)
 | |
|     {
 | |
|         $errors = [];
 | |
|         //Record must rely on real file
 | |
|         if ( ! $record->get_hd_file() instanceof \SplFileInfo) {
 | |
|             $errors["file_size"] = $this->translator->trans("Le record n'a pas de fichier physique");
 | |
|         }
 | |
| 
 | |
|         $size = $record->get_technical_infos('size');
 | |
|         $size = $size ? $size->getValue() : PHP_INT_MAX;
 | |
|         if ($size > self::AUTH_PHOTO_SIZE) {
 | |
|             $errors["size"] = $this->translator->trans("Le poids maximum d'un fichier est de %size%", ['%size%' => p4string::format_octets(self::AUTH_VIDEO_SIZE)]);
 | |
|         }
 | |
| 
 | |
|         return $errors;
 | |
|     }
 | |
| 
 | |
|     private function checkTicket($ticketsId, $type)
 | |
|     {
 | |
|         $return = ["status"  => self::UPLOAD_STATE_FAILED, "dist_id" => null];
 | |
|         $response = $this->_api->executeMethod("flickr.photos.upload.checkTickets", ["tickets" => $ticketsId]);
 | |
|         if ( ! $response->isOk())
 | |
|             throw new Bridge_Exception_ApiConnectorRequestFailed('Unable to retrieve element list ' . $type);
 | |
| 
 | |
|         $xml = $response->getXml();
 | |
|         $complete = isset($xml->uploader->ticket["complete"]) ? (string) $xml->uploader->ticket["complete"] : null;
 | |
| 
 | |
|         if ($complete) {
 | |
|             if ((int) $complete == 0)
 | |
|                 $return["status"] = self::UPLOAD_STATE_NOT_COMPLETED;
 | |
|             elseif ((int) $complete == 2)
 | |
|                 $return["status"] = self::UPLOAD_STATE_FAILED_CONVERTING;
 | |
|             else {
 | |
|                 $return["dist_id"] = (string) $xml->uploader->ticket["photoid"];
 | |
|                 $return["status"] = self::UPLOAD_STATE_DONE;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $return;
 | |
|     }
 | |
| }
 | 
