Accueil > > > API ALLOCINÉ HELPER
API ALLOCINÉ HELPER
Information sur la source
Description
Le code source à jour se trouve sur Github: https://github.com/etienne-gauvin/api-allo cine-helper La documentation se trouve ici: https://github.com/etienne-gauvin/api-allocin e-helper/wiki
Source
- <?php
-
- /**
- * API Allociné Helper 2
- * =====================
- *
- * Utiliser plus facilement l'API d'Allociné.fr (api.allocine.fr), de Screenrush.co.uk (api.screenrush.co.uk), de Filmstarts.de (api.filmstarts.de), de Beyazperde.com (api.beyazperde.com) ou de Sensacine.com (api.sensacine.com) pour récupérer des informations sur les films, stars, séances, cinés, news, etc...
- * Il est possible de supprimer la classe AlloData sans autre modification du code.
- *
- * Codes des erreurs:
- * ------------------
- * 1. Aucune fonction de récupération de données distantes n'est disponible (php_curl|file_get_contents).
- * 2. Erreur durant la récupération des données sur le serveur d'Allociné.
- * 3. Erreur durant la conversion des données JSON en array.
- * 4. Les mots-clés pour la recherche doivent contenir plus d'un caractère.
- * 5. Allociné a retourné une erreur (Le message de l'erreur est le message de l'ErrorException).
- * 6. offset inexistant (Uniquement dans la classe AlloData).
- * 7. Ce n'est pas un lien vers une image qui a été fournit en paramètre à la méthode __construct() de la classe AlloImage.
- *
- *
- * @licence http://creativecommons.org/licenses/by-nc/2.0/
- * @author Etienne Gauvin
- * @version 2.2
- */
-
- ###################################################################
- ## Modifier les constantes ci-dessous en fonction de vos besoins ##
- ###################################################################
-
- /**
- * L'URL de l'API et du serveur des images (par défaut).
- * The URL of the API and the server images (default).
- *
- * @var string
- */
-
- # Allociné.fr, France
- define( 'ALLO_DEFAULT_URL_API', "api.allocine.fr" );
- define( 'ALLO_DEFAULT_URL_IMAGES', "images.allocine.fr" );
-
- # Screenrush.co.uk, United-Kingdom
- // define( 'ALLO_DEFAULT_URL_API', "api.screenrush.co.uk" );
- // define( 'ALLO_DEFAULT_URL_IMAGES', "images.screenrush.co.uk" );
-
- # Beyazperde.com, Türkiye
- // define( 'ALLO_DEFAULT_URL_API', "api.beyazperde.com" );
- // define( 'ALLO_DEFAULT_URL_IMAGES', "tri.acimg.net" );
-
- # Filmstarts.de, Deutschland
- // define( 'ALLO_DEFAULT_URL_API', "api.filmstarts.de" );
- // define( 'ALLO_DEFAULT_URL_IMAGES', "bilder.filmstarts.de" );
-
- # Sensacine.com, España
- // define( 'ALLO_DEFAULT_URL_API', "api.sensacine.com" );
- // define( 'ALLO_DEFAULT_URL_IMAGES', "imagenes.sensacine.com" );
-
-
- /**
- * Activer/désactiver les Exceptions
- * Enable/disable Exceptions
- *
- * @var bool
- */
-
- define( 'ALLO_THROW_EXCEPTIONS', true );
-
-
- /**
- * Décoder de l'UTF8 les données réceptionnées
- * Automatically decode the received data from UTF8
- *
- * @var bool
- */
-
- define( 'ALLO_UTF8_DECODE', true );
-
-
- /**
- * Le partenaire utilisé pour toutes les requêtes.
- * The partner used for all requests.
- *
- * @var string
- */
-
- define( 'ALLO_PARTNER', 'YW5kcm9pZC12M3M' );
-
-
- ###################################################################
-
-
- /**
- * Exécuter les requêtes et traiter les données.
- *
- */
-
- class AlloHelper
- {
-
- /**
- * Contient la dernière ErrorException
- * @var ErrorException|null
- */
-
- private static $_lastError;
-
-
- /**
- * Provoquer une ErrorException et/ou retourne la dernière provoquée.
- *
- * @param string $message=null Le message de l'erreur
- * @param int $code=0 Le code de l'erreur
- * @return ErrorException|null
- */
-
- public static function error( $message = null, $code = 0 )
- {
- if ($message !== null)
- {
- $error = new ErrorException( $message, $code );
-
- if ( ALLO_THROW_EXCEPTIONS )
- throw $error;
-
- self::$_lastError = $error;
- }
-
- return self::$_lastError;
- }
-
-
- /**
- * Contient l'adresse du site où chercher les données.
- * @var string
- */
-
- public static $APIUrl = ALLO_DEFAULT_URL_API;
-
-
- /**
- * Contient l'adresse du site où chercher les images.
- * @var string
- */
-
- public static $imagesUrl = ALLO_DEFAULT_URL_IMAGES;
-
-
- /**
- * Modifier le langage.
- * Les initiales du langage sont telles que défini dans la liste des codes ISO 639-1.
- * Le français (fr), l'allemand (de), l'anglais (en), le turque (tr) et l'espagnol (es) sont disponibles.
- *
- * @see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
- *
- * @param string $lang=null Les initiales du langage.
- */
-
- public static function lang( $lang = null )
- {
- switch( (string) $lang )
- {
- case 'de': case 'filmstarts.de':
- self::$APIUrl = "api.filmstarts.de";
- self::$imagesUrl = "bilder.filmstarts.de";
- break;
-
- case 'es': case 'sensacine.com':
- self::$APIUrl = "api.sensacine.com";
- self::$imagesUrl = "imagenes.sensacine.com";
- break;
-
- case 'fr': case 'allocine.fr':
- self::$APIUrl = "api.allocine.fr";
- self::$imagesUrl = "images.allocine.fr";
- break;
-
- case 'en': case 'screenrush.co.uk':
- self::$APIUrl = "api.screenrush.co.uk";
- self::$imagesUrl = "images.screenrush.co.uk";
- break;
-
- case 'tr': case 'beyazperde.com':
- self::$APIUrl = "api.beyazperde.com";
- self::$imagesUrl = "tri.acimg.net";
- break;
- }
- }
-
-
- /**
- * Préréglages pour les paramètres d'URL
- * @var array
- */
-
- private $_presets = array();
-
-
- /**
- * Ajouter/modifier des préréglages.
- *
- * @param array|string $preset Si c'est un array alors chaque paire "clé" => "valeur" ou "clé=valeur" sera enregistrée dans les préréglages, sinon si c'est une chaîne alors c'est le nom du préréglage et $value est sa valeur.
- * @param string|array|int $value La valeur du préréglage si $preset est une chaîne de caractères.
- * @return this
- */
-
- public function set( $preset, $value=null )
- {
- if (is_array( $preset ))
- foreach( $preset as $name => $value )
- $this->_presets[ (string) $name ] = $value;
-
- elseif (is_string( $preset ))
- $this->_presets[ $preset ] = $value;
-
- return $this;
- }
-
-
- /**
- * Retourne les préréglages.
- *
- * @param string|null $preset=null Indiquer le nom d'un préréglage pour connaître sa valeur.
- * @return mixed
- */
-
- public function getPresets( $preset = null )
- {
- if ($preset === null)
- return $this->_presets;
- else
- return @$this->_presets[$preset];
- }
-
-
- /**
- * Effacer un/des préréglages.
- *
- * @param array $presets=array() Indiquer les préréglages à effacer ou laisser vide pour tout effacer.
- * @param bool $inverse=false Si $inverse vaut true alors tous les préréglages seront effacés sauf ceux indiqués dans $presets.
- * @return this
- */
-
- public function clearPresets( $presets = array(), $inverse = false )
- {
- if (empty($presets))
- $this->_presets = array();
- else {
- if ($inverse)
- foreach($this->_presets as $psn => $ps)
- if (!in_array($psn, $presets))
- unset($this->_presets[$psn]);
- else
- foreach($presets as $ps)
- unset($this->_presets[$ps]);
- }
-
- return $this;
- }
-
-
- /**
- * Retourne un URL créé à partir de différentes données.
- * Les paramètres seront ajoutés dans l'ordre, sous leur forme "clé=valeur" ou "valeur" si il n'y a pas de clé.
- * Si c'est un array les sous éléments seront implosés et séparés par des virgules "clé" => array("val1", "val2", "val3") deviendra "clé=val1,val2,val3"
- * Les valeurs et les clés ne passent pas par la fonction urlencode !
- *
- * @param string $type Le type de données à récupérer (exemple: "rest/v3/movie")
- */
-
- protected function creatURL( $type )
- {
- $this->set(array(
- 'format' => 'json',
- 'partner' => ALLO_PARTNER
- ));
-
- $options_str = array();
-
- foreach ($this->getPresets() as $cle => $valeur) {
- if (is_string($cle))
- {
- if (is_array($valeur))
- $options_str[] = "$cle=" . implode(',', $valeur);
-
- else
- $options_str[] = "$cle=" . (string) $valeur;
- }
- else
- $options_str[] = (string) $valeur;
- }
-
- return "http://". self::$APIUrl ."/$type?".implode('&',(array)$options_str);
- }
-
-
- /**
- * Récupérer des données JSON et les convertir depuis un URL grâce à php_curl, ou à défaut file_get_contents().
- *
- * @param string $url L'URL vers lequel aller chercher les données JSON.
- * @return array|false Un array contenant les données en cas de succès, false si une erreur est survenue.
- */
-
- protected function getDataFromURL ( $url )
- {
- if ( function_exists("curl_init") )
- {
- $curl = curl_init();
- curl_setopt ($curl, CURLOPT_URL, $url);
- curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, 10);
- curl_setopt ($curl, CURLOPT_RETURNTRANSFER, true);
- $data = curl_exec($curl);
- curl_close($curl);
- }
-
- else
- {
- if ( !function_exists("file_get_contents") )
- {
- $this->error("The extension php_curl must be installed with PHP or function file_get_contents must be enabled.", 1);
- return false;
- }
- else
- $data = @file_get_contents($url);
- }
-
- if (empty($data))
- {
- $this->error("An error occurred while retrieving the data.", 2);
- return false;
- }
-
- $data = @json_decode( $data, 1 );
-
- if (empty($data)) {
- $this->error("An error occurred when converting data.", 3);
- return false;
- }
- else return $data;
- }
-
-
- /*
- * Méthodes de récupération des données
- */
-
- /**
- * Récupérer les données pour un type de données et un élément du tableau retourné donné.
- * Utilisé en interne pour diminuer et clarifier le code dans les méthodes ne nécessitant pas de traitement particulier sur leurs données.
- *
- * @param string $type Voir AlloHelper::creatURL()
- * @param string $container L'élément contenant les données dans le tableau retourné par Allociné
- * @return AlloData|array|false
- */
-
- protected function getData( $type, $container, &$url )
- {
- // Récupération des données
- $data = $this->getDataFromURL( $url = $this->creatURL( $type ) );
-
- // En cas d'erreur
- if (empty( $data ))
- return false;
-
- // Succès ($data est encore un array)
- else
- {
- if (empty($data['error']))
- // On retourne les données
- if (class_exists('AlloData'))
- return new AlloData( $data[$container] );
- else
- return $data;
-
- // En cas d'erreur signalée par Allociné
- else
- {
- $this->error( $data['error']['$'], 5 );
- return false;
- }
- }
- }
-
- /**
- * Effectuer une recherche sur Allociné.
- * Possibilité de trier les résultats de films par ressemblance avec la chaîne de recherche.
- *
- * @param string $q La chaîne de recherche.
- * @param int $page=1 La page des résultats.
- * @param int $count=10 Le nombre maximum de résultats par page.
- * @param bool $sortMovies=false Réorganiser ou non les films selon la ressemblance entre leur titre et la chaîne de recherche.
- * @param array $filter=array() Filtrer les résultats pour gagner en rapidité. Peut-être remplit par "movietheater", "movie", "theater", "person", "news", "tvseries", "location", "character", "video" ou "photo".
- * @param &$url=null Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function search( $q, $page = 1, $count = 10, $sortMovies = false, array $filter = array(), &$url = null )
- {
-
- // Traitement de la chaîne de recherche
- if (!is_string($q) || strlen($q) < 2 )
- {
- $this->error( "The keywords should contain more than one character.", 4 );
- return false;
- }
-
- $accents = "àáâãäçèéêëìíîïñòóôõöùúûüýÿ'";
- $normal = 'aaaaaceeeeiiiinooooouuuuyy ';
- $q = utf8_encode(strtr(strtolower(trim($q)), $accents, $normal));
-
- // Préréglages
- $this->set(array(
- 'q' => urlencode($q),
- 'filter' => (array) $filter,
- 'count' => (int) $count,
- 'page' => (int) $page
- ));
-
- // Création de l'URL
- $url = $this->creatURL( 'rest/v3/search' );
-
- // Envoi de la requête
- $data = $this->getDataFromURL( $url );
-
- // En cas d'erreur
- if (empty($data))
- return false;
-
- // Succès ($data est encore un array)
- else
- {
- if (empty($data['error']))
- {
- $data = $data['feed'];
-
- if (!empty($data['movie']))
- {
- foreach ($data['movie'] as $iresult => &$result)
- {
- $result['productionYear'] = (int) @$result['productionYear'];
- $result['originalTitle'] = (string) @$result['originalTitle'];
-
- if (empty($result['title']))
- $result['title'] = @$result['originalTitle'];
-
- $result['release'] = (array) @$result['release'];
- $result['release']['releaseDate'] = (string) @$result['release']['releaseDate'];
-
- $result['statistics'] = (array) @$result['statistics'];
- $result['statistics']['pressRating'] = (float) @$result['statistics']['pressRating'];
- $result['statistics']['userRating'] = (float) @$result['statistics']['userRating'];
-
- $result['castingShort'] = (array) @$result['castingShort'];
- $result['castingShort']['directors'] = (string) @$result['castingShort']['directors'];
- $result['castingShort']['actors'] = (string) @$result['castingShort']['actors'];
-
- if (!empty($result['poster']['href']))
- $result['poster'] = new AlloImage($result['poster']['href']);
- else
- $result['poster'] = new AlloImage();
-
- $result['posterURL'] = $result['poster']->url();
- $result['link'] = (array) @$result['link'];
- }
- }
-
- // Réorganisation des films
- if ($sortMovies && !empty($data['movie']))
- {
- $movies = &$data['movie'];
- $resultats = array();
-
- // Tableau contenant $cleFilm => $similitude
- $similitudes = array();
-
- // Oncalcule la distance de levenstein entre la chaîne de recherche et le titre pour chaque film
- foreach ($movies as $i => &$m)
- $similitudes[$i] = levenshtein($q, strtr(strtolower($m['title']), $accents, $normal));
-
- // On réorganise le tableau des similitudes, mais en gardant les clés.
- asort($similitudes, true);
-
- // On remplit le tableau des résultats dans l'ordre des similitudes.
- foreach ($similitudes as $i => $sim)
- $resultats[] = $movies[$i];
-
-
- $data['movieSorted'] = $resultats;
- $data['movie'] = $movies;
- }
-
- // Réorganisation des compteurs des résultats
- if (!empty($data['results']))
- {
- foreach ($data['results'] as $r)
- $data['results'][$r['type']] = (int) $r['$'];
- }
-
- // On retourne les données
- if (class_exists('AlloData'))
- return new AlloData( $data );
- else
- return $data;
- }
-
- // En cas d'erreur signalée par Allociné
- else
- {
- $this->error( $data['error']['$'], 5 );
- return false;
- }
- }
- }
-
-
- /**
- * Récupérer les critiques des spectateurs et de la presse à propos d'un film, d'une série TV.
- *
- * @param int $code L'identifiant du film/de la série.
- * @param string $filter='press' Le type de critique ('press' ou 'public') à renvoyer.
- * @param string $type='movie' Le type de données ("movie" ou "tvseries") auquel faire correspondre l'identifiant $code.
- * @param int $count=10 Le nombre maximum de résultats par page.
- * @param int $page=1 La page des résultats.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function reviewlist( $code, $filter='press', $type='movie', $count = 10, $page = 1, &$url = null )
- {
- // Type de critiques (presse/public)
- switch ($filter)
- {
- case 'press': case 'presse': case 'desk-press':
- $filter = 'desk-press';
- break;
-
- default:
- $filter = 'public';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => $code,
- 'filter' => (array) $filter,
- 'type' => (string) $type,
- 'count' => (int) $count,
- 'page' => (int) $page
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/reviewlist', 'feed', $url);
- }
-
-
- /**
- * Récupérer une liste de films en fonction de différents paramètres.
- *
- * @param string $filter='nowshowing' Le type de résultats à afficher: 'nowshowing' (films au cinéma) ou 'comingsoon' (bientôt au cinéma);
- * @param string $order='dateasc' L'ordre dans lequel afficher les données: 'dateasc' (chronologique), 'datedesc' (anti-chronologique), 'theatercount' (nombre de salles) ou 'toprank' (popularité).
- * @param int $count=10 Le nombre maximum de résultats par page.
- * @param int $page=1 La page des résultats.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function movielist( $filter=array('nowshowing'), $order=array('dateasc'), $count = 10, $page = 1, &$url = null )
- {
- // Préréglages
- $this->set(array(
- 'filter' => (array) $filter,
- 'order' => (array) $order,
- 'count' => (int) $count,
- 'page' => (int) $page
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/movielist', 'feed', $url);
- }
-
-
- /**
- * Récupérer une liste de cinémas et la liste des films qui y passent actuellement en fonction d'un code postal.
- *
- * @param mixed $zip Le code postal de la ville du/des cinéma(s).
- * @param $date=null Spécifier une date pour les horaires.
- * @param $movieCode=null Spécifier les horaires d'un film (par identifiant).
- * @param int $count=10 Le nombre maximum de résultats par page.
- * @param int $page=1 La page des résultats.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function showtimesByZip( $zip, $date=null, $movieCode=null, $count = 10, $page = 1, &$url = null )
- {
- // Préréglages
- $this->set('zip', $zip);
- $this->set('count', (int) $count);
- $this->set('page', (int) $page);
-
- if ($date !== null)
- $this->set('date', $date);
-
- if ($movieCode !== null)
- $this->set('movie', $movieCode);
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/showtimelist', 'feed', $url);
- }
-
-
-
- /**
- * Récupérer une liste de cinémas et la liste des films qui y passent actuellement en fonction de coordonnées géographiques (latitude, longitude [, rayon]).
- *
- * @param float $lat La coordonnée latitude du cinéma.
- * @param float $long La coordonnée longitude du cinéma.
- * @param int $radius Le rayon dans lequel chercher.
- * @param $date=null Spécifier une date pour les horaires.
- * @param $movieCode=null Spécifier les horaires d'un film (par identifiant).
- * @param int $count=10 Le nombre maximum de résultats par page.
- * @param int $page=1 La page des résultats.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function showtimesByPosition( $lat, $long, $radius=10, $date=null, $movieCode=null, $count = 10, $page = 1, &$url = null )
- {
- // Préréglages
- $this->set('lat', (float) $lat);
- $this->set('long', (float) $long);
- $this->set('radius', (int) $radius);
- $this->set('count', (int) $count);
- $this->set('page', (int) $page);
-
- if ($date !== null)
- $this->set('date', $date);
-
- if ($movieCode !== null)
- $this->set('movie', $movieCode);
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/showtimelist', 'feed', $url);
- }
-
-
-
- /**
- * Récupérer une liste de cinémas et la liste des films qui y passent actuellement en fonction d'un ou de plusieurs identifiant(s) de cinéma(s);
- *
- * @param array|string $theaters Un identifiant/une liste d'identifiants de cinéma(s).
- * @param $date=null Spécifier une date pour les horaires.
- * @param $movieCode=null Spécifier les horaires d'un film (par identifiant).
- * @param int $count=10 Le nombre maximum de résultats par page.
- * @param int $page=1 La page des résultats.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function showtimesByTheaters( $theaters, $date=null, $movieCode=null, $count = 10, $page = 1, &$url = null )
- {
- // Préréglages
- $this->set('theaters', (array) $theaters);
- $this->set('count', (int) $count);
- $this->set('page', (int) $page);
-
- if ($date !== null)
- $this->set('date', $date);
-
- if ($movieCode !== null)
- $this->set('movie', $movieCode);
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/showtimelist', 'feed', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur un film.
- *
- * @param int $code L'identifiant du film.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function movie( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Création de l'URL
- $url = $this->creatURL( 'rest/v3/movie' );
-
- // Envoi de la requête
- $data = $this->getDataFromURL( $url );
-
- // En cas d'erreur
- if (empty($data))
- return false;
-
- // Succès ($data est encore un array)
- else
- {
- if (empty($data['error']))
- {
- $data = $data['movie'];
-
- // Remplacer "title" par "originalTitle" (si il n'existe pas)
- if (empty($data['title']))
- $data['title'] = $data['originalTitle'];
-
- // On retourne les données
- if (class_exists('AlloData'))
- return new AlloData( $data );
- else
- return $data;
- }
-
- // En cas d'erreur signalée par Allociné
- else
- {
- $this->error( $data['error']['$'], 5 );
- return false;
- }
- }
- }
-
-
- /**
- * Récupérer toutes les informations sur un article.
- *
- * @param int $code L'identifiant de l'article.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function news( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/news', 'news', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur une personne.
- *
- * @param int $code L'identifiant de la personne.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function person( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/person', 'person', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur un media (vidéo/photo).
- *
- * @param int $code L'identifiant du media.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function media( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/media', 'media', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur la filmographie d'une personne.
- *
- * @param int $code L'identifiant de la personne.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function filmography( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/filmography', 'person', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur une série TV.
- *
- * @param int $code L'identifiant de la série TV.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function tvserie( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/tvseries', 'tvseries', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur une saison d'une série TV.
- *
- * @param int $code L'identifiant de la saison.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function season( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/season', 'season', $url);
- }
-
-
- /**
- * Récupérer toutes les informations sur un épisode d'une saison d'une série TV.
- *
- * @param int $code L'identifiant de l'épisode.
- * @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
- * @param &$url Contiendra l'URL utilisé.
- *
- * @return AlloData|array|false
- */
-
- public function episode( $code, $profile = 'medium', &$url = null )
- {
- // Profile (quantité d'informations)
- switch($profile)
- {
- case 'small': break;
- case 'large': break;
- default: $profile = 'medium'; break;
-
- case 1: $profile = 'small'; break;
- case 3: $profile = 'large';
- }
-
- // Préréglages
- $this->set(array(
- 'code' => (int) $code,
- 'profile' => (string) $profile,
- ));
-
- // Récupération et revoi des données
- return $this->getData('rest/v3/episode', 'episode', $url);
- }
-
- }
-
-
- /**
- * Manipuler facilement les données reçues.
- * Il est possible de supprimer complètement cette classe sans autre modification du code.
- *
- * @implements ArrayAccess, SeekableIterator, Countable
- */
-
- class AlloData implements ArrayAccess, SeekableIterator, Countable
- {
-
- /**
- * Contiendra les données
- * @var array
- */
-
- private $_data = array();
-
-
- /**
- * Valeur de remplacement pour les symboles '$' ou false pour ne rien modifier.
- */
-
- const REPLACEMENT_OF_DOLLAR_SIGN = 'value';
-
-
- /**
- * Décoder une variable depuis l'UTF8.
- *
- * @param mixed $var Seules les chaînes sont décodées, mais aucune erreur ne sera provoquée si ce n'en est pas une.
- * @param mixed $tab=false Si ce paramètre vaut true alors le tableau sera parcouru de manière récursive et toutes les chaînes de caractèrezs seront converties.
- * @return array|string Le tableau|la chaîne décodé(e)
- */
-
- public static function utf8_decode( $var, $tab = false )
- {
- if (ALLO_UTF8_DECODE)
- {
- if (is_string($var)) return utf8_decode(str_replace('⤙', "'", $var));
- elseif (!is_array($var) || !$tab) return $var;
- else
- {
- $return = array();
- foreach ($var as $i => $cell)
- $return[utf8_decode($i)] = self::utf8_decode($cell, true);
- return $return;
- }
- }
- else
- return $var;
- }
-
-
- /**
- * Constructeur
- */
-
- public function __construct( $data )
- {
- $this->_data = (array) $data;
- }
-
-
- /**
- * Retourne un pointeur sur une valeur existante dans les données enregistrées, ou null si elle n'existe pas.
- *
- * @param $offset=null Retourne un pointeur sur tout le tableau si $offset==null
- * @return Une référence vers la valeur demandée, ou null si elle n'existe pas.
- */
-
- protected function &_getProperty( $offset = null, $ignoreException = false )
- {
- $data = &$this->_data;
-
- if ( $offset === null )
- return $data;
-
- else
- {
- if (isset( $data[$offset] ))
- return $data[$offset];
-
-
- elseif ( $offset == self::REPLACEMENT_OF_DOLLAR_SIGN && isset($data['$']) )
- return $data['$'];
-
- else
- if (!$ignoreException)
- AlloHelper::error("This offset ($offset) does not exist.", 6);
- }
- }
-
- /**
- * Retourne les données sous forme d'un array
- *
- */
-
- public function getArray()
- {
- return (array) self::utf8_decode($this->_getProperty(), true);
- }
-
-
- /**
- * Si l'on essaie d'accéder à une propriété inexistante (donc un élément de $this->_data)
- *
- */
-
- public function __get( $offset )
- {
- $data = $this->_getProperty($offset);
- if (is_array($data))
- return new AlloData( $data );
- else return self::utf8_decode($data);
- }
-
-
- /**
- * Impossible de créer/modifier une propriété
- *
- */
-
- public function __set( $offset, $value )
- {
- $data = &$this->_getProperty($offset);
- $data = $value;
- }
-
-
- /*
- * Implémentation des interfaces
- */
-
- /**
- * Pointeur interne
- * @var int
- */
-
- private $_position = 0;
-
- /**
- * Retourne la valeur de l'index courant.
- */
-
- public function current( )
- {
- $data = $this->_getProperty($this->_position);
- if (is_array($data))
- return new AlloData( $data );
- else return self::utf8_decode($data);
- }
-
- /**
- * Retourne true ou false selon l'existence ou non d'une occurence dans les données.
- */
-
- public function valid( )
- {
- return ($this->_getProperty($this->_position, true) !== null);
- }
-
- /**
- * Retourne la position actuelle.
- */
-
- public function key( )
- {
- return $this->_position;
- }
-
- /**
- * Incrémente l'index.
- */
-
- public function next( )
- {
- $this->_position++;
- }
-
-
- /**
- * Réinitialise l'index.
- */
-
- public function rewind( )
- {
- $this->_position = 0;
- }
-
-
- /**
- * Pour modifier directement la position dans le tableau.
- */
-
- public function seek( $newPosition )
- {
- $lastPosition = $this->_position;
- $this->_position = $newPosition;
-
- if (!$this->valid())
- {
- AlloHelper::error("This offset ($offset) does not exist.", 6);
- $this->position = $anciennePosition;
- }
- }
-
-
- /**
- * Retourne le nombre d'occurences dans le tableau.
- */
-
- public function count()
- {
- return count($this->_data);
- }
-
- /**
- * Si l'on essaie d'accéder à l'objet comme à un tableau.
- */
-
- public function offsetGet( $offset )
- {
- $data = $this->_getProperty($offset);
- if (is_array($data))
- return new AlloData( $data );
- else return self::utf8_decode($data);
- }
-
-
- /**
- * Si l'on veut de créer/modifier une propriété (interface ArrayAccess)
- */
-
- public function offsetSet( $offset, $value )
- {
- $data = &$this->_getProperty($offset);
- $data = $value;
- }
-
-
- /**
- * Lors de la vérification de l'existence d'une propriété avec isset (interface ArrayAccess)
- */
-
- public function offsetExists( $offset )
- {
- return ($this->_getProperty($this->_position, true) !== null);
- }
-
-
- /**
- * Il n'est pas possible de détruire une la variable référencée, seule la référence est détruite...
- * De toute façon ça n'a pas d'utilité.
- */
-
- public function offsetUnset($offset)
- {
- return;
- }
-
-
- /**
- * Coller toutes les valeurs/sous-valeurs du tableau associatif.
- * Exemple : $film->genre->implode( 'value' ) implosera toutes les valeurs de $film->genre[i]->value
- *
- * @param string $separator=', ' Le séparateur des valeurs.
- * @param string $lastSeparator=' et ' Le séparateur des dernière et l'avant-dernière valeurs.
- * @param string $offset='value' Les offsets à concaténer ('$' == 'value').
- */
-
- public function implode( $separator = ', ', $lastSeparator = ' et ', $offset = 'value' )
- {
- $tab = (array) $this->_getProperty();
-
- if ( count($tab) === 1 )
- {
- $data = new AlloData($tab[0]);
- if ( isset($data[$offset]) && is_string($data[$offset]) )
- return $data[$offset];
- }
-
- elseif ( count($tab) < 1 ) return '';
-
- $values = array();
-
- foreach ( $tab as $i => $stab )
- {
- $data = new AlloData( $stab );
- if ( isset($data[$offset]) && is_string($data[$offset]) )
- $values[] = $data[$offset];
- }
-
- $last = array_slice($values, -1, 1);
-
- if ( $values )
- return implode( (string) $separator, array_slice( $values, 0, -1 ) ) . (( count($values) > 1 ) ? (string) $lastSeparator . $last[0] : '' );
- else
- return '';
- }
-
- }
-
-
- /**
- * Manipuler facilement les URLs des images.
- *
- */
-
- class AlloImage
- {
-
- /**
- * Répertoire de l'image par défaut
- * @const string
- */
-
- const DEFAULT_IMAGE_PATH = "commons/emptymedia/AffichetteAllocine.gif";
-
-
- /**
- * Liste des icônes diponibles
- * @var array
- */
-
- public static $icons = array(
- 'play.png' => null,
- 'overplay.png' => null,
- 'overlayVod120.png' => array('r', 120, 160),
- );
-
-
- /**
- * Contient les paramètres de l'icône.
- * @var array|false
- */
-
- private $imageIcon = false;
-
-
- /**
- * Contient les paramètres de la bordure
- * @var array|false
- */
-
- private $imageBorder = false;
-
-
- /**
- * Contient les paramètres de la taille de l'image.
- * @var array|false
- */
-
- private $imageSize = false;
-
-
- /**
- * Contient l'adresse du serveur de l'image.
- * @var string
- */
-
- private $imageHost;
-
-
- /**
- * Contient le répertoire de l'image sur Allociné.
- * @var string
- */
-
- private $imagePath;
-
-
- /**
- * Image par défaut
- *
- * @return this
- */
-
- public function reset( )
- {
- $this->destroyBorder();
- $this->destroyIcon();
- $this->maxSize();
-
- return $this;
- }
-
- /**
- * Modifier l'icône sur l'image.
- *
- * @param string $position='c' La position de l'icône par rapport au centre de l'image (en une ou deux lettres), d'après la rose des sable. Renseigner une position invalide (telle que 'c') pour centrer l'icône.
- * @param int $margin=4 Le nombre de pixel entre l'icône et le(s) bord(s) le(s) plus proche(s).
- * @param string $icon='play.png' Le nom de l'icône à ajouter. La liste des icônes se trouve dans AlloImage::$icons.
- * @return this
- */
-
- public function icon( $position='c', $margin=4, $icon='play.png' )
- {
- if (!empty($this->icons[$icon]))
- {
- $p = $this->icons[$icon];
-
- switch ($p[0])
- {
- case 'r': $this->resize($p[1], $p[2]); break;
- case 'c': $this->cut($p[1], $p[2]); break;
- }
- }
-
- $this->imageIcon = array(
- 'position' => substr($position, 0, 2),
- 'margin' => (int) $margin,
- 'icon' => (string) $icon
- );
-
- return $this;
- }
-
-
- /**
- * Renvoie les paramètres enregistrés pour l'icône.
- *
- * @return array|false
- */
-
- public function getIcon()
- {
- return $this->imageIcon;
- }
-
-
- /**
- * Efface les paramètres enregistrés pour l'icône.
- *
- * @return this
- */
-
- public function destroyIcon()
- {
- $this->imageIcon = false;
- return $this;
- }
-
-
- /**
- * Modifier la bordure de l'image.
- *
- * @param int $size=1 L'épaisseur de la bordure en pixels.
- * @param string $color='000000' La couleur de la bordure en hexadécimal (sans # initial). [http://en.wikipedia.org/wiki/Web_colors#Hex_triplet]
- * @return this
- */
-
- public function border( $size=1, $color="000000" )
- {
- $this->imageBorder = array(
- 'size' => (int) $size,
- 'color' => (string) $color
- );
-
- return $this;
- }
-
-
- /**
- * Renvoie les paramètres enregistrés de la bordure.
- *
- * @return array|false
- */
-
- public function getBorder()
- {
- return $this->imageBorder;
- }
-
-
- /**
- * Efface la bordure.
- *
- * @return this
- */
-
- public function destroyBorder()
- {
- $this->imageBorder = false;
- return $this;
- }
-
-
- /**
- * Modifier proportionnellement la taille de l'image au plus petit.
- * Si les deux paramètres sont laissés tels quels ($xmax='x' et $ymax='y'), l'image sera de taille normale.
- * Appeler cette fonction efface les paramètres enregistrés pour AlloImage::cut() (Les deux méthodes ne peuvent être utilisées en même temps).
- *
- * @param int $xmax='x' La largeur maximale de l'image, en pixels. Laisser 'x' pour une largeur automatique en fonction de $ymax.
- * @param int $ymax='y' La hauteur maximale de l'image, en pixels. Laisser 'y' pour une hauteur automatique en fonction de $xmax.
- * @return this
- */
-
- public function resize( $xmax='x', $ymax='y' )
- {
- $this->imageSize = array(
- 'method' => 'r',
- 'xmax' => $xmax,
- 'ymax' => $ymax
- );
-
- return $this;
- }
-
-
- /**
- * Redimensionner l'image au plus petit, puis couper les bords trop grands.
- * Appeler cette fonction efface les paramètres enregistrés pour AlloImage::resize() (Les deux méthodes ne peuvent être utilisées en même temps).
- *
- * @param int $xmax La largeur maximale de l'image, en pixels.
- * @param int $ymax La hauteur maximale de l'image, en pixels.
- * @return this
- */
-
- public function cut( $xmax, $ymax )
- {
- $this->imageSize = array(
- 'method' => 'c',
- 'xmax' => (int) $xmax,
- 'ymax' => (int) $ymax
- );
-
- return $this;
- }
-
-
- /**
- * Retourne les paramètres enregistrés du redimensionnement/recoupe de l'image.
- *
- * @return array|false
- */
-
- public function getSize()
- {
- return $this->imageSize;
- }
-
-
- /**
- * Règle l'image à sa taille maximale (Effacer redimensionnement/recoupe)
- *
- * @return array|false
- */
-
- public function maxSize()
- {
- $this->imageSize = false;
- return $this;
- }
-
-
- /**
- * Retourne le host de l'image.
- *
- * @return string
- */
-
- public function getImageHost()
- {
- return $this->imageHost;
- }
-
-
- /**
- * Modifier le serveur (host) de l'image.
- *
- * @param string $server L'adresse sans slash du serveur (ex: 'images.allocine.fr'), le même paramètre que pour AlloHelper::lang(), ou 'default' pour régler selon le langage enregistré.
- * @return this
- */
-
- public function setImageHost( $server )
- {
- switch ($server)
- {
- case 'default':
- case 'de': case 'filmstarts.de':
- case 'es': case 'sensacine.com':
- case 'fr': case 'allocine.fr':
- case 'en': case 'screenrush.co.uk':
- $this->imageHost = self::$imagesUrl;
- break;
-
- default:
- $this->imageHost = $server;
- }
-
- return $this;
- }
-
-
- /**
- * Créer une nouvelle image grâce à son URL.
- * Si l'url est invalide, l'image utilisée sera celle par défaut.
- *
- * @param string $url=null L'URL de l'image.
- */
-
- public function __construct( $url = null )
- {
- if ( empty($url) || !filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) )
- {
- $this->imageHost = AlloHelper::$imagesUrl;
- $this->imagePath = self::DEFAULT_IMAGE_PATH;
-
- }
- else
- {
- $urlParse = parse_url($url);
-
- $this->imageHost = !empty($urlParse['host']) ? $urlParse['host'] : AlloHelper::$imagesUrl;
-
- if (!empty($urlParse['path']))
- $this->imagePath = $urlParse['path'];
- else
- AlloHelper::error("This isn't a URL to an image.", 7);
-
- // Parsage de l'URL
- $explodePath = explode('/', $this->imagePath);
-
- // Première partie vide ?
- if (empty($explodePath[0]))
- unset($explodePath[0]);
-
- // Détecte les paramètres jusqu'au début du path réel.
- foreach ($explodePath as $iPathPart => $pathPart)
- {
- if (strpos($pathPart, '_') === false)
- break;
- else
- unset($explodePath[$iPathPart]);
-
- // Icône
- if (strpos($pathPart, 'o') === 0 && preg_match("#^o_(.+)_(.+)_(.+)$#i", $pathPart, $i) != false)
- {
- $this->icon($i[3], $i[2], $i[1]);
- }
-
- // Bordure
- elseif (strpos($pathPart, 'b') === 0 && preg_match("#^b[xy]?_([0-9]+)_([0-9a-f]{6}|.*)$#i", $pathPart, $i) != false)
- {
- if (preg_match("#^[0-9a-f]{6}$#i", $i[2]) == false)
- $i[2] = "000000";
-
- $this->border($i[1], $i[2]);
- }
-
- // Redimensionnement
- elseif (preg_match("#^r[xy]?_([0-9]+|[a-z0-9]+)_([0-9]+|[a-z0-9]+)$#i", $pathPart, $i) != false)
- {
- $this->resize((int) $i[1], (int) $i[2]);
- }
-
- // Recoupe
- elseif (preg_match("#^c[xy]?_([0-9]+|[a-z0-9]+)_([0-9]+|[a-z0-9]+)$#i", $pathPart, $i) != false)
- {
- $this->cut((int) $i[1], (int) $i[2]);
- }
- }
-
- $this->imagePath = implode('/', $explodePath);
- }
- }
-
-
- /**
- * Construit l'URL à partir des paramètres enregistrés.
- *
- * @return string
- */
-
- public function url()
- {
- $params = array();
-
- // Taille
- if ( $this->imageSize !== false )
- $params[] = "{$this->imageSize['method']}_{$this->imageSize['xmax']}_{$this->imageSize['ymax']}";
-
- // Bordure
- if ( $this->imageBorder !== false )
- $params[] = "b_{$this->imageBorder['size']}_{$this->imageBorder['color']}";
-
- // Icône
- if ( $this->imageIcon !== false )
- $params[] = "o_{$this->imageIcon['icon']}_{$this->imageIcon['margin']}_{$this->imageIcon['position']}";
-
- return "http://{$this->imageHost}" . (!empty($params) ? '/' . implode('/', $params) : '') . "/{$this->imagePath}";
- }
-
-
- /**
- * Alias de AlloImage::url()
- *
- * @return string
- */
-
- public function __toString()
- {
- return $this->url();
- }
-
- }
<?php
/**
* API Allociné Helper 2
* =====================
*
* Utiliser plus facilement l'API d'Allociné.fr (api.allocine.fr), de Screenrush.co.uk (api.screenrush.co.uk), de Filmstarts.de (api.filmstarts.de), de Beyazperde.com (api.beyazperde.com) ou de Sensacine.com (api.sensacine.com) pour récupérer des informations sur les films, stars, séances, cinés, news, etc...
* Il est possible de supprimer la classe AlloData sans autre modification du code.
*
* Codes des erreurs:
* ------------------
* 1. Aucune fonction de récupération de données distantes n'est disponible (php_curl|file_get_contents).
* 2. Erreur durant la récupération des données sur le serveur d'Allociné.
* 3. Erreur durant la conversion des données JSON en array.
* 4. Les mots-clés pour la recherche doivent contenir plus d'un caractère.
* 5. Allociné a retourné une erreur (Le message de l'erreur est le message de l'ErrorException).
* 6. offset inexistant (Uniquement dans la classe AlloData).
* 7. Ce n'est pas un lien vers une image qui a été fournit en paramètre à la méthode __construct() de la classe AlloImage.
*
*
* @licence http://creativecommons.org/licenses/by-nc/2.0/
* @author Etienne Gauvin
* @version 2.2
*/
###################################################################
## Modifier les constantes ci-dessous en fonction de vos besoins ##
###################################################################
/**
* L'URL de l'API et du serveur des images (par défaut).
* The URL of the API and the server images (default).
*
* @var string
*/
# Allociné.fr, France
define( 'ALLO_DEFAULT_URL_API', "api.allocine.fr" );
define( 'ALLO_DEFAULT_URL_IMAGES', "images.allocine.fr" );
# Screenrush.co.uk, United-Kingdom
// define( 'ALLO_DEFAULT_URL_API', "api.screenrush.co.uk" );
// define( 'ALLO_DEFAULT_URL_IMAGES', "images.screenrush.co.uk" );
# Beyazperde.com, Türkiye
// define( 'ALLO_DEFAULT_URL_API', "api.beyazperde.com" );
// define( 'ALLO_DEFAULT_URL_IMAGES', "tri.acimg.net" );
# Filmstarts.de, Deutschland
// define( 'ALLO_DEFAULT_URL_API', "api.filmstarts.de" );
// define( 'ALLO_DEFAULT_URL_IMAGES', "bilder.filmstarts.de" );
# Sensacine.com, España
// define( 'ALLO_DEFAULT_URL_API', "api.sensacine.com" );
// define( 'ALLO_DEFAULT_URL_IMAGES', "imagenes.sensacine.com" );
/**
* Activer/désactiver les Exceptions
* Enable/disable Exceptions
*
* @var bool
*/
define( 'ALLO_THROW_EXCEPTIONS', true );
/**
* Décoder de l'UTF8 les données réceptionnées
* Automatically decode the received data from UTF8
*
* @var bool
*/
define( 'ALLO_UTF8_DECODE', true );
/**
* Le partenaire utilisé pour toutes les requêtes.
* The partner used for all requests.
*
* @var string
*/
define( 'ALLO_PARTNER', 'YW5kcm9pZC12M3M' );
###################################################################
/**
* Exécuter les requêtes et traiter les données.
*
*/
class AlloHelper
{
/**
* Contient la dernière ErrorException
* @var ErrorException|null
*/
private static $_lastError;
/**
* Provoquer une ErrorException et/ou retourne la dernière provoquée.
*
* @param string $message=null Le message de l'erreur
* @param int $code=0 Le code de l'erreur
* @return ErrorException|null
*/
public static function error( $message = null, $code = 0 )
{
if ($message !== null)
{
$error = new ErrorException( $message, $code );
if ( ALLO_THROW_EXCEPTIONS )
throw $error;
self::$_lastError = $error;
}
return self::$_lastError;
}
/**
* Contient l'adresse du site où chercher les données.
* @var string
*/
public static $APIUrl = ALLO_DEFAULT_URL_API;
/**
* Contient l'adresse du site où chercher les images.
* @var string
*/
public static $imagesUrl = ALLO_DEFAULT_URL_IMAGES;
/**
* Modifier le langage.
* Les initiales du langage sont telles que défini dans la liste des codes ISO 639-1.
* Le français (fr), l'allemand (de), l'anglais (en), le turque (tr) et l'espagnol (es) sont disponibles.
*
* @see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
*
* @param string $lang=null Les initiales du langage.
*/
public static function lang( $lang = null )
{
switch( (string) $lang )
{
case 'de': case 'filmstarts.de':
self::$APIUrl = "api.filmstarts.de";
self::$imagesUrl = "bilder.filmstarts.de";
break;
case 'es': case 'sensacine.com':
self::$APIUrl = "api.sensacine.com";
self::$imagesUrl = "imagenes.sensacine.com";
break;
case 'fr': case 'allocine.fr':
self::$APIUrl = "api.allocine.fr";
self::$imagesUrl = "images.allocine.fr";
break;
case 'en': case 'screenrush.co.uk':
self::$APIUrl = "api.screenrush.co.uk";
self::$imagesUrl = "images.screenrush.co.uk";
break;
case 'tr': case 'beyazperde.com':
self::$APIUrl = "api.beyazperde.com";
self::$imagesUrl = "tri.acimg.net";
break;
}
}
/**
* Préréglages pour les paramètres d'URL
* @var array
*/
private $_presets = array();
/**
* Ajouter/modifier des préréglages.
*
* @param array|string $preset Si c'est un array alors chaque paire "clé" => "valeur" ou "clé=valeur" sera enregistrée dans les préréglages, sinon si c'est une chaîne alors c'est le nom du préréglage et $value est sa valeur.
* @param string|array|int $value La valeur du préréglage si $preset est une chaîne de caractères.
* @return this
*/
public function set( $preset, $value=null )
{
if (is_array( $preset ))
foreach( $preset as $name => $value )
$this->_presets[ (string) $name ] = $value;
elseif (is_string( $preset ))
$this->_presets[ $preset ] = $value;
return $this;
}
/**
* Retourne les préréglages.
*
* @param string|null $preset=null Indiquer le nom d'un préréglage pour connaître sa valeur.
* @return mixed
*/
public function getPresets( $preset = null )
{
if ($preset === null)
return $this->_presets;
else
return @$this->_presets[$preset];
}
/**
* Effacer un/des préréglages.
*
* @param array $presets=array() Indiquer les préréglages à effacer ou laisser vide pour tout effacer.
* @param bool $inverse=false Si $inverse vaut true alors tous les préréglages seront effacés sauf ceux indiqués dans $presets.
* @return this
*/
public function clearPresets( $presets = array(), $inverse = false )
{
if (empty($presets))
$this->_presets = array();
else {
if ($inverse)
foreach($this->_presets as $psn => $ps)
if (!in_array($psn, $presets))
unset($this->_presets[$psn]);
else
foreach($presets as $ps)
unset($this->_presets[$ps]);
}
return $this;
}
/**
* Retourne un URL créé à partir de différentes données.
* Les paramètres seront ajoutés dans l'ordre, sous leur forme "clé=valeur" ou "valeur" si il n'y a pas de clé.
* Si c'est un array les sous éléments seront implosés et séparés par des virgules "clé" => array("val1", "val2", "val3") deviendra "clé=val1,val2,val3"
* Les valeurs et les clés ne passent pas par la fonction urlencode !
*
* @param string $type Le type de données à récupérer (exemple: "rest/v3/movie")
*/
protected function creatURL( $type )
{
$this->set(array(
'format' => 'json',
'partner' => ALLO_PARTNER
));
$options_str = array();
foreach ($this->getPresets() as $cle => $valeur) {
if (is_string($cle))
{
if (is_array($valeur))
$options_str[] = "$cle=" . implode(',', $valeur);
else
$options_str[] = "$cle=" . (string) $valeur;
}
else
$options_str[] = (string) $valeur;
}
return "http://". self::$APIUrl ."/$type?".implode('&',(array)$options_str);
}
/**
* Récupérer des données JSON et les convertir depuis un URL grâce à php_curl, ou à défaut file_get_contents().
*
* @param string $url L'URL vers lequel aller chercher les données JSON.
* @return array|false Un array contenant les données en cas de succès, false si une erreur est survenue.
*/
protected function getDataFromURL ( $url )
{
if ( function_exists("curl_init") )
{
$curl = curl_init();
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($curl);
curl_close($curl);
}
else
{
if ( !function_exists("file_get_contents") )
{
$this->error("The extension php_curl must be installed with PHP or function file_get_contents must be enabled.", 1);
return false;
}
else
$data = @file_get_contents($url);
}
if (empty($data))
{
$this->error("An error occurred while retrieving the data.", 2);
return false;
}
$data = @json_decode( $data, 1 );
if (empty($data)) {
$this->error("An error occurred when converting data.", 3);
return false;
}
else return $data;
}
/*
* Méthodes de récupération des données
*/
/**
* Récupérer les données pour un type de données et un élément du tableau retourné donné.
* Utilisé en interne pour diminuer et clarifier le code dans les méthodes ne nécessitant pas de traitement particulier sur leurs données.
*
* @param string $type Voir AlloHelper::creatURL()
* @param string $container L'élément contenant les données dans le tableau retourné par Allociné
* @return AlloData|array|false
*/
protected function getData( $type, $container, &$url )
{
// Récupération des données
$data = $this->getDataFromURL( $url = $this->creatURL( $type ) );
// En cas d'erreur
if (empty( $data ))
return false;
// Succès ($data est encore un array)
else
{
if (empty($data['error']))
// On retourne les données
if (class_exists('AlloData'))
return new AlloData( $data[$container] );
else
return $data;
// En cas d'erreur signalée par Allociné
else
{
$this->error( $data['error']['$'], 5 );
return false;
}
}
}
/**
* Effectuer une recherche sur Allociné.
* Possibilité de trier les résultats de films par ressemblance avec la chaîne de recherche.
*
* @param string $q La chaîne de recherche.
* @param int $page=1 La page des résultats.
* @param int $count=10 Le nombre maximum de résultats par page.
* @param bool $sortMovies=false Réorganiser ou non les films selon la ressemblance entre leur titre et la chaîne de recherche.
* @param array $filter=array() Filtrer les résultats pour gagner en rapidité. Peut-être remplit par "movietheater", "movie", "theater", "person", "news", "tvseries", "location", "character", "video" ou "photo".
* @param &$url=null Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function search( $q, $page = 1, $count = 10, $sortMovies = false, array $filter = array(), &$url = null )
{
// Traitement de la chaîne de recherche
if (!is_string($q) || strlen($q) < 2 )
{
$this->error( "The keywords should contain more than one character.", 4 );
return false;
}
$accents = "àáâãäçèéêëìíîïñòóôõöùúûüýÿ'";
$normal = 'aaaaaceeeeiiiinooooouuuuyy ';
$q = utf8_encode(strtr(strtolower(trim($q)), $accents, $normal));
// Préréglages
$this->set(array(
'q' => urlencode($q),
'filter' => (array) $filter,
'count' => (int) $count,
'page' => (int) $page
));
// Création de l'URL
$url = $this->creatURL( 'rest/v3/search' );
// Envoi de la requête
$data = $this->getDataFromURL( $url );
// En cas d'erreur
if (empty($data))
return false;
// Succès ($data est encore un array)
else
{
if (empty($data['error']))
{
$data = $data['feed'];
if (!empty($data['movie']))
{
foreach ($data['movie'] as $iresult => &$result)
{
$result['productionYear'] = (int) @$result['productionYear'];
$result['originalTitle'] = (string) @$result['originalTitle'];
if (empty($result['title']))
$result['title'] = @$result['originalTitle'];
$result['release'] = (array) @$result['release'];
$result['release']['releaseDate'] = (string) @$result['release']['releaseDate'];
$result['statistics'] = (array) @$result['statistics'];
$result['statistics']['pressRating'] = (float) @$result['statistics']['pressRating'];
$result['statistics']['userRating'] = (float) @$result['statistics']['userRating'];
$result['castingShort'] = (array) @$result['castingShort'];
$result['castingShort']['directors'] = (string) @$result['castingShort']['directors'];
$result['castingShort']['actors'] = (string) @$result['castingShort']['actors'];
if (!empty($result['poster']['href']))
$result['poster'] = new AlloImage($result['poster']['href']);
else
$result['poster'] = new AlloImage();
$result['posterURL'] = $result['poster']->url();
$result['link'] = (array) @$result['link'];
}
}
// Réorganisation des films
if ($sortMovies && !empty($data['movie']))
{
$movies = &$data['movie'];
$resultats = array();
// Tableau contenant $cleFilm => $similitude
$similitudes = array();
// Oncalcule la distance de levenstein entre la chaîne de recherche et le titre pour chaque film
foreach ($movies as $i => &$m)
$similitudes[$i] = levenshtein($q, strtr(strtolower($m['title']), $accents, $normal));
// On réorganise le tableau des similitudes, mais en gardant les clés.
asort($similitudes, true);
// On remplit le tableau des résultats dans l'ordre des similitudes.
foreach ($similitudes as $i => $sim)
$resultats[] = $movies[$i];
$data['movieSorted'] = $resultats;
$data['movie'] = $movies;
}
// Réorganisation des compteurs des résultats
if (!empty($data['results']))
{
foreach ($data['results'] as $r)
$data['results'][$r['type']] = (int) $r['$'];
}
// On retourne les données
if (class_exists('AlloData'))
return new AlloData( $data );
else
return $data;
}
// En cas d'erreur signalée par Allociné
else
{
$this->error( $data['error']['$'], 5 );
return false;
}
}
}
/**
* Récupérer les critiques des spectateurs et de la presse à propos d'un film, d'une série TV.
*
* @param int $code L'identifiant du film/de la série.
* @param string $filter='press' Le type de critique ('press' ou 'public') à renvoyer.
* @param string $type='movie' Le type de données ("movie" ou "tvseries") auquel faire correspondre l'identifiant $code.
* @param int $count=10 Le nombre maximum de résultats par page.
* @param int $page=1 La page des résultats.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function reviewlist( $code, $filter='press', $type='movie', $count = 10, $page = 1, &$url = null )
{
// Type de critiques (presse/public)
switch ($filter)
{
case 'press': case 'presse': case 'desk-press':
$filter = 'desk-press';
break;
default:
$filter = 'public';
}
// Préréglages
$this->set(array(
'code' => $code,
'filter' => (array) $filter,
'type' => (string) $type,
'count' => (int) $count,
'page' => (int) $page
));
// Récupération et revoi des données
return $this->getData('rest/v3/reviewlist', 'feed', $url);
}
/**
* Récupérer une liste de films en fonction de différents paramètres.
*
* @param string $filter='nowshowing' Le type de résultats à afficher: 'nowshowing' (films au cinéma) ou 'comingsoon' (bientôt au cinéma);
* @param string $order='dateasc' L'ordre dans lequel afficher les données: 'dateasc' (chronologique), 'datedesc' (anti-chronologique), 'theatercount' (nombre de salles) ou 'toprank' (popularité).
* @param int $count=10 Le nombre maximum de résultats par page.
* @param int $page=1 La page des résultats.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function movielist( $filter=array('nowshowing'), $order=array('dateasc'), $count = 10, $page = 1, &$url = null )
{
// Préréglages
$this->set(array(
'filter' => (array) $filter,
'order' => (array) $order,
'count' => (int) $count,
'page' => (int) $page
));
// Récupération et revoi des données
return $this->getData('rest/v3/movielist', 'feed', $url);
}
/**
* Récupérer une liste de cinémas et la liste des films qui y passent actuellement en fonction d'un code postal.
*
* @param mixed $zip Le code postal de la ville du/des cinéma(s).
* @param $date=null Spécifier une date pour les horaires.
* @param $movieCode=null Spécifier les horaires d'un film (par identifiant).
* @param int $count=10 Le nombre maximum de résultats par page.
* @param int $page=1 La page des résultats.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function showtimesByZip( $zip, $date=null, $movieCode=null, $count = 10, $page = 1, &$url = null )
{
// Préréglages
$this->set('zip', $zip);
$this->set('count', (int) $count);
$this->set('page', (int) $page);
if ($date !== null)
$this->set('date', $date);
if ($movieCode !== null)
$this->set('movie', $movieCode);
// Récupération et revoi des données
return $this->getData('rest/v3/showtimelist', 'feed', $url);
}
/**
* Récupérer une liste de cinémas et la liste des films qui y passent actuellement en fonction de coordonnées géographiques (latitude, longitude [, rayon]).
*
* @param float $lat La coordonnée latitude du cinéma.
* @param float $long La coordonnée longitude du cinéma.
* @param int $radius Le rayon dans lequel chercher.
* @param $date=null Spécifier une date pour les horaires.
* @param $movieCode=null Spécifier les horaires d'un film (par identifiant).
* @param int $count=10 Le nombre maximum de résultats par page.
* @param int $page=1 La page des résultats.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function showtimesByPosition( $lat, $long, $radius=10, $date=null, $movieCode=null, $count = 10, $page = 1, &$url = null )
{
// Préréglages
$this->set('lat', (float) $lat);
$this->set('long', (float) $long);
$this->set('radius', (int) $radius);
$this->set('count', (int) $count);
$this->set('page', (int) $page);
if ($date !== null)
$this->set('date', $date);
if ($movieCode !== null)
$this->set('movie', $movieCode);
// Récupération et revoi des données
return $this->getData('rest/v3/showtimelist', 'feed', $url);
}
/**
* Récupérer une liste de cinémas et la liste des films qui y passent actuellement en fonction d'un ou de plusieurs identifiant(s) de cinéma(s);
*
* @param array|string $theaters Un identifiant/une liste d'identifiants de cinéma(s).
* @param $date=null Spécifier une date pour les horaires.
* @param $movieCode=null Spécifier les horaires d'un film (par identifiant).
* @param int $count=10 Le nombre maximum de résultats par page.
* @param int $page=1 La page des résultats.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function showtimesByTheaters( $theaters, $date=null, $movieCode=null, $count = 10, $page = 1, &$url = null )
{
// Préréglages
$this->set('theaters', (array) $theaters);
$this->set('count', (int) $count);
$this->set('page', (int) $page);
if ($date !== null)
$this->set('date', $date);
if ($movieCode !== null)
$this->set('movie', $movieCode);
// Récupération et revoi des données
return $this->getData('rest/v3/showtimelist', 'feed', $url);
}
/**
* Récupérer toutes les informations sur un film.
*
* @param int $code L'identifiant du film.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function movie( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Création de l'URL
$url = $this->creatURL( 'rest/v3/movie' );
// Envoi de la requête
$data = $this->getDataFromURL( $url );
// En cas d'erreur
if (empty($data))
return false;
// Succès ($data est encore un array)
else
{
if (empty($data['error']))
{
$data = $data['movie'];
// Remplacer "title" par "originalTitle" (si il n'existe pas)
if (empty($data['title']))
$data['title'] = $data['originalTitle'];
// On retourne les données
if (class_exists('AlloData'))
return new AlloData( $data );
else
return $data;
}
// En cas d'erreur signalée par Allociné
else
{
$this->error( $data['error']['$'], 5 );
return false;
}
}
}
/**
* Récupérer toutes les informations sur un article.
*
* @param int $code L'identifiant de l'article.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function news( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/news', 'news', $url);
}
/**
* Récupérer toutes les informations sur une personne.
*
* @param int $code L'identifiant de la personne.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function person( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/person', 'person', $url);
}
/**
* Récupérer toutes les informations sur un media (vidéo/photo).
*
* @param int $code L'identifiant du media.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function media( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/media', 'media', $url);
}
/**
* Récupérer toutes les informations sur la filmographie d'une personne.
*
* @param int $code L'identifiant de la personne.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function filmography( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/filmography', 'person', $url);
}
/**
* Récupérer toutes les informations sur une série TV.
*
* @param int $code L'identifiant de la série TV.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function tvserie( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/tvseries', 'tvseries', $url);
}
/**
* Récupérer toutes les informations sur une saison d'une série TV.
*
* @param int $code L'identifiant de la saison.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function season( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/season', 'season', $url);
}
/**
* Récupérer toutes les informations sur un épisode d'une saison d'une série TV.
*
* @param int $code L'identifiant de l'épisode.
* @param int $profile='medium' La quantité d'informations à renvoyer: 'small', 'medium', 'large', 1 pour 'small', 2 pour 'medium', 3 pour 'large'.
* @param &$url Contiendra l'URL utilisé.
*
* @return AlloData|array|false
*/
public function episode( $code, $profile = 'medium', &$url = null )
{
// Profile (quantité d'informations)
switch($profile)
{
case 'small': break;
case 'large': break;
default: $profile = 'medium'; break;
case 1: $profile = 'small'; break;
case 3: $profile = 'large';
}
// Préréglages
$this->set(array(
'code' => (int) $code,
'profile' => (string) $profile,
));
// Récupération et revoi des données
return $this->getData('rest/v3/episode', 'episode', $url);
}
}
/**
* Manipuler facilement les données reçues.
* Il est possible de supprimer complètement cette classe sans autre modification du code.
*
* @implements ArrayAccess, SeekableIterator, Countable
*/
class AlloData implements ArrayAccess, SeekableIterator, Countable
{
/**
* Contiendra les données
* @var array
*/
private $_data = array();
/**
* Valeur de remplacement pour les symboles '$' ou false pour ne rien modifier.
*/
const REPLACEMENT_OF_DOLLAR_SIGN = 'value';
/**
* Décoder une variable depuis l'UTF8.
*
* @param mixed $var Seules les chaînes sont décodées, mais aucune erreur ne sera provoquée si ce n'en est pas une.
* @param mixed $tab=false Si ce paramètre vaut true alors le tableau sera parcouru de manière récursive et toutes les chaînes de caractèrezs seront converties.
* @return array|string Le tableau|la chaîne décodé(e)
*/
public static function utf8_decode( $var, $tab = false )
{
if (ALLO_UTF8_DECODE)
{
if (is_string($var)) return utf8_decode(str_replace('⤙', "'", $var));
elseif (!is_array($var) || !$tab) return $var;
else
{
$return = array();
foreach ($var as $i => $cell)
$return[utf8_decode($i)] = self::utf8_decode($cell, true);
return $return;
}
}
else
return $var;
}
/**
* Constructeur
*/
public function __construct( $data )
{
$this->_data = (array) $data;
}
/**
* Retourne un pointeur sur une valeur existante dans les données enregistrées, ou null si elle n'existe pas.
*
* @param $offset=null Retourne un pointeur sur tout le tableau si $offset==null
* @return Une référence vers la valeur demandée, ou null si elle n'existe pas.
*/
protected function &_getProperty( $offset = null, $ignoreException = false )
{
$data = &$this->_data;
if ( $offset === null )
return $data;
else
{
if (isset( $data[$offset] ))
return $data[$offset];
elseif ( $offset == self::REPLACEMENT_OF_DOLLAR_SIGN && isset($data['$']) )
return $data['$'];
else
if (!$ignoreException)
AlloHelper::error("This offset ($offset) does not exist.", 6);
}
}
/**
* Retourne les données sous forme d'un array
*
*/
public function getArray()
{
return (array) self::utf8_decode($this->_getProperty(), true);
}
/**
* Si l'on essaie d'accéder à une propriété inexistante (donc un élément de $this->_data)
*
*/
public function __get( $offset )
{
$data = $this->_getProperty($offset);
if (is_array($data))
return new AlloData( $data );
else return self::utf8_decode($data);
}
/**
* Impossible de créer/modifier une propriété
*
*/
public function __set( $offset, $value )
{
$data = &$this->_getProperty($offset);
$data = $value;
}
/*
* Implémentation des interfaces
*/
/**
* Pointeur interne
* @var int
*/
private $_position = 0;
/**
* Retourne la valeur de l'index courant.
*/
public function current( )
{
$data = $this->_getProperty($this->_position);
if (is_array($data))
return new AlloData( $data );
else return self::utf8_decode($data);
}
/**
* Retourne true ou false selon l'existence ou non d'une occurence dans les données.
*/
public function valid( )
{
return ($this->_getProperty($this->_position, true) !== null);
}
/**
* Retourne la position actuelle.
*/
public function key( )
{
return $this->_position;
}
/**
* Incrémente l'index.
*/
public function next( )
{
$this->_position++;
}
/**
* Réinitialise l'index.
*/
public function rewind( )
{
$this->_position = 0;
}
/**
* Pour modifier directement la position dans le tableau.
*/
public function seek( $newPosition )
{
$lastPosition = $this->_position;
$this->_position = $newPosition;
if (!$this->valid())
{
AlloHelper::error("This offset ($offset) does not exist.", 6);
$this->position = $anciennePosition;
}
}
/**
* Retourne le nombre d'occurences dans le tableau.
*/
public function count()
{
return count($this->_data);
}
/**
* Si l'on essaie d'accéder à l'objet comme à un tableau.
*/
public function offsetGet( $offset )
{
$data = $this->_getProperty($offset);
if (is_array($data))
return new AlloData( $data );
else return self::utf8_decode($data);
}
/**
* Si l'on veut de créer/modifier une propriété (interface ArrayAccess)
*/
public function offsetSet( $offset, $value )
{
$data = &$this->_getProperty($offset);
$data = $value;
}
/**
* Lors de la vérification de l'existence d'une propriété avec isset (interface ArrayAccess)
*/
public function offsetExists( $offset )
{
return ($this->_getProperty($this->_position, true) !== null);
}
/**
* Il n'est pas possible de détruire une la variable référencée, seule la référence est détruite...
* De toute façon ça n'a pas d'utilité.
*/
public function offsetUnset($offset)
{
return;
}
/**
* Coller toutes les valeurs/sous-valeurs du tableau associatif.
* Exemple : $film->genre->implode( 'value' ) implosera toutes les valeurs de $film->genre[i]->value
*
* @param string $separator=', ' Le séparateur des valeurs.
* @param string $lastSeparator=' et ' Le séparateur des dernière et l'avant-dernière valeurs.
* @param string $offset='value' Les offsets à concaténer ('$' == 'value').
*/
public function implode( $separator = ', ', $lastSeparator = ' et ', $offset = 'value' )
{
$tab = (array) $this->_getProperty();
if ( count($tab) === 1 )
{
$data = new AlloData($tab[0]);
if ( isset($data[$offset]) && is_string($data[$offset]) )
return $data[$offset];
}
elseif ( count($tab) < 1 ) return '';
$values = array();
foreach ( $tab as $i => $stab )
{
$data = new AlloData( $stab );
if ( isset($data[$offset]) && is_string($data[$offset]) )
$values[] = $data[$offset];
}
$last = array_slice($values, -1, 1);
if ( $values )
return implode( (string) $separator, array_slice( $values, 0, -1 ) ) . (( count($values) > 1 ) ? (string) $lastSeparator . $last[0] : '' );
else
return '';
}
}
/**
* Manipuler facilement les URLs des images.
*
*/
class AlloImage
{
/**
* Répertoire de l'image par défaut
* @const string
*/
const DEFAULT_IMAGE_PATH = "commons/emptymedia/AffichetteAllocine.gif";
/**
* Liste des icônes diponibles
* @var array
*/
public static $icons = array(
'play.png' => null,
'overplay.png' => null,
'overlayVod120.png' => array('r', 120, 160),
);
/**
* Contient les paramètres de l'icône.
* @var array|false
*/
private $imageIcon = false;
/**
* Contient les paramètres de la bordure
* @var array|false
*/
private $imageBorder = false;
/**
* Contient les paramètres de la taille de l'image.
* @var array|false
*/
private $imageSize = false;
/**
* Contient l'adresse du serveur de l'image.
* @var string
*/
private $imageHost;
/**
* Contient le répertoire de l'image sur Allociné.
* @var string
*/
private $imagePath;
/**
* Image par défaut
*
* @return this
*/
public function reset( )
{
$this->destroyBorder();
$this->destroyIcon();
$this->maxSize();
return $this;
}
/**
* Modifier l'icône sur l'image.
*
* @param string $position='c' La position de l'icône par rapport au centre de l'image (en une ou deux lettres), d'après la rose des sable. Renseigner une position invalide (telle que 'c') pour centrer l'icône.
* @param int $margin=4 Le nombre de pixel entre l'icône et le(s) bord(s) le(s) plus proche(s).
* @param string $icon='play.png' Le nom de l'icône à ajouter. La liste des icônes se trouve dans AlloImage::$icons.
* @return this
*/
public function icon( $position='c', $margin=4, $icon='play.png' )
{
if (!empty($this->icons[$icon]))
{
$p = $this->icons[$icon];
switch ($p[0])
{
case 'r': $this->resize($p[1], $p[2]); break;
case 'c': $this->cut($p[1], $p[2]); break;
}
}
$this->imageIcon = array(
'position' => substr($position, 0, 2),
'margin' => (int) $margin,
'icon' => (string) $icon
);
return $this;
}
/**
* Renvoie les paramètres enregistrés pour l'icône.
*
* @return array|false
*/
public function getIcon()
{
return $this->imageIcon;
}
/**
* Efface les paramètres enregistrés pour l'icône.
*
* @return this
*/
public function destroyIcon()
{
$this->imageIcon = false;
return $this;
}
/**
* Modifier la bordure de l'image.
*
* @param int $size=1 L'épaisseur de la bordure en pixels.
* @param string $color='000000' La couleur de la bordure en hexadécimal (sans # initial). [http://en.wikipedia.org/wiki/Web_colors#Hex_triplet]
* @return this
*/
public function border( $size=1, $color="000000" )
{
$this->imageBorder = array(
'size' => (int) $size,
'color' => (string) $color
);
return $this;
}
/**
* Renvoie les paramètres enregistrés de la bordure.
*
* @return array|false
*/
public function getBorder()
{
return $this->imageBorder;
}
/**
* Efface la bordure.
*
* @return this
*/
public function destroyBorder()
{
$this->imageBorder = false;
return $this;
}
/**
* Modifier proportionnellement la taille de l'image au plus petit.
* Si les deux paramètres sont laissés tels quels ($xmax='x' et $ymax='y'), l'image sera de taille normale.
* Appeler cette fonction efface les paramètres enregistrés pour AlloImage::cut() (Les deux méthodes ne peuvent être utilisées en même temps).
*
* @param int $xmax='x' La largeur maximale de l'image, en pixels. Laisser 'x' pour une largeur automatique en fonction de $ymax.
* @param int $ymax='y' La hauteur maximale de l'image, en pixels. Laisser 'y' pour une hauteur automatique en fonction de $xmax.
* @return this
*/
public function resize( $xmax='x', $ymax='y' )
{
$this->imageSize = array(
'method' => 'r',
'xmax' => $xmax,
'ymax' => $ymax
);
return $this;
}
/**
* Redimensionner l'image au plus petit, puis couper les bords trop grands.
* Appeler cette fonction efface les paramètres enregistrés pour AlloImage::resize() (Les deux méthodes ne peuvent être utilisées en même temps).
*
* @param int $xmax La largeur maximale de l'image, en pixels.
* @param int $ymax La hauteur maximale de l'image, en pixels.
* @return this
*/
public function cut( $xmax, $ymax )
{
$this->imageSize = array(
'method' => 'c',
'xmax' => (int) $xmax,
'ymax' => (int) $ymax
);
return $this;
}
/**
* Retourne les paramètres enregistrés du redimensionnement/recoupe de l'image.
*
* @return array|false
*/
public function getSize()
{
return $this->imageSize;
}
/**
* Règle l'image à sa taille maximale (Effacer redimensionnement/recoupe)
*
* @return array|false
*/
public function maxSize()
{
$this->imageSize = false;
return $this;
}
/**
* Retourne le host de l'image.
*
* @return string
*/
public function getImageHost()
{
return $this->imageHost;
}
/**
* Modifier le serveur (host) de l'image.
*
* @param string $server L'adresse sans slash du serveur (ex: 'images.allocine.fr'), le même paramètre que pour AlloHelper::lang(), ou 'default' pour régler selon le langage enregistré.
* @return this
*/
public function setImageHost( $server )
{
switch ($server)
{
case 'default':
case 'de': case 'filmstarts.de':
case 'es': case 'sensacine.com':
case 'fr': case 'allocine.fr':
case 'en': case 'screenrush.co.uk':
$this->imageHost = self::$imagesUrl;
break;
default:
$this->imageHost = $server;
}
return $this;
}
/**
* Créer une nouvelle image grâce à son URL.
* Si l'url est invalide, l'image utilisée sera celle par défaut.
*
* @param string $url=null L'URL de l'image.
*/
public function __construct( $url = null )
{
if ( empty($url) || !filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED) )
{
$this->imageHost = AlloHelper::$imagesUrl;
$this->imagePath = self::DEFAULT_IMAGE_PATH;
}
else
{
$urlParse = parse_url($url);
$this->imageHost = !empty($urlParse['host']) ? $urlParse['host'] : AlloHelper::$imagesUrl;
if (!empty($urlParse['path']))
$this->imagePath = $urlParse['path'];
else
AlloHelper::error("This isn't a URL to an image.", 7);
// Parsage de l'URL
$explodePath = explode('/', $this->imagePath);
// Première partie vide ?
if (empty($explodePath[0]))
unset($explodePath[0]);
// Détecte les paramètres jusqu'au début du path réel.
foreach ($explodePath as $iPathPart => $pathPart)
{
if (strpos($pathPart, '_') === false)
break;
else
unset($explodePath[$iPathPart]);
// Icône
if (strpos($pathPart, 'o') === 0 && preg_match("#^o_(.+)_(.+)_(.+)$#i", $pathPart, $i) != false)
{
$this->icon($i[3], $i[2], $i[1]);
}
// Bordure
elseif (strpos($pathPart, 'b') === 0 && preg_match("#^b[xy]?_([0-9]+)_([0-9a-f]{6}|.*)$#i", $pathPart, $i) != false)
{
if (preg_match("#^[0-9a-f]{6}$#i", $i[2]) == false)
$i[2] = "000000";
$this->border($i[1], $i[2]);
}
// Redimensionnement
elseif (preg_match("#^r[xy]?_([0-9]+|[a-z0-9]+)_([0-9]+|[a-z0-9]+)$#i", $pathPart, $i) != false)
{
$this->resize((int) $i[1], (int) $i[2]);
}
// Recoupe
elseif (preg_match("#^c[xy]?_([0-9]+|[a-z0-9]+)_([0-9]+|[a-z0-9]+)$#i", $pathPart, $i) != false)
{
$this->cut((int) $i[1], (int) $i[2]);
}
}
$this->imagePath = implode('/', $explodePath);
}
}
/**
* Construit l'URL à partir des paramètres enregistrés.
*
* @return string
*/
public function url()
{
$params = array();
// Taille
if ( $this->imageSize !== false )
$params[] = "{$this->imageSize['method']}_{$this->imageSize['xmax']}_{$this->imageSize['ymax']}";
// Bordure
if ( $this->imageBorder !== false )
$params[] = "b_{$this->imageBorder['size']}_{$this->imageBorder['color']}";
// Icône
if ( $this->imageIcon !== false )
$params[] = "o_{$this->imageIcon['icon']}_{$this->imageIcon['margin']}_{$this->imageIcon['position']}";
return "http://{$this->imageHost}" . (!empty($params) ? '/' . implode('/', $params) : '') . "/{$this->imagePath}";
}
/**
* Alias de AlloImage::url()
*
* @return string
*/
public function __toString()
{
return $this->url();
}
}
Historique
- 05 septembre 2010 12:54:15 :
- Ajout d'informations
- 07 septembre 2010 15:18:24 :
- Passage à la V2.0:
-> Ajout du système de News
- 07 septembre 2010 15:23:17 :
- Correction d'une erreur dans "lisez-moi.html"
- 04 octobre 2010 01:23:28 :
- Passage à la V3.0
- 05 octobre 2010 00:59:04 :
- Passage à la V3.1
- 05 octobre 2010 21:17:21 :
- Changement d'icône
- 05 octobre 2010 21:19:36 :
- Changement d'icône
- 06 octobre 2010 01:26:11 :
- Passage à la V3.2
- 06 octobre 2010 19:10:59 :
- Passage à la V3.3
- 06 octobre 2010 19:17:54 :
- Changement d'image
- 08 octobre 2010 18:35:21 :
- Correction d'une erreur
- 13 octobre 2010 11:45:45 :
- Passage à la V3.3.3
- 14 octobre 2010 13:27:12 :
- Passage à la V3.3.4
- 16 octobre 2010 17:23:33 :
- Passage V3.4.1
- 16 octobre 2010 19:49:32 :
- Passage sous licence Creative Commons CC-by
- 17 octobre 2010 18:37:15 :
- Passage à la V3.5.0
- 17 octobre 2010 19:17:06 :
- Documentation abrégée dans le .zip
Une version plus complète sera bientôt disponible
- 19 octobre 2010 09:07:05 :
- Correction d'une erreur
- 19 octobre 2010 18:24:18 :
- Passage à la V3.5.1
- 19 octobre 2010 18:25:22 :
- Correction d'une erreur
- 26 octobre 2010 20:47:41 :
- Passage à la V3.5.2
- 26 octobre 2010 21:19:38 :
- Passage à la V3.5.3
- 26 octobre 2010 21:22:42 :
- Correction d'une erreur
- 27 octobre 2010 19:33:13 :
- Passage à la V3.5.4
- 28 octobre 2010 15:10:12 :
- Passage à la V3.6.0
- 28 octobre 2010 17:15:57 :
- Passage à la V3.6.1
- 14 novembre 2010 14:46:49 :
- Passage à la V3.6.2
- 19 décembre 2010 19:00:12 :
- Passage à la V3.6.2
- 06 février 2011 15:52:59 :
- MàJ VERSION 4
- 20 mars 2011 12:21:08 :
- Passage V5
- 28 mars 2012 23:58:21 :
- Mise à jour.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
script d'affichage de séance de cinéma [ par thierry34600 ]
bonjour à tous voila je cherche un script séance de cinéma [url=http://www.cgrcinemas.fr/villeneuve/horaires/]horaire[/url] car je doit crée un si
probleme d'insertion dans une base de donnée [ par esteller ]
Document sans titre <?php function afficherformulaire($nom='',$prenom='',$genre=1,$datnais='',$datemb='',$salbrut='',$sitmat=1,$nbenf='
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|