<?php
namespace TheatreCore\Repository;
use AmazonCloudFront;
use AmazonS3;
use TheatreCore\Classes\Images\Images;
use TheatreCore\Entity\Commandes;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Keywords;
use TheatreCore\Entity\Multimedias;
use TheatreCore\Entity\ObjectMultimedia;
use TheatreCore\Entity\Spectacles;
use TheatreCore\Traits\TheatreTrait;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Service\Functions;
use App\Service\TheatreParametres;
/**
* MultimediasRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class MultimediasRepository extends ServiceEntityRepository
{
use TheatreTrait {
getRelationsArray as protected getRelationsArrayTrait;
}
private $em;
public $__table;
public $__table_object;
public $__idtable;
private $security;
private $players;
public function __construct(ManagerRegistry $registry, TheatreParametres $players, TranslatorInterface $tr, Functions $func, Images $images, Security $security)
{
parent::__construct($registry, Multimedias::class);
$this->__table = $this->getClassMetadata()->getTableName();
$this->__table_object = $this->getClassMetadata()->name;
$this->__idtable = $this->getClassMetadata()->getSingleIdentifierFieldName();
$this->players = $players;
$this->security = $security;
$this->translator = $tr;
$this->func = $func;
$this->images = $images;
}
// le bucket
public $bucket = 'thtv';
// identifiant de la distribution cloudfront à modifier (visible via la console)
protected $cloudfront_id = 'ESJMHJBTXYGF5';
// OriginAccessIdentity valeur récupèrée avec ça
public $oai = 'E1W4AXU0ZXINNE';
// cloud
protected $is_cloud = false;
// s3 canonique user id
public $s3_canonical_user_id = '9a5870bc4a58b0f2d6336a8f70487253e0f0ef1dcabb9ae525d07a28e876c4d6414484dc9e944ee24445e5aefb10c2b3';
// format par défaut pour toHourMinuteSecond()
public $hms_format = array(
86400 => array(' jour',' jours'),
3600 => array(' heure', ' heures'),
60 => array(' minute', ' minutes'),
1 => array(' seconde', ' secondes')
);
// les différents status
public $status_types = array(
0 => array(
'code' => 'nodispo',
'string' => 'Non disponible',
),
1 => array(
'code' => null,
'string' => 'En ligne',
),
2 => array(
'code' => 'noexport',
'string' => 'Intégration désactivée',
),
3 => array(
'code' => 'nodelete',
'string' => 'Supprimé',
),
4 => array(
'code' => 'montheatre',
'string' => 'Réservé aux abonnés',
),
5 => array(
'code' => 'vod',
'string' => 'Streaming VOD',
),
);
// utilisé via setParameters()
protected $parameters = array();
// pour configurer SWFObject, cf. getPlayer()
public $flashvars = null;
public $params = null;
public $attributes = null;
// champs à retourner pour finddata
public $default_fields = array(
'idmultimedia',
'evenement',
'publish',
'policyAccess',
'status',
'language',
'markdown',
'duree',
'dureeSiteSec',
'description',
'sujetTitre',
'price',
'flv',
'h264',
'h264m',
'hd720',
'hd1080',
'hd2160',
'mp3',
'code',
'countView',
'flvWidth',
'flvHeight',
'etalab'
);
// {{{ findData()
/** Recherche des multimedias
*
* Permet de rechercher des multimedias en fonction de certains critères :
* la première lettre, un bout du nom, le type de multimedia, si il est en ligne ou pas
*
* @access public
* @see Theatre::find()
*/
public function findData($publish=null,$keywords=null,$idobject=null,$object=null)
{
$query = $this->createQueryBuilder('e');
$query->orderBy('e.idmultimedia', 'desc');
if($this->getCount()){
$query->select('COUNT(e.idmultimedia)');
$this->setCount(false);
return $query;
}
// parametre
if(isset($_REQUEST['idmultimedia']) && !empty($_REQUEST['idmultimedia'])) {
$idmultimedia = $_REQUEST['idmultimedia'];
}
if(isset($_REQUEST['keywords']) && $_REQUEST['keywords']!='nom' && !empty($_REQUEST['keywords'])) {
$keywords = filter_var(trim($_REQUEST['keywords']), FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
if(my_is_int($keywords)) {
$idmultimedia = (int)$keywords;
$keywords = null;
}
}
if(isset($_REQUEST['publish']) && !empty($_REQUEST['publish'])) {
$publish = $_REQUEST['publish'];
}
//recherche stricte par id
if(!empty($idmultimedia)) {
$query->andWhere('e.idmultimedia = '.(int)$idmultimedia);
}
// vidéos d'un utilisateur
if(isset($_REQUEST['idextranetuser']) && $this->my_is_int($_REQUEST['idextranetuser'])) {
$query->andWhere('e.idextranetuser = '.(int)$_REQUEST['idextranetuser']);
}
// mots cles
if (!empty($keywords)) {
// $this->whereAdd('sujet_titre LIKE \'%'.$this->escape($keywords).'%\'');
// $this->whereAdd('evenement LIKE \'%'.$this->escape($keywords).'%\'','OR');
// $this->whereAdd('filmeur LIKE \'%'.$this->escape($keywords).'%\'','OR');
// $this->whereAdd('code=\''.$this->escape($keywords).'\'','OR');
}
// // selectionne les fiches hors ligne
if (!empty($publish) && $publish=='no') {
$query->andWhere('e.publish = 0');
}
//
// // recherche par idobject
// if(!empty($idobject) && !empty($object)) {
// $s = '';
// foreach($fields as $field)
// {
// if ($s) $s.=',';
// $s .= 'm.'.$field;
// }
// $query = 'SELECT '.$s.'
// FROM object_multimedia om, multimedias m
// WHERE 1
// AND om.idmultimedia=m.idmultimedia
// AND om.idobject='.((int)$idobject).'
// AND om.object=\''.$this->escape($object).'\'';
// if(!empty($publish) && $publish = 1) {
// $query .= ' AND publish=1 ';
// }
// $query .= 'ORDER BY m.date, m.idmultimedia ASC';
//
// on lance la recherche
return $query->getQuery();
}
// }}}
// {{{ setToArray()
/** Liste des multimedias dans un tableau associatif
*
* Tableau associatif notament utilisé pour lister les informations sur les multimedias
* Utile pour générer les tableaux HTML de listes de multimedias
*
* @access public
* @return array
* @see findData()
*/
public function setToArray($spec=true)
{
if($spec==true) {
$this->findData();
}
$values = array();
$color = null;
$nb = 0;
while($this->fetch()) {
// valeurs de l'enregistrement
$values[$nb] = $this->getInfosMultimedia();
// couleur de ligne alternative
$color = $this->colorAlternate($color);
$values[$nb]['colorline'] = $color;
$values[$nb]['id'] = $this->idmultimedia;
$nb++;
}
return $values;
}
// }}}
// {{{ getInfosMultimedia()
/** Informations sur un document multimedia
*
* @access public
* @return array les infos sous forme de tableau
* @param int $idmultimedia numero de la fiche multimedia
* @param boolean $all ajoute les infos sur l'auteur, le metteur en scène, etc.
* @param mixed $player ajoute le code du player (0|false=rien, 1|true|'js'=player JS, 'xmlconf'=xml config)
* @param array $params paramètres supplémentaires
* @param string $code code du multimedia (au lieu de l'idmultimedia)
*/
public function getInfosMultimedia($idmultimedia=null,$all=false,$player=false,$params=array(),$code=null)
{
$con = $this->getEntityManager();
$infos = array();
////////////// infos de la table
if(!isset($this->idmultimedia) || empty($this->idmultimedia)) {
if (!empty($code)) {
$idmultimedia = $this->getIdByUrl($code);
if(empty($idmultimedia)){
return array();
}
}
}
$data = $con->getRepository(Multimedias::class)
->createQueryBuilder('e')
->select('e')
->andWhere('e.idmultimedia = :idmultimedia')
->setParameter(':idmultimedia', $idmultimedia)
->getQuery()
->getOneOrNullResult();
if(empty($data)){
return [];
}
$this->idmultimedia = $data->getIdmultimedia();
if(is_null($data)){
return [];
}
if(!empty($params['display'])) {
$display = $params['display'];
unset($params['display']);
} else {
$display = array();
}
$infos += array(
'idmultimedia' => $data->getIdmultimedia(),
'sujet_titre' => $data->getSujetTitre(),
'evenement' => $data->getEvenement(),
'duree' => $data->getDuree(),
'duree_site_sec' => $data->getDureeSiteSec(),
'url_clean' => $data->getUrlClean(),
'publish' => $data->getPublish(),
'copyright' => $data->getCopyright(),
'nameview' => $data->getSujetTitre(),
'permalink' => $_ENV['URL_THNET'] . '/video/' . $data->getUrlClean(),
'code' => $data->getCode(),
'etalab' => $data->getetalab(),
'idextranetuser' => $data->getIdextranetuser(),
'idextranetuser_producteur' => $data->getidextranetuserProducteur(),
'idcontact_producteur' => $data->getIdcontactProducteur(),
'quality' => $data->getQuality(),
'count_view' => $data->getCountView(),
'use_cloud' => $data->getUseCloud(),
'is_coconut' => $data->getIsCoconut(),
'lieu' => $data->getLieu(),
'date' => $data->getDate(),
'flv_width' => $data->getFlvWidth(),
'flv_height' => $data->getFlvHeight(),
'dateinsert' => $data->getDateInsert(),
'audio_video' => $data->getAudioVideo(),
'type' => $data->getType() ? $data->getType()->getIdtypemultimedia() : null,
'date_year' => $data->getDate()->format('Y'),
'date_month' => $data->getDate()->format('m'),
'date_day' => $data->getDate()->format('d')
);
if(empty($infos['idmultimedia'])) {
return array();
}
if($infos['is_coconut']==1 && isset($this->heywatch) && !empty($this->heywatch)) {
// $infos['heywatch'] = (array)unserialize($this->heywatch);
// $infos['heywatch_string'] = print_r($infos['heywatch'], true);
}
// a qui est la vidéo ?
if(!is_null($data->getIdextranetuser()) && !empty($data->getIdextranetuser()) && $GLOBALS['session'] instanceof Extranetusers && $data->getIdextranetuser()->getIdextranetuser()==$GLOBALS['session']->getIdextranetuser()) {
$infos['my_video'] = $data->getIdextranetuser()->getIdextranetuser();
}
foreach($this->default_fields as $field) {
if (!isset($infos[$field])) {
$infos[$field] = $data->{'get'.ucfirst($field)}();
}
}
$infos['flowplayer'] = $_ENV['KEY_FLOWPLAYER'];
// si le fichier est hors ligne ou privé (status différent de 1)
if($infos['status']!=1) {
// si status == 4 => vérifier si montheatre OK
if($infos['status']==4) {
if(!$GLOBALS['session'] instanceof Extranetusers) {
$infos['status_publication'] = $this->getStatus($infos['status']);
}
// si status == 5 => vérifier que la personne est connectée et que la VOD est active
} elseif($infos['status']==5) {
// si elle n'est pas logué => VOD
if(!$GLOBALS['session'] instanceof Extranetusers) {
$infos['status_publication'] = $this->getStatus($infos['status']);
} else {
// si elle n'est pas root ou que sa commande n'est pas valide => VOD
if(array_flip($GLOBALS['session']->getRoles())['ROLE_ISROOT'] !=1
&& !$con->getRepository(Commandes::class)->isValid('multimedias',$infos['idmultimedia'],$GLOBALS['session']->getIdextranetuser())) {
$infos['status_publication'] = $this->getStatus($infos['status']);
}
}
} else { // si autre status => teste si accessible par l'extranetuser (propriétaire ou root)
if(!is_null($data->getIdextranetuser()) && !empty($data->getIdextranetuser()) && $GLOBALS['session'] instanceof Extranetusers && $GLOBALS['session']->getIdextranetuser()!=$infos['idextranetuser']->getIdextranetuser()
//&& !Theatre::factory('multimedia_extranetuser')->isAuthorized($infos['idmultimedia'],$infos['idextranetuser'])
&& array_flip($GLOBALS['session']->getRoles())['ROLE_ISROOT'] !=1) {
$infos['status_publication'] = $this->getStatus($infos['status']);
}
}
}
// si l'utilisateur à le droit de lire les vidéos normalement sur le cloud en pseudo streaming
// if($GLOBALS['session']->getPseudoStreaming()==1) {
// $infos['use_cloud'] = 0;
// }
// le prix TTC
if(!empty($infos['price'])) {
$infos['ttc_price'] = round($infos['price']+($infos['price']*20/100),2);
}
if(!empty($infos['description'])) {
$infos['description_wiki'] = $infos['description'];
$infos['description_html'] = $this->wikiTransform($infos['description'], $infos['markdown']);
$infos['description'] = strip_tags($infos['description_html']);
$infos['description_courte'] = $this->cutSentence($infos['description'],45,true);
}
if(isset($this->date)) {
$infos['date_en'] = $this->date;
$infos['date'] = $this->getFormeDate($this->date);
$infos['date_annee'] = $this->getFormeDate($this->date,'Y');
}
if(isset($this->dateupdate)) {
$infos['dateupdate_en'] = $this->dateupdate;
$infos['dateupdate'] = $this->getFormeDate($this->dateupdate);
}
if($all) {
$infos['multimedia_auteur'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_auteur');
$infos['multimedia_metteur'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_metteur');
$infos['multimedia_acteur'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_acteur');
$infos['multimedia_intervenant'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_intervenant');
$infos['multimedia_contact'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_contact');
$infos['multimedia_partenaire'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_partenaire');
$infos['multimedia_spectacle'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_spectacle');
}
// tableau complet des objets liés
if(isset($params['tableau'])) {
$object_multimedia = $con->getRepository(ObjectMultimedia::class);
$fields = array('idperson','lastname','firstname','url_clean');
$infos['authors'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_auteur'),true);
$infos['directors'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_metteur'),true);
$infos['actors'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_acteur'),true);
$infos['intervenants'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_intervenant'),true);
$allpersons = $infos['authors'] + $infos['directors'];
foreach($allpersons as $kap => $vap){
unset($vap['nopunct']);
$infos['allpersons'][$vap['idperson']] = $vap;
}
if(!empty($infos['allpersons'])){
$infos['allpersons'] = $this->noPunct($infos['allpersons']);
}
$fields_contact = array('idcontact','type','organisation','url_clean','link_on_video');
$infos['contacts'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'contacts',$fields_contact,$this->getIdrole('multimedia_contact'),true);
$infos['partenaires'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'contacts',$fields_contact,$this->getIdrole('multimedia_partenaire'),true);
$fields_spectacle = array('idspectacle','title','url_clean','idtypespectacle');
$infos['spectacles'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'spectacles',$fields_spectacle,null,true);
$fields_text = array('idtext','title','url_clean','textfictif', 'valid');
$infos['texts'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'texts',$fields_text,null,true);
// mots clés
$infos['keywords'] = $con->getRepository(Keywords::class)->getListKeywords(array(
'special' => array(
'idmultimedia' => $infos['idmultimedia'],
),
'dbg' => array('multimedia_keyword_'.$infos['idmultimedia'], 'Mots clés associés au document multimedia '.$infos['idmultimedia'])
));
// si pas d'auteur de metteur ou de spectacle
if(empty($infos['authors']) && empty($infos['directors']) && empty($infos['spectacles'])) {
$infos['only_description'] = true;
}
}
// la vignette du multimedia
if(isset($params['vignette'])) {
if(is_array($params['vignette'])) {
$format = $params['vignette'];
} else {
$format = array();
}
$format_flou = $format;
$infos['vignette'] = $x = $this->getVignetteMultimedia($idmultimedia,$format);
$format_flou['blur'] = true;
$infos['vignette_flou'] = $this->getVignetteMultimedia($idmultimedia,$format_flou);
}
// le producteur
/*if(!empty($params['get_producteur']) && !empty($infos['idcontact_producteur'])) {
$infos['producteur'] = Theatre::factory('contacts')->getInfosObject($infos['idcontact_producteur']);
}*/
// ajoute les infos sur les fichiers disponible
$this->getInfosMultimediaMore($infos);
// le player à utiliser
if($player) {
// la conf en version XML OU le player en JS
if ($player === 'xmlconf') {
$infos['player'] = $this->getPlayerXMLConfig($infos,$params); //XML config
} else {
// si iPhone ou iPod ou iPad, on regarde si un contenu qui va bien
if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/iPhone|iPod|iPad|Android/', $_SERVER['HTTP_USER_AGENT'])) {
$infos['user']['iphone'] = true;
}
$infos['player'] = $this->getPlayer($infos,$params); // player JS
}
}
/* Statistiques */
// clé prévention flood de stats (doit correspondre avec la verif dans logVideoStats())
$infos['key'] = md5($_ENV['URL_THTV'].date('Ymd'));
// le ratio
if(!empty($infos['flv_width']) && !empty($infos['flv_height'])) {
$infos['ratio'] = $this->getRatio($infos['flv_width'],$infos['flv_height']);
}
// ajouter la taille pour l'embed si c'est de l'audio
if($infos['mp3']==1 || empty($infos['flv_width'])) {
$infos['flv_width'] = 560;
$infos['flv_height'] = 480;
}
$infos['jsonld'] = $this->makeJsonLD($infos);
if(!empty($params['api'])) {
if(empty($infos['vignette'])) {
$params_vignette = array('width'=>115,'height'=>115,'direction'=>'crop','fleche'=>'none','ratio' => $infos['ratio']);
$infos['vignette'] = $this->getVignetteMultimedia($idmultimedia,$params_vignette);
$params_vignette['blur'] = true;
$infos['vignette_flou'] = $this->getVignetteMultimedia($idmultimedia,$params_vignette);
// différentes tailles de vignettes
$vignette_sizes = array(
'1920x1080' => array(
'width' => 1920,
'height' => 1080
),
'990x557' => array(
'width' => 990,
'height' => 557,
),
'495x277' => array(
'width' => 495,
'height' => 277,
)
);
foreach($vignette_sizes as $k=>$v) {
$infos['images'][$k] = $this->getVignetteMultimedia($idmultimedia,array('width'=>$v['width'],'height'=>$v['height'],'direction'=>'crop','fleche'=>'none','ratio' => $infos['ratio']));
}
}
$infos = $this->getApiTab($infos);
}
$infos['display'] = $display;
return $infos;
}
// }}}
// {{{ getMultimediaMore()
/** Ajoute des infos concernant le media
*
*
* @param array $infos tableau contenant les infos (directement modifié)
* @access public
* @return void
*/
public function getInfosMultimediaMore(&$infos,$test_file=false)
{
//format possible pour le player html5 $format_avaibles_array
$format_avaibles_array = array('h264m' => 'Mobile','h264' => '240p','hd720' => '720HD','hd1080' => '1080HD','hd2160' => '2160HD');
$format_avaibles_label = array();
$format_avaibles_count = array();
$format_avaibles = array();
//==> ça ne peut pas être un flv ET un mp3
if($infos['mp3'] ?? 0 == 1) {
$infos['mediatype'] = 'mp3';
} elseif($infos['flv'] ?? 0 == 1) {
$infos['mediatype'] = 'flv';
}
//Sélection du format par default
$default_value = "h264";
$format_avaibles_default = array('hd720', 'h264', 'h264m');
foreach($format_avaibles_default AS $valeur){
if($infos[$valeur] ?? 0){
$default_value = $valeur;
break;
}
}
// checker les différents formats
$count = 1;
foreach($this->getVideoFormats() as $k=>$v) {
//==> ça ne peut pas être un flv ET un mp3
if($v['format']=='mp3' && !empty($infos['mediatype']) && $infos['mediatype']=='flv') {
continue;
}
// si le fichier est hors ligne (status différent de 1)
if(!empty($infos['status_publication'])) {
// si c'est status = 5, on mets un teaser à la place (format-idmultiemdia-teaser.extension)
$teaser_vod = $v['format'].'-'.$infos['idmultimedia'].'-'.$infos['status_publication'].'.'.$v['extension'];
if($infos['status_publication']=='vod' && file_exists($_ENV['PATH_MEDIAS'].$v['format'].'/'.$teaser_vod)) {
$medianame = $teaser_vod;
} else {
$medianame = $v['format'].'-'.$infos['status_publication'].'.'.$v['extension'];
}
} else {
// nom du fichier
$medianame = $v['format'].'-'.$infos['idmultimedia'].'.'.$v['extension'];
}
// est-ce qu'il y a un fichier de ce type ? check le fichier ou la base
if(($test_file && file_exists($_ENV['PATH_MEDIAS'].$v['format'].'/'.$medianame))
|| (!$test_file && !empty($infos[$v['format']]))) {
$infos['formats'][$v['format']] = array(
'flv' => ($v['format'] == 'flv') ? true : false,
'mediatype' => $v['format'],
'medianame' => $medianame,
'medialocalpath' => $_ENV['PATH_MEDIAS'] . $v['format'] . '/' . $medianame,
'mediaurl' => $_ENV['URL_MEDIAS'] . '/' . $v['format'] . '/' . $medianame,
// 'mime_type' => $infos['heywatch'][$v['coconut']]->format->mime_type
);
$infos['formats_download'][$v['format']] = array(
'flv' => ($v['format'] == 'flv') ? true : false,
'mediatype' => $v['format'],
'medianame' => $medianame,
// 'medialocalpath' => PATH_MEDIAS . $v['format'] . '/' . $medianame,
// 'mediaurl' => URL_MEDIAS . '/' . $v['format'] . '/' . $medianame,
'sizefile' => (!empty($v['coconut']) && !empty($infos['heywatch'][$v['coconut']])) ? $this->setSizeToFormat($infos['heywatch'][$v['coconut']]->format->size) : false,
// 'mediawidth' => (!empty($v['coconut']) && !empty($infos['heywatch'][$v['coconut']])) ? $infos['heywatch'][$v['coconut']]->streams->video->width : false,
// 'mediaheight' => (!empty($v['coconut']) && !empty($infos['heywatch'][$v['coconut']])) ? $infos['heywatch'][$v['coconut']]->streams->video->height : false,
'download' => ($v['format'] == 'flv' || $v['format'] == 'upload') ? false : true
);
if (array_key_exists($v['format'], $format_avaibles_array)) {
$format_avaibles[] = $v['format'];
$infos['formats'][$v['format']]['labelname'] = $format_avaibles_array[$v['format']];
$infos['formats_download'][$v['format']]['labelname'] = $format_avaibles_array[$v['format']];
$format_avaibles_label[] = $format_avaibles_array[$v['format']];
$format_avaibles_count[] = $count;
$count++;
}
$infos['format_default'] = $default_value;
$infos['format_avaibles'] = join(',', $format_avaibles);
$infos['format_avaibles_label'] = join(',', $format_avaibles_label);
$infos['format_avaibles_count'] = join(',', $format_avaibles_count);
}
}
// si on a du h264m et flv_width, ajouter la taille mobile
if(!empty($infos['formats']['h264m']) && !empty($infos['flv_width'])) {
$infos['mobile_width'] = '320';
$infos['mobile_height'] = round(($infos['mobile_width']*$infos['flv_height'])/$infos['flv_width']);
// la vignette du multimedia mobile
// if($GLOBALS['context']['session']->get('mobile')) {
// $width_vignette = 320;
// $height_vignette = round(($width_vignette*$infos['flv_height'])/$infos['flv_width']);
// $format = (array('width'=> $width_vignette,'height' => $height_vignette,'direction'=>'crop','fleche'=>'grand'));
// $infos['vignette_mobile'] = $this->getVignetteMultimedia($infos['idmultimedia'],$format);
// }
}
//On met en tête les données de la vidéo par défault pour qu'elle soit charger par flowplayer
// TODO : A REVOIR
// uksort($infos['formats'], create_function('$x,$y','return ($y === "'.$default_value.'") ? 1 : -1;'));
// ajouter la durée du fichier si elle n'y est pas
$this->updateDureeSiteSec($infos);
//// doit rester _après_ l'appel à updateDureeSiteSec()
if (isset($infos['duree_site_sec']) && $infos['duree_site_sec'] > 0) {
$infos['duree_site_sec_human'] = $this->toHourMinuteSecond($infos['duree_site_sec']);
}
// image de la vidéo ou du mp3
$infos['image_media'] = $this->getImage($infos['idmultimedia']);
}
// }}}
// {{{ getInfosObject()
/** Alias de getInfosMultimedia
*
* @access public
* @return array
* @see getInfosMultimedia()
* @param int $idobject identifiant
*/
public function getInfosObject($idobject=null) { return $this->getInfosMultimedia($idobject); }
// }}}
// {{{ orderByDefaut()
/** Classement par défaut
*
* Défini le tri par défaut pour les requêtes de type SELECT
*
* @access public
* @return string
*/
public function orderByDefaut($order=null)
{
// tri par défaut
if(empty($order)) {
$order = 'idmultimedia';
}
return $order;
}
// }}}
// {{{ getObjectTitle()
/** Infos de l'item recherché
*
* Affichage standard du titre de l'objet
*
* @access public
* @return string
* @param int $idobject Identifiant de l'item
* @param array $infos_object Informations pour construire le titre
* @param array $params Paramétres supplémentaires
*/
public function getObjectTitle($idobject=null,$infos_object=array(),$params=array())
{
if(!$idobject) {
$idobject = $this->idmultimedia;
}
$infos['sujet_titre'] = null;
// champs
$fields = array('idmultimedia','sujet_titre','url_clean');
if(!empty($infos_object)) {
foreach($fields as $k=>$v) {
if(array_key_exists($v, $infos_object)) {
$infos[$v] = $infos_object[$v];
}
}
} else {
//charger les infos que si necessaire
if(empty($this->sujet_titre)) {
// $this->selectAdd();
// $this->selectAdd(join($fields, ','));
// $this->get($idobject);
}
foreach($fields as $k=>$v) {
if(isset($this->$v) && $this->$v!='') {
$infos[$v] = trim($this->$v);
}
}
}
if(!empty($params['return_array'])) {
// ajouter title pour la compatibilité
$infos['title'] = $infos['sujet_titre'];
return $infos;
} else {
return $infos['sujet_titre'];
}
}
// }}}
// {{{ getLinksObjectsMultimedia()
/** Objets associee un multimedia
*
* Liste et les associations multimedias / persons / contacts
*
* @access public
* @return array
* @see Object_multimedia::getObjectsMultimedia()
* @param int $idmultimedia identifiant du multimedia
* @param string $type type recherché (metteur en scene, auteur)
*/
public function getLinksObjectsMultimedia($idmultimedia,$type)
{
$infos = array();
$object_multimedia = $this->getEntityManager()->getRepository(ObjectMultimedia::class);
if($type=='multimedia_auteur' || $type=='multimedia_metteur' || $type=='multimedia_acteur' || $type=='multimedia_intervenant') {
$fields = array('idperson','lastname','firstname');
$infos = $object_multimedia->getObjectsMultimedia($idmultimedia,'persons',$fields,$this->getIdrole($type));
} elseif($type=='multimedia_contact' || $type=='multimedia_partenaire') {
$fields = array('idcontact','type','organisation','lastname','firstname');
$infos = $object_multimedia->getObjectsMultimedia($idmultimedia,'contacts',$fields,$this->getIdrole($type));
} elseif($type=='multimedia_spectacle') {
$fields = array('idspectacle','title');
$infos = $object_multimedia->getObjectsMultimedia($idmultimedia,'spectacles',$fields,$this->getIdrole($type));
} elseif($type=='multimedia_contents') {
$fields = array('idcontent','title'); //TODOC
//$fields = array('idcontent','title','idclassification'); //TODOC
/*$fields = array(
'fields' => 'idcontent','title',
'links' => array(
'content_classification' => array(
'fields' => array('idclassification'),
),
),
),
);*/
$infos = $object_multimedia->getObjectsMultimedia($idmultimedia,'contents',$fields,'NULL');
} elseif($type=='multimedia_texts') {
$fields = array('idtext','title');
$infos = $object_multimedia->getObjectsMultimedia($idmultimedia,'texts',$fields,'NULL');
}
// retourner les infos
return $infos;
}
// }}}
// {{{ getLinkedObjectMultimedia()
/** Objets associee un multimedia
*
* Liste et les associations multimedias / persons / contacts
*
* @access public
* @return array
* @see Object_multimedia::getObjectsMultimedia()
* @param int $idmultimedia identifiant du multimedia
* @param string $type type recherché (metteur en scene, auteur)
*/
public function getLinkedObjectMultimedias($idobject,$type)
{
$infos_link = $this->getRelationsArray($type);
// retouver les documents multimedias associés à un texte
if(!empty($infos_link)) {
return $this->getLinkedObject($infos_link,$idobject,$type,'texts');
}
}
// }}}
// {{{ getItemsList()
/** Liste des items pour les champs relationnels
*
* Retourne un tableau associatif contenant la liste des items d'une relation
*
* @access public
* @return array
* @param string $type Ce qu'on recherche
* @param string $idtext L'id de l'objet
*/
public function getItemsList($idmultimedia,$type,$type_object=null)
{
// type de liaison
$array_types = array(
'multimedia_auteur',
'multimedia_metteur',
'multimedia_acteur',
'multimedia_intervenant',
'multimedia_contact',
'multimedia_partenaire',
'multimedia_contents',
'multimedia_spectacle',
'multimedia_classification',
'multimedia_texts',
'idextranetuser',
'idextranetuser_producteur',
'multimedia_extranetuser',
'idcontact_producteur',
'multimedia_keyword',
);
// fausse relation
if($type=='add_from_spectacle') {
return array();
}
if (in_array($type,$array_types)) {
if ($type == 'multimedia_classification' || $type=='idextranetuser' || $type=='multimedia_extranetuser'
||$type=='idextranetuser_producteur' || $type=='idcontact_producteur' || $type=='multimedia_keyword') {
if(empty($infos_link)) {
$infos_link = $this->getRelationsArray($type);
}
$infos_linked_obj = $this->getLinkedObject($infos_link,$idmultimedia,$type,'multimedias');
return $infos_linked_obj;
}
$itemslist = array();
$itemslist = $this->getLinksObjectsMultimedia($idmultimedia,$type);
foreach ($itemslist as $key=>$value) {
$itemslist[$key]['view_name'] = $value['title'];
}
return $itemslist;
} else {
return 'Aucune fonction de recherche pour le type <strong>'.$type.'</strong> dans la méthode !';
}
}
// }}}
// {{{ setRelationSelectMultimedias()
/** Enregistrement dans les table relationnelle
* Permet l'enregistrement multiple de valeur dans les tables de relation
* Rôles ; 1>metteur, 21>auteur, 5>acteur, 22>contact, 23>partenaire, NULL>spectacles
*/
public function setRelationSelectMultimedias(
string $table,
string $key,
string $col,
$arrayValues,
int $id,
string $object,
int $idrole = null
): void
{
$em = $this->getEntityManager()->getConnection();
$idroleSql = empty($idrole) ? ' idrole IS NULL' : ' idrole='.(int)$idrole;
$idroleInsert = empty($idrole) ? 'NULL' : '?';
/* supression des enregistrements qui ont le meme idobject
* le meme object, le meme idmultimedia mais dont le idrole change
* exemple : une fiche multimedia ou une personne est auteur et metteur en scene
* sinon : supression classique
* les roles
* */
$sqlDelete = "DELETE FROM $table WHERE $col=$id AND object LIKE '$object' AND $idroleSql";
$em->executeStatement($sqlDelete);
$this->logDeletion('Supprime via setRelationSelectMultimedias '.$sqlDelete);
//inserer les donnees
if(!empty($arrayValues)) {
$prepValues = [];
$sql = "INSERT INTO $table ($key, $col, object, idrole, ordermultimedia) VALUES ( ?, ?, ?, $idroleInsert, ?)";
$prep = $em->prepare($sql);
$i = 0;
foreach ($arrayValues as $value) {
$prepValues[] = empty($idrole) ? [$value,$id,$object,$i] : [$value,$id,$object,$idrole,$i];
$i++;
}
foreach ($prepValues as $value){
$prep->executeStatement($value);
}
}
}
// }}}
// {{{ getItemDesc()
/** Infos de l'item pour les listes AjaxRelation
*
* Affichage de la description de l'objet
*
* @access public
* @return string la description
* @param int $idobject Identifiant de l'item
*/
public function getItemDesc($idobject=null)
{
if(!$idobject) {
$idobject = $this->idmultimedia;
}
// champs
$fields = array('idmultimedia','sujetTitre','support', 'date');
//charger les infos que si necessaire
if(empty($this->sujet_titre)) {
// $this->selectAdd();
// $this->selectAdd(join($fields, ','));
$datas = $this->get($idobject);
}
// foreach($fields as $k=>$v) {
// if(isset($this->$v) && $this->$v!='') {
// $$v = $this->$v;
// }
// }
return $datas['sujetTitre'].' - '.$datas['support'].' - '.date_format($datas['date'], 'Y-m-d'). ' - n°'.$datas['idmultimedia'];
}
// }}}
// {{{ getListSearch()
/** Liste des textes
*
* Pour les champs Ajax de relations et les recherches diverses
* permet de générer un tableau associatif des titres des textes en
* fonction de critères de recherche alphabétique ou mots clés
*
* @access public
* @return array
* @param string $lettres Pour la recherche alphabetique
* @param string $keywords Recherche par mots cles
*/
public function getListSearch($lettre,$type=null,$keywords=null,$test=null,$type_object=null)
{
//mode debug
//DB_DataObject::debugLevel(1);
// $this->selectAdd();
// $this->selectAdd('DISTINCT(idmultimedia),sujet_titre,support,date');
// $this->whereAdd('publish=1');
$query = $this->createQueryBuilder('e');
$query->andWhere('e.publish=1');
// selection par ordre alpha
if (!empty($lettre)) {
$query->andWhere('e.sujetTitre LIKE \''.$this->escape($lettre).'%\'');
}
// recherche avec un mot cle
$list = $this->splitKeywords($keywords);
if ($list) {
if (!empty($list[$this->IDSTR])) {
// mots clés
foreach($list[$this->IDSTR] as $s) {
$query->andWhere('e.sujetTitre LIKE \'%'.$s.'%\'');
}
}
if (!empty($list[$this->IDNUM])) {
// recherche par numéro d'id pour les mots clés numériques
$query->andWhere('idmultimedia IN ('.implode(',', $list[$this->IDNUM]).')', 'OR');
}
}
$query->orderBy('e.sujetTitre');
// $datas = $query->fetch();
// $query->setMaxResults(1);
$query = $query->getQuery();
// tableau de donnees
$r = array();
foreach($query->getResult() AS $data){
// titre du media
// if($GLOBALS['context']['module']=='thnet') {
// $r[$data->getIdmultimedia()] = $data->getSujetTitre();
// } else {
$r[$data->getIdmultimedia()] = $this->cutSentence($data->getSujetTitre(),25).' - '.$data->getSupport().' - '.$data->getDate()->format('d-m-Y');
// si trouvé par id, on l'affiche en fin de titre
if (!empty($list[$this->IDNUM]) && in_array($this->idmultimedia, $list[$this->IDNUM])) {
$r[$this->idmultimedia] .= ' - n°'.$this->idmultimedia;
}
// }
}
$this->free();
return $r;
}
// }}}
// {{{ getMultimediaContent()
/** Recuperer les fichiers multimedia associes a un contenu
*
*
* @access public
* @param int $idobject id de l'objet lié
* @param string $object objet lié
* @param int $idrole Le role si besoin
* @return array
*/
public function getMultimediaContent($idobject,$object='contents',$params=array())
{
$conn = $this->getEntityManager();
$sql = 'SELECT *
FROM object_multimedia om, multimedias m
WHERE om.idmultimedia=m.idmultimedia
AND om.idobject='.((int)$idobject).'
AND om.object=\''.$object.'\'
AND m.publish=1';
// un role précis associé ?
if(!empty($params['idrole'])) {
$sql .= ' AND om.idrole='.((int)$params['idrole']);
}
$tabcontent = $this->queryAll($sql);
$fields = array('idcontact','type','organisation','url_clean');
$object_multimedia = $conn->getRepository(ObjectMultimedia::class);
foreach(array_keys($tabcontent) as $k) {
// checker si c'est un partenaire
$partenaires = $object_multimedia->getObjectsMultimedia($tabcontent[$k]['idmultimedia'],'contacts',$fields,$this->getIdrole('multimedia_partenaire'),true);
if(!empty($partenaires)) {
$tabcontent[$k]['partenaires'] = $this->noPunct($partenaires);
}
// ajouter le permalink
$tabcontent[$k]['permalink'] = $_ENV['URL_THNET'].'/video/'.$tabcontent[$k]['url_clean'];
// on peux partager ?
if(!empty($params['share'])) {
$tabcontent[$k]['share'] = true;
}
$this->setParameters(array('idcontent'=>$idobject));
$tabcontent[$k]['player'] = $this->getPlayer($tabcontent[$k]);
$this->getInfosMultimediaMore($tabcontent[$k]);
// si iPhone ou iPod ou iPad, on regarde si un contenu qui va bien
if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/iPhone|iPod|iPad|Android/', $_SERVER['HTTP_USER_AGENT'])) {
$tabcontent[$k]['user']['iphone'] = true;
}
}
//retourner les contenus multimedia
if(!empty($tabcontent) && !empty($tabcontent)) {
return $tabcontent;
} else {
return null;
}
}
// }}}
// {{{ getStats()
/** Statistiques à noter pour cette vidéo
*
*
* @access protected
* @return array
* @param int $idmultimedia Identifiant de la vidéo
*/
protected function getStats($url,$idmultimedia)
{
$stats = array();
// recuperer l'url et l'encoder
$url = preg_replace('#^'.preg_quote('/','#').'#', '', $url);
// supprimer ce qu'il y a apres le ?
if (strstr($url, '?')) {
$path = substr($url, 0, strpos($url, '?'));
} else {
$path = $url;
}
$path = explode('/', trim($path, '/'));
// object et son id et url encodée
$stats['url_encoded'] = urlencode('/'.join('/',$path));
$stats['object'] = 'multimedias';
$stats['idobject'] = $idmultimedia;
return $stats;
}
// }}}
// {{{ escapeJS()
/** Echappe les chaines à insérer dans du javascript, utilisé par getPlayer()
*
*
* @param string $string
* @access protected
* @return string chaine echappée
*/
protected function escapeJS($string)
{
$js_escape = array( "\r" => '\r',
"\n" => '\n',
"\t" => '\t',
"'" => "\\'",
'\\' => '\\\\',
'"' => '\\"');
return strtr($string, $js_escape);
}
// }}}
// {{{ findPlayer()
/** Retourne le nom et la configuration du player adéquat pour le type de média
*
*
* @param string $type type de media (flv, mp3, ...)
* @param array $playerConf contient la config si un player est trouvé
* @access protected
* @return string identifiant unique du player
*/
protected function findPlayer($type, &$playerConf) {
// configuration du player
$mediaplayers = $this->players->getPlayers();
if (empty($mediaplayers) || !is_array($mediaplayers)) {
return false;
}
$url = null;
foreach($mediaplayers as $k => $v) {
if (!$v['active']) {
// player non actif
continue;
}
if (in_array($type, $v['types']) || in_array('*', $v['types'])) {
// player trouvé
$playerConf = $v;
return $k;
}
}
return false;
}
// }}}
// {{{ getImage()
/** Retourne le chemin vers l'image liée à un fichier multimedia
*
*
* @param int $idmultimedia l'identifiant ou rien pour l'objet courant
* @access protected
* @return string le chemin ou null si pas trouvé
*/
protected function getImage($idmultimedia=null)
{
if (empty($idmultimedia)) {
$idmultimedia = $this->idmultimedia;
}
if (empty($idmultimedia) || !$this->my_is_int($idmultimedia) || $idmultimedia <= 0) return null;
// image du flv/mp3
$base_url_image = 'img_tv/';
$nom_image = $idmultimedia.'.jpg';
$image_4_3 = $base_url_image.$nom_image;
$image_16_9 = $base_url_image.'prop169/'.$nom_image;
if(file_exists($_ENV['PATH_IMG'].$image_16_9)) {
// on utilise en priorité l'image 16/9 si elle existe
$image_media = $_ENV['URL_THNET'].'/images/'.$image_16_9;
} elseif (file_exists($_ENV['PATH_IMG'].$image_4_3)){
$image_media = $_ENV['URL_THNET'].'/images/'.$image_4_3;
} else {
$image_media = $_ENV['URL_THNET'].'/images/default/audio-def.jpg';
}
return $image_media;
}
// }}}
// {{{ isExtraConf()
/** test si on veut surcharger la configuration de base
*
*
* @access protected
* @return bool
* @param array $datamedia Infos sur le media, des infos complémentaires sont être ajoutées
* @param array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
*/
protected function isExtraConf()
{
}
// }}}
// {{{ makePlayerConf()
/** Construire le player
*
*
* @access protected
* @return array la configuration du player
* @param array $datamedia Infos sur le media, des infos complémentaires sont être ajoutées
* @param array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
*/
protected function makePlayerConf(&$datamedia, $extraconf=null)
{
// pour les infos complémentaires
$this->getInfosMultimediaMore($datamedia);
// id player
$player_id = 'media'.$datamedia['code'];
// début du tableau de conf
$pconf = array(
// les flashvars du ficher de config
// http://developer.longtailvideo.com/trac/wiki/Player5FlashVars
'flashvars' => array(
'aboutlink' => $_ENV['URL_THTV'], // clic droit sur jwplayer
'abouttext' => preg_replace('#^.+//#','', $_ENV['URL_THTV']), // idem
'skin' => $_ENV['URL_THTV'].'/mediaplayer/skins/thnet/thnet.xml',
'linktarget' => '_blank', // target sur le menu "?"
'bufferlength' => $this->getBufferLength(),
'titre_video' => $datamedia['sujet_titre'],
'url_video' => $_ENV['URL_THTV'].'/video/'.$datamedia['url_clean'],
'mediaid' => $datamedia['code'],
'controlbar' => 'over',
'stretching' => 'uniform',
//'debug' => 'console',
),
// les paramètres et attributs pour le embed ou le js
'params' => array(
'allowscriptaccess' => 'always',
'allowfullscreen' => 'true',
'wmode' => 'opaque',
),
'attributes' => array(
'id' => $player_id,
'name' => $player_id,
),
'playerid' => $player_id, // idenfiiant
//'urlxmlconfig' => $_ENV['URL_THTV'].'/player/view/media/'.$datamedia['code'], // fichier de conf xml
'movie' => $_ENV['URL_THTV'].'/video/swf/'.$datamedia['code'], // film
'movie_simple' => $_ENV['URL_THTV'].'/video/swf/'.$datamedia['code'], // film sans parametre
'extra_js' => '',
'required' => '9.0.28.0', // version de flash requise
);
// redéfinition de flashvars
if(!empty($extraconf['flashvars'])) {
foreach($pconf['flashvars'] as $k=>$v) {
if(array_key_exists($k, $extraconf['flashvars'])) {
if($extraconf['flashvars'][$k]===false) {
unset($pconf['flashvars'][$k]);
} else {
$pconf['flashvars'][$k] = $extraconf['flashvars'][$k];
}
}
}
}
/*if(!empty($datamedia['status']) && $datamedia['status']!=1
&& $GLOBALS['context']['session']->get('idextranetuser')!=$infos['idextranetuser']
&& $GLOBALS['context']['session']->get('isroot')!=1) {
$pconf['repeat'] = 'always';
}*/
// paramètres a passer en plus à l'url du movie
// et qui sera recu dans le fichier de config
if (!empty($this->parameters)) {
$params_string = '';
foreach($this->parameters as $k => $v) {
if ($params_string) $params_string .= '&';
$params_string .= $k.'='.urlencode($v);
}
$pconf['movie'] .= urlencode('?'.urlencode($params_string));
}
// dimensions
$pconf['width'] = 0;
$pconf['height'] = 0;
// on a defini d'autres dimensions ?
$grow = true;
if(!empty($this->parameters) && is_array($this->parameters)) {
if (isset($this->parameters['width']) && $this->parameters['width']>0) $pconf['width'] = $this->parameters['width'];
if (isset($this->parameters['height']) && $this->parameters['height']>0) $pconf['height'] = $this->parameters['height'];
if (isset($this->parameters['grow'])) $grow = $this->parameters['grow'];
}
// démarrage automatique
if(isset($_REQUEST['autostart']) && empty($GLOBALS['autostart'])) {
$GLOBALS['autostart'] = 1; // empêche d'avoir plusieurs players en autostart sur une page
$pconf['flashvars']['autostart'] = 'true';
}
// **** JW FLASH PLAYER ****
// dimensions
if($pconf['width'] <= 0 && $pconf['height'] <= 0) {
$pconf['width'] = (isset($datamedia['flv_width'])) ? $datamedia['flv_width'] : $datamedia['flvWidth'];
$pconf['height'] = (isset($datamedia['flv_height'])) ? $datamedia['flv_height'] : $datamedia['flvHeight'];
} elseif (!($pconf['width'] > 0 && $pconf['height'] > 0)) {
$dw = $datamedia['flv_width'];
$dh = $datamedia['flv_height'];
if ($pconf['width'] > 0 && $dw > 0) {
if (!$grow && $pconf['width'] > $dw) $pconf['width'] = $dw;
$pconf['height'] = round($pconf['width'] * ($dh/$dw));
} else if ($dh > 0) {
if (!$grow && $pconf['height'] > $dh) $pconf['height'] = $dh;
$pconf['width'] = round($pconf['height'] * ($dw/$dh));
}
}
// si c'est audio et que height=0
if(empty($pconf['height'])) {
$pconf['height'] = $pconf['width'];
}
// mettre à true pour récupérer les états du player dans la console FF3
$debug_player = false;
if ($debug_player) {
$pconf['extra_js'] = '
function tracecall'.$datamedia['idmultimedia'].'(aMsg) {
setTimeout(function() { throw new Error("[debug'.$datamedia['idmultimedia'].'] " + aMsg); }, 0);
}';
$pconf['flashvars']['tracecall'] = 'tracecall'.$datamedia['idmultimedia'];
}
// on va checker les formats et actuellement, on affiche uniquement le flv ICI LES TEST
if (!empty($_ENV['USE_FLV_STREAMER']) && $_ENV['USE_FLV_STREAMER'] && !empty($datamedia['formats']['flv'])) {
// sur le cloud : streamer : http://developer.longtailvideo.com/trac/wiki/Player5MediaProviders
if($datamedia['use_cloud']==1) {
// le stream amazon
$cloudfront_dns = 'stream.theatre-contemporain.net';
//$cloudfront_dns = 's24rkom4lz2n10.cloudfront.net';
$rtmp_cloudfront_dns = 'rtmp://'.$cloudfront_dns.'/cfx/st';
$pconf['flashvars']['provider'] = 'rtmp';
$pconf['flashvars']['streamer'] = $rtmp_cloudfront_dns;
$path_file = 'flv/'.$datamedia['formats']['flv']['medianame'];
$set_secure = true;
// création de la signature pour le contenu cloudfront
if($set_secure) {
require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
$cloudfront = new AmazonCloudFront();
$url_media = $cloudfront->get_private_object_url($cloudfront_dns.'/cfx/st', $path_file, '+4 hours');
$path_file = str_replace($rtmp_cloudfront_dns.'/', '', $url_media); // supprimer le prefix
}
// fichier final
$pconf['flashvars']['file'] = $path_file;
} else { // via le serveur lighttpd => pseudo streaming
$pconf['flashvars']['file'] = $_ENV['FLV_STREAMER_HOST'].'/flv/'.$datamedia['formats']['flv']['medianame'];
$pconf['flashvars']['provider'] = 'http';
}
} else {
// lecture simple
if(!empty($datamedia['mediatype']) && !empty($datamedia['formats'][$datamedia['mediatype']]['mediaurl'])) {
$pconf['flashvars']['file'] = $datamedia['formats'][$datamedia['mediatype']]['mediaurl'];
} else {
$pconf['flashvars']['file'] = 'null';
error_log('Impossible de trouver ce fichier vidéo '.$datamedia['idmultimedia'].' '.$_SERVER['REQUEST_URI']);
}
}
/* Statistiques */
// clé prévention flood de stats (doit correspondre avec la verif dans logVideoStats())
$key = md5($_ENV['URL_THTV'].date('Ymd'));
// valuers communes
$params_stats_callback = array(
'code' => $datamedia['code'], // code de la vidéo
'idmultimedia' => $datamedia['idmultimedia'], // identifiant de la vidéo
'key' => $key,
);
// debug
if (!empty($_SERVER['SPECIAL_ID'])) {
$params_stats_callback['dbg'] = 1;
}
// stats complexes
if (!empty($this->parameters['url'])
&& !empty($this->parameters['module'])) {
// idcontent ?
if (!empty($this->parameters['idcontent'])) {
$idcontent = (int)$this->parameters['idcontent'];
} else {
$idcontent = 0;
}
// récupérer l'url encodé
$urlstats = $this->getStats($this->parameters['url'], $datamedia['idmultimedia']);
if (!empty($urlstats)) {
// mettre le parametre dbg à 1 pour le mode debug (cf. logVideosStats())
$params_stats_callback += array(
'url' => $urlstats['url_encoded'],
'module' => $this->parameters['module'],
'idcontent' => $idcontent,
'object' => $urlstats['object'],
'idobject' => (int)$urlstats['idobject'],
);
foreach($params_stats_callback as $kparam=>$vparam) {
$params_stats_tab[] = $kparam.'='.$vparam;
}
if(!empty($extraconf['flashvars']['plugins']['yourlytics-1']) && $extraconf['flashvars']['plugins']['yourlytics-1']!==false) {
$pconf['flashvars']['yourlytics.callback'] = $_ENV['URL_THTV'].'/stats/store?'.join('&', $params_stats_tab);
}
}
}
// stats simple : si yourlytics.callback n'existe pas = stats classique
if(empty($pconf['flashvars']['yourlytics.callback'])) {
$params_stats_tab = array(); // redéclare
foreach($params_stats_callback as $kparam=>$vparam) {
$params_stats_tab[] = $kparam.'='.$vparam;
}
if(isset($extraconf['flashvars']['plugins']['yourlytics-1'])) {
if($extraconf['flashvars']['plugins']['yourlytics-1']!==false) {
$pconf['flashvars']['yourlytics.callback'] = $_ENV['URL_THTV'].'/stats/store?'.join('&', $params_stats_tab);
}
} else {
$pconf['flashvars']['yourlytics.callback'] = $_ENV['URL_THTV'].'/stats/store?'.join('&', $params_stats_tab);
}
}
// plugins des stats = premier de la liste
$pconf['flashvars']['plugins'] = array();
// ajouter les plugins
// stats
if(isset($extraconf['flashvars']['plugins']['yourlytics-1'])) {
if($extraconf['flashvars']['plugins']['yourlytics-1']!==false) {
$pconf['flashvars']['plugins']['yourlytics-1'] = $extraconf['flashvars']['plugins']['yourlytics-1'];
}
} else {
$pconf['flashvars']['plugins']['yourlytics-1'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/yourlytics-1/yourlytics-1.swf';
}
// facebook
if(isset($extraconf['flashvars']['plugins']['facebook'])) {
if($extraconf['flashvars']['plugins']['facebook']!==false) {
$pconf['flashvars']['plugins']['facebook'] = $extraconf['flashvars']['plugins']['facebook'];
}
} else {
$pconf['flashvars']['plugins']['facebook'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/thnet_facebook/thnet_facebook.swf';
}
// partage
if($datamedia['status']==1) {
// si extraconf redéfini sharing
if(isset($extraconf['flashvars']['plugins']['sharing'])) {
if($extraconf['flashvars']['plugins']['sharing']!==false) {
$pconf['flashvars']['plugins']['sharing'] = $extraconf['flashvars']['plugins']['sharing'];
}
} else {
$pconf['flashvars']['plugins']['sharing'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/thnet_sharing/thnet_sharing.swf';
}
}
// plugin vidéo en relation
if(!isset($extraconf['flashvars']['plugins']['related']) ||
(isset($extraconf['flashvars']['plugins']['related']) && $extraconf['flashvars']['plugins']['related']!==false)) {
$pconf['flashvars']['plugins']['related'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/related/related.swf';
$conf_related = array(
'file' => $_ENV['URL_THTV'].'/player/related/media/'.$datamedia['code'], // le fichier RSS
'usedock' => 'false', // ne pas afficher l'icone
'heading' => 'Vidéos associées', // on remplace l'anglais
'dimensions' => '160x90', // dimensions des images
);
foreach($conf_related as $d=>$r) {
$pconf['flashvars']['related.'.$d] = $r;
}
}
// tooltip timeslider
if(!isset($extraconf['flashvars']['plugins']['timeslidertooltipplugin-1']) ||
(isset($extraconf['flashvars']['plugins']['timeslidertooltipplugin-1']) && $extraconf['flashvars']['plugins']['timeslidertooltipplugin-1']!==false)) {
$pconf['flashvars']['plugins']['timeslidertooltipplugin-1'] = 'timeslidertooltipplugin-1';
$pconf['flashvars']['timeslidertooltipplugin.marginbottom'] = 12;
}
// plugin google analytics en production
if(empty($GLOBALS['special_id']) && !empty($extraconf['flashvars']) && empty($extraconf['flashvars']['plugins']['gapro-1']) && $extraconf['flashvars']['plugins']['gapro-1']!==false) {
$pconf['flashvars']['plugins']['gapro-1'] = 'gapro-1';
$pconf['flashvars']['gapro.accountid'] = 'UA-2955171-16';
}
// pour plugin partenaires/titre => actif même quand pas de partenaire
if(!isset($extraconf['flashvars']['plugins']['partenaires']) ||
(isset($extraconf['flashvars']['plugins']['partenaires']) && $extraconf['flashvars']['plugins']['partenaires']!==false)) {
$pconf['flashvars']['plugins']['partenaires'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/thnet_partenaire/thnet_partenaire.swf';
if(!empty($datamedia['partenaires'])) {
// si plusieurs, string et renvoi sur thtv
if(count($datamedia['partenaires'])>1) {
foreach($datamedia['partenaires'] as $k=>$v) {
$pconf['flashvars']['thnet_partenaire.nom'] = $v['organisation'];
if(isset($v['link_on_video']) && $v['link_on_video']==1) {
$pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THTV'].'/videos/contact/'.$v['url_clean'].'/';
} else {
$pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THNET'].'/contacts/'.$v['url_clean'].'/';
}
break;
}
/*$pconf['flashvars']['thnet_partenaire.nom'] = join(', ', $partenaires);
$pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THTV'].'/video/'.$datamedia['url_clean'];*/
} else {
foreach($datamedia['partenaires'] as $k=>$v) {
$pconf['flashvars']['thnet_partenaire.nom'] = $v['organisation'];
if(isset($v['link_on_video']) && $v['link_on_video']==1) {
$pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THTV'].'/videos/contact/'.$v['url_clean'].'/';
} else {
$pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THNET'].'/contacts/'.$v['url_clean'].'/';
}
}
}
}
}
// gestion de la hd720
if(!empty($datamedia['formats']['hd720']) && !empty($datamedia['formats']['hd720']['medialocalpath']) && file_exists($datamedia['formats']['hd720']['medialocalpath'])) {
$pconf['flashvars']['plugins'][] = $_ENV['URL_THTV'].'/mediaplayer/plugins/HD/HD.swf';
$pconf['flashvars']['hd.file'] = $datamedia['formats']['hd720']['mediaurl'];
}
// largeur hauteur pour embed
$pconf['width'] = (isset($datamedia['flv_width'])) ? $datamedia['flv_width'] : $datamedia['flvWidth'];
$pconf['height'] = (isset($datamedia['flv_height'])) ? $datamedia['flv_height'] : $datamedia['flvHeight'];
// ajouter le logo audio
if(!empty($datamedia['mediatype']) && $datamedia['mediatype']=='mp3') {
$pconf['flashvars']['logo'] = $_ENV['URL_THTV'].'/mediaplayer/audio.png';
$pconf['flashvars']['logo.hide'] = false;
}
// image de la video
if (!empty($datamedia['image_media'])) {
$pconf['flashvars']['image'] = $datamedia['image_media'];
}
// pour la barre de controle => utile seulement sur l'ancienne skin
//$pconf['height'] += 20;
// ajout des flashvars,params et/ou attributes provenant d'une propriété ou d'un paramètre
if (empty($extraconf)) {
$extraconf = array();
}
foreach(array('flashvars', 'params', 'attributes') as $name) {
// si le paramètre est vide, on essaye d'utiliser la propriété de l'objet
if (empty($extraconf[$name]) && !empty($this->$name) && is_array($this->$name)) {
$extraconf[$name] = $this->$name;
}
if (!empty($extraconf[$name]) && is_array($extraconf[$name])) {
$pconf[$name] += $extraconf[$name];
}
}
// liste des plugins en string
$pconf['flashvars']['plugins'] = join(',', $pconf['flashvars']['plugins']);
// =>>> ajouté au array datamedia par référence
// sélection du player en fonction du type de fichier
$playerConf = null;
$useplayer = false;
if(!empty($datamedia['mediatype'])) {
$useplayer = $this->findPlayer($datamedia['mediatype'], $playerConf);
}
if ($useplayer === false) return '';
$more_datamedia = array(
'playerid' => $player_id,
'embed_old' => $this->getEmbedCode($pconf), // code d'exort swf
'embed' => $this->getEmbedCode($pconf, true), // code d'exort iframe
'embeddiv' => $this->getEmbedCode($pconf, true, true), // code d'export iframe responsive
'div_width' => $pconf['width'].'px', // taille div
'div_height' => $pconf['height'].'px', // idem
'mediaplayer' => true,
'is_'.$useplayer => true,
);
foreach($more_datamedia as $k=>$v) {
$datamedia[$k] = $v;
}
// si le player n'est pas capable d'afficher l'image, on la passe au template
if (empty($playerConf['image']) && $datamedia['image_media']) {
$datamedia['external_image_display'] = true;
}
return $pconf;
}
// }}}
// {{{ getPlayer()
/** Construire le player
*
*
* @access public
* @return string le code pour le player
* @param array $datamedia Infos sur le media, des infos complémentaires peuvent être ajoutées
* @param array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
*/
public function getPlayer(&$datamedia, $extraconf=null)
{
$pconf = $this->makePlayerConf($datamedia, $extraconf);
if(!empty($pconf)) {
return $this->makePlayerEmbedJS($pconf);
}
}
// }}}
// {{{ getPlayerXMLConfig()
/** Construire le player
*
*
* @access public
* @return string xml de la config
* @param array $datamedia Infos sur le media, des infos complémentaires peuvent être ajoutées
* @param array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
*/
public function getPlayerXMLConfig(&$datamedia, $extraconf=null)
{
$pconf = $this->makePlayerConf($datamedia, $extraconf);
if(!empty($pconf)) {
$xml = '<config>'."\n";
// configuration XML à partir des flashvars
foreach($pconf['flashvars'] as $k => $v) {
$xml.="\t".'<'.$k.'>'.htmlspecialchars($v, ENT_COMPAT, 'UTF-8').'</'.$k.'>'."\n";
}
$xml .= '</config>'."\n";
return $xml;
}
}
// }}}
// {{{ getPlayerArrayConfig()
/** Retourner le array du player
*
*
* @access public
* @return array array de la config
* @param array $datamedia Infos sur le media, des infos complémentaires peuvent être ajoutées
* @param array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
*/
public function getPlayerArrayConfig(&$datamedia, $extraconf=null) { return $this->makePlayerConf($datamedia, $extraconf); }
// }}}
// {{{ makePlayerEmbedJS()
/** Génére le code pour le player portable en JS
*
*
* @param array $pconf conf du player
* @access public
* @return string
*/
public function makePlayerEmbedJS($pconf)
{
// generation de l'objet swf et de sa configuration
$player = '<script type="text/javascript">'."\n";
$player .= '
/* <![CDATA[ */'."\n";
// javascript optionnel
if (!empty($pconf['extra_js'])) {
$player .= $pconf['extra_js'];
}
// on redefinie le table flashvars car tout est dans le xml
$pconf['flashvars'] = array(
'width' => $pconf['width'],
'height' => $pconf['height'],
);
// autostart ?
if(!empty($GLOBALS['autostart'])) {
$pconf['flashvars']['autostart'] = true;
}
// ajout de flashvars, params, attributes
foreach(array('flashvars','params', 'attributes') as $name) {
$f = '';
if (!empty($pconf[$name]) && is_array($pconf[$name])) {
foreach ($pconf[$name] as $k => $v) {
if ($f) $f .= ",\n";
$f .= ' '.$k.':"'.$this->escapeJS($v).'"';
}
}
$player .= 'var '.$name.' = {'."\n".$f."\n".'};'."\n";
}
$player .= '
swfobject.embedSWF("'.$pconf['movie'].'","'.$pconf['playerid'].'","'.$pconf['width'].'","'.$pconf['height'].'","'.$pconf['required'].'", "'.$_ENV['URL_THNET'].'/navigation/js/swfobject/expressInstall.swf",flashvars,params,attributes,hideVideo);'."\n";
$player .= '/* ]]> */'."\n";
$player .= '</script>'."\n";
/*$file = 'http://thnet-yvestan:15001/h264/h264-4539.mp4';
//"http.startparam":"starttime",
$player = '<script type="text/javascript">'."\n";
$player .= '
jwplayer("myElement").setup({
file: "'.$file.'",
startparam:"start",
primary:"flash",
image: "/uploads/myPoster.jpg"
});';
$player .= '</script>'."\n";*/
return $player;
}
// }}}
// {{{ makeJsonLD()
/** Génére le code en js+ld pour les moteurs de recherche
*
*
* @access public
* @return string
*/
public function makeJsonLD($infos)
{
$format_default = $infos['format_default'];
$jsonld = '
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "VideoObject",';
$titre = str_replace('"','', $infos['sujet_titre']);
$jsonld .= '"name": "' .$titre .'",';
$jsonld .= '"description": "'.$infos['description'].'",
"thumbnailUrl": "'.$_ENV['URL_THNET'].'/images/img_tv/'.$infos['idmultimedia'].'.jpg",';
if(!empty($infos['date'])){
$date = $this->getFormeDate($infos['date'],$GLOBALS['format_date']['fr']);
$jsonld .= '"uploadDate": "'.$date.'",';
}
// $jsonld .= ' "duration": "'.$infos['duree_site_sec_human'].'",
//
// "contentUrl": "'.$infos['formats'][$format_default]['mediaurl'].'",
// "embedUrl": "'.$_ENV['URL_THNET'].'/embed/'.$infos['code'].'"
// }
// </script>';
// "publisher": {
// "@type": "Organization",
// "name": "{contact[organisation]}",
// "logo": {
// "@type": "ImageObject",
// "url": "{profilepicture}",
// "width": 90,
// "height": 90
// }
// },
return $jsonld;
}
// }}}
// {{{ getEmbedCode
/** Génére le code pour le player portable (object/embed)
*
*
* @param array $pconf conf du player
* @access public
* @return string
*/
public function getEmbedCode($pconf,$iframe=false, $iframe_reponsive = false)
{
$pconf['width'] = 480;
$pconf['height'] = 405;
$out = '';
if($iframe_reponsive){
$out .= '<div style="position:relative;width:100%;display:inline-block;">';
}
if($iframe) {
// $out .= '<iframe allowFullScreen=“true” src="'.str_replace('video/swf','embed',$pconf['movie_simple']).'" style="border:none;position:absolute;top:0;left:0;width:100%;height:100%;"></iframe>';
$out .= '<iframe width="560" height="315" allowFullScreen src="'.str_replace('video/swf','embed',$pconf['movie_simple']).'"></iframe>';
} else {
$out = '<object width="'.$pconf['width'].'" height="'.$pconf['height'].'">';
$out .= '<param name="movie" value="'.$pconf['movie_simple'].'"></param>';
foreach($pconf['params'] as $k => $v) {
$out .= '<param name="'.$k.'" value="'.htmlspecialchars($v, ENT_COMPAT, 'UTF-8').'"></param>';
}
$out .= '<embed src="'.$pconf['movie_simple'].'" type="application/x-shockwave-flash" width="'.$pconf['width'].'" height="'.$pconf['height'].'"';
foreach($pconf['params'] as $k => $v) {
$out .= ' '.$k.'="'.htmlspecialchars($v, ENT_COMPAT, 'UTF-8').'"';
}
$out .= '></embed></object>';
}
if($iframe_reponsive){
$out .= '</div>';
}
return $out;
}
// }}}
// {{{ setParameters()
/** Définit les paramètres à passer au player
*
*
* @param array $parameters paramètres
* @access public
* @return void
*/
public function setParameters($parameters=array()) { $this->parameters = array_merge($this->parameters, $parameters); }
// }}}
// {{{ setStatsParameters()
/** Définit les paramètres à passer au player pour les stats
*
*
* @param array $parameters paramètres
* @access public
* @return void
*/
public function setStatsParameters($url=null,$module=null)
{
if (!isset($url)) $url = $_SERVER['REQUEST_URI'];
if (!isset($module)) $module = $GLOBALS['context']['module'];
$this->setParameters(array('url' => $url, 'module'=> $module));
}
// }}}
// {{{ setDimensions()
/** Définit les dimensions d'affichage du média
*
*
* @param array $dimensions height = hauteur, width = largeur , grow autorise ou non l'agrandissement du media
* @access public
* @return void
*/
public function setDimensions($dimensions=array())
{
if (!isset($dimensions['width'])) $dimensions['width'] = 0;
if (!isset($dimensions['height'])) $dimensions['height'] = 0;
if (!isset($dimensions['grow'])) $dimensions['grow'] = true;
$dimensions['width'] = (int)$dimensions['width'];
$dimensions['height'] = (int)$dimensions['height'];
// en pourcentage
if(!empty($dimensions['percent'])) {
$dimensions['width'] = $dimensions['width'].'%';
$dimensions['height'] = $dimensions['height'].'%';
}
$dimensions['grow'] = !!$dimensions['grow'];
$this->setParameters($dimensions);
}
// }}}
// {{{ getVignetteMultimedia()
/** Récupére la vignette d'un document multimedia ou la cree si besoin
*
* @access public
* param int $idmultimedia identifiant du document multimédia
* @return string
*/
public function getVignetteMultimedia($idmultimedia=null,$format=array())
{
if(empty($idmultimedia)) {
$idmultimedia = $this->idmultimedia;
}
// par default : image normal 100px x 100px qualite 75
if($format) {
$set_format = $format;
} else {
$set_format = (array('width'=>93,'height'=>70,'direction'=>'crop','fleche'=>'moyen'));
}
$this->images->setVignetteFormat($set_format);
return $this->images->getVignetteObject($idmultimedia,'multimedias','image');
}
// }}}
// {{{ getStaticThumbnail()
/** Récupére la vignette d'un document multimedia et lui donne le nom du code
*
* @access public
* param int $code identifiant du document multimédia
* @return string
*/
public function getStaticThumbnail($idmultimedia,$code,$width=140,$format=array())
{
if(empty($code)) {
$code = $this->code;
}
// generation par la classe Images
if(!isset($this->images)) {
$this->images = Images::getInstance($this->getEntityManager());
}
$params_thumb = array(
'basedir' => 'video/',
'other_directory' => $_ENV['PATH_IMG'].'img_tv',
'no_ext_dir' => true,
'baseimgfile' => $code,
);
return $_ENV['URL_DIRECTORYUPLOAD'].$this->images->getThumbnail($idmultimedia.'.jpg',$width,'thumb',$params_thumb);
}
// }}}
// {{{ getIdrole()
/** relation entre le type et l'idrole
*
* @access public
* @return string
* @param string $type Type recherché
*/
public function getIdrole($type)
{
$roles = array(
'multimedia_auteur' => '21',
'multimedia_acteur' => '5',
'multimedia_intervenant' => '25',
'multimedia_metteur' => '1',
'multimedia_contact' => '22',
'multimedia_partenaire' => '23',
//'multimedia_spectacle_trailer' => '24',
//'multimedia_text_trailer' => '24',
);
if(!array_key_exists($type,$roles)) {
return null;
}
return $roles[$type];
}
// }}}
// {{{ getInfosVideoTete()
/** Une vidéo de tête
*
* @access public
* @return string
* @param string $type Type recherché
*/
public function getInfosVideoTete($infos_row,$partenaires=true,$dimensions=array('width'=>'280','height'=>'210'))
{
$conn = $this->getEntityManager();
$video_tete = array();
// infos sur le spectacle
if(isset($infos_row['spectacle'])) {
$video_tete['spectacle'] = $infos_row['spectacle'];
if(!empty($infos_row['spectacle']['multimedia'])){
$idmultimedia = $infos_row['spectacle']['multimedia']['idmultimedia'];
}
}
// idmultimedia
if(isset($infos_row['idmultimedia'])) {
$idmultimedia = $infos_row['idmultimedia'];
}
// change la taille pour la video de tete
$this->setDimensions($dimensions);
// recup des infos de la vidéo de tete
$datamedia = $this->getInfosMultimedia($idmultimedia,false,true);
// partenariat
if($partenaires) {
$fields = array('idcontact','type','organisation','url_clean');
$object_multimedia = $conn->getRepository(ObjectMultimedia::class);
$partenaires = $object_multimedia->getObjectsMultimedia($idmultimedia,'contacts',$fields,$this->getIdrole('multimedia_partenaire'),true);
if(!empty($partenaires)) {
$partenaires = $this->noPunct($partenaires);
$datamedia['partenaires'] = $this->noPunct($partenaires);
}
}
if(!empty($datamedia)) {
$video_tete['media'][] = $datamedia;
}
// trouver la prochaine date et lieu du spectacle lié
if(isset($infos_row['spectacle'])) {
$spectacles = $conn->getRepository(Spectacles::class);
$video_tete['spectacle'] += $spectacles->getProchDateLieu(array('prochains' => true) ,$infos_row['spectacle']['idspectacle']);
}
return $video_tete;
}
// }}}
// {{{ getCountMultimedias()
/** Retourne le nombres de vidéos
*
* Retourne le nombres de vidéos au format "standard"
*
* @access public
* @return array
* @param array $params_sql paramètre pour la requete SQL
* @param array $params_tab paramètre pour la requete SQL
* @param array $format de la vignette si pas standard
* @param bool $debug mode débugage
*/
public function getCountMultimedias($params_sql=null)
{
// si pas de tableau
if(!isset($params_sql['special'])) {
$params_sql['special'] = array();
}
if(!isset($params_sql['params'])) {
$params_sql['params'] = array();
}
// construction de la requête avec le passage de paramètres
$sql = $this->getSQLMultimedias($params_sql);
$dbg = (empty($params_sql['dbg'])) ? array() : $dbg = $params_sql['dbg'];
return $this->queryOne($sql,$dbg);
}
// }}}
// {{{ getListMultimedias()
/** Retourne des listes de vidéos
*
* Retourne des listes de vidéo au format "standard""
*
* @access public
* @return array
* @param array $params_sql paramètre pour la requete SQL
* @param array $params_tab paramètre pour la requete SQL
* @param array $format de la vignette si pas standard
* @param bool $debug mode débugage
*/
public function getListMultimedias($params_sql=null,$format_vignette=array(),$params_display=array())
{
$conn = $this->getEntityManager();
// si pas de tableau
if(!isset($params_sql['special'])) {
$params_sql['special'] = array();
}
if(!isset($params_sql['params'])) {
$params_sql['params'] = array();
}
// construction de la requête avec le passage de paramètres;
$sql = $this->getSQLMultimedias($params_sql);
// vignettes
if(empty($params_display['format_vignette'])) {
// defaut
$format_vignette = array('width'=>$_ENV['VIGN_VIDEO_WIDTH'],'height'=>$_ENV['VIGN_VIDEO_HEIGHT'],'fleche'=>'none','ratio' => '169');
// carré et sans fleche pour l'API
if(!empty($params_display['api'])) {
$format_vignette = array('width'=>115,'height'=>115,'direction'=>'crop','fleche'=>'none');
}
}
if(!empty($params_display['display'])) {
$display = $params_display['display'];
unset($params_display['display']);
} else {
$display = array();
}
// pour les prochaines date du spectacle
$spectacles = $this->getEntityManager()->getRepository(Spectacles::class);
// paramètre de debug
$dbg = (empty($params_sql['dbg'])) ? array() : $dbg = $params_sql['dbg'];
// executer la requete
$this->query($sql,$dbg);
$videos = array();
// donnée entières ?
if(empty($params_display['alldata'])) {
$params_display['alldata'] = false;
}
// debug
$start_boucle = microtime(true);
// on boucle
while($this->fetch()) {
$idmultimedia = $this->idmultimedia;
if(!empty($params_sql['fields'])) {
foreach($params_sql['fields'] as $f) {
$videos[$idmultimedia][$f] = $this->$f;
}
} else {
if(!empty($params_display['api'])) {
$videos[$idmultimedia] = $this->getInfosMultimedia($idmultimedia,false,true,array('vignette' => $format_vignette, 'tableau' => true, 'display' => $display));
} else {
$videos[$idmultimedia] = $this->getInfosMultimedia($idmultimedia,false,$params_display['alldata'],array('vignette' => $format_vignette, 'tableau' => true, 'display' => $display));
}
$videos[$idmultimedia]['description_wiki'] = $this->description;
$videos[$idmultimedia]['description_html'] = $this->wikiTransform($this->description, $this->markdown);
$videos[$idmultimedia]['description'] = strip_tags($videos[$idmultimedia]['description_html']);
$videos[$idmultimedia]['description_courte'] = $this->cutSentence($videos[$idmultimedia]['description'],45,true);
$videos[$idmultimedia]['dateinsert'] = $this->getFormeDate($this->dateinsert);
$videos[$idmultimedia]['url_clean'] = $this->url_clean;
}
// conversion du array pour la version API
if(!empty($params_display['api'])) {
$videos[$idmultimedia] = $this->getApiTab($videos[$idmultimedia]);
}
// récupèration du calendrier
if(!empty($params_display['get_schedule']) && isset($this->idspectacle)) {
$params_schedule = array('prochains' => true);
if(!empty($params_display['get_schedule_ville'])){
$params_schedule['area'] = $params_display['get_schedule_ville'];
}
$contact_id = $this->idcontact;
if(!empty($params_display['get_schedule_contact'])){
$contact_id = $params_display['get_schedule_contact'];
}
if(!empty($params_display['anciens'])){
$params_schedule['anciens'] = true;
}
$a = $videos[$idmultimedia]['spectacle'] = $conn->getRepository(Spectacles::class)->getInfosSpectacle($this->idspectacle);
if($params_display['get_schedule']=='plus_proche') {
$contact_id = null;
}
$videos[$idmultimedia]['spectacle']['schedule'] = $conn->getRepository(Spectacles::class)->getProchDateLieu(
$params_schedule,
$this->idspectacle,
$contact_id
);
}
}
// debug de la boucle
if($this->isTraceMode('list_object')) {
$this->setTraceInfos(array(
'execution_time_boucle' => microtime(true) - $start_boucle,
'nb_occurence' => count($videos),
'dbg' => $dbg,
));
}
$this->free();
return $videos;
}
// }}}
// {{{ getSQLMultimedias()
/** Générer la requete standard pour des vidéos
*
* $params = array(
* 'select' => champs en plus pour le select,
* 'from' => champs en plus pour le from,
* 'where' => paramètres en plus le where,
* 'order' => classement des résultats,
* 'limit' => limiter le nb de résultats array(debut,fin), (all pour pas de limit)
* )
* $special = array(
* 'select_by_text_or_adaptation' => text et adaptation,
* 'prochains' => true = date dans le future, un entier = fait un between
* 'anciens' =>
* 'join' => jointure gauche sur contacts et schedules
* )
*
*
* @access public
* @param array $params Les paramètres pour la requete
* @param array $special Les paramètres supplémentaires
* @param bool $debug afficher la requête TODO
* @return string
*/
public function getSQLMultimedias($query=array(),$debug=false)
{
// on prepare les tableaux
foreach(array('select','from','where','order','group','limit') as $t) {
if(!empty($query[$t])) {
if(!is_array($query[$t])) {
$query[$t][] = $query[$t];
} else {
$query[$t] = $query[$t];
}
} else {
$query[$t] = array();
}
}
// champs par défaut
if(empty($query['count_only_spectacles']) && empty($query['only_custom_select'])){
$this->addSQLParams('select',$query,array(
array('multimedias' => '*')
));
}
// publié ou pas
if(empty($query['publish']) && $_ENV['CHECK_IF_ONLINE']) {
$this->addSQLParams('where',$query,array(
array('multimedias','publish',1)
));
} elseif(!empty($query['publish'])) {
$this->addSQLParams('where',$query,array(
array('multimedias','publish',$query['publish'])
));
}
// langue spécifique ?
if(!empty($query['language'])) {
$this->addSQLParams('where',$query,array(
array('multimedias','language',$query['language'],'AND')
));
}
// recherche par liaison via object_multimedia
if(!empty($query['multimedia_extranetuser'])) {
// 3 tables de recherche
$this->addSQLParams('from',$query,array(
'multimedia_extranetuser',
'multimedias'
));
// jointure entre les 3 tables
$this->addSQLParams('join',$query,array(
'multimedias.`idmultimedia`' => 'multimedia_extranetuser.`idmultimedia`',
));
// pas d'idrole, du spectacle et pas de mp3
$this->addSQLParams('where',$query,array(
array('multimedia_extranetuser','idextranetuser',$query['multimedia_extranetuser']),
));
}
// recherche par liaison via object_multimedia
//recherche des vidéos par années
if(!empty($query['where_date_multimedias'])) {
$query['where'][] = ' AND multimedias.`date` BETWEEN \''.$query['where_date_multimedias']['datestart'].'\' AND \''.$query['where_date_multimedias']['dateend'].'\' ';
}
if(!empty($query['affiche'])) {
if(empty($query['count_only_spectacles'])){
$this->addSQLParams('select',$query,array(
array('spectacles' => 'idspectacle'),
array('schedules' => 'idcontact')
));
}
// 3 tables de recherche
$this->addSQLParams('from',$query,array(
'object_multimedia',
'schedules',
'spectacles',
'contacts',
'multimedias'
));
// jointure entre les 3 tables
$this->addSQLParams('join',$query,array(
'multimedias.`idmultimedia`' => 'object_multimedia.`idmultimedia`',
'schedules.`idspectacle`' => 'object_multimedia.`idobject`',
'schedules.`idspectacle`' => 'spectacles.`idspectacle`',
'spectacles.`idspectacle`' => 'object_multimedia.`idobject`',
'contacts.`idcontact`' => 'schedules.`idcontact`',
));
// pas d'idrole, du spectacle et pas de mp3
$this->addSQLParams('where',$query,array(
array('object_multimedia','object','spectacles'),
array('object_multimedia','idrole','ISNULL'),
/*array('multimedias','mp3',0),*/
));
// période
if(is_array($query['affiche'])) {
if(!empty($query['affiche']['datestart']) && !empty($query['affiche']['dateend'])) {
$query['where'][] = ' AND schedules.`date` BETWEEN \''.$query['affiche']['datestart'].'\' AND \''.$query['affiche']['dateend'].'\' ';
} else {
if(key($query['affiche'])=='today') {
// ajouter les jours
$date_debut = date('Y-m-d');
$date_fin = strftime('%Y-%m-%d',strtotime($date_debut)+$query['affiche']['today']*24*3600);
$query['where'][] = ' AND schedules.`date` BETWEEN \''.$date_debut.'\' AND \''.$date_fin.'\' ';
}
if(key($query['affiche'])=='old') {
// ajouter les jours
$date_fin = date('Y-m-d');
$date_debut = strftime('%Y-%m-%d',strtotime($date_fin)-$query['affiche']['old']*24*3600);
$query['where'][] = ' AND schedules.`date` BETWEEN \''.$date_debut.'\' AND \''.$date_fin.'\' ';
}
if(key($query['affiche'])=='old_stricts') {
$query['where'][] = ' AND schedules.`date` <\''.date('Y-m-d').'\' ';
}
if(key($query['affiche'])=='saison') {
// ajouter les jours
$date_debut = $query['affiche']['saison'][0];
$date_fin = $query['affiche']['saison'][1];
$query['where'][] = ' AND schedules.`date` BETWEEN \''.$date_debut.'\' AND \''.$date_fin.'\' ';
}
}
}
// classement par le calendrier
$this->addSQLParams('order',$query,array(
array('schedules' => 'date')
));
// du plus récent au plus anciens
if(empty($query['direction'])) {
$this->addSQLParams('direction',$query,'ASC');
}
// grouper par idspectacle
$this->addSQLParams('group',$query,array('object_multimedia' => 'idobject'));
}
if(!empty($query['novod']) && $query['novod']) {
$query['where'][] = ' AND (price=\'\' OR price IS NULL) ';
}
// recherche par liaison via object_multimedia
if(!empty($query['object'])) {
// 2 tables de recherche
$this->addSQLParams('from',$query,array(
'object_multimedia',
'multimedias'
));
// jointure entre les 2 tables
$this->addSQLParams('join',$query,array(
'multimedias.`idmultimedia`' => 'object_multimedia.`idmultimedia`',
));
// pas d'idrole, du spectacle et pas de mp3
if(is_array($query['object'])) {
foreach($query['object'] as $k=>$v) {
// si on a v array('contact',12) par exemple
if($k=='list') {
$this->addSQLParams('where',$query,array(
array('object_multimedia','object',$v[0]),
array('object_multimedia','idobject',$v[1]),
));
}
else if(is_numeric($k)) {
$this->addSQLParams('where',$query,array(
array('object_multimedia','object',$v),
array('object_multimedia','idobject',$k)
));
}
else {
if(is_array($v)) {
$this->addSQLParams('where',$query,array(
array('object_multimedia','object',key($v)),
array('object_multimedia','idobject',reset($v)),
));
} else { // si on a array('contact' => 12) par exemple
$this->addSQLParams('where',$query,array(
array('object_multimedia','object',$k),
array('object_multimedia','idobject',$v),
));
}
}
}
}
}
// recherche par liaison via multimedia_classification
if(!empty($query['idclassification'])) {
// 2 tables de recherche
$this->addSQLParams('from',$query,array(
'multimedia_classification',
'multimedias'
));
// jointure entre les 2 tables
$this->addSQLParams('join',$query,array(
'multimedias.`idmultimedia`' => 'multimedia_classification.`idmultimedia`',
));
// voir si la classification est string ou pas
if(is_array($query['idclassification'])) {
foreach($query['idclassification'] as $k=>$v) {
if(!$this->my_is_int($v)) {
$is_string = true;
} else {
$is_string = false;
}
break; // sortir
}
} else {
if(!$this->my_is_int($query['idclassification'])) {
$is_string = true;
} else {
$is_string = false;
}
}
// si la classification est string
if($is_string) {
$this->addSQLParams('from',$query,array(
'classifications',
));
$this->addSQLParams('join',$query,array(
'classifications.`idclassification`' => 'multimedia_classification.`idclassification`',
));
$this->addSQLParams('where',$query,array(
array('classifications','classification',$query['idclassification']),
));
} else {
$this->addSQLParams('where',$query,array(
array('multimedia_classification','idclassification',$query['idclassification']),
));
}
}
// uniquement un type de media
if(!empty($query['mediatype'])) {
$this->addSQLParams('where',$query,array(
array('multimedias',$query['mediatype'],1),
));
}
// recherche par type
if(!empty($query['type'])) {
$this->addSQLParams('where',$query,array(
array('multimedias','type',$query['type'])
));
}
return $this->getSQLObject($query);
}
// }}}
// {{{ getMultimediasBy()
/** Retoure la liste des idmultimedias en relation avec l'objet indiqué
*
*
* @param string $object type d'objet
* @param int $idobject identifiant de l'objet
* @param string $extrasql sql optionnel
* @access public
* @return array liste des idmultimedias (tableau unidimensionnel)
*/
public function getMultimediasBy($object, $idobject, $extrasql=null, $select=null)
{
if(!empty($select)) {
if($select=='count') {
$sql_select = ' COUNT(DISTINCT(m.idmultimedia)) ';
} else {
$sql_select = 'DISTINCT(m.idmultimedia),'.$select;
}
} else {
$sql_select = 'DISTINCT(m.idmultimedia)';
}
$sql = 'SELECT '.$sql_select.'
FROM object_multimedia om, multimedias m
WHERE om.idmultimedia=m.idmultimedia
AND om.idobject='.((int)$idobject).'
AND om.object=\''.$object.'\'
AND m.publish=1';
if (!empty($extrasql)) $sql.=' '.$extrasql;
if($select=='count') {
$countcontent = $this->queryOne($sql);
return $countcontent;
}
if(!empty($select)) {
$tabcontent = $this->queryAll($sql);
return $tabcontent;
} else {
$tabcontent = $this->queryCol($sql);
return array_unique($tabcontent);
}
}
// }}}
// {{{ getAssociateMultimedias()
/** Retourne une liste de multimedias en relation avec un autre multimedia
*
*
* @param int $idmultimedia identifiant du multimedia
* @param int $nmax nombre maximal à retourner
* @param string $extrasql sql optionnel à passer à la méthode getMultimediasBy()
* @access public
* @return array liste mélangé et semi-aléatoire d'idmultimedias
*/
public function getAssociateMultimedias($idmultimedia, $nmax=10, $extrasql=null)
{
$infos = array();
$conn = $this->getEntityManager();
$object_multimedia = $conn->getRepository(ObjectMultimedia::class);
/* on récupère les id par type */
$fields = null;
foreach(array('multimedia_auteur','multimedia_metteur', 'multimedia_acteur', 'multimedia_intervenant') as $type) {
$infos['persons'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'persons',$fields,$this->getIdrole($type));
}
foreach(array('multimedia_contact', 'multimedia_partenaire') as $type) {
$infos['contacts'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'contacts',$fields,$this->getIdrole($type));
}
foreach(array('multimedia_spectacle') as $type) {
$infos['spectacles'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'spectacles',$fields,$this->getIdrole($type));
}
foreach(array('multimedia_contents') as $type) {
$infos['contents'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'contents',$fields,'NULL');
}
/* pour chaque type, on crée une liste des idmultimedias correspondants */
$tab = array();
foreach(array_keys($infos) as $object) {
foreach($infos[$object] as $k => $v) {
$tab[$k] = array();
foreach(array_keys($v) as $idobject) {
/* on obtient la liste des idmultimedias pour ce type d'objet et cet idobject */
$nums = $this->getMultimediasBy($object, $idobject, $extrasql);
foreach($nums as $nk => $nv) {
// on ignore l'idmultimedia courant
if ($nv == $idmultimedia) {
unset($nums[$nk]);
}
}
$tab[$k] += $nums;
}
if (empty($tab[$k])) {
unset($tab[$k]);
}
}
}
/* on remplit le tableau final en prenant un idmultimedia pour chaque type au hasard
* on essaye d'en obtenir $nmax si possible */
$t = array();
if (!empty($tab)) {
$i = 0;
/* tant que nécessaire */
while ($i < $nmax) {
$keys = array_keys($tab);
if (empty($keys)) break;
/* on en prend un dans chaque sous-tableau (pour chaque type) */
foreach($keys as $key) {
/* si le tableau est vide, on le supprime */
if (empty($tab[$key])) {
unset($tab[$key]);
continue;
}
/* tant que le tableau n'est pas vide */
while (!empty($tab[$key])) {
/* on en tire un au hasard */
$val = array_rand($tab[$key]);
if (in_array($tab[$key][$val], $t)) {
/* déjà existant dans le tableau final, on le supprime et on continue */
unset($tab[$key][$val]);
continue;
}
/* on ajoute la valeur dans le tableau final */
$t[$i++] = $tab[$key][$val];
/* et on la supprime du tableau d'origine */
unset($tab[$key][$val]);
/* on passe au tableau/type suivant */
break;
}
if ($i >= $nmax) break;
}
}
}
// on mélange
shuffle($t);
// on retourne la liste des idmultimedias
return $t;
}
// }}}
// {{{ makeCode()
/** Fabrique un code unique pour un fichier multimedia
*
*
* @access public
* @return string le code
*/
public function makeCode()
{
do {
$code = $this->func->codeAlea(8);
$sql = 'SELECT idmultimedia FROM '.$this->__table.' WHERE code=\''.$code.'\' LIMIT 1';
$res = $this->queryOne($sql);
} while (!empty($res));
return $code;
}
// }}}
// {{{ getTypeMultimediaList()
/** Liste des types multimedias pour les boites de sélection
*
*
* @access public
* @return array id|label
*/
public function getTypeMultimediaList()
{
$sql = 'SELECT tm.idtypemultimedia,l.'.$GLOBALS['lng'].'
FROM typesmultimedias tm,langterms l
WHERE tm.typemultimedia=l.id
ORDER BY l.'.$GLOBALS['lng'];
$conn = $this->getEntityManager()->getConnection();
$query = $conn->executeQuery($sql);
$list = [];
$results = $query->fetchAllAssociative();
foreach($results as $result) {
$list[$result['idtypemultimedia']] = $result['fr'];
}
return $list;
}
// }}}
// {{{ getTypeMultimediaLabel()
/** Retourne le label dans la langue courante pour un type multimedia donné
*
*
* @param int $idtypemultimedia identifiant du type multimedia
* @access public
* @return string label
*/
public function getTypeMultimediaLabel($idtypemultimedia)
{
$sql_types = 'SELECT l.'.$GLOBALS['lng'].'
FROM typesmultimedias tm,langterms l
WHERE tm.typemultimedia=l.id
AND tm.idtypemultimedia='.((int)$idtypemultimedia);
return $this->queryOne($sql_types);
}
// }}}
// {{{ countMultimedias()
/** Compter le nb de documents multimédia
*
*
* @access public
* @return int
*/
public function countMultimedias($object=null,$idobject=null,$vod=false)
{
if(!empty($object) && !empty($idobject)) {
$sql_count_video = '
SELECT COUNT(DISTINCT(m.`'.$this->__idtable.'`)) as total
FROM '.$this->__table.' m, object_multimedia om
WHERE m.`publish`=1
AND om.`idmultimedia`= m.`idmultimedia`
AND om.`object`=\''.$this->escape($object).'\'
AND om.`idobject`='.(int)$idobject;
} else {
$sql_count_video = '
SELECT COUNT(DISTINCT(idmultimedia))
FROM '.$this->__table.'
WHERE 1';
}
if($vod) {
$sql_count_video .= ' AND price!=\'\' ';
}
return $this->queryOne($sql_count_video);
}
// }}}
// {{{ countObjects()
/** Compter le nb de documents par objet
*
*
* @access public
* @return int
*/
public function countObjects($object)
{
$sql_count_video = '
SELECT COUNT(DISTINCT(om.`idobject`)) as total
FROM '.$this->__table.' m, object_multimedia om
WHERE m.`publish`=1
AND om.`idmultimedia`= m.`idmultimedia`
AND om.`object`=\''.$this->escape($object).'\' ';
return $this->queryOne($sql_count_video);
}
// }}}
// {{{ countHours()
/** Compter le nb d'heure de vidéo
*
*
* @access public
* @return int
*/
public function countHours()
{
$sql_count = 'SELECT SUM(duree_site_sec) FROM multimedias WHERE publish =1 AND status <5';
$nb_secondes = $this->queryOne($sql_count);
return intval($nb_secondes / 3600);
}
// }}}
// {{{ getRelationsArray()
/** Tableau des relations
*
* @access public
* @param string|int $type le type de champ
*/
public function getRelationsArray($type=null)
{
// récupérer les relations communes
$array_types = $this->getRelationsArrayTrait('all');
$array_types += array(
// multimedia_classification idmultimedia/idclassification
'multimedia_classification' => array(// classifications associées
'type_join' => 'multiple',
'dest_table' => 'classifications',
'fields' => array('idclassification','classification','type'),
'join_table' => 'multimedia_classification',
'hide_relation' => true,
'silent_delete_relation' => true,
'description' => 'Classification(s) associée(s) à ce document multimédia',
),
// multimedia_keyword idmultimedia/idkeyword
'multimedia_keyword' => array(// mots clés associés
'type_join' => 'multiple',
'dest_table' => 'keywords',
'fields' => array('idkeyword','title','url_clean'),
'join_table' => 'multimedia_keyword',
'hide_relation' => true,
'silent_delete_relation' => true,
'description' => 'Mot(s) clé(s) associé(s) à ce document multimédia',
),
// extranetusers idextranetuser/idextranetuser
'idextranetuser' => array(// classifications associées
'type_join' => 'simple',
'dest_table' => 'extranetusers',
'join_field_src' => 'idextranetuser',
'fields' => array('idextranetuser','login','lastname','firstname'),
'description' => 'Utilisateur(s) associée(s) à ce document multimédia',
'silent_delete_relation' => true,
),
// extranetusers idextranetuser_producteur/idextranetuser
'idextranetuser_producteur' => array(// classifications associées
'type_join' => 'simple',
'dest_table' => 'extranetusers',
'join_field_src' => 'idextranetuser_producteur',
'join_field_dest' => 'idextranetuser',
'fields' => array('idextranetuser','login','lastname','firstname'),
'description' => 'Producteur(s) associée(s) à ce document multimédia',
'silent_delete_relation' => true,
),
// contacts idcontact_producteur/idcontact
'idcontact_producteur' => array(// classifications associées
'type_join' => 'simple',
'dest_table' => 'contacts',
'join_field_src' => 'idcontact_producteur',
'join_field_dest' => 'idcontact',
'fields' => array('idcontact','organisation','firstname','lastname','url_clean'),
'description' => 'Producteur(s) associée(s) à ce document multimédia',
'silent_delete_relation' => true,
),
// rated_multimedias idmultimedia/idmultimedia
/*'rated_multimedias' => array(// action sur cette fiche
'type_join' => 'simple',
'fields' => array('idmultimedia','rate','rate_count'),
'description' => 'Vote(s) sur cette vidéo',
'silent_delete_relation' => true,
'hide_relation' => true,
'do_constraint' => true, // fait avec un on delete cascade
),*/
// object_multimedia idobject/object
'multimedia_person' => array(// multimedias associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'persons',
'join_from_object' => true,
'join_table' => 'object_multimedia',
'fields' => array('idperson','lastname','firstname','url_clean'),
'description' => 'Biographie(s) associée(s) à cet enregistrement',
'silent_delete_relation' => true,
),
// object_multimedia idobject/object
'multimedia_spectacle' => array(// multimedias associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'spectacles',
'join_from_object' => true,
'join_table' => 'object_multimedia',
'fields' => array('idspectacle','title','url_clean'),
'description' => 'Spectacle(s) associé(s) à cet enregistrement',
'silent_delete_relation' => true,
),
// object_multimedia idobject/object
'multimedia_text' => array(// multimedias associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'texts',
'join_from_object' => true,
'join_table' => 'object_multimedia',
'fields' => array('idtext','title','url_clean'),
'description' => 'Texte(s) associé(s) à cet enregistrement',
'silent_delete_relation' => true,
),
// object_multimedia idobject/object
'multimedia_content' => array(// multimedias associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'contents',
'join_from_object' => true,
'join_table' => 'object_multimedia',
'fields' => array('idcontent','title','publish'),
'description' => 'Contenu(s) associé(s) à cet enregistrement',
'silent_delete_relation' => true,
),
// object_multimedia idobject/object
'multimedia_contact' => array(// multimedias associés à cet enregistrement
'type_join' => 'multiple',
'dest_table' => 'contacts',
'join_from_object' => true,
'join_table' => 'object_multimedia',
'fields' => array('idcontact','organisation','firstname','lastname','url_clean'),
'description' => 'Contact(s) associé(s) à cet enregistrement',
'silent_delete_relation' => true,
),
'multimedia_extranetuser' => array(// auteurs
'type_join' => 'multiple',
'dest_table' => 'extranetusers',
'join_table' => 'multimedia_extranetuser',
'fields' => array('idextranetuser','login','lastname','firstname'),
'description' => 'Utilisateur(s) autorisé(s) à voir cet enregistrement hors ligne',
'silent_delete_relation' => true,
),
);
if(!empty($array_types[$type])) {
$array_types[$type]['type'] = $type;
return $array_types[$type];
} else {
return $array_types;
}
}
// }}}
// {{{ getVideoFormats()
/** Format des vidéos
*
* @access public
* @return array
*/
public function getVideoFormats($format=null,$test_format=false,$idmultimedia=null)
{
// on va checker les formats
$formats = array(
'mp3' => array(
'sound' => true,
'description' => 'MP3 classique',
'extension' => 'mp3',
'format' => 'mp3',
'user_agent' => 'all',
'encodage' => array('id' => 1),
'possible_conversion' => array()
),
'flv' => array(
'description' => 'FLV classique : bas débit et ancien bonne qualité',
'extension' => 'flv',
'format' => 'flv',
'user_agent' => 'all',
'encodage' => array(
'169' => '384 par 216 384kbps flv mp3 12.5i/s mono 44100 96kbps (ou fichier d\'origine si pas de h264 disponible)',
'43' => '384 par 288 384kbps flv mp3 12.5i/s mono 44100 96kbps (ou fichier di\'origine si pas de h264 disponible)',
'id' => 3656,
),
'coconut' => 'flv:0x396_800k',
'possible_conversion' => array('h264','flv','h264m'),
'size' => array(
'16:9' => array(
'width' => '704',
'height' => '396',
'id' => 3656,
),
'4:3' => array(
'width' => '384',
'height' => '288',
'id' => 3657,
),
),
'teaser' => true,
),
'h264m' => array(
'description' => 'H264 pour iPhone/iPod',
'extension' => 'mp4',
'format' => 'h264m',
'user_agent' => array('iPhone','iPod','iPad'),
'encodage' => array(
'169' => '512 par 288 h264 768kbps h264 aac 25i/s stereo 44100 112kbps',
'43' => '512 par 288 h264 768kbps h264 aac 25i/s stereo 44100 112kbps',
'id' => 3659,
),
'coconut' => 'mp4:0x288_512k',
'possible_conversion' => array('flv')
),
'h264' => array(
'description' => 'H264 bonne qualité pour HTML5 ou Flash',
'extension' => 'mp4',
'format' => 'h264',
'user_agent' => 'all',
'encodage' => array(
'169' => '704 par 396 1500kbps h264 aac 25i/s stereo 44100 112kbps',
'43' => '600 par 450 1024kbps h264 aac 25i/s stereo 44100 112kbps',
'id' => 2592,
),
'coconut' => 'mp4:0x450_800k',
'possible_conversion' => array('flv','h264m')
),
'hd720' => array(
'description' => 'HD 720p',
'extension' => 'mp4',
'format' => 'hd720',
'encodage' => array(
'169' => '1280 par 720 2000kbps h264 aac 25i/s stereo 44100 128kbps',
'43' => 'non pris en charge, ramené en 16/9 avec bandes noires si besoin',
'id' => 3700,
),
'coconut' => 'mp4:720p_2000k',
'possible_conversion' => array('h264','h264m','flv')
),
'upload' => array(
'description' => 'Vidéo uploadée',
'extension' => 'avi',
'format' => 'upload',
'encodage' => array(
'169' => 'Défini par l\'utilisateur',
'43' => 'Défini par l\'utilisateur',
'id' => 0,
),
'possible_conversion' => array('h264','h264m','flv','hd720','hd1080','hd2160')
),
'hd1080' => array(
'description' => 'HD 1080',
'extension' => 'mp4',
'format' => 'hd1080',
'encodage' => array(
'169' => '1920 par 1080 2500kbps h264 aac 25i/s stereo 44100 128kbps',
'43' => 'non pris en charge, ramené en 16/9 avec bandes noires si besoin',
'id' => 3705,
),
'coconut' => 'mp4:1080p_3200k',
'possible_conversion' => array('hd720','h264','h264m','flv')
),
'hd2160' => array(
'description' => 'HD 2160',
'extension' => 'mp4',
'format' => 'hd2160',
'encodage' => array(
'169' => '3840 par 2160 8000kbps h264 aac 25i/s stereo 44100 128kbps',
'43' => 'non pris en charge, ramené en 16/9 avec bandes noires si besoin',
// TODO quel id ici ???? (j'ai juste ajouté +1 à l'id utilisé pour hd1080
'id' => 3706,
),
'coconut' => 'mp4:2160p_8000k',
'possible_conversion' => array('hd1080', 'hd720', 'h264', 'h264m', 'flv')
)
);
if(!empty($format) && array_key_exists($format, $formats)) {
return $formats[$format];
}
// tester si le format existe
if($test_format) {
$videos = array();
foreach($formats as $f=>$v) {
$medianame = $v['format'].'-'.$idmultimedia.'.'.$v['extension'];
if(file_exists($_ENV['PATH_MEDIAS'].$v['format'].'/'.$medianame)) {
$videos[$v['format']] = array(
'mediatype' => $v['format'],
'medianame' => $medianame,
'medialocalpath' => $_ENV['PATH_MEDIAS'].$v['format'].'/'.$medianame,
'mediaurl' => URL_MEDIAS.'/'.$v['format'].'/'.$medianame,
);
}
}
return $videos;
}
return $formats;
}
// }}}
// {{{ setViews()
/** Incrémenter le compteur de vue
*
*
* @param int $idmultimedia identifiant du document multimedia
* @param int $nb_vue Nombre de vue à ajouter
* @access public
* @return string label
*/
public function setViews($idmultimedia,$nb_view=1)
{
$sql = 'UPDATE '.$this->__table.'
SET count_view = (count_view+'.(int)$nb_view.')
WHERE idmultimedia='.(int)$idmultimedia;
$res = $this->getEntityManager()->getConnection()->executeQuery($sql);
return $res;
}
// }}}
// {{{ getSize()
/** Récupère la taille d'in fichier video avec mplayer
*
*
* @param string $file Fichier a tester
* @access public
* @return array
*/
public function getSize($file)
{
$cmd = 'mplayer -identify -vo null -ao null -frames 0 '.$file;
exec($cmd, $match);
$search = array(
'ID_VIDEO_WIDTH' => array(
'replace' => 'ID_VIDEO_WIDTH=',
'key' => 'width',
),
'ID_VIDEO_HEIGHT' => array(
'replace' => 'ID_VIDEO_HEIGHT=',
'key' => 'height',
),
);
$infos_videos = array();
foreach($match as $m) {
foreach($search as $k=>$s) {
if(strpos($m, $k)!==false) {
$infos_videos[$s['key']] = str_replace($s['replace'], '', $m);
continue;
}
}
}
return $infos_videos;
}
// }}}
// {{{ getRatio()
/** Cacule le ratio
*
*
* @param int $w Largeur
* @param int $h Hauteur
* @param string $file Fichier a tester
* @param bool $debug Débuger le calcul
* @access public
* @return array
*/
public function getRatio($w=0,$h=0,$file=null,$debug=false)
{
// si pas de taille, aller chercher
if(!empty($file)) {
$size = $this->getSize($file);
if(!empty($size)) {
$w = $size['width'];
$h = $size['height'];
}
}
//if($w=0 || $h=0) return '4:3';
$ratio = round(100*$w/$h)/100;
if ($ratio >= 1.77 && $ratio <= 1.78) {
$ratio = '16:9';
} elseif ($ratio >= 1.33 && $ratio <= 1.34) {
$ratio = '4:3';
} elseif ($ratio >= 1.25 && $ratio <= 1.26) {
$ratio = '16:9'; // en fait 5:4
}
// debugage uniquement
if($debug) {
$ratio .= ' '.$w.'x'.$h;
}
return $ratio;
}
// }}}
// {{{ getFLVDuration()
/** Lit la durée d'une vidéo flv, retourne la durée en milliseconds ou une valeur négative en cas d'erreur
*
*
* @param string $file chemin vers le fichier flv dont on veut connaitre la durée
* @access public
* @return int durée en millisecondes
*/
public function getFLVDuration($file)
{
$step = 1;
$duration = false;
if (file_exists($file)) {
$step++;
$fp = fopen($file, 'r');
if ($fp) {
$step++;
$header = fread($fp, 5);
if ($header !== false) {
$step++;
$is_flv = ($header[0]=='F' && $header[1]=='L' && $header[2]=='V');
if ($is_flv) {
$step++;
$is_flv_video = (hexdec(bin2hex($header[4])) & 0x01);
$is_flv_audio = (hexdec(bin2hex($header[4])) & 0x04);
if ($is_flv_video || $is_flv_audio) {
$step++;
if (fseek($fp, 0, SEEK_END) == 0) {
$step++;
$length = ftell($fp);
if ($length !== false) {
$step++;
if (fseek($fp, -3, SEEK_END) == 0) {
$step++;
$value = fread($fp,3);
if ($value !== false) {
$step++;
$taglen = hexdec(bin2hex($value));
if ($length > $taglen) {
$step++;
if (fseek($fp, $length - $taglen, SEEK_SET) == 0) {
$step++;
$value = fread($fp, 3);
if ($value !== false) {
$step++;
$duration = hexdec(bin2hex($value));
}
}
}
}
}
}
}
}
}
}
fclose($fp);
}
}
return ($duration === false ? -$step:$duration);
}
// }}}
// {{{ updateDureeSiteSec()
/** Lit la durée du fichier et l'inscrit dans le champ duree_site_sec si possible
*
*
* @param array $infos tableau contenant les infos multimedia
* @access public
* @return void
*/
public function updateDureeSiteSec(&$infos)
{
// a tester
if (!isset($infos['duree_site_sec'])
|| !isset($infos['duree_site'])
|| !isset($infos['idmultimedia']))
return;
// flv ou mp3
if(!empty($infos['mediatype']) && $infos['mediatype']!='mp3'
&& $infos['mediatype']!='flv')
return;
// si la duree est déjà positive, ne rien faire
if ($infos['duree_site_sec'] > 0) return;
// si le fichier n'existe pas, ne rien faire
// valeur 0 par défaut
$duree_sec = 0;
if(!empty($infos['mediatype'])){
switch ($infos['mediatype']) {
case 'flv':
// lecture de la durée des flv à l'aide de getFLVDuration()
if(!empty($infos['formats']['flv']['medialocalpath'])
&& file_exists($infos['formats']['flv']['medialocalpath'])) {
$duree = $this->getFLVDuration($infos['formats']['flv']['medialocalpath']);
} else {
$duree = 0;
}
if ($duree > 0) {
// on convertit de milliseconds à secondes entières
$duree_sec = (int)(round($duree/1000));
}
break;
case 'mp3':
// lecture de la durée des mp3 à l'aide de mp3info
$ret = -1;
$output = array();
if(!empty($infos['formats']['mp3']['medialocalpath'])
&& file_exists($infos['formats']['mp3']['medialocalpath'])) {
$duree = exec(MP3_SECONDS_CMD.' '.escapeshellarg($infos['formats']['mp3']['medialocalpath']), $output, $ret);
} else {
$duree = 0;
}
if ($ret == 0 && $duree > 0) {
// pas d'erreur, on suppose la durée lue valide
$duree_sec = (int)$duree;
}
break;
default:
// type non supporté, ne rien faire
return;
}
}
// test le champ duree_site (champ en minutes)
if ($infos['duree_site'] <= 0) {
$new_duree_site = 0;
} else {
$new_duree_site = $infos['duree_site'];
}
if ($duree_sec > 0) {
if ($new_duree_site == 0) {
// on utilise la valeur mesurée pour remplir duree_site si celui-ci n'est pas initialisé
$new_duree_site = (int) round($duree_sec / 60);
}
} else {
// erreur, on retourne duree_site * 60 si possible
if ($infos['duree_site'] > 0) {
$duree_sec = $infos['duree_site'] * 60;
}
}
// champs a mettre a jour
$values['duree_site_sec'] = $duree_sec;
if ($infos['duree_site'] != $new_duree_site) {
$values['duree_site'] = $new_duree_site;
}
if (empty($infos['duree'])) {
$values['duree'] = $new_duree_site;
}
$this->setUpdateFields($values);
//on update
$this->setData($infos['idmultimedia']);
//on renvoie les "bonnes" valeurs
$infos['duree_site'] = $new_duree_site;
$infos['duree_site_sec'] = $duree_sec;
}
// }}}
// {{{ toHourMinuteSecond()
/** Convertit une durée en secondes en jours,heures,minutes,secondes
* Exemple: 1 jour 4 heures 53 minutes 15 secondes
*
*
* @param int $time
* @param array $format format pour l'affichage par défaut:
* array( 86400 => array('jour','jours'), 3600 => array('heure', 'heures'), 60 => array('minute', 'minutes'), 1 => array('seconde', 'secondes')
* @access public
* @return void
*/
public function toHourMinuteSecond($time, $format=null)
{
$time = (int) $time;
if ($time <= 0) return '';
if (!empty($format)) {
$tabTemps = $format;
} else {
$tabTemps = $this->hms_format;
}
$result = '';
foreach($tabTemps as $nombreSecondesDansUnite => $uniteTemps) {
$count = floor($time/$nombreSecondesDansUnite);
$time %= $nombreSecondesDansUnite;
if($count > 1) {
if ($result != '') $result.=' ';
$result .= $count.$uniteTemps[1];
} else if ($count == 1) {
if ($result != '') $result.=' ';
$result .= $count.$uniteTemps[0];
}
}
return $result;
}
// }}}
// {{{ getBufferLength()
/**
* Taille du buffer en seconde
*
*
* @param int $len taille
* @access public
* @return int
*/
public function getBufferLength($len=3)
{
$len = 3; // secondes par défaut
if (isset($_REQUEST['bufferlength'])) {
$len = (int)$_REQUEST['bufferlength'];
if ($len < 1) $len = 1;
$bufferlength = $len;
} else if (isset($_REQUEST['blen'])) {
$len = (int)$_REQUEST['blen'];
if ($len < 1) $len = 1;
$bufferlength = $len;
}
$bufferlength = $len;
return $bufferlength;
}
// }}}
// {{{ getBucket()
/** Retourne le bucket utilise sur AWS
*
* @access public
* @return string
*/
public function getBucket() { return $this->bucket; }
// }}}
// {{{ isCloud()
/** Est-ce qu'on utilise le cloud pour le chargement des videos ?
*
* @access public
* @return string
*/
public function isCloud() { return $this->is_cloud; }
// }}}
// {{{ getImageByUrl()
/** Récupéer l'image depuis heywatch DEPRECATED
*
* @access public
* @return string
*/
public function getImageByUrl($id_video,$idmultimedia,$size,$other_version='4:3',$replace=false,$start=15) {
// répertoire des images taille exacte
$dest = $_ENV['PATH_IMG'].'img_tv/prop169/'.$idmultimedia.'.jpg';
// supprimer ?
if($replace) {
@unlink($dest);
}
// image taille exacte
$url = 'https://'.HW_USERNAME.':'.HW_PASSWORD.'@'.HW_SERVER_SIMPLE.'encoded_video/'.$id_video.'.jpg?start='.$start.'&width='.$size['width'].'&height='.$size['height'];
copy($url, $dest);
// version 4:3 demandée
if($other_version=='4:3') {
// rép 4:3
$dest = FINAL_DEST_JPG.$idmultimedia.'.jpg';
// grande largeur et hauteur en 4:3 => pour les vignettes et autres
$size_43['width'] = $size['width'];
$size_43['height'] = round($size['width']*(3/4));
// supprimer ?
if($replace) {
@unlink($dest);
}
// image taille 4:34
$url = 'https://'.HW_USERNAME.':'.HW_PASSWORD.'@'.HW_SERVER_SIMPLE.'encoded_video/'.$id_video.'.jpg?start='.$start.'&width='.$size_43['width'].'&height='.$size_43['height'];
copy($url, $dest);
}
}
// }}}
// {{{ getImageFromFile()
/** Récupéer l'image depuis le fichier avec ffmpeg
*
* @access public
* @return string
*/
public function getImageFromFile($infos,$other_version='4:3',$replace=false,$start=15) {
// test du sysytème ,nouveau de génération de vignette
/*if($_SERVER['REMOTE_ADDR']=='77.245.143.67') {
return $this->New_getImageFromFile($infos,$other_version,$replace,$start);
}*/
// fichier source pour générer la vignette
$orderSources = array(
'upload',
'hd720',
'h264',
'flv',
);
foreach($orderSources as $s) {
if(!empty($infos['formats'][$s]['medialocalpath']) && file_exists($infos['formats'][$s]['medialocalpath'])) {
$format = $s;
break;
}
}
// taille de la vidéo
$size = $this->getSize($infos['formats'][$s]['medialocalpath']);
// répertoire des images taille exacte
$dest_169 = $_ENV['PATH_IMG'].'img_tv/prop169/'.$infos['idmultimedia'].'.jpg';
$ffmpeg = '/usr/bin/ffmpeg';
// supprimer ?
if($replace) {
@unlink($dest_169);
}
// image taille exacte
$cmd = $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$size['width'].'x'.$size['height'].' '.$dest_169;
exec($cmd);
// version 4:3 demandée
if($other_version=='4:3') {
// rép 4:3
$dest_43 = $_ENV['PATH_IMG'].'img_tv/'.$infos['idmultimedia'].'.jpg';
// grande largeur et hauteur en 4:3 => pour les vignettes et autres
$size_43['width'] = $size['width'];
$size_43['height'] = round($size['width']*(3/4));
// supprimer ?
if($replace) {
@unlink($dest_43);
}
if(file_exists($dest_169)) {
$cmd = DFT_MAGICK_CONVERT.' '.$dest_169.' -gravity center -background black -extent '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
exec($cmd);
$success = true;
}
// image taille 4:3 depuis le fichier source
if(empty($success)) {
$cmd = $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
exec($cmd);
}
}
}
// }}}
// {{{ NewgetImageFromFile()
/** Récupéer l'image depuis le fichier avec ffmpeg
*
* @access public
* @return string
*/
public function New_getImageFromFile($infos,$other_version='4:3',$replace=false,$start=15) {
// répertoire des images taille exacte
$dest_169 = FINAL_DEST_JPG.'prop169/'.$infos['idmultimedia'].'.jpg';
$ffmpeg = '/usr/bin/ffmpeg';
$exiftool = '/usr/bin/exiftool';
// supprimer ?
if($replace) {
@unlink($dest_169);
}
// => en priorité, le fichier hd720, sinon, le flv
// si on a pas la taille du hd720, la récupèrer avec exiftool
if($infos['hd720']==1) {
$cmd = $exiftool.' -j '.$infos['formats']['hd720']['medialocalpath'];
$videoinfos = shell_exec($cmd);
$videoinfos = json_decode($videoinfos);
if(!empty($videoinfos) && is_array($videoinfos)) {
$videoinfos = $videoinfos[0];
if(!empty($videoinfos->ImageWidth)) {
$video_width = $videoinfos->SourceImageWidth;
$video_height = $videoinfos->SourceImageHeight;
$format = 'hd720';
}
}
}
if(empty($format)) {
$video_width = $infos['flv_width'];
$video_height = $infos['flv_height'];
$format = 'flv';
}
// image taille exacte
$cmd = $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$video_width.'x'.$video_height.' '.$dest_169;
exec($cmd);
// version 4:3 demandée
if($other_version=='4:3') {
// rép 4:3
$dest_43 = FINAL_DEST_JPG.$infos['idmultimedia'].'.jpg';
// supprimer ?
if($replace) {
@unlink($dest_43);
}
// grande largeur et hauteur en 4:3 => pour les vignettes et autres
$size_43['width'] = $video_width;
$size_43['height'] = round($video_width*(3/4));
// si ratio de la vidéo = 16:9, on ajoute des bandes noires
if($infos['ratio']=='16:9') {
// l'image 16:9 doit exister
// créer une image avec des bandes noires
if(file_exists($dest_169)) {
$cmd = DFT_MAGICK_CONVERT.' '.$dest_169.' -gravity center -background black -extent '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
exec($cmd);
$success = true;
}
}
// image taille 4:3 depuis le fichier source
if(empty($success)) {
$cmd = $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
exec($cmd);
}
}
}
// }}}
// {{{ getStatus()
/** Le status en texte
*
* status (pour le player):
* - 0 => publié et visible
* - 1 => interdiction de l'embed
* - 2 => supprimé
* - 3 => non-accessible
*
* @access public
* @param int $status Le status de publication
* @param bool $return_list Retourner une liste ou le code de status
* @return string|array
*/
public function getStatus($status,$return_list=false) {
if($return_list) {
foreach($this->status_types as $k=>$v) {
$status_list[$k] = $v['string'];
}
return $status_list;
} else {
return $this->status_types[$status]['code'];
}
}
// }}}
// {{{ updateCloudAcl()
/** mettre en privé sur S3
*
* @access public
* @param array $infos les infos sur le médias
* @param string $format Type de fichier
* @return bool
*/
public function updateCloudAcl($idmultimedia,$format='flv')
{
// infos sur le format
$f = $this->getVideoFormats($format);
if(!empty($f)) {
$fichier = $f['format'].'/'.$f['format'].'-'.$idmultimedia.'.'.$f['extension'];
// classe AWS
require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
$s3 = new AmazonS3();
$response = $s3->set_object_acl($this->getBucket(), $fichier, array(
array('id' => $this->s3_canonical_user_id, 'permission' => $s3::GRANT_READ),
array('id' => AWS_CANONICAL_ID, 'permission' => $s3::GRANT_FULL_CONTROL),
));
if($response->isOK()) {
return true;
}
}
return false;
}
// }}}
// {{{ updateCloudStorageType()
/** réduire le cout de stockage
*
* @access public
* @param array $infos les infos sur le médias
* @return bool
*/
public function updateCloudStorageType($idmultimedia,$format='flv')
{
// infos sur le format
$f = $this->getVideoFormats($format);
if(!empty($f)) {
$fichier = $f['format'].'/'.$f['format'].'-'.$idmultimedia.'.'.$f['extension'];
// classe AWS
require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
$s3 = new AmazonS3();
$response = $s3->change_storage_redundancy($this->getBucket(), $fichier, AmazonS3::STORAGE_REDUCED);
if($response->isOK()) {
return true;
}
}
return false;
}
// }}}
// {{{ isOnCloud()
/** tester si les fichiers sont sur le cloud
*
* @access public
* @param array $infos les infos sur le médias
* @return array
*/
public function isOnCloud($idmultimedia)
{
// classe AWS
require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
$s3 = new AmazonS3();
$formats_multimedias = $this->getVideoFormats();
// on parcours les formats et on regarde s'ils sont sur le cloud
foreach($formats_multimedias as $k=>$v) {
// sur le bucket S3 ?
$f = $k.'/'.$k.'-'.$idmultimedia.'.'.$v['extension'];
$response = $s3->if_object_exists($this->getBucket(), $f);
if($response) {
$formats[$k] = array(
'cloud_acl' => false
);
// tester également les droits sur cloudfront
$response_acls = $s3->get_object_acl($this->getBucket(), $f);
if($response_acls->status=='200') {
$acls = (array)$response_acls->body->AccessControlList;
foreach($acls['Grant'] as $a) {
if($a->Grantee->ID==MY_S3_CANONICAL_USER_ID) {
$formats[$k]['cloud_acl'] = true;
}
}
}
}
// tester également le teaser
if(!empty($v['teaser'])) {
$f = $k.'/'.$k.'-'.$idmultimedia.'-vod.'.$formats_multimedias[$k]['extension'];
// sur le bucket S3 ?
$response = $s3->if_object_exists($this->getBucket(), $f);
if($response) {
$formats[$k.'-teaser'] = array(
'cloud_acl' => false
);
// tester également les droits sur cloudfront
$response_acls = $s3->get_object_acl($this->getBucket(), $f);
if($response_acls->status=='200') {
$acls = (array)$response_acls->body->AccessControlList;
foreach($acls['Grant'] as $a) {
if($a->Grantee->ID==MY_S3_CANONICAL_USER_ID) {
$formats[$k.'-teaser']['cloud_acl'] = true;
}
}
}
}
}
}
return $formats;
}
// }}}
// {{{ putOnCloud()
/** Envoyer un fichier sur le cloud et changer les ACL
*
* @access public
* @param array $infos les infos sur le médias
* @return array
*/
public function putOnCloud($from,$to)
{
// commande
$cmd = PATH_LIBS.'Bin/put_to_cloud '.escapeshellcmd($from).' '.escapeshellcmd('s3://'.$this->getBucket().'/'.$to).' /tmp/put_file_to_cloud >/dev/null';
$result = exec($cmd);
// classe AWS
require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
$s3 = new AmazonS3();
$response = $s3->set_object_acl($this->getBucket(), $to, array(
array('id' => $this->s3_canonical_user_id, 'permission' => $s3::GRANT_READ),
array('id' => AWS_CANONICAL_ID, 'permission' => $s3::GRANT_FULL_CONTROL),
));
/*if($response->isOK()) {
}*/
$response = $s3->change_storage_redundancy($this->getBucket(), $to, AmazonS3::STORAGE_REDUCED);
if($response->isOK()) {
return true;
}
}
// }}}
// {{{ setQualityList()
/** Création de deux listes: videos_qualite_ok et videos_qualite_basse
*
* @access public
* @param array $videos les infos sur le médias
* @param mixe $context le contexte
* @return array
*/
public function setQualityList($videos,&$context)
{
// 2 qualites
$listes = array(
0 => 'videos_qualite_basse',
1 => 'videos_qualite_ok'
);
foreach($videos as $k => $v) {
$name = $listes[$videos[$k]['quality']];
if (!isset($context['view']->$name)) {
$context['view']->$name = array();
}
$item = &$context['view']->$name;
$item[$k] = $videos[$k];
}
}
// }}}
// {{{ getApiTab()
/** génére la version pour la diffusion API
*
* @see Theatre::getApiTab
*/
public function getApiTab($data)
{
// généré à partir de getApiFields
$data_api = parent::getApiTab($data,$_ENV['URL_THTV']);
return $data_api;
}
// }}}
// {{{ getApiFields()
/** champs à renvoyer par l'API
*
* @access public
* @param array tableau de données
*/
protected function getApiFields()
{
return array(
'sujet_titre' => 'title',
'permalink' => 'permalink',
'url_clean' => 'permanent_url',
'duree_site_sec' => 'duration',
'quality' => 'quality',
'language' => 'language',
'description_html' => 'description',
'date_en' => 'capture_date',
'lieu' => 'capture_place',
'authors' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
),
'directors' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
),
'actors' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
),
'intervenants->others' => array(
'lastname' => 'lastname',
'firstname' => 'firstname',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
),
'contacts' => array(
'organisation' => 'organisation',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/contact/${1}',
),
'partenaires->partners' => array(
'organisation' => 'organisation',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/contact/${1}',
),
'spectacles' => array(
'title' => 'title',
'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/spectacle/${1}',
),
'keywords' => array(
'title' => 'title',
'url_clean' => 'slug',
),
'vignette' => 'thumbnail',
'image_media' => 'image',
'images' => 'images',
'embed' => 'player',
'dateinsert' => 'insert_date',
);
}
// }}}
// {{{ getContactGaTrackingId()
/** voir si le partenaire à un ga_tracking_id
*
* @access public
* @param int $idmultimedia Identifiant du document
* @return int
*/
public function getContactGaTrackingId($idmultimedia)
{
$sql = 'SELECT contacts.`ga_tracking_id` as ga_tracking_id FROM
object_multimedia JOIN contacts ON contacts.`idcontact`=object_multimedia.`idobject`
WHERE object_multimedia.`idmultimedia`='.$idmultimedia.'
AND object_multimedia.`object`=\'contacts\'
AND object_multimedia.`idrole`='.$this->getIdrole('multimedia_partenaire').'
AND contacts.`ga_tracking_id` IS NOT NULL';
$tracking_id = $this->queryOne($sql);
if(!empty($tracking_id)) {
return $tracking_id;
} else {
return null;
}
}
// }}}
public function setSizeToFormat($octet){
// Array contenant les differents unités
$unite = array('Octet','KO','MO','GO');
if ($octet < 1000) // octet
{
return $octet." ".$unite[0];
}
else
{
if ($octet < 1000000) // ko
{
$ko = round($octet/1024,2);
return $ko." ".$unite[1];
}
else // Mo ou Go
{
if ($octet < 1000000000) // Mo
{
$mo = round($octet/(1024*1024),2);
return $mo." ".$unite[2];
}
else // Go
{
$go = round($octet/(1024*1024*1024),2);
return $go." ".$unite[3];
}
}
}
}
}