vendor/theatre/core/src/Repository/MultimediasRepository.php line 481

Open in your IDE?
  1. <?php
  2. namespace TheatreCore\Repository;
  3. use AmazonCloudFront;
  4. use AmazonS3;
  5. use TheatreCore\Classes\Images\Images;
  6. use TheatreCore\Entity\Commandes;
  7. use TheatreCore\Entity\Extranetusers;
  8. use TheatreCore\Entity\Keywords;
  9. use TheatreCore\Entity\Multimedias;
  10. use TheatreCore\Entity\ObjectMultimedia;
  11. use TheatreCore\Entity\Spectacles;
  12. use TheatreCore\Traits\TheatreTrait;
  13. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use Symfony\Component\Security\Core\Security;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use App\Service\Functions;
  18. use App\Service\TheatreParametres;
  19. /**
  20.  * MultimediasRepository
  21.  *
  22.  * This class was generated by the Doctrine ORM. Add your own custom
  23.  * repository methods below.
  24.  */
  25. class MultimediasRepository extends ServiceEntityRepository
  26. {
  27.     use TheatreTrait {
  28.         getRelationsArray as protected getRelationsArrayTrait;
  29.     }
  30.     private $em;
  31.     public $__table;
  32.     public $__table_object;
  33.     public $__idtable;
  34.     private $security;
  35.     private $players;
  36.     public function __construct(ManagerRegistry $registryTheatreParametres $playersTranslatorInterface $trFunctions $funcImages $imagesSecurity $security)
  37.     {
  38.         parent::__construct($registryMultimedias::class);
  39.         $this->__table $this->getClassMetadata()->getTableName();
  40.         $this->__table_object $this->getClassMetadata()->name;
  41.         $this->__idtable $this->getClassMetadata()->getSingleIdentifierFieldName();
  42.         $this->players $players;
  43.         $this->security $security;
  44.         $this->translator $tr;
  45.         $this->func $func;
  46.         $this->images $images;
  47.     }
  48.     // le bucket
  49.     public $bucket 'thtv';
  50.     // identifiant de la distribution cloudfront à modifier (visible via la console)
  51.     protected $cloudfront_id 'ESJMHJBTXYGF5';
  52.     // OriginAccessIdentity valeur récupèrée avec ça
  53.     public $oai 'E1W4AXU0ZXINNE';
  54.     // cloud
  55.     protected $is_cloud false;
  56.     // s3 canonique user id
  57.     public $s3_canonical_user_id '9a5870bc4a58b0f2d6336a8f70487253e0f0ef1dcabb9ae525d07a28e876c4d6414484dc9e944ee24445e5aefb10c2b3';
  58.     // format par défaut pour toHourMinuteSecond()
  59.     public $hms_format = array(
  60.         86400 => array(' jour',' jours'),
  61.         3600 => array(' heure'' heures'),
  62.         60 => array(' minute'' minutes'),
  63.         => array(' seconde'' secondes')
  64.     );
  65.     // les différents status
  66.     public $status_types = array(
  67.         => array(
  68.             'code' => 'nodispo',
  69.             'string' => 'Non disponible',
  70.         ),
  71.         => array(
  72.             'code' => null,
  73.             'string' => 'En ligne',
  74.         ),
  75.         => array(
  76.             'code' => 'noexport',
  77.             'string' => 'Intégration désactivée',
  78.         ),
  79.         => array(
  80.             'code' => 'nodelete',
  81.             'string' => 'Supprimé',
  82.         ),
  83.         => array(
  84.             'code' => 'montheatre',
  85.             'string' => 'Réservé aux abonnés',
  86.         ),
  87.         => array(
  88.             'code' => 'vod',
  89.             'string' => 'Streaming VOD',
  90.         ),
  91.     );
  92.     // utilisé via setParameters()
  93.     protected $parameters = array();
  94.     // pour configurer SWFObject, cf. getPlayer()
  95.     public $flashvars null;
  96.     public $params null;
  97.     public $attributes null;
  98.     // champs à retourner pour finddata
  99.     public $default_fields =  array(
  100.         'idmultimedia',
  101.         'evenement',
  102.         'publish',
  103.         'policyAccess',
  104.         'status',
  105.         'language',
  106.         'markdown',
  107.         'duree',
  108.         'dureeSiteSec',
  109.         'description',
  110.         'sujetTitre',
  111.         'price',
  112.         'flv',
  113.         'h264',
  114.         'h264m',
  115.         'hd720',
  116.         'hd1080',
  117.         'hd2160',
  118.         'mp3',
  119.         'code',
  120.         'countView',
  121.         'flvWidth',
  122.         'flvHeight',
  123.         'etalab'
  124.     );
  125.     //  {{{ findData()
  126.     /** Recherche des multimedias
  127.      *
  128.      * Permet de rechercher des multimedias en fonction de certains critères :
  129.      * la première lettre, un bout du nom, le type de multimedia, si il est en ligne ou pas
  130.      *
  131.      * @access  public
  132.      * @see     Theatre::find()
  133.      */
  134.     public function findData($publish=null,$keywords=null,$idobject=null,$object=null)
  135.     {
  136.         $query $this->createQueryBuilder('e');
  137.         $query->orderBy('e.idmultimedia''desc');
  138.         if($this->getCount()){
  139.             $query->select('COUNT(e.idmultimedia)');
  140.             $this->setCount(false);
  141.             return $query;
  142.         }
  143.         // parametre
  144.         if(isset($_REQUEST['idmultimedia']) && !empty($_REQUEST['idmultimedia'])) {
  145.             $idmultimedia $_REQUEST['idmultimedia'];
  146.         }
  147.         if(isset($_REQUEST['keywords']) && $_REQUEST['keywords']!='nom' && !empty($_REQUEST['keywords'])) {
  148.             $keywords filter_var(trim($_REQUEST['keywords']), FILTER_SANITIZE_STRINGFILTER_FLAG_NO_ENCODE_QUOTES);
  149.             if(my_is_int($keywords)) {
  150.                 $idmultimedia = (int)$keywords;
  151.                 $keywords null;
  152.             }
  153.         }
  154.         if(isset($_REQUEST['publish']) && !empty($_REQUEST['publish'])) {
  155.             $publish $_REQUEST['publish'];
  156.         }
  157.         //recherche stricte par id
  158.         if(!empty($idmultimedia)) {
  159.             $query->andWhere('e.idmultimedia = '.(int)$idmultimedia);
  160.         }
  161.         // vidéos d'un utilisateur
  162.         if(isset($_REQUEST['idextranetuser']) && $this->my_is_int($_REQUEST['idextranetuser'])) {
  163.             $query->andWhere('e.idextranetuser = '.(int)$_REQUEST['idextranetuser']);
  164.         }
  165.         // mots cles
  166.         if (!empty($keywords)) {
  167. //            $this->whereAdd('sujet_titre LIKE \'%'.$this->escape($keywords).'%\'');
  168. //            $this->whereAdd('evenement LIKE \'%'.$this->escape($keywords).'%\'','OR');
  169. //            $this->whereAdd('filmeur LIKE \'%'.$this->escape($keywords).'%\'','OR');
  170. //            $this->whereAdd('code=\''.$this->escape($keywords).'\'','OR');
  171.         }
  172. //        // selectionne les fiches hors ligne
  173.         if (!empty($publish) && $publish=='no') {
  174.             $query->andWhere('e.publish = 0');
  175.         }
  176. //
  177. //        // recherche par idobject
  178. //        if(!empty($idobject) && !empty($object)) {
  179. //            $s = '';
  180. //            foreach($fields as $field)
  181. //            {
  182. //                if ($s) $s.=',';
  183. //                $s .= 'm.'.$field;
  184. //            }
  185. //            $query = 'SELECT '.$s.'
  186. //                FROM object_multimedia om, multimedias m
  187. //                WHERE 1
  188. //                AND om.idmultimedia=m.idmultimedia
  189. //                AND om.idobject='.((int)$idobject).'
  190. //                AND om.object=\''.$this->escape($object).'\'';
  191. //            if(!empty($publish) && $publish = 1) {
  192. //                $query .= ' AND publish=1 ';
  193. //            }
  194. //            $query .= 'ORDER BY m.date, m.idmultimedia ASC';
  195. //
  196.         // on lance la recherche
  197.         return $query->getQuery();
  198.     }
  199.     // }}}
  200.     //  {{{ setToArray()
  201.     /** Liste des multimedias dans un tableau associatif
  202.      *
  203.      * Tableau associatif notament utilisé pour lister les informations sur les multimedias
  204.      * Utile pour générer les tableaux HTML de listes de multimedias
  205.      *
  206.      * @access  public
  207.      * @return  array
  208.      * @see     findData()
  209.      */
  210.     public function setToArray($spec=true)
  211.     {
  212.         if($spec==true) {
  213.             $this->findData();
  214.         }
  215.         $values = array();
  216.         $color null;
  217.         $nb 0;
  218.         while($this->fetch()) {
  219.             // valeurs de l'enregistrement
  220.             $values[$nb] = $this->getInfosMultimedia();
  221.             // couleur de ligne alternative
  222.             $color $this->colorAlternate($color);
  223.             $values[$nb]['colorline'] = $color;
  224.             $values[$nb]['id'] = $this->idmultimedia;
  225.             $nb++;
  226.         }
  227.         return $values;
  228.     }
  229.     // }}}
  230.     //  {{{ getInfosMultimedia()
  231.     /** Informations sur un document multimedia
  232.      *
  233.      * @access public
  234.      * @return array  les infos sous forme de tableau
  235.      * @param  int      $idmultimedia numero de la fiche multimedia
  236.      * @param  boolean  $all    ajoute les infos sur l'auteur, le metteur en scène, etc.
  237.      * @param  mixed    $player ajoute le code du player (0|false=rien, 1|true|'js'=player JS, 'xmlconf'=xml config)
  238.      * @param  array    $params paramètres supplémentaires
  239.      * @param  string   $code   code du multimedia (au lieu de l'idmultimedia)
  240.      */
  241.     public function getInfosMultimedia($idmultimedia=null,$all=false,$player=false,$params=array(),$code=null)
  242.     {
  243.         $con $this->getEntityManager();
  244.         $infos = array();
  245.         ////////////// infos de la table
  246.         if(!isset($this->idmultimedia) || empty($this->idmultimedia)) {
  247.             if (!empty($code)) {
  248.                 $idmultimedia $this->getIdByUrl($code);
  249.                 if(empty($idmultimedia)){
  250.                     return array();
  251.                 }
  252.             }
  253.         }
  254.         $data $con->getRepository(Multimedias::class)
  255.             ->createQueryBuilder('e')
  256.             ->select('e')
  257.             ->andWhere('e.idmultimedia = :idmultimedia')
  258.             ->setParameter(':idmultimedia'$idmultimedia)
  259.             ->getQuery()
  260.             ->getOneOrNullResult();
  261.         if(empty($data)){
  262.             return [];
  263.         }
  264.         $this->idmultimedia $data->getIdmultimedia();
  265.         if(is_null($data)){
  266.             return [];
  267.         }
  268.         if(!empty($params['display'])) {
  269.             $display $params['display'];
  270.             unset($params['display']);
  271.         } else {
  272.             $display = array();
  273.         }
  274.          $infos += array(
  275.             'idmultimedia' => $data->getIdmultimedia(),
  276.             'sujet_titre' => $data->getSujetTitre(),
  277.             'evenement' => $data->getEvenement(),
  278.             'duree' => $data->getDuree(),
  279.             'duree_site_sec' => $data->getDureeSiteSec(),
  280.             'url_clean' => $data->getUrlClean(),
  281.             'publish' => $data->getPublish(),
  282.             'copyright' => $data->getCopyright(),
  283.             'nameview' => $data->getSujetTitre(),
  284.             'permalink' => $_ENV['URL_THNET'] . '/video/' $data->getUrlClean(),
  285.             'code' => $data->getCode(),
  286.             'etalab' => $data->getetalab(),
  287.             'idextranetuser' => $data->getIdextranetuser(),
  288.             'idextranetuser_producteur' => $data->getidextranetuserProducteur(),
  289.             'idcontact_producteur' => $data->getIdcontactProducteur(),
  290.             'quality' => $data->getQuality(),
  291.             'count_view' => $data->getCountView(),
  292.             'use_cloud' => $data->getUseCloud(),
  293.             'is_coconut' => $data->getIsCoconut(),
  294.             'lieu' => $data->getLieu(),
  295.             'date' => $data->getDate(),
  296.             'flv_width' => $data->getFlvWidth(),
  297.             'flv_height' => $data->getFlvHeight(),
  298.             'dateinsert' => $data->getDateInsert(),
  299.             'audio_video' => $data->getAudioVideo(),
  300.              'type' => $data->getType() ? $data->getType()->getIdtypemultimedia() : null,
  301.              'date_year' => $data->getDate()->format('Y'),
  302.              'date_month' => $data->getDate()->format('m'),
  303.              'date_day' => $data->getDate()->format('d')
  304.         );
  305.         if(empty($infos['idmultimedia'])) {
  306.             return array();
  307.         }
  308.         if($infos['is_coconut']==&& isset($this->heywatch) && !empty($this->heywatch)) {
  309. //            $infos['heywatch'] = (array)unserialize($this->heywatch);
  310. //            $infos['heywatch_string'] = print_r($infos['heywatch'], true);
  311.         }
  312.         // a qui est la vidéo ?
  313.         if(!is_null($data->getIdextranetuser()) && !empty($data->getIdextranetuser()) && $GLOBALS['session'] instanceof Extranetusers && $data->getIdextranetuser()->getIdextranetuser()==$GLOBALS['session']->getIdextranetuser()) {
  314.             $infos['my_video'] = $data->getIdextranetuser()->getIdextranetuser();
  315.         }
  316.         foreach($this->default_fields as $field) {
  317.             if (!isset($infos[$field])) {
  318.                 $infos[$field] = $data->{'get'.ucfirst($field)}();
  319.             }
  320.         }
  321.         $infos['flowplayer'] = $_ENV['KEY_FLOWPLAYER'];
  322.         // si le fichier est hors ligne ou privé (status différent de 1)
  323.         if($infos['status']!=1) {
  324.             // si status == 4 => vérifier si montheatre OK
  325.             if($infos['status']==4) {
  326.                 if(!$GLOBALS['session'] instanceof Extranetusers) {
  327.                     $infos['status_publication'] = $this->getStatus($infos['status']);
  328.                 }
  329.                 // si status == 5 => vérifier que la personne est connectée et que la VOD est active
  330.             } elseif($infos['status']==5) {
  331.                 // si elle n'est pas logué => VOD
  332.                 if(!$GLOBALS['session'] instanceof Extranetusers) {
  333.                     $infos['status_publication'] = $this->getStatus($infos['status']);
  334.                 } else {
  335.                     // si elle n'est pas root ou que sa commande n'est pas valide => VOD
  336.                     if(array_flip($GLOBALS['session']->getRoles())['ROLE_ISROOT'] !=1
  337.                         && !$con->getRepository(Commandes::class)->isValid('multimedias',$infos['idmultimedia'],$GLOBALS['session']->getIdextranetuser())) {
  338.                         $infos['status_publication'] = $this->getStatus($infos['status']);
  339.                     }
  340.                 }
  341.             } else { // si autre status => teste si accessible par l'extranetuser (propriétaire ou root)
  342.                 if(!is_null($data->getIdextranetuser()) && !empty($data->getIdextranetuser()) && $GLOBALS['session'] instanceof Extranetusers && $GLOBALS['session']->getIdextranetuser()!=$infos['idextranetuser']->getIdextranetuser()
  343.                     //&& !Theatre::factory('multimedia_extranetuser')->isAuthorized($infos['idmultimedia'],$infos['idextranetuser'])
  344.                     && array_flip($GLOBALS['session']->getRoles())['ROLE_ISROOT'] !=1) {
  345.                     $infos['status_publication'] = $this->getStatus($infos['status']);
  346.                 }
  347.             }
  348.         }
  349.         // si l'utilisateur à le droit de lire les vidéos normalement sur le cloud en pseudo streaming
  350. //        if($GLOBALS['session']->getPseudoStreaming()==1) {
  351. //            $infos['use_cloud'] = 0;
  352. //        }
  353.         // le prix TTC
  354.         if(!empty($infos['price'])) {
  355.             $infos['ttc_price'] = round($infos['price']+($infos['price']*20/100),2);
  356.         }
  357.         if(!empty($infos['description'])) {
  358.             $infos['description_wiki'] = $infos['description'];
  359.             $infos['description_html'] = $this->wikiTransform($infos['description'], $infos['markdown']);
  360.             $infos['description'] = strip_tags($infos['description_html']);
  361.             $infos['description_courte'] = $this->cutSentence($infos['description'],45,true);
  362.         }
  363.         if(isset($this->date)) {
  364.             $infos['date_en'] = $this->date;
  365.             $infos['date'] = $this->getFormeDate($this->date);
  366.             $infos['date_annee'] = $this->getFormeDate($this->date,'Y');
  367.         }
  368.         if(isset($this->dateupdate)) {
  369.             $infos['dateupdate_en'] = $this->dateupdate;
  370.             $infos['dateupdate'] = $this->getFormeDate($this->dateupdate);
  371.         }
  372.         if($all) {
  373.             $infos['multimedia_auteur'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_auteur');
  374.             $infos['multimedia_metteur'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_metteur');
  375.             $infos['multimedia_acteur'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_acteur');
  376.             $infos['multimedia_intervenant'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_intervenant');
  377.             $infos['multimedia_contact'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_contact');
  378.             $infos['multimedia_partenaire'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_partenaire');
  379.             $infos['multimedia_spectacle'] = $this->getLinksObjectsMultimedia($this->idmultimedia,'multimedia_spectacle');
  380.         }
  381.         // tableau complet des objets liés
  382.         if(isset($params['tableau'])) {
  383.             $object_multimedia $con->getRepository(ObjectMultimedia::class);
  384.             $fields = array('idperson','lastname','firstname','url_clean');
  385.             $infos['authors'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_auteur'),true);
  386.             $infos['directors'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_metteur'),true);
  387.             $infos['actors'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_acteur'),true);
  388.             $infos['intervenants'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'persons',$fields,$this->getIdrole('multimedia_intervenant'),true);
  389.             $allpersons $infos['authors'] + $infos['directors'];
  390.             foreach($allpersons as $kap => $vap){
  391.                 unset($vap['nopunct']);
  392.                 $infos['allpersons'][$vap['idperson']] = $vap;
  393.             }
  394.             if(!empty($infos['allpersons'])){
  395.                 $infos['allpersons'] = $this->noPunct($infos['allpersons']);
  396.             }
  397.             $fields_contact = array('idcontact','type','organisation','url_clean','link_on_video');
  398.             $infos['contacts'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'contacts',$fields_contact,$this->getIdrole('multimedia_contact'),true);
  399.             $infos['partenaires'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'contacts',$fields_contact,$this->getIdrole('multimedia_partenaire'),true);
  400.             $fields_spectacle = array('idspectacle','title','url_clean','idtypespectacle');
  401.             $infos['spectacles'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'spectacles',$fields_spectacle,null,true);
  402.             $fields_text = array('idtext','title','url_clean','textfictif''valid');
  403.             $infos['texts'] = $object_multimedia->getObjectsMultimedia($infos['idmultimedia'],'texts',$fields_text,null,true);
  404.             // mots clés
  405.             $infos['keywords'] = $con->getRepository(Keywords::class)->getListKeywords(array(
  406.                 'special' => array(
  407.                     'idmultimedia' => $infos['idmultimedia'],
  408.                 ),
  409.                 'dbg' => array('multimedia_keyword_'.$infos['idmultimedia'], 'Mots clés associés au document multimedia '.$infos['idmultimedia'])
  410.             ));
  411.             // si pas d'auteur de metteur ou de spectacle
  412.             if(empty($infos['authors']) && empty($infos['directors']) && empty($infos['spectacles'])) {
  413.                 $infos['only_description'] = true;
  414.             }
  415.         }
  416.         // la vignette du multimedia
  417.         if(isset($params['vignette'])) {
  418.             if(is_array($params['vignette'])) {
  419.                 $format $params['vignette'];
  420.             } else {
  421.                 $format = array();
  422.             }
  423.             $format_flou $format;
  424.             $infos['vignette'] = $x $this->getVignetteMultimedia($idmultimedia,$format);
  425.             $format_flou['blur'] = true;
  426.             $infos['vignette_flou'] = $this->getVignetteMultimedia($idmultimedia,$format_flou);
  427.         }
  428.         // le producteur
  429.         /*if(!empty($params['get_producteur']) && !empty($infos['idcontact_producteur'])) {
  430.             $infos['producteur'] = Theatre::factory('contacts')->getInfosObject($infos['idcontact_producteur']);
  431.         }*/
  432.         // ajoute les infos sur les fichiers disponible
  433.         $this->getInfosMultimediaMore($infos);
  434.         // le player à utiliser
  435.         if($player) {
  436.             // la conf en version XML OU le player en JS
  437.             if ($player === 'xmlconf') {
  438.                 $infos['player'] = $this->getPlayerXMLConfig($infos,$params); //XML config
  439.             } else {
  440.                 // si iPhone ou iPod ou iPad, on regarde si un contenu qui va bien
  441.                 if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/iPhone|iPod|iPad|Android/'$_SERVER['HTTP_USER_AGENT'])) {
  442.                     $infos['user']['iphone'] = true;
  443.                 }
  444.                 $infos['player'] = $this->getPlayer($infos,$params); // player JS
  445.             }
  446.         }
  447.         /* Statistiques */
  448.         // clé prévention flood de stats (doit correspondre avec la verif dans logVideoStats())
  449.         $infos['key'] = md5($_ENV['URL_THTV'].date('Ymd'));
  450.         // le ratio
  451.         if(!empty($infos['flv_width']) && !empty($infos['flv_height'])) {
  452.             $infos['ratio'] = $this->getRatio($infos['flv_width'],$infos['flv_height']);
  453.         }
  454.         // ajouter la taille pour l'embed si c'est de l'audio
  455.         if($infos['mp3']==|| empty($infos['flv_width'])) {
  456.             $infos['flv_width'] = 560;
  457.             $infos['flv_height'] = 480;
  458.         }
  459.         $infos['jsonld'] = $this->makeJsonLD($infos);
  460.         if(!empty($params['api'])) {
  461.             if(empty($infos['vignette'])) {
  462.                 $params_vignette = array('width'=>115,'height'=>115,'direction'=>'crop','fleche'=>'none','ratio' => $infos['ratio']);
  463.                 $infos['vignette'] = $this->getVignetteMultimedia($idmultimedia,$params_vignette);
  464.                 $params_vignette['blur'] = true;
  465.                 $infos['vignette_flou'] = $this->getVignetteMultimedia($idmultimedia,$params_vignette);
  466.                 // différentes tailles de vignettes
  467.                 $vignette_sizes = array(
  468.                     '1920x1080' => array(
  469.                         'width' => 1920,
  470.                         'height' => 1080
  471.                     ),
  472.                     '990x557' => array(
  473.                         'width' => 990,
  474.                         'height' => 557,
  475.                     ),
  476.                     '495x277' => array(
  477.                         'width' => 495,
  478.                         'height' => 277,
  479.                     )
  480.                 );
  481.                 foreach($vignette_sizes as $k=>$v) {
  482.                     $infos['images'][$k] = $this->getVignetteMultimedia($idmultimedia,array('width'=>$v['width'],'height'=>$v['height'],'direction'=>'crop','fleche'=>'none','ratio' => $infos['ratio']));
  483.                 }
  484.             }
  485.             $infos $this->getApiTab($infos);
  486.         }
  487.         $infos['display'] = $display;
  488.         return $infos;
  489.     }
  490.     // }}}
  491.     // {{{ getMultimediaMore()
  492.     /** Ajoute des infos concernant le media
  493.      *
  494.      *
  495.      * @param  array $infos tableau contenant les infos (directement modifié)
  496.      * @access public
  497.      * @return void
  498.      */
  499.     public function getInfosMultimediaMore(&$infos,$test_file=false)
  500.     {
  501.         //format possible pour le player html5 $format_avaibles_array
  502.         $format_avaibles_array = array('h264m' => 'Mobile','h264' => '240p','hd720' => '720HD','hd1080' => '1080HD','hd2160' => '2160HD');
  503.         $format_avaibles_label = array();
  504.         $format_avaibles_count = array();
  505.         $format_avaibles = array();
  506.         //==> ça ne peut pas être un flv ET un mp3
  507.         if($infos['mp3'] ?? == 1) {
  508.             $infos['mediatype'] = 'mp3';
  509.         } elseif($infos['flv'] ?? == 1) {
  510.             $infos['mediatype'] = 'flv';
  511.         }
  512.         //Sélection du format par default
  513.         $default_value "h264";
  514.         $format_avaibles_default = array('hd720''h264''h264m');
  515.         foreach($format_avaibles_default AS $valeur){
  516.             if($infos[$valeur] ?? 0){
  517.                 $default_value $valeur;
  518.                 break;
  519.             }
  520.         }
  521.         // checker les différents formats
  522.         $count 1;
  523.         foreach($this->getVideoFormats() as $k=>$v) {
  524.             //==> ça ne peut pas être un flv ET un mp3
  525.             if($v['format']=='mp3' && !empty($infos['mediatype']) && $infos['mediatype']=='flv') {
  526.                 continue;
  527.             }
  528.             // si le fichier est hors ligne (status différent de 1)
  529.             if(!empty($infos['status_publication'])) {
  530.                 // si c'est status = 5, on mets un teaser à la place (format-idmultiemdia-teaser.extension)
  531.                 $teaser_vod $v['format'].'-'.$infos['idmultimedia'].'-'.$infos['status_publication'].'.'.$v['extension'];
  532.                 if($infos['status_publication']=='vod' && file_exists($_ENV['PATH_MEDIAS'].$v['format'].'/'.$teaser_vod)) {
  533.                     $medianame $teaser_vod;
  534.                 } else {
  535.                     $medianame $v['format'].'-'.$infos['status_publication'].'.'.$v['extension'];
  536.                 }
  537.             } else {
  538.                 // nom du fichier
  539.                 $medianame $v['format'].'-'.$infos['idmultimedia'].'.'.$v['extension'];
  540.             }
  541.             // est-ce qu'il y a un fichier de ce type ? check le fichier ou la base
  542.             if(($test_file && file_exists($_ENV['PATH_MEDIAS'].$v['format'].'/'.$medianame))
  543.                 || (!$test_file && !empty($infos[$v['format']]))) {
  544.                 $infos['formats'][$v['format']] = array(
  545.                     'flv' => ($v['format'] == 'flv') ? true false,
  546.                     'mediatype' => $v['format'],
  547.                     'medianame' => $medianame,
  548.                     'medialocalpath' => $_ENV['PATH_MEDIAS'] . $v['format'] . '/' $medianame,
  549.                     'mediaurl' => $_ENV['URL_MEDIAS'] . '/' $v['format'] . '/' $medianame,
  550.                     // 'mime_type' => $infos['heywatch'][$v['coconut']]->format->mime_type
  551.                 );
  552.                 $infos['formats_download'][$v['format']] = array(
  553.                     'flv' => ($v['format'] == 'flv') ? true false,
  554.                     'mediatype' => $v['format'],
  555.                     'medianame' => $medianame,
  556. //                    'medialocalpath' => PATH_MEDIAS . $v['format'] . '/' . $medianame,
  557. //                    'mediaurl' => URL_MEDIAS . '/' . $v['format'] . '/' . $medianame,
  558.                     'sizefile' => (!empty($v['coconut']) && !empty($infos['heywatch'][$v['coconut']])) ? $this->setSizeToFormat($infos['heywatch'][$v['coconut']]->format->size) : false,
  559. //                    'mediawidth' => (!empty($v['coconut']) && !empty($infos['heywatch'][$v['coconut']])) ? $infos['heywatch'][$v['coconut']]->streams->video->width : false,
  560. //                    'mediaheight' => (!empty($v['coconut']) && !empty($infos['heywatch'][$v['coconut']])) ? $infos['heywatch'][$v['coconut']]->streams->video->height : false,
  561.                     'download' => ($v['format'] == 'flv' || $v['format'] == 'upload') ? false true
  562.                 );
  563.                 if (array_key_exists($v['format'], $format_avaibles_array)) {
  564.                     $format_avaibles[] = $v['format'];
  565.                     $infos['formats'][$v['format']]['labelname'] = $format_avaibles_array[$v['format']];
  566.                     $infos['formats_download'][$v['format']]['labelname'] = $format_avaibles_array[$v['format']];
  567.                     $format_avaibles_label[] = $format_avaibles_array[$v['format']];
  568.                     $format_avaibles_count[] = $count;
  569.                     $count++;
  570.                 }
  571.                 $infos['format_default'] = $default_value;
  572.                 $infos['format_avaibles'] = join(','$format_avaibles);
  573.                 $infos['format_avaibles_label'] = join(','$format_avaibles_label);
  574.                 $infos['format_avaibles_count'] = join(','$format_avaibles_count);
  575.             }
  576.         }
  577.         // si on a du h264m et flv_width, ajouter la taille mobile
  578.         if(!empty($infos['formats']['h264m']) && !empty($infos['flv_width'])) {
  579.             $infos['mobile_width'] = '320';
  580.             $infos['mobile_height'] = round(($infos['mobile_width']*$infos['flv_height'])/$infos['flv_width']);
  581.             // la vignette du multimedia mobile
  582. //            if($GLOBALS['context']['session']->get('mobile')) {
  583. //                $width_vignette = 320;
  584. //                $height_vignette = round(($width_vignette*$infos['flv_height'])/$infos['flv_width']);
  585. //                $format = (array('width'=> $width_vignette,'height' => $height_vignette,'direction'=>'crop','fleche'=>'grand'));
  586. //                $infos['vignette_mobile'] = $this->getVignetteMultimedia($infos['idmultimedia'],$format);
  587. //            }
  588.         }
  589.         //On met en tête les données de la vidéo par défault pour qu'elle soit charger par flowplayer
  590. //        TODO : A REVOIR
  591. //        uksort($infos['formats'], create_function('$x,$y','return ($y === "'.$default_value.'") ? 1 : -1;'));
  592.         // ajouter la durée du fichier si elle n'y est pas
  593.         $this->updateDureeSiteSec($infos);
  594.         //// doit rester _après_ l'appel à updateDureeSiteSec()
  595.         if (isset($infos['duree_site_sec']) && $infos['duree_site_sec'] > 0) {
  596.             $infos['duree_site_sec_human'] = $this->toHourMinuteSecond($infos['duree_site_sec']);
  597.         }
  598.         // image de la vidéo ou du mp3
  599.         $infos['image_media'] = $this->getImage($infos['idmultimedia']);
  600.     }
  601.     // }}}
  602.     //  {{{ getInfosObject()
  603.     /** Alias de getInfosMultimedia
  604.      *
  605.      * @access  public
  606.      * @return  array
  607.      * @see     getInfosMultimedia()
  608.      * @param   int $idobject identifiant
  609.      */
  610.     public function getInfosObject($idobject=null) { return $this->getInfosMultimedia($idobject); }
  611.     // }}}
  612.     //  {{{ orderByDefaut()
  613.     /** Classement par défaut
  614.      *
  615.      * Défini le tri par défaut pour les requêtes de type SELECT
  616.      *
  617.      * @access public
  618.      * @return string
  619.      */
  620.     public function orderByDefaut($order=null)
  621.     {
  622.         // tri par défaut
  623.         if(empty($order)) {
  624.             $order 'idmultimedia';
  625.         }
  626.         return $order;
  627.     }
  628.     // }}}
  629.     //  {{{ getObjectTitle()
  630.     /** Infos de l'item recherché
  631.      *
  632.      * Affichage standard du titre de l'objet
  633.      *
  634.      * @access public
  635.      * @return string
  636.      * @param  int $idobject Identifiant de l'item
  637.      * @param  array $infos_object Informations pour construire le titre
  638.      * @param array $params Paramétres supplémentaires
  639.      */
  640.     public function getObjectTitle($idobject=null,$infos_object=array(),$params=array())
  641.     {
  642.         if(!$idobject) {
  643.             $idobject $this->idmultimedia;
  644.         }
  645.         $infos['sujet_titre'] = null;
  646.         // champs
  647.         $fields = array('idmultimedia','sujet_titre','url_clean');
  648.         if(!empty($infos_object)) {
  649.             foreach($fields as $k=>$v) {
  650.                 if(array_key_exists($v$infos_object)) {
  651.                     $infos[$v] = $infos_object[$v];
  652.                 }
  653.             }
  654.         } else {
  655.             //charger les infos que si necessaire
  656.             if(empty($this->sujet_titre)) {
  657. //                $this->selectAdd();
  658. //                $this->selectAdd(join($fields, ','));
  659. //                $this->get($idobject);
  660.             }
  661.             foreach($fields as $k=>$v) {
  662.                 if(isset($this->$v) && $this->$v!='') {
  663.                     $infos[$v] = trim($this->$v);
  664.                 }
  665.             }
  666.         }
  667.         if(!empty($params['return_array'])) {
  668.             // ajouter title pour la compatibilité
  669.             $infos['title'] = $infos['sujet_titre'];
  670.             return $infos;
  671.         } else {
  672.             return $infos['sujet_titre'];
  673.         }
  674.     }
  675.     // }}}
  676.     //  {{{ getLinksObjectsMultimedia()
  677.     /** Objets associee un multimedia
  678.      *
  679.      * Liste et les associations multimedias / persons / contacts
  680.      *
  681.      * @access  public
  682.      * @return  array
  683.      * @see     Object_multimedia::getObjectsMultimedia()
  684.      * @param   int     $idmultimedia    identifiant du multimedia
  685.      * @param   string  $type           type recherché (metteur en scene, auteur)
  686.      */
  687.     public function getLinksObjectsMultimedia($idmultimedia,$type)
  688.     {
  689.         $infos = array();
  690.         $object_multimedia $this->getEntityManager()->getRepository(ObjectMultimedia::class);
  691.         if($type=='multimedia_auteur' || $type=='multimedia_metteur' || $type=='multimedia_acteur' || $type=='multimedia_intervenant') {
  692.             $fields = array('idperson','lastname','firstname');
  693.             $infos $object_multimedia->getObjectsMultimedia($idmultimedia,'persons',$fields,$this->getIdrole($type));
  694.         } elseif($type=='multimedia_contact' || $type=='multimedia_partenaire') {
  695.             $fields = array('idcontact','type','organisation','lastname','firstname');
  696.             $infos $object_multimedia->getObjectsMultimedia($idmultimedia,'contacts',$fields,$this->getIdrole($type));
  697.         } elseif($type=='multimedia_spectacle') {
  698.             $fields = array('idspectacle','title');
  699.             $infos $object_multimedia->getObjectsMultimedia($idmultimedia,'spectacles',$fields,$this->getIdrole($type));
  700.         } elseif($type=='multimedia_contents') {
  701.             $fields = array('idcontent','title'); //TODOC
  702.             //$fields = array('idcontent','title','idclassification'); //TODOC
  703.             /*$fields = array(
  704.               'fields' => 'idcontent','title',
  705.               'links' => array(
  706.               'content_classification' => array(
  707.               'fields' => array('idclassification'),
  708.               ),
  709.               ),
  710.               ),
  711.               );*/
  712.             $infos $object_multimedia->getObjectsMultimedia($idmultimedia,'contents',$fields,'NULL');
  713.         } elseif($type=='multimedia_texts') {
  714.             $fields = array('idtext','title');
  715.             $infos $object_multimedia->getObjectsMultimedia($idmultimedia,'texts',$fields,'NULL');
  716.         }
  717.         // retourner les infos
  718.         return $infos;
  719.     }
  720.     // }}}
  721.     //  {{{ getLinkedObjectMultimedia()
  722.     /** Objets associee un multimedia
  723.      *
  724.      * Liste et les associations multimedias / persons / contacts
  725.      *
  726.      * @access  public
  727.      * @return  array
  728.      * @see     Object_multimedia::getObjectsMultimedia()
  729.      * @param   int     $idmultimedia    identifiant du multimedia
  730.      * @param   string  $type           type recherché (metteur en scene, auteur)
  731.      */
  732.     public function getLinkedObjectMultimedias($idobject,$type)
  733.     {
  734.         $infos_link $this->getRelationsArray($type);
  735.         // retouver les documents multimedias associés à un texte
  736.         if(!empty($infos_link)) {
  737.             return $this->getLinkedObject($infos_link,$idobject,$type,'texts');
  738.         }
  739.     }
  740.     // }}}
  741.     //  {{{ getItemsList()
  742.     /** Liste des items pour les champs relationnels
  743.      *
  744.      * Retourne un tableau associatif contenant la liste des items d'une relation
  745.      *
  746.      * @access  public
  747.      * @return  array
  748.      * @param   string $type        Ce qu'on recherche
  749.      * @param   string $idtext      L'id de l'objet
  750.      */
  751.     public function getItemsList($idmultimedia,$type,$type_object=null)
  752.     {
  753.         // type de liaison
  754.         $array_types = array(
  755.             'multimedia_auteur',
  756.             'multimedia_metteur',
  757.             'multimedia_acteur',
  758.             'multimedia_intervenant',
  759.             'multimedia_contact',
  760.             'multimedia_partenaire',
  761.             'multimedia_contents',
  762.             'multimedia_spectacle',
  763.             'multimedia_classification',
  764.             'multimedia_texts',
  765.             'idextranetuser',
  766.             'idextranetuser_producteur',
  767.             'multimedia_extranetuser',
  768.             'idcontact_producteur',
  769.             'multimedia_keyword',
  770.         );
  771.         // fausse relation
  772.         if($type=='add_from_spectacle') {
  773.             return array();
  774.         }
  775.         if (in_array($type,$array_types)) {
  776.             if ($type == 'multimedia_classification' || $type=='idextranetuser' || $type=='multimedia_extranetuser'
  777.                 ||$type=='idextranetuser_producteur' || $type=='idcontact_producteur' || $type=='multimedia_keyword') {
  778.                 if(empty($infos_link)) {
  779.                     $infos_link $this->getRelationsArray($type);
  780.                 }
  781.                 $infos_linked_obj $this->getLinkedObject($infos_link,$idmultimedia,$type,'multimedias');
  782.                 return $infos_linked_obj;
  783.             }
  784.             $itemslist = array();
  785.             $itemslist $this->getLinksObjectsMultimedia($idmultimedia,$type);
  786.             foreach ($itemslist as $key=>$value) {
  787.                 $itemslist[$key]['view_name'] = $value['title'];
  788.             }
  789.             return $itemslist;
  790.         }  else {
  791.             return 'Aucune fonction de recherche pour le type <strong>'.$type.'</strong> dans la méthode !';
  792.         }
  793.     }
  794.     // }}}
  795.     //  {{{ setRelationSelectMultimedias()
  796.     /** Enregistrement dans les table relationnelle
  797.      * Permet l'enregistrement multiple de valeur dans les tables de relation
  798.      * Rôles ; 1>metteur, 21>auteur, 5>acteur, 22>contact, 23>partenaire, NULL>spectacles
  799.      */
  800.     public function setRelationSelectMultimedias(
  801.         string $table,
  802.         string $key,
  803.         string $col,
  804.         $arrayValues,
  805.         int $id,
  806.         string $object,
  807.         int $idrole null
  808.     ): void
  809.     {
  810.         $em $this->getEntityManager()->getConnection();
  811.         $idroleSql = empty($idrole) ? ' idrole IS NULL' ' idrole='.(int)$idrole;
  812.         $idroleInsert = empty($idrole) ? 'NULL' '?';
  813.         /* supression des enregistrements qui ont le meme idobject
  814.          * le meme object, le meme idmultimedia mais dont le idrole change
  815.          * exemple : une fiche multimedia ou une personne est auteur et metteur en scene
  816.          * sinon : supression classique
  817.          * les roles
  818.          * */
  819.         $sqlDelete "DELETE FROM $table WHERE $col=$id AND object LIKE '$object' AND $idroleSql";
  820.         $em->executeStatement($sqlDelete);
  821.         $this->logDeletion('Supprime via setRelationSelectMultimedias '.$sqlDelete);
  822.         //inserer les donnees
  823.         if(!empty($arrayValues)) {
  824.             $prepValues = [];
  825.             $sql "INSERT INTO $table ($key$col, object, idrole, ordermultimedia) VALUES ( ?, ?, ?, $idroleInsert, ?)";
  826.             $prep $em->prepare($sql);
  827.             $i 0;
  828.             foreach ($arrayValues as $value) {
  829.                 $prepValues[] = empty($idrole) ? [$value,$id,$object,$i] : [$value,$id,$object,$idrole,$i];
  830.                 $i++;
  831.             }
  832.             foreach ($prepValues as $value){
  833.                 $prep->executeStatement($value);
  834.             }
  835.         }
  836.     }
  837.     // }}}
  838.     //  {{{ getItemDesc()
  839.     /** Infos de l'item pour les listes AjaxRelation
  840.      *
  841.      * Affichage de la description de l'objet
  842.      *
  843.      * @access public
  844.      * @return string la description
  845.      * @param  int $idobject Identifiant de l'item
  846.      */
  847.     public function getItemDesc($idobject=null)
  848.     {
  849.         if(!$idobject) {
  850.             $idobject $this->idmultimedia;
  851.         }
  852.         // champs
  853.         $fields = array('idmultimedia','sujetTitre','support''date');
  854.         //charger les infos que si necessaire
  855.         if(empty($this->sujet_titre)) {
  856. //            $this->selectAdd();
  857. //            $this->selectAdd(join($fields, ','));
  858.             $datas $this->get($idobject);
  859.         }
  860. //        foreach($fields as $k=>$v) {
  861. //            if(isset($this->$v) && $this->$v!='') {
  862. //                $$v = $this->$v;
  863. //            }
  864. //        }
  865.         return $datas['sujetTitre'].' - '.$datas['support'].' - '.date_format($datas['date'], 'Y-m-d'). ' - n°'.$datas['idmultimedia'];
  866.     }
  867.     // }}}
  868.     //  {{{ getListSearch()
  869.     /** Liste des textes
  870.      *
  871.      * Pour les champs Ajax de relations et les recherches diverses
  872.      * permet de générer un tableau associatif des titres des textes en
  873.      * fonction de critères de recherche alphabétique ou mots clés
  874.      *
  875.      * @access  public
  876.      * @return  array
  877.      * @param   string $lettres     Pour la recherche alphabetique
  878.      * @param   string $keywords    Recherche par mots cles
  879.      */
  880.     public function getListSearch($lettre,$type=null,$keywords=null,$test=null,$type_object=null)
  881.     {
  882.         //mode debug
  883.         //DB_DataObject::debugLevel(1);
  884. //        $this->selectAdd();
  885. //        $this->selectAdd('DISTINCT(idmultimedia),sujet_titre,support,date');
  886. //        $this->whereAdd('publish=1');
  887.         $query $this->createQueryBuilder('e');
  888.         $query->andWhere('e.publish=1');
  889.         // selection par ordre alpha
  890.         if (!empty($lettre)) {
  891.             $query->andWhere('e.sujetTitre LIKE \''.$this->escape($lettre).'%\'');
  892.         }
  893.         // recherche avec un mot cle
  894.         $list $this->splitKeywords($keywords);
  895.         if ($list) {
  896.             if (!empty($list[$this->IDSTR])) {
  897.                 // mots clés
  898.                 foreach($list[$this->IDSTR] as $s) {
  899.                     $query->andWhere('e.sujetTitre LIKE \'%'.$s.'%\'');
  900.                 }
  901.             }
  902.             if (!empty($list[$this->IDNUM])) {
  903.                 // recherche par numéro d'id pour les mots clés numériques
  904.                 $query->andWhere('idmultimedia IN ('.implode(','$list[$this->IDNUM]).')''OR');
  905.             }
  906.         }
  907.         $query->orderBy('e.sujetTitre');
  908. //        $datas = $query->fetch();
  909. //        $query->setMaxResults(1);
  910.         $query $query->getQuery();
  911.         // tableau de donnees
  912.         $r = array();
  913.         foreach($query->getResult() AS $data){
  914.             // titre du media
  915. //            if($GLOBALS['context']['module']=='thnet') {
  916. //                $r[$data->getIdmultimedia()] = $data->getSujetTitre();
  917. //            } else {
  918.                 $r[$data->getIdmultimedia()] = $this->cutSentence($data->getSujetTitre(),25).' - '.$data->getSupport().' - '.$data->getDate()->format('d-m-Y');
  919.                 // si trouvé par id, on l'affiche en fin de titre
  920.                 if (!empty($list[$this->IDNUM]) && in_array($this->idmultimedia$list[$this->IDNUM])) {
  921.                     $r[$this->idmultimedia] .= ' - n°'.$this->idmultimedia;
  922.                 }
  923. //            }
  924.         }
  925.         $this->free();
  926.         return $r;
  927.     }
  928.     // }}}
  929.     //  {{{ getMultimediaContent()
  930.     /** Recuperer les fichiers multimedia associes a un contenu
  931.      *
  932.      *
  933.      * @access   public
  934.      * @param    int        $idobject id de l'objet lié
  935.      * @param    string        $object objet lié
  936.      * @param    int        $idrole Le role si besoin
  937.      * @return   array
  938.      */
  939.     public function getMultimediaContent($idobject,$object='contents',$params=array())
  940.     {
  941.         $conn $this->getEntityManager();
  942.         $sql 'SELECT *
  943.                 FROM object_multimedia om, multimedias m
  944.                 WHERE om.idmultimedia=m.idmultimedia
  945.                 AND om.idobject='.((int)$idobject).'
  946.                 AND om.object=\''.$object.'\'
  947.                 AND m.publish=1';
  948.         // un role précis associé ?
  949.         if(!empty($params['idrole'])) {
  950.             $sql .= ' AND om.idrole='.((int)$params['idrole']);
  951.         }
  952.         $tabcontent $this->queryAll($sql);
  953.         $fields = array('idcontact','type','organisation','url_clean');
  954.         $object_multimedia $conn->getRepository(ObjectMultimedia::class);
  955.         foreach(array_keys($tabcontent) as $k) {
  956.             // checker si c'est un partenaire
  957.             $partenaires $object_multimedia->getObjectsMultimedia($tabcontent[$k]['idmultimedia'],'contacts',$fields,$this->getIdrole('multimedia_partenaire'),true);
  958.             if(!empty($partenaires)) {
  959.                 $tabcontent[$k]['partenaires']  = $this->noPunct($partenaires);
  960.             }
  961.             // ajouter le permalink
  962.             $tabcontent[$k]['permalink'] = $_ENV['URL_THNET'].'/video/'.$tabcontent[$k]['url_clean'];
  963.             // on peux partager ?
  964.             if(!empty($params['share'])) {
  965.                 $tabcontent[$k]['share'] = true;
  966.             }
  967.             $this->setParameters(array('idcontent'=>$idobject));
  968.             $tabcontent[$k]['player'] = $this->getPlayer($tabcontent[$k]);
  969.             $this->getInfosMultimediaMore($tabcontent[$k]);
  970.             // si iPhone ou iPod ou iPad, on regarde si un contenu qui va bien
  971.             if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/iPhone|iPod|iPad|Android/'$_SERVER['HTTP_USER_AGENT'])) {
  972.                 $tabcontent[$k]['user']['iphone'] = true;
  973.             }
  974.         }
  975.         //retourner les contenus multimedia
  976.         if(!empty($tabcontent) && !empty($tabcontent)) {
  977.             return $tabcontent;
  978.         } else {
  979.             return null;
  980.         }
  981.     }
  982.     // }}}
  983.     //  {{{ getStats()
  984.     /** Statistiques à noter pour cette vidéo
  985.      *
  986.      *
  987.      * @access  protected
  988.      * @return  array
  989.      * @param   int $idmultimedia Identifiant de la vidéo
  990.      */
  991.     protected function getStats($url,$idmultimedia)
  992.     {
  993.         $stats = array();
  994.         // recuperer l'url et l'encoder
  995.         $url preg_replace('#^'.preg_quote('/','#').'#'''$url);
  996.         // supprimer ce qu'il y a apres le ?
  997.         if (strstr($url'?')) {
  998.             $path substr($url0strpos($url'?'));
  999.         } else {
  1000.             $path $url;
  1001.         }
  1002.         $path explode('/'trim($path'/'));
  1003.         // object et son id et url encodée
  1004.         $stats['url_encoded'] = urlencode('/'.join('/',$path));
  1005.         $stats['object'] = 'multimedias';
  1006.         $stats['idobject'] = $idmultimedia;
  1007.         return $stats;
  1008.     }
  1009.     // }}}
  1010.     // {{{ escapeJS()
  1011.     /** Echappe les chaines à insérer dans du javascript, utilisé par getPlayer()
  1012.      *
  1013.      *
  1014.      * @param  string $string
  1015.      * @access protected
  1016.      * @return string chaine echappée
  1017.      */
  1018.     protected function escapeJS($string)
  1019.     {
  1020.         $js_escape = array( "\r" => '\r',
  1021.             "\n" => '\n',
  1022.             "\t" => '\t',
  1023.             "'"  => "\\'",
  1024.             '\\' => '\\\\',
  1025.             '"'  => '\\"');
  1026.         return strtr($string$js_escape);
  1027.     }
  1028.     // }}}
  1029.     // {{{ findPlayer()
  1030.     /** Retourne le nom et la configuration du player adéquat pour le type de média
  1031.      *
  1032.      *
  1033.      * @param  string $type  type de media (flv, mp3, ...)
  1034.      * @param  array  $playerConf  contient la config si un player est trouvé
  1035.      * @access protected
  1036.      * @return string identifiant unique du player
  1037.      */
  1038.     protected function findPlayer($type, &$playerConf) {
  1039.         // configuration du player
  1040.         $mediaplayers $this->players->getPlayers();
  1041.         if (empty($mediaplayers) || !is_array($mediaplayers)) {
  1042.             return false;
  1043.         }
  1044.         $url null;
  1045.         foreach($mediaplayers as $k => $v) {
  1046.             if (!$v['active']) {
  1047.                 // player non actif
  1048.                 continue;
  1049.             }
  1050.             if (in_array($type$v['types']) || in_array('*'$v['types'])) {
  1051.                 // player trouvé
  1052.                 $playerConf $v;
  1053.                 return $k;
  1054.             }
  1055.         }
  1056.         return false;
  1057.     }
  1058.     // }}}
  1059.     // {{{ getImage()
  1060.     /** Retourne le chemin vers l'image liée à un fichier multimedia
  1061.      *
  1062.      *
  1063.      * @param  int $idmultimedia l'identifiant ou rien pour l'objet courant
  1064.      * @access protected
  1065.      * @return string le chemin ou null si pas trouvé
  1066.      */
  1067.     protected function getImage($idmultimedia=null)
  1068.     {
  1069.         if (empty($idmultimedia)) {
  1070.             $idmultimedia $this->idmultimedia;
  1071.         }
  1072.         if (empty($idmultimedia) || !$this->my_is_int($idmultimedia) || $idmultimedia <= 0) return null;
  1073.         // image du flv/mp3
  1074.         $base_url_image 'img_tv/';
  1075.         $nom_image $idmultimedia.'.jpg';
  1076.         $image_4_3 $base_url_image.$nom_image;
  1077.         $image_16_9 $base_url_image.'prop169/'.$nom_image;
  1078.         if(file_exists($_ENV['PATH_IMG'].$image_16_9)) {
  1079.             // on utilise en priorité l'image 16/9 si elle existe
  1080.             $image_media $_ENV['URL_THNET'].'/images/'.$image_16_9;
  1081.         } elseif (file_exists($_ENV['PATH_IMG'].$image_4_3)){
  1082.             $image_media $_ENV['URL_THNET'].'/images/'.$image_4_3;
  1083.         } else {
  1084.             $image_media $_ENV['URL_THNET'].'/images/default/audio-def.jpg';
  1085.         }
  1086.         return $image_media;
  1087.     }
  1088.     // }}}
  1089.     //  {{{ isExtraConf()
  1090.     /** test si on veut surcharger la configuration de base
  1091.      *
  1092.      *
  1093.      * @access  protected
  1094.      * @return  bool
  1095.      * @param   array $datamedia Infos sur le media, des infos complémentaires sont être ajoutées
  1096.      * @param   array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
  1097.      */
  1098.     protected function isExtraConf()
  1099.     {
  1100.     }
  1101.     // }}}
  1102.     //  {{{ makePlayerConf()
  1103.     /** Construire le player
  1104.      *
  1105.      *
  1106.      * @access  protected
  1107.      * @return  array la configuration du player
  1108.      * @param   array $datamedia Infos sur le media, des infos complémentaires sont être ajoutées
  1109.      * @param   array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
  1110.      */
  1111.     protected function makePlayerConf(&$datamedia$extraconf=null)
  1112.     {
  1113.         // pour les infos complémentaires
  1114.         $this->getInfosMultimediaMore($datamedia);
  1115.         // id player
  1116.         $player_id 'media'.$datamedia['code'];
  1117.         // début du tableau de conf
  1118.         $pconf = array(
  1119.             // les flashvars du ficher de config
  1120.             // http://developer.longtailvideo.com/trac/wiki/Player5FlashVars
  1121.             'flashvars' => array(
  1122.                 'aboutlink' => $_ENV['URL_THTV'], // clic droit sur jwplayer
  1123.                 'abouttext' => preg_replace('#^.+//#',''$_ENV['URL_THTV']),  // idem
  1124.                 'skin' => $_ENV['URL_THTV'].'/mediaplayer/skins/thnet/thnet.xml',
  1125.                 'linktarget' => '_blank'// target sur le menu "?"
  1126.                 'bufferlength' => $this->getBufferLength(),
  1127.                 'titre_video' => $datamedia['sujet_titre'],
  1128.                 'url_video' => $_ENV['URL_THTV'].'/video/'.$datamedia['url_clean'],
  1129.                 'mediaid' => $datamedia['code'],
  1130.                 'controlbar' => 'over',
  1131.                 'stretching' => 'uniform',
  1132.                 //'debug' => 'console',
  1133.             ),
  1134.             // les paramètres et attributs pour le embed ou le js
  1135.             'params' => array(
  1136.                 'allowscriptaccess' => 'always',
  1137.                 'allowfullscreen' => 'true',
  1138.                 'wmode' => 'opaque',
  1139.             ),
  1140.             'attributes' => array(
  1141.                 'id' => $player_id,
  1142.                 'name' => $player_id,
  1143.             ),
  1144.             'playerid' => $player_id// idenfiiant
  1145.             //'urlxmlconfig' => $_ENV['URL_THTV'].'/player/view/media/'.$datamedia['code'], // fichier de conf xml
  1146.             'movie' => $_ENV['URL_THTV'].'/video/swf/'.$datamedia['code'], // film
  1147.             'movie_simple' => $_ENV['URL_THTV'].'/video/swf/'.$datamedia['code'], // film sans parametre
  1148.             'extra_js' => '',
  1149.             'required' => '9.0.28.0'// version de flash requise
  1150.         );
  1151.         // redéfinition de flashvars
  1152.         if(!empty($extraconf['flashvars'])) {
  1153.             foreach($pconf['flashvars'] as $k=>$v) {
  1154.                 if(array_key_exists($k$extraconf['flashvars'])) {
  1155.                     if($extraconf['flashvars'][$k]===false) {
  1156.                         unset($pconf['flashvars'][$k]);
  1157.                     } else {
  1158.                         $pconf['flashvars'][$k] = $extraconf['flashvars'][$k];
  1159.                     }
  1160.                 }
  1161.             }
  1162.         }
  1163.         /*if(!empty($datamedia['status']) && $datamedia['status']!=1
  1164.             && $GLOBALS['context']['session']->get('idextranetuser')!=$infos['idextranetuser']
  1165.                     && $GLOBALS['context']['session']->get('isroot')!=1) {
  1166.             $pconf['repeat'] = 'always';
  1167.         }*/
  1168.         // paramètres a passer en plus à l'url du movie
  1169.         // et qui sera recu dans le fichier de config
  1170.         if (!empty($this->parameters)) {
  1171.             $params_string '';
  1172.             foreach($this->parameters as $k => $v) {
  1173.                 if ($params_string$params_string .= '&';
  1174.                 $params_string .= $k.'='.urlencode($v);
  1175.             }
  1176.             $pconf['movie'] .= urlencode('?'.urlencode($params_string));
  1177.         }
  1178.         // dimensions
  1179.         $pconf['width'] = 0;
  1180.         $pconf['height'] = 0;
  1181.         // on a defini d'autres dimensions ?
  1182.         $grow true;
  1183.         if(!empty($this->parameters) && is_array($this->parameters)) {
  1184.             if (isset($this->parameters['width']) && $this->parameters['width']>0$pconf['width'] = $this->parameters['width'];
  1185.             if (isset($this->parameters['height']) && $this->parameters['height']>0$pconf['height'] = $this->parameters['height'];
  1186.             if (isset($this->parameters['grow'])) $grow $this->parameters['grow'];
  1187.         }
  1188.         // démarrage automatique
  1189.         if(isset($_REQUEST['autostart']) && empty($GLOBALS['autostart'])) {
  1190.             $GLOBALS['autostart'] = 1// empêche d'avoir plusieurs players en autostart sur une page
  1191.             $pconf['flashvars']['autostart'] = 'true';
  1192.         }
  1193.         // **** JW FLASH PLAYER ****
  1194.         // dimensions
  1195.         if($pconf['width'] <= && $pconf['height'] <= 0) {
  1196.             $pconf['width'] = (isset($datamedia['flv_width'])) ? $datamedia['flv_width'] : $datamedia['flvWidth'];
  1197.             $pconf['height'] = (isset($datamedia['flv_height'])) ? $datamedia['flv_height'] : $datamedia['flvHeight'];
  1198.         } elseif (!($pconf['width'] > && $pconf['height'] > 0)) {
  1199.             $dw $datamedia['flv_width'];
  1200.             $dh $datamedia['flv_height'];
  1201.             if ($pconf['width'] > && $dw 0) {
  1202.                 if (!$grow && $pconf['width'] > $dw$pconf['width'] = $dw;
  1203.                 $pconf['height'] = round($pconf['width'] * ($dh/$dw));
  1204.             } else if ($dh 0) {
  1205.                 if (!$grow && $pconf['height'] > $dh$pconf['height'] = $dh;
  1206.                 $pconf['width'] = round($pconf['height'] * ($dw/$dh));
  1207.             }
  1208.         }
  1209.         // si c'est audio et que height=0
  1210.         if(empty($pconf['height'])) {
  1211.             $pconf['height'] = $pconf['width'];
  1212.         }
  1213.         // mettre à true pour récupérer les états du player dans la console FF3
  1214.         $debug_player false;
  1215.         if ($debug_player) {
  1216.             $pconf['extra_js'] = '
  1217.             function tracecall'.$datamedia['idmultimedia'].'(aMsg) {
  1218.                 setTimeout(function() { throw new Error("[debug'.$datamedia['idmultimedia'].'] " + aMsg); }, 0);
  1219.             }';
  1220.             $pconf['flashvars']['tracecall'] = 'tracecall'.$datamedia['idmultimedia'];
  1221.         }
  1222.         // on va checker les formats et actuellement, on affiche uniquement le flv ICI LES TEST
  1223.         if (!empty($_ENV['USE_FLV_STREAMER']) && $_ENV['USE_FLV_STREAMER'] && !empty($datamedia['formats']['flv'])) {
  1224.             // sur le cloud : streamer : http://developer.longtailvideo.com/trac/wiki/Player5MediaProviders
  1225.             if($datamedia['use_cloud']==1) {
  1226.                 // le stream  amazon
  1227.                 $cloudfront_dns 'stream.theatre-contemporain.net';
  1228.                 //$cloudfront_dns = 's24rkom4lz2n10.cloudfront.net';
  1229.                 $rtmp_cloudfront_dns 'rtmp://'.$cloudfront_dns.'/cfx/st';
  1230.                 $pconf['flashvars']['provider'] = 'rtmp';
  1231.                 $pconf['flashvars']['streamer'] = $rtmp_cloudfront_dns;
  1232.                 $path_file 'flv/'.$datamedia['formats']['flv']['medianame'];
  1233.                 $set_secure true;
  1234.                 // création de la signature pour le contenu cloudfront
  1235.                 if($set_secure) {
  1236.                     require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
  1237.                     $cloudfront = new AmazonCloudFront();
  1238.                     $url_media $cloudfront->get_private_object_url($cloudfront_dns.'/cfx/st'$path_file'+4 hours');
  1239.                     $path_file str_replace($rtmp_cloudfront_dns.'/'''$url_media); // supprimer le prefix
  1240.                 }
  1241.                 // fichier final
  1242.                 $pconf['flashvars']['file'] = $path_file;
  1243.             } else { // via le serveur lighttpd => pseudo streaming
  1244.                 $pconf['flashvars']['file'] = $_ENV['FLV_STREAMER_HOST'].'/flv/'.$datamedia['formats']['flv']['medianame'];
  1245.                 $pconf['flashvars']['provider'] = 'http';
  1246.             }
  1247.         } else {
  1248.             // lecture simple
  1249.             if(!empty($datamedia['mediatype']) && !empty($datamedia['formats'][$datamedia['mediatype']]['mediaurl'])) {
  1250.                 $pconf['flashvars']['file'] = $datamedia['formats'][$datamedia['mediatype']]['mediaurl'];
  1251.             } else {
  1252.                 $pconf['flashvars']['file'] = 'null';
  1253.                 error_log('Impossible de trouver ce fichier vidéo '.$datamedia['idmultimedia'].' '.$_SERVER['REQUEST_URI']);
  1254.             }
  1255.         }
  1256.         /* Statistiques */
  1257.         // clé prévention flood de stats (doit correspondre avec la verif dans logVideoStats())
  1258.         $key md5($_ENV['URL_THTV'].date('Ymd'));
  1259.         // valuers communes
  1260.         $params_stats_callback = array(
  1261.             'code' => $datamedia['code'], // code de la vidéo
  1262.             'idmultimedia' => $datamedia['idmultimedia'], // identifiant de la vidéo
  1263.             'key' => $key,
  1264.         );
  1265.         // debug
  1266.         if (!empty($_SERVER['SPECIAL_ID'])) {
  1267.             $params_stats_callback['dbg'] = 1;
  1268.         }
  1269.         // stats complexes
  1270.         if (!empty($this->parameters['url'])
  1271.             && !empty($this->parameters['module'])) {
  1272.             // idcontent ?
  1273.             if (!empty($this->parameters['idcontent'])) {
  1274.                 $idcontent = (int)$this->parameters['idcontent'];
  1275.             } else {
  1276.                 $idcontent 0;
  1277.             }
  1278.             // récupérer l'url encodé
  1279.             $urlstats $this->getStats($this->parameters['url'], $datamedia['idmultimedia']);
  1280.             if (!empty($urlstats)) {
  1281.                 // mettre le parametre dbg à 1 pour le mode debug (cf. logVideosStats())
  1282.                 $params_stats_callback += array(
  1283.                     'url' => $urlstats['url_encoded'],
  1284.                     'module' => $this->parameters['module'],
  1285.                     'idcontent' => $idcontent,
  1286.                     'object' => $urlstats['object'],
  1287.                     'idobject' => (int)$urlstats['idobject'],
  1288.                 );
  1289.                 foreach($params_stats_callback as $kparam=>$vparam) {
  1290.                     $params_stats_tab[] = $kparam.'='.$vparam;
  1291.                 }
  1292.                 if(!empty($extraconf['flashvars']['plugins']['yourlytics-1']) && $extraconf['flashvars']['plugins']['yourlytics-1']!==false) {
  1293.                     $pconf['flashvars']['yourlytics.callback'] = $_ENV['URL_THTV'].'/stats/store?'.join('&'$params_stats_tab);
  1294.                 }
  1295.             }
  1296.         }
  1297.         // stats simple : si yourlytics.callback n'existe pas = stats classique
  1298.         if(empty($pconf['flashvars']['yourlytics.callback'])) {
  1299.             $params_stats_tab = array(); // redéclare
  1300.             foreach($params_stats_callback as $kparam=>$vparam) {
  1301.                 $params_stats_tab[] = $kparam.'='.$vparam;
  1302.             }
  1303.             if(isset($extraconf['flashvars']['plugins']['yourlytics-1'])) {
  1304.                 if($extraconf['flashvars']['plugins']['yourlytics-1']!==false) {
  1305.                     $pconf['flashvars']['yourlytics.callback'] = $_ENV['URL_THTV'].'/stats/store?'.join('&'$params_stats_tab);
  1306.                 }
  1307.             } else {
  1308.                 $pconf['flashvars']['yourlytics.callback'] = $_ENV['URL_THTV'].'/stats/store?'.join('&'$params_stats_tab);
  1309.             }
  1310.         }
  1311.         // plugins des stats = premier de la liste
  1312.         $pconf['flashvars']['plugins'] = array();
  1313.         // ajouter les plugins
  1314.         // stats
  1315.         if(isset($extraconf['flashvars']['plugins']['yourlytics-1'])) {
  1316.             if($extraconf['flashvars']['plugins']['yourlytics-1']!==false) {
  1317.                 $pconf['flashvars']['plugins']['yourlytics-1'] = $extraconf['flashvars']['plugins']['yourlytics-1'];
  1318.             }
  1319.         } else {
  1320.             $pconf['flashvars']['plugins']['yourlytics-1'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/yourlytics-1/yourlytics-1.swf';
  1321.         }
  1322.         // facebook
  1323.         if(isset($extraconf['flashvars']['plugins']['facebook'])) {
  1324.             if($extraconf['flashvars']['plugins']['facebook']!==false) {
  1325.                 $pconf['flashvars']['plugins']['facebook'] = $extraconf['flashvars']['plugins']['facebook'];
  1326.             }
  1327.         } else {
  1328.             $pconf['flashvars']['plugins']['facebook'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/thnet_facebook/thnet_facebook.swf';
  1329.         }
  1330.         // partage
  1331.         if($datamedia['status']==1) {
  1332.             // si extraconf redéfini sharing
  1333.             if(isset($extraconf['flashvars']['plugins']['sharing'])) {
  1334.                 if($extraconf['flashvars']['plugins']['sharing']!==false) {
  1335.                     $pconf['flashvars']['plugins']['sharing'] = $extraconf['flashvars']['plugins']['sharing'];
  1336.                 }
  1337.             } else {
  1338.                 $pconf['flashvars']['plugins']['sharing'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/thnet_sharing/thnet_sharing.swf';
  1339.             }
  1340.         }
  1341.         // plugin vidéo en relation
  1342.         if(!isset($extraconf['flashvars']['plugins']['related']) ||
  1343.             (isset($extraconf['flashvars']['plugins']['related']) && $extraconf['flashvars']['plugins']['related']!==false)) {
  1344.             $pconf['flashvars']['plugins']['related'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/related/related.swf';
  1345.             $conf_related = array(
  1346.                 'file' => $_ENV['URL_THTV'].'/player/related/media/'.$datamedia['code'], // le fichier RSS
  1347.                 'usedock' => 'false'// ne pas afficher l'icone
  1348.                 'heading' => 'Vidéos associées'// on remplace l'anglais
  1349.                 'dimensions' => '160x90'// dimensions des images
  1350.             );
  1351.             foreach($conf_related as $d=>$r) {
  1352.                 $pconf['flashvars']['related.'.$d] = $r;
  1353.             }
  1354.         }
  1355.         // tooltip timeslider
  1356.         if(!isset($extraconf['flashvars']['plugins']['timeslidertooltipplugin-1']) ||
  1357.             (isset($extraconf['flashvars']['plugins']['timeslidertooltipplugin-1']) && $extraconf['flashvars']['plugins']['timeslidertooltipplugin-1']!==false)) {
  1358.             $pconf['flashvars']['plugins']['timeslidertooltipplugin-1'] = 'timeslidertooltipplugin-1';
  1359.             $pconf['flashvars']['timeslidertooltipplugin.marginbottom'] = 12;
  1360.         }
  1361.         // plugin google analytics en production
  1362.         if(empty($GLOBALS['special_id'])  && !empty($extraconf['flashvars']) && empty($extraconf['flashvars']['plugins']['gapro-1']) && $extraconf['flashvars']['plugins']['gapro-1']!==false) {
  1363.             $pconf['flashvars']['plugins']['gapro-1'] = 'gapro-1';
  1364.             $pconf['flashvars']['gapro.accountid'] = 'UA-2955171-16';
  1365.         }
  1366.         // pour plugin partenaires/titre => actif même quand pas de partenaire
  1367.         if(!isset($extraconf['flashvars']['plugins']['partenaires']) ||
  1368.             (isset($extraconf['flashvars']['plugins']['partenaires']) && $extraconf['flashvars']['plugins']['partenaires']!==false)) {
  1369.             $pconf['flashvars']['plugins']['partenaires'] = $_ENV['URL_THTV'].'/mediaplayer/plugins/thnet_partenaire/thnet_partenaire.swf';
  1370.             if(!empty($datamedia['partenaires'])) {
  1371.                 // si plusieurs, string et renvoi sur thtv
  1372.                 if(count($datamedia['partenaires'])>1) {
  1373.                     foreach($datamedia['partenaires'] as $k=>$v) {
  1374.                         $pconf['flashvars']['thnet_partenaire.nom'] = $v['organisation'];
  1375.                         if(isset($v['link_on_video']) && $v['link_on_video']==1) {
  1376.                             $pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THTV'].'/videos/contact/'.$v['url_clean'].'/';
  1377.                         } else {
  1378.                             $pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THNET'].'/contacts/'.$v['url_clean'].'/';
  1379.                         }
  1380.                         break;
  1381.                     }
  1382.                     /*$pconf['flashvars']['thnet_partenaire.nom'] = join(', ', $partenaires);
  1383.                     $pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THTV'].'/video/'.$datamedia['url_clean'];*/
  1384.                 } else {
  1385.                     foreach($datamedia['partenaires'] as $k=>$v) {
  1386.                         $pconf['flashvars']['thnet_partenaire.nom'] = $v['organisation'];
  1387.                         if(isset($v['link_on_video']) && $v['link_on_video']==1) {
  1388.                             $pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THTV'].'/videos/contact/'.$v['url_clean'].'/';
  1389.                         } else {
  1390.                             $pconf['flashvars']['thnet_partenaire.urlpartenaire'] = $_ENV['URL_THNET'].'/contacts/'.$v['url_clean'].'/';
  1391.                         }
  1392.                     }
  1393.                 }
  1394.             }
  1395.         }
  1396.         // gestion de la hd720
  1397.         if(!empty($datamedia['formats']['hd720']) && !empty($datamedia['formats']['hd720']['medialocalpath']) && file_exists($datamedia['formats']['hd720']['medialocalpath'])) {
  1398.             $pconf['flashvars']['plugins'][] = $_ENV['URL_THTV'].'/mediaplayer/plugins/HD/HD.swf';
  1399.             $pconf['flashvars']['hd.file'] = $datamedia['formats']['hd720']['mediaurl'];
  1400.         }
  1401.         // largeur hauteur pour embed
  1402.         $pconf['width'] = (isset($datamedia['flv_width'])) ? $datamedia['flv_width'] : $datamedia['flvWidth'];
  1403.         $pconf['height'] = (isset($datamedia['flv_height'])) ? $datamedia['flv_height'] : $datamedia['flvHeight'];
  1404.         // ajouter le logo audio
  1405.         if(!empty($datamedia['mediatype']) && $datamedia['mediatype']=='mp3') {
  1406.             $pconf['flashvars']['logo'] = $_ENV['URL_THTV'].'/mediaplayer/audio.png';
  1407.             $pconf['flashvars']['logo.hide'] = false;
  1408.         }
  1409.         // image de la video
  1410.         if (!empty($datamedia['image_media'])) {
  1411.             $pconf['flashvars']['image'] = $datamedia['image_media'];
  1412.         }
  1413.         // pour la barre de controle => utile seulement sur l'ancienne skin
  1414.         //$pconf['height'] += 20;
  1415.         // ajout des flashvars,params et/ou attributes provenant d'une propriété ou d'un paramètre
  1416.         if (empty($extraconf)) {
  1417.             $extraconf = array();
  1418.         }
  1419.         foreach(array('flashvars''params''attributes') as $name) {
  1420.             // si le paramètre est vide, on essaye d'utiliser la propriété de l'objet
  1421.             if (empty($extraconf[$name]) && !empty($this->$name) && is_array($this->$name)) {
  1422.                 $extraconf[$name] = $this->$name;
  1423.             }
  1424.             if (!empty($extraconf[$name]) && is_array($extraconf[$name])) {
  1425.                 $pconf[$name] += $extraconf[$name];
  1426.             }
  1427.         }
  1428.         // liste des plugins en string
  1429.         $pconf['flashvars']['plugins'] = join(','$pconf['flashvars']['plugins']);
  1430.         // =>>> ajouté au array datamedia par référence
  1431.         // sélection du player en fonction du type de fichier
  1432.         $playerConf null;
  1433.         $useplayer false;
  1434.         if(!empty($datamedia['mediatype'])) {
  1435.             $useplayer $this->findPlayer($datamedia['mediatype'], $playerConf);
  1436.         }
  1437.         if ($useplayer === false) return '';
  1438.         $more_datamedia = array(
  1439.             'playerid' => $player_id,
  1440.             'embed_old' => $this->getEmbedCode($pconf), // code d'exort swf
  1441.             'embed' => $this->getEmbedCode($pconftrue), // code d'exort iframe
  1442.             'embeddiv' => $this->getEmbedCode($pconftruetrue), // code d'export iframe responsive
  1443.             'div_width' => $pconf['width'].'px'// taille div
  1444.             'div_height' => $pconf['height'].'px'// idem
  1445.             'mediaplayer' => true,
  1446.             'is_'.$useplayer => true,
  1447.         );
  1448.         foreach($more_datamedia as $k=>$v) {
  1449.             $datamedia[$k] = $v;
  1450.         }
  1451.         // si le player n'est pas capable d'afficher l'image, on la passe au template
  1452.         if (empty($playerConf['image']) && $datamedia['image_media']) {
  1453.             $datamedia['external_image_display'] = true;
  1454.         }
  1455.         return $pconf;
  1456.     }
  1457.     // }}}
  1458.     //  {{{ getPlayer()
  1459.     /** Construire le player
  1460.      *
  1461.      *
  1462.      * @access  public
  1463.      * @return  string le code pour le player
  1464.      * @param   array $datamedia Infos sur le media, des infos complémentaires peuvent être ajoutées
  1465.      * @param   array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
  1466.      */
  1467.     public function getPlayer(&$datamedia$extraconf=null)
  1468.     {
  1469.         $pconf $this->makePlayerConf($datamedia$extraconf);
  1470.         if(!empty($pconf)) {
  1471.             return $this->makePlayerEmbedJS($pconf);
  1472.         }
  1473.     }
  1474.     // }}}
  1475.     //  {{{ getPlayerXMLConfig()
  1476.     /** Construire le player
  1477.      *
  1478.      *
  1479.      * @access  public
  1480.      * @return  string xml de la config
  1481.      * @param   array $datamedia Infos sur le media, des infos complémentaires peuvent être ajoutées
  1482.      * @param   array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
  1483.      */
  1484.     public function getPlayerXMLConfig(&$datamedia$extraconf=null)
  1485.     {
  1486.         $pconf $this->makePlayerConf($datamedia$extraconf);
  1487.         if(!empty($pconf)) {
  1488.             $xml '<config>'."\n";
  1489.             // configuration XML à partir des flashvars
  1490.             foreach($pconf['flashvars'] as $k => $v) {
  1491.                 $xml.="\t".'<'.$k.'>'.htmlspecialchars($vENT_COMPAT'UTF-8').'</'.$k.'>'."\n";
  1492.             }
  1493.             $xml .= '</config>'."\n";
  1494.             return $xml;
  1495.         }
  1496.     }
  1497.     // }}}
  1498.     // {{{ getPlayerArrayConfig()
  1499.     /** Retourner le array du player
  1500.      *
  1501.      *
  1502.      * @access  public
  1503.      * @return  array array de la config
  1504.      * @param   array $datamedia Infos sur le media, des infos complémentaires peuvent être ajoutées
  1505.      * @param   array $extraconf tableau optionnel permettant d'ajouter des flashvars, des params, des attributes
  1506.      */
  1507.     public function getPlayerArrayConfig(&$datamedia$extraconf=null) { return $this->makePlayerConf($datamedia$extraconf); }
  1508.     // }}}
  1509.     // {{{ makePlayerEmbedJS()
  1510.     /** Génére le code pour le player portable en JS
  1511.      *
  1512.      *
  1513.      * @param  array $pconf conf du player
  1514.      * @access public
  1515.      * @return string
  1516.      */
  1517.     public function makePlayerEmbedJS($pconf)
  1518.     {
  1519.         // generation de l'objet swf et de sa configuration
  1520.         $player '<script type="text/javascript">'."\n";
  1521.         $player .= '
  1522.                  /* <![CDATA[ */'."\n";
  1523.         // javascript optionnel
  1524.         if (!empty($pconf['extra_js'])) {
  1525.             $player .= $pconf['extra_js'];
  1526.         }
  1527.         // on redefinie le table flashvars car tout est dans le xml
  1528.         $pconf['flashvars'] = array(
  1529.             'width' => $pconf['width'],
  1530.             'height' => $pconf['height'],
  1531.         );
  1532.         // autostart ?
  1533.         if(!empty($GLOBALS['autostart'])) {
  1534.             $pconf['flashvars']['autostart'] = true;
  1535.         }
  1536.         // ajout de flashvars, params, attributes
  1537.         foreach(array('flashvars','params''attributes') as $name) {
  1538.             $f '';
  1539.             if (!empty($pconf[$name]) && is_array($pconf[$name])) {
  1540.                 foreach ($pconf[$name] as $k => $v) {
  1541.                     if ($f$f .= ",\n";
  1542.                     $f .= '                        '.$k.':"'.$this->escapeJS($v).'"';
  1543.                 }
  1544.             }
  1545.             $player .= 'var '.$name.' = {'."\n".$f."\n".'};'."\n";
  1546.         }
  1547.         $player .= '
  1548.                 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";
  1549.         $player .= '/* ]]> */'."\n";
  1550.         $player .= '</script>'."\n";
  1551.         /*$file = 'http://thnet-yvestan:15001/h264/h264-4539.mp4';
  1552.         //"http.startparam":"starttime",
  1553.         $player = '<script type="text/javascript">'."\n";
  1554.     $player .= '
  1555.     jwplayer("myElement").setup({
  1556.         file: "'.$file.'",
  1557.          startparam:"start",
  1558.                 primary:"flash",
  1559.         image: "/uploads/myPoster.jpg"
  1560.     });';
  1561.         $player .= '</script>'."\n";*/
  1562.         return $player;
  1563.     }
  1564.     // }}}
  1565.     // {{{ makeJsonLD()
  1566.     /** Génére le code en js+ld pour les moteurs de recherche
  1567.      *
  1568.      *
  1569.      * @access public
  1570.      * @return string
  1571.      */
  1572.     public function makeJsonLD($infos)
  1573.     {
  1574.         $format_default $infos['format_default'];
  1575.         $jsonld '
  1576.         <script type="application/ld+json">
  1577.         {
  1578.         "@context": "http://schema.org",
  1579.         "@type": "VideoObject",';
  1580.         $titre str_replace('"',''$infos['sujet_titre']);
  1581.         $jsonld .= '"name": "' .$titre .'",';
  1582.         $jsonld .= '"description": "'.$infos['description'].'",    
  1583.         "thumbnailUrl": "'.$_ENV['URL_THNET'].'/images/img_tv/'.$infos['idmultimedia'].'.jpg",';
  1584.         if(!empty($infos['date'])){
  1585.             $date $this->getFormeDate($infos['date'],$GLOBALS['format_date']['fr']);
  1586.             $jsonld .= '"uploadDate": "'.$date.'",';
  1587.         }
  1588. //        $jsonld .= ' "duration": "'.$infos['duree_site_sec_human'].'",
  1589. //
  1590. //        "contentUrl": "'.$infos['formats'][$format_default]['mediaurl'].'",
  1591. //        "embedUrl": "'.$_ENV['URL_THNET'].'/embed/'.$infos['code'].'"
  1592. //        }
  1593. //        </script>';
  1594.         // "publisher": {
  1595.         //     "@type": "Organization",
  1596.         //     "name": "{contact[organisation]}",
  1597.         //     "logo": {
  1598.         //         "@type": "ImageObject",
  1599.         //         "url": "{profilepicture}",
  1600.         //         "width": 90,
  1601.         //         "height": 90
  1602.         //     }
  1603.         // },
  1604.         return $jsonld;
  1605.     }
  1606.     // }}}
  1607.     // {{{ getEmbedCode
  1608.     /** Génére le code pour le player portable (object/embed)
  1609.      *
  1610.      *
  1611.      * @param  array $pconf conf du player
  1612.      * @access public
  1613.      * @return string
  1614.      */
  1615.     public function getEmbedCode($pconf,$iframe=false$iframe_reponsive false)
  1616.     {
  1617.         $pconf['width'] = 480;
  1618.         $pconf['height'] = 405;
  1619.         $out '';
  1620.         if($iframe_reponsive){
  1621.             $out .= '<div style="position:relative;width:100%;display:inline-block;">';
  1622.         }
  1623.         if($iframe) {
  1624.             // $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>';
  1625.             $out .= '<iframe width="560" height="315" allowFullScreen src="'.str_replace('video/swf','embed',$pconf['movie_simple']).'"></iframe>';
  1626.         } else {
  1627.             $out '<object width="'.$pconf['width'].'" height="'.$pconf['height'].'">';
  1628.             $out .= '<param name="movie" value="'.$pconf['movie_simple'].'"></param>';
  1629.             foreach($pconf['params'] as $k => $v) {
  1630.                 $out .= '<param name="'.$k.'" value="'.htmlspecialchars($vENT_COMPAT'UTF-8').'"></param>';
  1631.             }
  1632.             $out .= '<embed src="'.$pconf['movie_simple'].'" type="application/x-shockwave-flash" width="'.$pconf['width'].'" height="'.$pconf['height'].'"';
  1633.             foreach($pconf['params'] as $k => $v) {
  1634.                 $out .= ' '.$k.'="'.htmlspecialchars($vENT_COMPAT'UTF-8').'"';
  1635.             }
  1636.             $out .= '></embed></object>';
  1637.         }
  1638.         if($iframe_reponsive){
  1639.             $out .= '</div>';
  1640.         }
  1641.         return $out;
  1642.     }
  1643.     // }}}
  1644.     // {{{ setParameters()
  1645.     /** Définit les paramètres à passer au player
  1646.      *
  1647.      *
  1648.      * @param  array $parameters paramètres
  1649.      * @access public
  1650.      * @return void
  1651.      */
  1652.     public function setParameters($parameters=array()) { $this->parameters array_merge($this->parameters$parameters); }
  1653.     // }}}
  1654.     // {{{ setStatsParameters()
  1655.     /** Définit les paramètres à passer au player pour les stats
  1656.      *
  1657.      *
  1658.      * @param  array $parameters paramètres
  1659.      * @access public
  1660.      * @return void
  1661.      */
  1662.     public function setStatsParameters($url=null,$module=null)
  1663.     {
  1664.         if (!isset($url)) $url $_SERVER['REQUEST_URI'];
  1665.         if (!isset($module)) $module $GLOBALS['context']['module'];
  1666.         $this->setParameters(array('url' => $url'module'=> $module));
  1667.     }
  1668.     // }}}
  1669.     // {{{ setDimensions()
  1670.     /** Définit les dimensions d'affichage du média
  1671.      *
  1672.      *
  1673.      * @param  array $dimensions height = hauteur, width = largeur , grow autorise ou non l'agrandissement du media
  1674.      * @access public
  1675.      * @return void
  1676.      */
  1677.     public function setDimensions($dimensions=array())
  1678.     {
  1679.         if (!isset($dimensions['width'])) $dimensions['width'] = 0;
  1680.         if (!isset($dimensions['height'])) $dimensions['height'] = 0;
  1681.         if (!isset($dimensions['grow'])) $dimensions['grow'] = true;
  1682.         $dimensions['width'] = (int)$dimensions['width'];
  1683.         $dimensions['height'] = (int)$dimensions['height'];
  1684.         // en pourcentage
  1685.         if(!empty($dimensions['percent'])) {
  1686.             $dimensions['width'] = $dimensions['width'].'%';
  1687.             $dimensions['height'] = $dimensions['height'].'%';
  1688.         }
  1689.         $dimensions['grow'] = !!$dimensions['grow'];
  1690.         $this->setParameters($dimensions);
  1691.     }
  1692.     // }}}
  1693.     //  {{{ getVignetteMultimedia()
  1694.     /** Récupére la vignette d'un document multimedia ou la cree si besoin
  1695.      *
  1696.      * @access   public
  1697.      * param     int $idmultimedia identifiant du document multimédia
  1698.      * @return   string
  1699.      */
  1700.     public function getVignetteMultimedia($idmultimedia=null,$format=array())
  1701.     {
  1702.         if(empty($idmultimedia)) {
  1703.             $idmultimedia $this->idmultimedia;
  1704.         }
  1705.         // par default : image normal 100px x 100px qualite 75
  1706.         if($format) {
  1707.             $set_format $format;
  1708.         } else {
  1709.             $set_format = (array('width'=>93,'height'=>70,'direction'=>'crop','fleche'=>'moyen'));
  1710.         }
  1711.         $this->images->setVignetteFormat($set_format);
  1712.         return $this->images->getVignetteObject($idmultimedia,'multimedias','image');
  1713.     }
  1714.     // }}}
  1715.     //  {{{ getStaticThumbnail()
  1716.     /** Récupére la vignette d'un document multimedia et lui donne le nom du code
  1717.      *
  1718.      * @access   public
  1719.      * param     int $code identifiant du document multimédia
  1720.      * @return   string
  1721.      */
  1722.     public function getStaticThumbnail($idmultimedia,$code,$width=140,$format=array())
  1723.     {
  1724.         if(empty($code)) {
  1725.             $code $this->code;
  1726.         }
  1727.         // generation par la classe Images
  1728.         if(!isset($this->images)) {
  1729.             $this->images Images::getInstance($this->getEntityManager());
  1730.         }
  1731.         $params_thumb = array(
  1732.             'basedir' => 'video/',
  1733.             'other_directory' => $_ENV['PATH_IMG'].'img_tv',
  1734.             'no_ext_dir' => true,
  1735.             'baseimgfile' => $code,
  1736.         );
  1737.         return $_ENV['URL_DIRECTORYUPLOAD'].$this->images->getThumbnail($idmultimedia.'.jpg',$width,'thumb',$params_thumb);
  1738.     }
  1739.     // }}}
  1740.     //  {{{ getIdrole()
  1741.     /** relation entre le type et l'idrole
  1742.      *
  1743.      * @access  public
  1744.      * @return  string
  1745.      * @param   string $type Type recherché
  1746.      */
  1747.     public function getIdrole($type)
  1748.     {
  1749.         $roles = array(
  1750.             'multimedia_auteur' => '21',
  1751.             'multimedia_acteur' => '5',
  1752.             'multimedia_intervenant' => '25',
  1753.             'multimedia_metteur' => '1',
  1754.             'multimedia_contact' => '22',
  1755.             'multimedia_partenaire' => '23',
  1756.             //'multimedia_spectacle_trailer' => '24',
  1757.             //'multimedia_text_trailer' => '24',
  1758.         );
  1759.         if(!array_key_exists($type,$roles)) {
  1760.             return null;
  1761.         }
  1762.         return $roles[$type];
  1763.     }
  1764.     // }}}
  1765.     //  {{{ getInfosVideoTete()
  1766.     /** Une vidéo de tête
  1767.      *
  1768.      * @access  public
  1769.      * @return  string
  1770.      * @param   string $type Type recherché
  1771.      */
  1772.     public function getInfosVideoTete($infos_row,$partenaires=true,$dimensions=array('width'=>'280','height'=>'210'))
  1773.     {
  1774.         $conn $this->getEntityManager();
  1775.         $video_tete = array();
  1776.         // infos sur le spectacle
  1777.         if(isset($infos_row['spectacle'])) {
  1778.             $video_tete['spectacle'] = $infos_row['spectacle'];
  1779.             if(!empty($infos_row['spectacle']['multimedia'])){
  1780.                 $idmultimedia $infos_row['spectacle']['multimedia']['idmultimedia'];
  1781.             }
  1782.         }
  1783.         // idmultimedia
  1784.         if(isset($infos_row['idmultimedia'])) {
  1785.             $idmultimedia $infos_row['idmultimedia'];
  1786.         }
  1787.         // change la taille pour la video de tete
  1788.         $this->setDimensions($dimensions);
  1789.         // recup des infos de la vidéo de tete
  1790.         $datamedia $this->getInfosMultimedia($idmultimedia,false,true);
  1791.         // partenariat
  1792.         if($partenaires) {
  1793.             $fields = array('idcontact','type','organisation','url_clean');
  1794.             $object_multimedia $conn->getRepository(ObjectMultimedia::class);
  1795.             $partenaires $object_multimedia->getObjectsMultimedia($idmultimedia,'contacts',$fields,$this->getIdrole('multimedia_partenaire'),true);
  1796.             if(!empty($partenaires)) {
  1797.                 $partenaires $this->noPunct($partenaires);
  1798.                 $datamedia['partenaires'] = $this->noPunct($partenaires);
  1799.             }
  1800.         }
  1801.         if(!empty($datamedia)) {
  1802.             $video_tete['media'][] = $datamedia;
  1803.         }
  1804.         // trouver la prochaine date et lieu du spectacle lié
  1805.         if(isset($infos_row['spectacle'])) {
  1806.             $spectacles $conn->getRepository(Spectacles::class);
  1807.             $video_tete['spectacle'] += $spectacles->getProchDateLieu(array('prochains' => true) ,$infos_row['spectacle']['idspectacle']);
  1808.         }
  1809.         return $video_tete;
  1810.     }
  1811.     // }}}
  1812.     //  {{{ getCountMultimedias()
  1813.     /** Retourne le nombres de vidéos
  1814.      *
  1815.      * Retourne le nombres de vidéos au format "standard"
  1816.      *
  1817.      * @access   public
  1818.      * @return   array
  1819.      * @param    array $params_sql paramètre pour la requete SQL
  1820.      * @param    array $params_tab paramètre pour la requete SQL
  1821.      * @param    array $format de la vignette si pas standard
  1822.      * @param    bool $debug mode débugage
  1823.      */
  1824.     public function getCountMultimedias($params_sql=null)
  1825.     {
  1826.         // si pas de tableau
  1827.         if(!isset($params_sql['special'])) {
  1828.             $params_sql['special'] = array();
  1829.         }
  1830.         if(!isset($params_sql['params'])) {
  1831.             $params_sql['params'] = array();
  1832.         }
  1833.         // construction de la requête avec le passage de paramètres
  1834.         $sql $this->getSQLMultimedias($params_sql);
  1835.         $dbg = (empty($params_sql['dbg'])) ? array() : $dbg $params_sql['dbg'];
  1836.         return $this->queryOne($sql,$dbg);
  1837.     }
  1838.     // }}}
  1839.     //  {{{ getListMultimedias()
  1840.     /** Retourne des listes de vidéos
  1841.      *
  1842.      * Retourne des listes de vidéo au format "standard""
  1843.      *
  1844.      * @access   public
  1845.      * @return   array
  1846.      * @param    array $params_sql paramètre pour la requete SQL
  1847.      * @param    array $params_tab paramètre pour la requete SQL
  1848.      * @param    array $format de la vignette si pas standard
  1849.      * @param    bool $debug mode débugage
  1850.      */
  1851.     public function getListMultimedias($params_sql=null,$format_vignette=array(),$params_display=array())
  1852.     {
  1853.         $conn $this->getEntityManager();
  1854.         // si pas de tableau
  1855.         if(!isset($params_sql['special'])) {
  1856.             $params_sql['special'] = array();
  1857.         }
  1858.         if(!isset($params_sql['params'])) {
  1859.             $params_sql['params'] = array();
  1860.         }
  1861.         // construction de la requête avec le passage de paramètres;
  1862.         $sql $this->getSQLMultimedias($params_sql);
  1863.         // vignettes
  1864.         if(empty($params_display['format_vignette'])) {
  1865.             // defaut
  1866.             $format_vignette = array('width'=>$_ENV['VIGN_VIDEO_WIDTH'],'height'=>$_ENV['VIGN_VIDEO_HEIGHT'],'fleche'=>'none','ratio' => '169');
  1867.             // carré et sans fleche pour l'API
  1868.             if(!empty($params_display['api'])) {
  1869.                 $format_vignette = array('width'=>115,'height'=>115,'direction'=>'crop','fleche'=>'none');
  1870.             }
  1871.         }
  1872.         if(!empty($params_display['display'])) {
  1873.             $display $params_display['display'];
  1874.             unset($params_display['display']);
  1875.         } else {
  1876.             $display = array();
  1877.         }
  1878.         // pour les prochaines date du spectacle
  1879.         $spectacles $this->getEntityManager()->getRepository(Spectacles::class);
  1880.         // paramètre de debug
  1881.         $dbg = (empty($params_sql['dbg'])) ? array() : $dbg $params_sql['dbg'];
  1882.         // executer la requete
  1883.         $this->query($sql,$dbg);
  1884.         $videos = array();
  1885.         // donnée entières ?
  1886.         if(empty($params_display['alldata'])) {
  1887.             $params_display['alldata'] = false;
  1888.         }
  1889.         // debug
  1890.         $start_boucle microtime(true);
  1891.         // on boucle
  1892.         while($this->fetch()) {
  1893.             $idmultimedia $this->idmultimedia;
  1894.             if(!empty($params_sql['fields'])) {
  1895.                 foreach($params_sql['fields'] as $f)  {
  1896.                     $videos[$idmultimedia][$f] = $this->$f;
  1897.                 }
  1898.             } else {
  1899.                 if(!empty($params_display['api'])) {
  1900.                     $videos[$idmultimedia] = $this->getInfosMultimedia($idmultimedia,false,true,array('vignette' => $format_vignette'tableau' => true'display' => $display));
  1901.                 } else {
  1902.                     $videos[$idmultimedia] = $this->getInfosMultimedia($idmultimedia,false,$params_display['alldata'],array('vignette' => $format_vignette'tableau' => true'display' => $display));
  1903.                 }
  1904.                 $videos[$idmultimedia]['description_wiki'] = $this->description;
  1905.                 $videos[$idmultimedia]['description_html'] = $this->wikiTransform($this->description$this->markdown);
  1906.                 $videos[$idmultimedia]['description'] = strip_tags($videos[$idmultimedia]['description_html']);
  1907.                 $videos[$idmultimedia]['description_courte'] = $this->cutSentence($videos[$idmultimedia]['description'],45,true);
  1908.                 $videos[$idmultimedia]['dateinsert'] = $this->getFormeDate($this->dateinsert);
  1909.                 $videos[$idmultimedia]['url_clean'] = $this->url_clean;
  1910.             }
  1911.             // conversion du array pour la version API
  1912.             if(!empty($params_display['api'])) {
  1913.                 $videos[$idmultimedia] = $this->getApiTab($videos[$idmultimedia]);
  1914.             }
  1915.             // récupèration du calendrier
  1916.             if(!empty($params_display['get_schedule']) && isset($this->idspectacle)) {
  1917.                 $params_schedule = array('prochains' => true);
  1918.                 if(!empty($params_display['get_schedule_ville'])){
  1919.                     $params_schedule['area'] = $params_display['get_schedule_ville'];
  1920.                 }
  1921.                 $contact_id $this->idcontact;
  1922.                 if(!empty($params_display['get_schedule_contact'])){
  1923.                     $contact_id $params_display['get_schedule_contact'];
  1924.                 }
  1925.                 if(!empty($params_display['anciens'])){
  1926.                     $params_schedule['anciens'] = true;
  1927.                 }
  1928.                 $a $videos[$idmultimedia]['spectacle'] = $conn->getRepository(Spectacles::class)->getInfosSpectacle($this->idspectacle);
  1929.                 if($params_display['get_schedule']=='plus_proche') {
  1930.                     $contact_id null;
  1931.                 }
  1932.                 $videos[$idmultimedia]['spectacle']['schedule'] = $conn->getRepository(Spectacles::class)->getProchDateLieu(
  1933.                     $params_schedule,
  1934.                     $this->idspectacle,
  1935.                     $contact_id
  1936.                 );
  1937.             }
  1938.         }
  1939.         // debug de la boucle
  1940.         if($this->isTraceMode('list_object')) {
  1941.             $this->setTraceInfos(array(
  1942.                 'execution_time_boucle' => microtime(true) - $start_boucle,
  1943.                 'nb_occurence' => count($videos),
  1944.                 'dbg' => $dbg,
  1945.             ));
  1946.         }
  1947.         $this->free();
  1948.         return $videos;
  1949.     }
  1950.     // }}}
  1951.     //  {{{ getSQLMultimedias()
  1952.     /** Générer la requete standard pour des vidéos
  1953.      *
  1954.      * $params = array(
  1955.      *  'select' => champs en plus pour le select,
  1956.      *  'from' => champs en plus pour le from,
  1957.      *  'where' => paramètres en plus le where,
  1958.      *  'order' => classement des résultats,
  1959.      *  'limit' => limiter le nb de résultats array(debut,fin), (all pour pas de limit)
  1960.      * )
  1961.      * $special = array(
  1962.      *  'select_by_text_or_adaptation' => text et adaptation,
  1963.      *  'prochains' => true = date dans le future, un entier = fait un between
  1964.      *  'anciens' =>
  1965.      *  'join' => jointure gauche sur contacts et schedules
  1966.      * )
  1967.      *
  1968.      *
  1969.      * @access   public
  1970.      * @param    array  $params Les paramètres pour la requete
  1971.      * @param    array $special Les paramètres supplémentaires
  1972.      * @param    bool $debug afficher la requête TODO
  1973.      * @return   string
  1974.      */
  1975.     public function getSQLMultimedias($query=array(),$debug=false)
  1976.     {
  1977.         // on prepare les tableaux
  1978.         foreach(array('select','from','where','order','group','limit') as $t) {
  1979.             if(!empty($query[$t])) {
  1980.                 if(!is_array($query[$t])) {
  1981.                     $query[$t][] = $query[$t];
  1982.                 } else {
  1983.                     $query[$t] = $query[$t];
  1984.                 }
  1985.             } else {
  1986.                 $query[$t] = array();
  1987.             }
  1988.         }
  1989.         // champs par défaut
  1990.         if(empty($query['count_only_spectacles']) && empty($query['only_custom_select'])){
  1991.             $this->addSQLParams('select',$query,array(
  1992.                 array('multimedias' => '*')
  1993.             ));
  1994.         }
  1995.         // publié ou pas
  1996.         if(empty($query['publish']) && $_ENV['CHECK_IF_ONLINE']) {
  1997.             $this->addSQLParams('where',$query,array(
  1998.                 array('multimedias','publish',1)
  1999.             ));
  2000.         } elseif(!empty($query['publish'])) {
  2001.             $this->addSQLParams('where',$query,array(
  2002.                 array('multimedias','publish',$query['publish'])
  2003.             ));
  2004.         }
  2005.         // langue spécifique ?
  2006.         if(!empty($query['language'])) {
  2007.             $this->addSQLParams('where',$query,array(
  2008.                 array('multimedias','language',$query['language'],'AND')
  2009.             ));
  2010.         }
  2011.         // recherche par liaison via object_multimedia
  2012.         if(!empty($query['multimedia_extranetuser'])) {
  2013.             // 3 tables de recherche
  2014.             $this->addSQLParams('from',$query,array(
  2015.                 'multimedia_extranetuser',
  2016.                 'multimedias'
  2017.             ));
  2018.             // jointure entre les 3 tables
  2019.             $this->addSQLParams('join',$query,array(
  2020.                 'multimedias.`idmultimedia`' => 'multimedia_extranetuser.`idmultimedia`',
  2021.             ));
  2022.             // pas d'idrole, du spectacle et pas de mp3
  2023.             $this->addSQLParams('where',$query,array(
  2024.                 array('multimedia_extranetuser','idextranetuser',$query['multimedia_extranetuser']),
  2025.             ));
  2026.         }
  2027.         // recherche par liaison via object_multimedia
  2028.         //recherche des vidéos par années
  2029.         if(!empty($query['where_date_multimedias'])) {
  2030.             $query['where'][] = ' AND multimedias.`date` BETWEEN \''.$query['where_date_multimedias']['datestart'].'\' AND \''.$query['where_date_multimedias']['dateend'].'\' ';
  2031.         }
  2032.         if(!empty($query['affiche'])) {
  2033.             if(empty($query['count_only_spectacles'])){
  2034.                 $this->addSQLParams('select',$query,array(
  2035.                     array('spectacles' => 'idspectacle'),
  2036.                     array('schedules' => 'idcontact')
  2037.                 ));
  2038.             }
  2039.             // 3 tables de recherche
  2040.             $this->addSQLParams('from',$query,array(
  2041.                 'object_multimedia',
  2042.                 'schedules',
  2043.                 'spectacles',
  2044.                 'contacts',
  2045.                 'multimedias'
  2046.             ));
  2047.             // jointure entre les 3 tables
  2048.             $this->addSQLParams('join',$query,array(
  2049.                 'multimedias.`idmultimedia`' => 'object_multimedia.`idmultimedia`',
  2050.                 'schedules.`idspectacle`' => 'object_multimedia.`idobject`',
  2051.                 'schedules.`idspectacle`' => 'spectacles.`idspectacle`',
  2052.                 'spectacles.`idspectacle`' => 'object_multimedia.`idobject`',
  2053.                 'contacts.`idcontact`' => 'schedules.`idcontact`',
  2054.             ));
  2055.             // pas d'idrole, du spectacle et pas de mp3
  2056.             $this->addSQLParams('where',$query,array(
  2057.                 array('object_multimedia','object','spectacles'),
  2058.                 array('object_multimedia','idrole','ISNULL'),
  2059.                 /*array('multimedias','mp3',0),*/
  2060.             ));
  2061.             // période
  2062.             if(is_array($query['affiche'])) {
  2063.                 if(!empty($query['affiche']['datestart']) && !empty($query['affiche']['dateend'])) {
  2064.                     $query['where'][] = ' AND schedules.`date` BETWEEN \''.$query['affiche']['datestart'].'\' AND \''.$query['affiche']['dateend'].'\' ';
  2065.                 } else {
  2066.                     if(key($query['affiche'])=='today') {
  2067.                         // ajouter les jours
  2068.                         $date_debut date('Y-m-d');
  2069.                         $date_fin strftime('%Y-%m-%d',strtotime($date_debut)+$query['affiche']['today']*24*3600);
  2070.                         $query['where'][] = ' AND schedules.`date` BETWEEN \''.$date_debut.'\' AND \''.$date_fin.'\' ';
  2071.                     }
  2072.                     if(key($query['affiche'])=='old') {
  2073.                         // ajouter les jours
  2074.                         $date_fin date('Y-m-d');
  2075.                         $date_debut strftime('%Y-%m-%d',strtotime($date_fin)-$query['affiche']['old']*24*3600);
  2076.                         $query['where'][] = ' AND schedules.`date` BETWEEN \''.$date_debut.'\' AND \''.$date_fin.'\' ';
  2077.                     }
  2078.                     if(key($query['affiche'])=='old_stricts') {
  2079.                         $query['where'][] = ' AND schedules.`date` <\''.date('Y-m-d').'\' ';
  2080.                     }
  2081.                     if(key($query['affiche'])=='saison') {
  2082.                         // ajouter les jours
  2083.                         $date_debut $query['affiche']['saison'][0];
  2084.                         $date_fin $query['affiche']['saison'][1];
  2085.                         $query['where'][] = ' AND schedules.`date` BETWEEN \''.$date_debut.'\' AND \''.$date_fin.'\' ';
  2086.                     }
  2087.                 }
  2088.             }
  2089.             // classement par le calendrier
  2090.             $this->addSQLParams('order',$query,array(
  2091.                 array('schedules' => 'date')
  2092.             ));
  2093.             // du plus récent au plus anciens
  2094.             if(empty($query['direction'])) {
  2095.                 $this->addSQLParams('direction',$query,'ASC');
  2096.             }
  2097.             // grouper par idspectacle
  2098.             $this->addSQLParams('group',$query,array('object_multimedia' => 'idobject'));
  2099.         }
  2100.         if(!empty($query['novod']) && $query['novod']) {
  2101.             $query['where'][] = ' AND (price=\'\' OR price IS NULL) ';
  2102.         }
  2103.         // recherche par liaison via object_multimedia
  2104.         if(!empty($query['object'])) {
  2105.             // 2 tables de recherche
  2106.             $this->addSQLParams('from',$query,array(
  2107.                 'object_multimedia',
  2108.                 'multimedias'
  2109.             ));
  2110.             // jointure entre les 2 tables
  2111.             $this->addSQLParams('join',$query,array(
  2112.                 'multimedias.`idmultimedia`' => 'object_multimedia.`idmultimedia`',
  2113.             ));
  2114.             // pas d'idrole, du spectacle et pas de mp3
  2115.             if(is_array($query['object'])) {
  2116.                 foreach($query['object'] as $k=>$v) {
  2117.                     // si on a v array('contact',12) par exemple
  2118.                     if($k=='list') {
  2119.                         $this->addSQLParams('where',$query,array(
  2120.                             array('object_multimedia','object',$v[0]),
  2121.                             array('object_multimedia','idobject',$v[1]),
  2122.                         ));
  2123.                     }
  2124.                     else if(is_numeric($k)) {
  2125.                         $this->addSQLParams('where',$query,array(
  2126.                             array('object_multimedia','object',$v),
  2127.                             array('object_multimedia','idobject',$k)
  2128.                         ));
  2129.                     }
  2130.                     else {
  2131.                         if(is_array($v)) {
  2132.                             $this->addSQLParams('where',$query,array(
  2133.                                 array('object_multimedia','object',key($v)),
  2134.                                 array('object_multimedia','idobject',reset($v)),
  2135.                             ));
  2136.                         } else { // si on a array('contact' => 12) par exemple
  2137.                             $this->addSQLParams('where',$query,array(
  2138.                                 array('object_multimedia','object',$k),
  2139.                                 array('object_multimedia','idobject',$v),
  2140.                             ));
  2141.                         }
  2142.                     }
  2143.                 }
  2144.             }
  2145.         }
  2146.         // recherche par liaison via multimedia_classification
  2147.         if(!empty($query['idclassification'])) {
  2148.             // 2 tables de recherche
  2149.             $this->addSQLParams('from',$query,array(
  2150.                 'multimedia_classification',
  2151.                 'multimedias'
  2152.             ));
  2153.             // jointure entre les 2 tables
  2154.             $this->addSQLParams('join',$query,array(
  2155.                 'multimedias.`idmultimedia`' => 'multimedia_classification.`idmultimedia`',
  2156.             ));
  2157.             // voir si la classification est string ou pas
  2158.             if(is_array($query['idclassification'])) {
  2159.                 foreach($query['idclassification'] as $k=>$v) {
  2160.                     if(!$this->my_is_int($v)) {
  2161.                         $is_string true;
  2162.                     } else {
  2163.                         $is_string false;
  2164.                     }
  2165.                     break; // sortir
  2166.                 }
  2167.             } else {
  2168.                 if(!$this->my_is_int($query['idclassification'])) {
  2169.                     $is_string true;
  2170.                 } else {
  2171.                     $is_string false;
  2172.                 }
  2173.             }
  2174.             // si la classification est string
  2175.             if($is_string) {
  2176.                 $this->addSQLParams('from',$query,array(
  2177.                     'classifications',
  2178.                 ));
  2179.                 $this->addSQLParams('join',$query,array(
  2180.                     'classifications.`idclassification`' => 'multimedia_classification.`idclassification`',
  2181.                 ));
  2182.                 $this->addSQLParams('where',$query,array(
  2183.                     array('classifications','classification',$query['idclassification']),
  2184.                 ));
  2185.             } else {
  2186.                 $this->addSQLParams('where',$query,array(
  2187.                     array('multimedia_classification','idclassification',$query['idclassification']),
  2188.                 ));
  2189.             }
  2190.         }
  2191.         // uniquement un type de media
  2192.         if(!empty($query['mediatype'])) {
  2193.             $this->addSQLParams('where',$query,array(
  2194.                 array('multimedias',$query['mediatype'],1),
  2195.             ));
  2196.         }
  2197.         // recherche par type
  2198.         if(!empty($query['type'])) {
  2199.             $this->addSQLParams('where',$query,array(
  2200.                 array('multimedias','type',$query['type'])
  2201.             ));
  2202.         }
  2203.         return $this->getSQLObject($query);
  2204.     }
  2205.     // }}}
  2206.     // {{{ getMultimediasBy()
  2207.     /** Retoure la liste des idmultimedias en relation avec l'objet indiqué
  2208.      *
  2209.      *
  2210.      * @param  string $object     type d'objet
  2211.      * @param  int    $idobject   identifiant de l'objet
  2212.      * @param  string $extrasql   sql optionnel
  2213.      * @access public
  2214.      * @return array              liste des idmultimedias (tableau unidimensionnel)
  2215.      */
  2216.     public function getMultimediasBy($object$idobject$extrasql=null$select=null)
  2217.     {
  2218.         if(!empty($select)) {
  2219.             if($select=='count') {
  2220.                 $sql_select ' COUNT(DISTINCT(m.idmultimedia)) ';
  2221.             } else {
  2222.                 $sql_select 'DISTINCT(m.idmultimedia),'.$select;
  2223.             }
  2224.         } else {
  2225.             $sql_select 'DISTINCT(m.idmultimedia)';
  2226.         }
  2227.         $sql 'SELECT '.$sql_select.'
  2228.                 FROM object_multimedia om, multimedias m
  2229.                 WHERE om.idmultimedia=m.idmultimedia
  2230.                 AND om.idobject='.((int)$idobject).'
  2231.                 AND om.object=\''.$object.'\'
  2232.                 AND m.publish=1';
  2233.         if (!empty($extrasql)) $sql.=' '.$extrasql;
  2234.         if($select=='count') {
  2235.             $countcontent $this->queryOne($sql);
  2236.             return $countcontent;
  2237.         }
  2238.         if(!empty($select)) {
  2239.             $tabcontent $this->queryAll($sql);
  2240.             return $tabcontent;
  2241.         } else {
  2242.             $tabcontent $this->queryCol($sql);
  2243.             return array_unique($tabcontent);
  2244.         }
  2245.     }
  2246.     // }}}
  2247.     // {{{ getAssociateMultimedias()
  2248.     /** Retourne une liste de multimedias en relation avec un autre multimedia
  2249.      *
  2250.      *
  2251.      * @param  int $idmultimedia  identifiant du multimedia
  2252.      * @param  int $nmax          nombre maximal à retourner
  2253.      * @param  string $extrasql   sql optionnel à passer à la méthode getMultimediasBy()
  2254.      * @access public
  2255.      * @return array              liste mélangé et semi-aléatoire d'idmultimedias
  2256.      */
  2257.     public function getAssociateMultimedias($idmultimedia$nmax=10$extrasql=null)
  2258.     {
  2259.         $infos = array();
  2260.         $conn $this->getEntityManager();
  2261.         $object_multimedia $conn->getRepository(ObjectMultimedia::class);
  2262.         /* on récupère les id par type */
  2263.         $fields null;
  2264.         foreach(array('multimedia_auteur','multimedia_metteur''multimedia_acteur''multimedia_intervenant') as $type) {
  2265.             $infos['persons'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'persons',$fields,$this->getIdrole($type));
  2266.         }
  2267.         foreach(array('multimedia_contact''multimedia_partenaire') as $type) {
  2268.             $infos['contacts'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'contacts',$fields,$this->getIdrole($type));
  2269.         }
  2270.         foreach(array('multimedia_spectacle') as $type) {
  2271.             $infos['spectacles'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'spectacles',$fields,$this->getIdrole($type));
  2272.         }
  2273.         foreach(array('multimedia_contents') as $type) {
  2274.             $infos['contents'][$type] = $object_multimedia->getObjectsMultimedia($idmultimedia,'contents',$fields,'NULL');
  2275.         }
  2276.         /* pour chaque type, on crée une liste des idmultimedias correspondants */
  2277.         $tab = array();
  2278.         foreach(array_keys($infos) as $object) {
  2279.             foreach($infos[$object] as $k => $v) {
  2280.                 $tab[$k] = array();
  2281.                 foreach(array_keys($v) as $idobject) {
  2282.                     /* on obtient la liste des idmultimedias pour ce type d'objet et cet idobject */
  2283.                     $nums $this->getMultimediasBy($object$idobject$extrasql);
  2284.                     foreach($nums as $nk => $nv) {
  2285.                         // on ignore l'idmultimedia courant
  2286.                         if ($nv == $idmultimedia) {
  2287.                             unset($nums[$nk]);
  2288.                         }
  2289.                     }
  2290.                     $tab[$k] += $nums;
  2291.                 }
  2292.                 if (empty($tab[$k])) {
  2293.                     unset($tab[$k]);
  2294.                 }
  2295.             }
  2296.         }
  2297.         /* on remplit le tableau final en prenant un idmultimedia pour chaque type au hasard
  2298.          * on essaye d'en obtenir $nmax si possible */
  2299.         $t = array();
  2300.         if (!empty($tab)) {
  2301.             $i 0;
  2302.             /* tant que nécessaire */
  2303.             while ($i $nmax) {
  2304.                 $keys array_keys($tab);
  2305.                 if (empty($keys)) break;
  2306.                 /* on en prend un dans chaque sous-tableau (pour chaque type) */
  2307.                 foreach($keys as $key) {
  2308.                     /* si le tableau est vide, on le supprime */
  2309.                     if (empty($tab[$key])) {
  2310.                         unset($tab[$key]);
  2311.                         continue;
  2312.                     }
  2313.                     /* tant que le tableau n'est pas vide */
  2314.                     while (!empty($tab[$key])) {
  2315.                         /* on en tire un au hasard */
  2316.                         $val array_rand($tab[$key]);
  2317.                         if (in_array($tab[$key][$val], $t)) {
  2318.                             /* déjà existant dans le tableau final, on le supprime et on continue */
  2319.                             unset($tab[$key][$val]);
  2320.                             continue;
  2321.                         }
  2322.                         /* on ajoute la valeur dans le tableau final */
  2323.                         $t[$i++] = $tab[$key][$val];
  2324.                         /* et on la supprime du tableau d'origine */
  2325.                         unset($tab[$key][$val]);
  2326.                         /* on passe au tableau/type suivant */
  2327.                         break;
  2328.                     }
  2329.                     if ($i >= $nmax) break;
  2330.                 }
  2331.             }
  2332.         }
  2333.         // on mélange
  2334.         shuffle($t);
  2335.         // on retourne la liste des idmultimedias
  2336.         return $t;
  2337.     }
  2338.     // }}}
  2339.     // {{{ makeCode()
  2340.     /** Fabrique un code unique pour un fichier multimedia
  2341.      *
  2342.      *
  2343.      * @access public
  2344.      * @return string le code
  2345.      */
  2346.     public function makeCode()
  2347.     {
  2348.         do {
  2349.             $code $this->func->codeAlea(8);
  2350.             $sql 'SELECT idmultimedia FROM '.$this->__table.' WHERE code=\''.$code.'\' LIMIT 1';
  2351.             $res $this->queryOne($sql);
  2352.         } while (!empty($res));
  2353.         return $code;
  2354.     }
  2355.     // }}}
  2356.     // {{{ getTypeMultimediaList()
  2357.     /** Liste des types multimedias pour les boites de sélection
  2358.      *
  2359.      *
  2360.      * @access public
  2361.      * @return array  id|label
  2362.      */
  2363.     public function getTypeMultimediaList()
  2364.     {
  2365.         $sql 'SELECT tm.idtypemultimedia,l.'.$GLOBALS['lng'].'
  2366.                 FROM typesmultimedias tm,langterms l
  2367.                 WHERE tm.typemultimedia=l.id
  2368.                 ORDER BY l.'.$GLOBALS['lng'];
  2369.         $conn $this->getEntityManager()->getConnection();
  2370.         $query $conn->executeQuery($sql);
  2371.         $list = [];
  2372.         $results $query->fetchAllAssociative();
  2373.         foreach($results as $result) {
  2374.             $list[$result['idtypemultimedia']] = $result['fr'];
  2375.         }
  2376.         return $list;
  2377.     }
  2378.     // }}}
  2379.     // {{{ getTypeMultimediaLabel()
  2380.     /** Retourne le label dans la langue courante pour un type multimedia donné
  2381.      *
  2382.      *
  2383.      * @param  int $idtypemultimedia identifiant du type multimedia
  2384.      * @access public
  2385.      * @return string label
  2386.      */
  2387.     public function getTypeMultimediaLabel($idtypemultimedia)
  2388.     {
  2389.         $sql_types 'SELECT l.'.$GLOBALS['lng'].'
  2390.                       FROM typesmultimedias tm,langterms l
  2391.                       WHERE tm.typemultimedia=l.id
  2392.                       AND tm.idtypemultimedia='.((int)$idtypemultimedia);
  2393.         return $this->queryOne($sql_types);
  2394.     }
  2395.     // }}}
  2396.     // {{{ countMultimedias()
  2397.     /** Compter le nb de documents multimédia
  2398.      *
  2399.      *
  2400.      * @access public
  2401.      * @return int
  2402.      */
  2403.     public function countMultimedias($object=null,$idobject=null,$vod=false)
  2404.     {
  2405.         if(!empty($object) && !empty($idobject)) {
  2406.             $sql_count_video '
  2407.                 SELECT COUNT(DISTINCT(m.`'.$this->__idtable.'`)) as total
  2408.                 FROM '.$this->__table.' m, object_multimedia om
  2409.                 WHERE m.`publish`=1
  2410.                 AND om.`idmultimedia`= m.`idmultimedia`
  2411.                 AND om.`object`=\''.$this->escape($object).'\'
  2412.                 AND om.`idobject`='.(int)$idobject;
  2413.         } else {
  2414.             $sql_count_video '
  2415.                 SELECT COUNT(DISTINCT(idmultimedia))
  2416.                 FROM '.$this->__table.'
  2417.                 WHERE 1';
  2418.         }
  2419.         if($vod) {
  2420.             $sql_count_video .= ' AND price!=\'\' ';
  2421.         }
  2422.         return $this->queryOne($sql_count_video);
  2423.     }
  2424.     // }}}
  2425.     // {{{ countObjects()
  2426.     /** Compter le nb de documents par objet
  2427.      *
  2428.      *
  2429.      * @access public
  2430.      * @return int
  2431.      */
  2432.     public function countObjects($object)
  2433.     {
  2434.         $sql_count_video '
  2435.             SELECT COUNT(DISTINCT(om.`idobject`)) as total
  2436.             FROM '.$this->__table.' m, object_multimedia om
  2437.             WHERE m.`publish`=1
  2438.             AND om.`idmultimedia`= m.`idmultimedia`
  2439.             AND om.`object`=\''.$this->escape($object).'\' ';
  2440.         return $this->queryOne($sql_count_video);
  2441.     }
  2442.     // }}}
  2443.     // {{{ countHours()
  2444.     /** Compter le nb d'heure de vidéo
  2445.      *
  2446.      *
  2447.      * @access public
  2448.      * @return int
  2449.      */
  2450.     public function countHours()
  2451.     {
  2452.         $sql_count 'SELECT SUM(duree_site_sec) FROM multimedias WHERE publish =1 AND status <5';
  2453.         $nb_secondes $this->queryOne($sql_count);
  2454.         return intval($nb_secondes 3600);
  2455.     }
  2456.     // }}}
  2457.     //  {{{ getRelationsArray()
  2458.     /** Tableau des relations
  2459.      *
  2460.      * @access  public
  2461.      * @param string|int $type le type de champ
  2462.      */
  2463.     public function getRelationsArray($type=null)
  2464.     {
  2465.         // récupérer les relations communes
  2466.         $array_types $this->getRelationsArrayTrait('all');
  2467.         $array_types += array(
  2468.             // multimedia_classification idmultimedia/idclassification
  2469.             'multimedia_classification' => array(// classifications associées
  2470.                 'type_join' => 'multiple',
  2471.                 'dest_table' => 'classifications',
  2472.                 'fields' => array('idclassification','classification','type'),
  2473.                 'join_table' => 'multimedia_classification',
  2474.                 'hide_relation' => true,
  2475.                 'silent_delete_relation' => true,
  2476.                 'description' => 'Classification(s) associée(s) à ce document multimédia',
  2477.             ),
  2478.             // multimedia_keyword idmultimedia/idkeyword
  2479.             'multimedia_keyword' => array(// mots clés associés
  2480.                 'type_join' => 'multiple',
  2481.                 'dest_table' => 'keywords',
  2482.                 'fields' => array('idkeyword','title','url_clean'),
  2483.                 'join_table' => 'multimedia_keyword',
  2484.                 'hide_relation' => true,
  2485.                 'silent_delete_relation' => true,
  2486.                 'description' => 'Mot(s) clé(s) associé(s) à ce document multimédia',
  2487.             ),
  2488.             // extranetusers idextranetuser/idextranetuser
  2489.             'idextranetuser' => array(// classifications associées
  2490.                 'type_join' => 'simple',
  2491.                 'dest_table' => 'extranetusers',
  2492.                 'join_field_src' => 'idextranetuser',
  2493.                 'fields' => array('idextranetuser','login','lastname','firstname'),
  2494.                 'description' => 'Utilisateur(s) associée(s) à ce document multimédia',
  2495.                 'silent_delete_relation' => true,
  2496.             ),
  2497.             // extranetusers idextranetuser_producteur/idextranetuser
  2498.             'idextranetuser_producteur' => array(// classifications associées
  2499.                 'type_join' => 'simple',
  2500.                 'dest_table' => 'extranetusers',
  2501.                 'join_field_src' => 'idextranetuser_producteur',
  2502.                 'join_field_dest' => 'idextranetuser',
  2503.                 'fields' => array('idextranetuser','login','lastname','firstname'),
  2504.                 'description' => 'Producteur(s) associée(s) à ce document multimédia',
  2505.                 'silent_delete_relation' => true,
  2506.             ),
  2507.             // contacts idcontact_producteur/idcontact
  2508.             'idcontact_producteur' => array(// classifications associées
  2509.                 'type_join' => 'simple',
  2510.                 'dest_table' => 'contacts',
  2511.                 'join_field_src' => 'idcontact_producteur',
  2512.                 'join_field_dest' => 'idcontact',
  2513.                 'fields' => array('idcontact','organisation','firstname','lastname','url_clean'),
  2514.                 'description' => 'Producteur(s) associée(s) à ce document multimédia',
  2515.                 'silent_delete_relation' => true,
  2516.             ),
  2517.             // rated_multimedias idmultimedia/idmultimedia
  2518.             /*'rated_multimedias' => array(// action sur cette fiche
  2519.                  'type_join' => 'simple',
  2520.                  'fields' => array('idmultimedia','rate','rate_count'),
  2521.                  'description' => 'Vote(s) sur cette vidéo',
  2522.                  'silent_delete_relation' => true,
  2523.                  'hide_relation' => true,
  2524.                  'do_constraint' => true, // fait avec un on delete cascade
  2525.              ),*/
  2526.             // object_multimedia idobject/object
  2527.             'multimedia_person' => array(// multimedias associés à cet enregistrement
  2528.                 'type_join' => 'multiple',
  2529.                 'dest_table' => 'persons',
  2530.                 'join_from_object' => true,
  2531.                 'join_table' => 'object_multimedia',
  2532.                 'fields' => array('idperson','lastname','firstname','url_clean'),
  2533.                 'description' => 'Biographie(s) associée(s) à cet enregistrement',
  2534.                 'silent_delete_relation' => true,
  2535.             ),
  2536.             // object_multimedia idobject/object
  2537.             'multimedia_spectacle' => array(// multimedias associés à cet enregistrement
  2538.                 'type_join' => 'multiple',
  2539.                 'dest_table' => 'spectacles',
  2540.                 'join_from_object' => true,
  2541.                 'join_table' => 'object_multimedia',
  2542.                 'fields' => array('idspectacle','title','url_clean'),
  2543.                 'description' => 'Spectacle(s) associé(s) à cet enregistrement',
  2544.                 'silent_delete_relation' => true,
  2545.             ),
  2546.             // object_multimedia idobject/object
  2547.             'multimedia_text' => array(// multimedias associés à cet enregistrement
  2548.                 'type_join' => 'multiple',
  2549.                 'dest_table' => 'texts',
  2550.                 'join_from_object' => true,
  2551.                 'join_table' => 'object_multimedia',
  2552.                 'fields' => array('idtext','title','url_clean'),
  2553.                 'description' => 'Texte(s) associé(s) à cet enregistrement',
  2554.                 'silent_delete_relation' => true,
  2555.             ),
  2556.             // object_multimedia idobject/object
  2557.             'multimedia_content' => array(// multimedias associés à cet enregistrement
  2558.                 'type_join' => 'multiple',
  2559.                 'dest_table' => 'contents',
  2560.                 'join_from_object' => true,
  2561.                 'join_table' => 'object_multimedia',
  2562.                 'fields' => array('idcontent','title','publish'),
  2563.                 'description' => 'Contenu(s) associé(s) à cet enregistrement',
  2564.                 'silent_delete_relation' => true,
  2565.             ),
  2566.             // object_multimedia idobject/object
  2567.             'multimedia_contact' => array(// multimedias associés à cet enregistrement
  2568.                 'type_join' => 'multiple',
  2569.                 'dest_table' => 'contacts',
  2570.                 'join_from_object' => true,
  2571.                 'join_table' => 'object_multimedia',
  2572.                 'fields' => array('idcontact','organisation','firstname','lastname','url_clean'),
  2573.                 'description' => 'Contact(s) associé(s) à cet enregistrement',
  2574.                 'silent_delete_relation' => true,
  2575.             ),
  2576.             'multimedia_extranetuser' => array(// auteurs
  2577.                 'type_join' => 'multiple',
  2578.                 'dest_table' => 'extranetusers',
  2579.                 'join_table' => 'multimedia_extranetuser',
  2580.                 'fields' => array('idextranetuser','login','lastname','firstname'),
  2581.                 'description' => 'Utilisateur(s) autorisé(s) à voir cet enregistrement hors ligne',
  2582.                 'silent_delete_relation' => true,
  2583.             ),
  2584.         );
  2585.         if(!empty($array_types[$type])) {
  2586.             $array_types[$type]['type'] = $type;
  2587.             return $array_types[$type];
  2588.         } else {
  2589.             return $array_types;
  2590.         }
  2591.     }
  2592.     // }}}
  2593.     //  {{{ getVideoFormats()
  2594.     /** Format des vidéos
  2595.      *
  2596.      * @access  public
  2597.      * @return array
  2598.      */
  2599.     public function getVideoFormats($format=null,$test_format=false,$idmultimedia=null)
  2600.     {
  2601.         // on va checker  les formats
  2602.         $formats = array(
  2603.             'mp3' => array(
  2604.                 'sound' => true,
  2605.                 'description' => 'MP3 classique',
  2606.                 'extension' => 'mp3',
  2607.                 'format' => 'mp3',
  2608.                 'user_agent' => 'all',
  2609.                 'encodage' => array('id' => 1),
  2610.                 'possible_conversion' => array()
  2611.             ),
  2612.             'flv' => array(
  2613.                 'description' => 'FLV classique : bas débit et ancien bonne qualité',
  2614.                 'extension' => 'flv',
  2615.                 'format' => 'flv',
  2616.                 'user_agent' => 'all',
  2617.                 'encodage' => array(
  2618.                     '169' => '384 par 216 384kbps flv mp3 12.5i/s mono 44100 96kbps (ou fichier d\'origine si pas de h264 disponible)',
  2619.                     '43' => '384 par 288 384kbps flv mp3 12.5i/s mono 44100 96kbps (ou fichier di\'origine si pas de h264 disponible)',
  2620.                     'id' => 3656,
  2621.                 ),
  2622.                 'coconut' => 'flv:0x396_800k',
  2623.                 'possible_conversion' => array('h264','flv','h264m'),
  2624.                 'size' => array(
  2625.                     '16:9' => array(
  2626.                         'width' => '704',
  2627.                         'height' => '396',
  2628.                         'id' => 3656,
  2629.                     ),
  2630.                     '4:3' => array(
  2631.                         'width' => '384',
  2632.                         'height' => '288',
  2633.                         'id' => 3657,
  2634.                     ),
  2635.                 ),
  2636.                 'teaser' => true,
  2637.             ),
  2638.             'h264m' => array(
  2639.                 'description' => 'H264 pour iPhone/iPod',
  2640.                 'extension' => 'mp4',
  2641.                 'format' => 'h264m',
  2642.                 'user_agent' => array('iPhone','iPod','iPad'),
  2643.                 'encodage' => array(
  2644.                     '169' => '512 par 288 h264 768kbps h264 aac 25i/s stereo 44100 112kbps',
  2645.                     '43' => '512 par 288 h264 768kbps h264 aac 25i/s stereo 44100 112kbps',
  2646.                     'id' => 3659,
  2647.                 ),
  2648.                 'coconut' => 'mp4:0x288_512k',
  2649.                 'possible_conversion' => array('flv')
  2650.             ),
  2651.             'h264' => array(
  2652.                 'description' => 'H264 bonne qualité pour HTML5 ou Flash',
  2653.                 'extension' => 'mp4',
  2654.                 'format' => 'h264',
  2655.                 'user_agent' => 'all',
  2656.                 'encodage' => array(
  2657.                     '169' => '704 par 396 1500kbps h264 aac 25i/s stereo 44100 112kbps',
  2658.                     '43' => '600 par 450 1024kbps h264 aac 25i/s stereo 44100 112kbps',
  2659.                     'id' => 2592,
  2660.                 ),
  2661.                 'coconut' => 'mp4:0x450_800k',
  2662.                 'possible_conversion' => array('flv','h264m')
  2663.             ),
  2664.             'hd720' => array(
  2665.                 'description' => 'HD 720p',
  2666.                 'extension' => 'mp4',
  2667.                 'format' => 'hd720',
  2668.                 'encodage' => array(
  2669.                     '169' => '1280 par 720 2000kbps h264 aac 25i/s stereo 44100 128kbps',
  2670.                     '43' => 'non pris en charge, ramené en 16/9 avec bandes noires si besoin',
  2671.                     'id' => 3700,
  2672.                 ),
  2673.                 'coconut' => 'mp4:720p_2000k',
  2674.                 'possible_conversion' => array('h264','h264m','flv')
  2675.             ),
  2676.             'upload' => array(
  2677.                 'description' => 'Vidéo uploadée',
  2678.                 'extension' => 'avi',
  2679.                 'format' => 'upload',
  2680.                 'encodage' => array(
  2681.                     '169' => 'Défini par l\'utilisateur',
  2682.                     '43' => 'Défini par l\'utilisateur',
  2683.                     'id' => 0,
  2684.                 ),
  2685.                 'possible_conversion' => array('h264','h264m','flv','hd720','hd1080','hd2160')
  2686.             ),
  2687.             'hd1080' => array(
  2688.                 'description' => 'HD 1080',
  2689.                 'extension' => 'mp4',
  2690.                 'format' => 'hd1080',
  2691.                 'encodage' => array(
  2692.                     '169' => '1920 par 1080 2500kbps h264 aac 25i/s stereo 44100 128kbps',
  2693.                     '43' => 'non pris en charge, ramené en 16/9 avec bandes noires si besoin',
  2694.                     'id' => 3705,
  2695.                 ),
  2696.                 'coconut' => 'mp4:1080p_3200k',
  2697.                 'possible_conversion' => array('hd720','h264','h264m','flv')
  2698.             ),
  2699.             'hd2160' => array(
  2700.                 'description' => 'HD 2160',
  2701.                 'extension' => 'mp4',
  2702.                 'format' => 'hd2160',
  2703.                 'encodage' => array(
  2704.                     '169' => '3840 par 2160 8000kbps h264 aac 25i/s stereo 44100 128kbps',
  2705.                     '43' => 'non pris en charge, ramené en 16/9 avec bandes noires si besoin',
  2706.                     // TODO quel id ici ???? (j'ai juste ajouté +1 à l'id utilisé pour hd1080
  2707.                     'id' => 3706,
  2708.                 ),
  2709.                 'coconut' => 'mp4:2160p_8000k',
  2710.                 'possible_conversion' => array('hd1080''hd720''h264''h264m''flv')
  2711.             )
  2712.         );
  2713.         if(!empty($format) && array_key_exists($format$formats)) {
  2714.             return $formats[$format];
  2715.         }
  2716.         // tester si le format existe
  2717.         if($test_format) {
  2718.             $videos = array();
  2719.             foreach($formats as $f=>$v) {
  2720.                 $medianame $v['format'].'-'.$idmultimedia.'.'.$v['extension'];
  2721.                 if(file_exists($_ENV['PATH_MEDIAS'].$v['format'].'/'.$medianame)) {
  2722.                     $videos[$v['format']] = array(
  2723.                         'mediatype' => $v['format'],
  2724.                         'medianame' => $medianame,
  2725.                         'medialocalpath' => $_ENV['PATH_MEDIAS'].$v['format'].'/'.$medianame,
  2726.                         'mediaurl' => URL_MEDIAS.'/'.$v['format'].'/'.$medianame,
  2727.                     );
  2728.                 }
  2729.             }
  2730.             return $videos;
  2731.         }
  2732.         return $formats;
  2733.     }
  2734.     // }}}
  2735.     // {{{ setViews()
  2736.     /** Incrémenter le compteur de vue
  2737.      *
  2738.      *
  2739.      * @param  int $idmultimedia identifiant du document multimedia
  2740.      * @param  int $nb_vue Nombre de vue à ajouter
  2741.      * @access public
  2742.      * @return string label
  2743.      */
  2744.     public function setViews($idmultimedia,$nb_view=1)
  2745.     {
  2746.         $sql 'UPDATE '.$this->__table.'
  2747.                 SET count_view = (count_view+'.(int)$nb_view.')
  2748.                 WHERE idmultimedia='.(int)$idmultimedia;
  2749.         $res $this->getEntityManager()->getConnection()->executeQuery($sql);
  2750.         return $res;
  2751.     }
  2752.     // }}}
  2753.     // {{{ getSize()
  2754.     /** Récupère la taille d'in fichier video avec mplayer
  2755.      *
  2756.      *
  2757.      * @param  string $file Fichier a tester
  2758.      * @access public
  2759.      * @return array
  2760.      */
  2761.     public function getSize($file)
  2762.     {
  2763.         $cmd 'mplayer -identify -vo null -ao null -frames 0 '.$file;
  2764.         exec($cmd$match);
  2765.         $search = array(
  2766.             'ID_VIDEO_WIDTH' => array(
  2767.                 'replace' => 'ID_VIDEO_WIDTH=',
  2768.                 'key' => 'width',
  2769.             ),
  2770.             'ID_VIDEO_HEIGHT' => array(
  2771.                 'replace' => 'ID_VIDEO_HEIGHT=',
  2772.                 'key' => 'height',
  2773.             ),
  2774.         );
  2775.         $infos_videos = array();
  2776.         foreach($match as $m) {
  2777.             foreach($search as $k=>$s) {
  2778.                 if(strpos($m$k)!==false) {
  2779.                     $infos_videos[$s['key']] = str_replace($s['replace'], ''$m);
  2780.                     continue;
  2781.                 }
  2782.             }
  2783.         }
  2784.         return $infos_videos;
  2785.     }
  2786.     // }}}
  2787.     // {{{ getRatio()
  2788.     /** Cacule le ratio
  2789.      *
  2790.      *
  2791.      * @param  int $w Largeur
  2792.      * @param  int $h Hauteur
  2793.      * @param  string $file Fichier a tester
  2794.      * @param  bool $debug Débuger le calcul
  2795.      * @access public
  2796.      * @return array
  2797.      */
  2798.     public function getRatio($w=0,$h=0,$file=null,$debug=false)
  2799.     {
  2800.         // si pas de taille, aller chercher
  2801.         if(!empty($file)) {
  2802.             $size $this->getSize($file);
  2803.             if(!empty($size)) {
  2804.                 $w $size['width'];
  2805.                 $h $size['height'];
  2806.             }
  2807.         }
  2808.         //if($w=0 || $h=0) return '4:3';
  2809.         $ratio round(100*$w/$h)/100;
  2810.         if ($ratio >= 1.77 && $ratio <=  1.78) {
  2811.             $ratio '16:9';
  2812.         } elseif ($ratio >= 1.33 && $ratio <= 1.34) {
  2813.             $ratio '4:3';
  2814.         } elseif ($ratio >= 1.25 && $ratio <= 1.26) {
  2815.             $ratio '16:9'// en fait 5:4
  2816.         }
  2817.         // debugage uniquement
  2818.         if($debug) {
  2819.             $ratio .= ' '.$w.'x'.$h;
  2820.         }
  2821.         return $ratio;
  2822.     }
  2823.     // }}}
  2824.     // {{{ getFLVDuration()
  2825.     /** Lit la durée d'une vidéo flv, retourne la durée en milliseconds ou une valeur négative en cas d'erreur
  2826.      *
  2827.      *
  2828.      * @param  string $file chemin vers le fichier flv dont on veut connaitre la durée
  2829.      * @access public
  2830.      * @return int durée en millisecondes
  2831.      */
  2832.     public function getFLVDuration($file)
  2833.     {
  2834.         $step 1;
  2835.         $duration false;
  2836.         if (file_exists($file)) {
  2837.             $step++;
  2838.             $fp fopen($file'r');
  2839.             if ($fp) {
  2840.                 $step++;
  2841.                 $header fread($fp5);
  2842.                 if ($header !== false) {
  2843.                     $step++;
  2844.                     $is_flv = ($header[0]=='F' && $header[1]=='L' && $header[2]=='V');
  2845.                     if ($is_flv) {
  2846.                         $step++;
  2847.                         $is_flv_video = (hexdec(bin2hex($header[4])) & 0x01);
  2848.                         $is_flv_audio = (hexdec(bin2hex($header[4])) & 0x04);
  2849.                         if ($is_flv_video || $is_flv_audio) {
  2850.                             $step++;
  2851.                             if (fseek($fp0SEEK_END) == 0) {
  2852.                                 $step++;
  2853.                                 $length ftell($fp);
  2854.                                 if ($length !== false) {
  2855.                                     $step++;
  2856.                                     if (fseek($fp, -3SEEK_END) == 0) {
  2857.                                         $step++;
  2858.                                         $value fread($fp,3);
  2859.                                         if ($value !== false) {
  2860.                                             $step++;
  2861.                                             $taglen hexdec(bin2hex($value));
  2862.                                             if ($length $taglen) {
  2863.                                                 $step++;
  2864.                                                 if (fseek($fp$length $taglenSEEK_SET) == 0) {
  2865.                                                     $step++;
  2866.                                                     $value fread($fp3);
  2867.                                                     if ($value !== false) {
  2868.                                                         $step++;
  2869.                                                         $duration hexdec(bin2hex($value));
  2870.                                                     }
  2871.                                                 }
  2872.                                             }
  2873.                                         }
  2874.                                     }
  2875.                                 }
  2876.                             }
  2877.                         }
  2878.                     }
  2879.                 }
  2880.                 fclose($fp);
  2881.             }
  2882.         }
  2883.         return ($duration === false ? -$step:$duration);
  2884.     }
  2885.     // }}}
  2886.     // {{{ updateDureeSiteSec()
  2887.     /** Lit la durée du fichier et l'inscrit dans le champ duree_site_sec si possible
  2888.      *
  2889.      *
  2890.      * @param  array $infos tableau contenant les infos multimedia
  2891.      * @access public
  2892.      * @return void
  2893.      */
  2894.     public function updateDureeSiteSec(&$infos)
  2895.     {
  2896.         // a tester
  2897.         if (!isset($infos['duree_site_sec'])
  2898.             || !isset($infos['duree_site'])
  2899.             || !isset($infos['idmultimedia']))
  2900.             return;
  2901.         // flv ou mp3
  2902.         if(!empty($infos['mediatype']) && $infos['mediatype']!='mp3'
  2903.             && $infos['mediatype']!='flv')
  2904.             return;
  2905.         // si la duree est déjà positive, ne rien faire
  2906.         if ($infos['duree_site_sec'] > 0) return;
  2907.         // si le fichier n'existe pas, ne rien faire
  2908.         // valeur 0 par défaut
  2909.         $duree_sec 0;
  2910.         if(!empty($infos['mediatype'])){
  2911.             switch ($infos['mediatype']) {
  2912.                 case 'flv':
  2913.                     // lecture de la durée des flv à l'aide de getFLVDuration()
  2914.                     if(!empty($infos['formats']['flv']['medialocalpath'])
  2915.                         && file_exists($infos['formats']['flv']['medialocalpath'])) {
  2916.                         $duree $this->getFLVDuration($infos['formats']['flv']['medialocalpath']);
  2917.                     } else {
  2918.                         $duree 0;
  2919.                     }
  2920.                     if ($duree 0) {
  2921.                         // on convertit de milliseconds à secondes entières
  2922.                         $duree_sec = (int)(round($duree/1000));
  2923.                     }
  2924.                     break;
  2925.                 case 'mp3':
  2926.                     // lecture de la durée des mp3 à l'aide de mp3info
  2927.                     $ret = -1;
  2928.                     $output = array();
  2929.                     if(!empty($infos['formats']['mp3']['medialocalpath'])
  2930.                         && file_exists($infos['formats']['mp3']['medialocalpath'])) {
  2931.                         $duree exec(MP3_SECONDS_CMD.' '.escapeshellarg($infos['formats']['mp3']['medialocalpath']), $output$ret);
  2932.                     } else {
  2933.                         $duree 0;
  2934.                     }
  2935.                     if ($ret == && $duree 0) {
  2936.                         // pas d'erreur, on suppose la durée lue valide
  2937.                         $duree_sec = (int)$duree;
  2938.                     }
  2939.                     break;
  2940.                 default:
  2941.                     // type non supporté, ne rien faire
  2942.                     return;
  2943.             }
  2944.         }
  2945.         // test le champ duree_site (champ en minutes)
  2946.         if ($infos['duree_site'] <= 0) {
  2947.             $new_duree_site 0;
  2948.         } else {
  2949.             $new_duree_site $infos['duree_site'];
  2950.         }
  2951.         if ($duree_sec 0) {
  2952.             if ($new_duree_site == 0) {
  2953.                 // on utilise la valeur mesurée pour remplir duree_site si celui-ci n'est pas initialisé
  2954.                 $new_duree_site = (int) round($duree_sec 60);
  2955.             }
  2956.         } else {
  2957.             // erreur, on retourne duree_site * 60 si possible
  2958.             if ($infos['duree_site'] > 0) {
  2959.                 $duree_sec $infos['duree_site'] * 60;
  2960.             }
  2961.         }
  2962.         // champs a mettre a jour
  2963.         $values['duree_site_sec'] = $duree_sec;
  2964.         if ($infos['duree_site'] != $new_duree_site) {
  2965.             $values['duree_site'] = $new_duree_site;
  2966.         }
  2967.         if (empty($infos['duree'])) {
  2968.             $values['duree'] = $new_duree_site;
  2969.         }
  2970.         $this->setUpdateFields($values);
  2971.         //on update
  2972.         $this->setData($infos['idmultimedia']);
  2973.         //on renvoie les "bonnes" valeurs
  2974.         $infos['duree_site'] = $new_duree_site;
  2975.         $infos['duree_site_sec'] = $duree_sec;
  2976.     }
  2977.     // }}}
  2978.     // {{{ toHourMinuteSecond()
  2979.     /** Convertit une durée en secondes en jours,heures,minutes,secondes
  2980.      *  Exemple: 1 jour 4 heures 53 minutes 15 secondes
  2981.      *
  2982.      *
  2983.      * @param  int $time
  2984.      * @param  array $format  format pour l'affichage par défaut:
  2985.      * array( 86400 => array('jour','jours'), 3600 => array('heure', 'heures'), 60 => array('minute', 'minutes'), 1 => array('seconde', 'secondes')
  2986.      * @access public
  2987.      * @return void
  2988.      */
  2989.     public function toHourMinuteSecond($time$format=null)
  2990.     {
  2991.         $time = (int) $time;
  2992.         if ($time <= 0) return '';
  2993.         if (!empty($format)) {
  2994.             $tabTemps $format;
  2995.         } else {
  2996.             $tabTemps $this->hms_format;
  2997.         }
  2998.         $result '';
  2999.         foreach($tabTemps as $nombreSecondesDansUnite => $uniteTemps) {
  3000.             $count floor($time/$nombreSecondesDansUnite);
  3001.             $time %= $nombreSecondesDansUnite;
  3002.             if($count 1) {
  3003.                 if ($result != ''$result.=' ';
  3004.                 $result .= $count.$uniteTemps[1];
  3005.             } else if ($count == 1) {
  3006.                 if ($result != ''$result.=' ';
  3007.                 $result .= $count.$uniteTemps[0];
  3008.             }
  3009.         }
  3010.         return $result;
  3011.     }
  3012.     // }}}
  3013.     // {{{ getBufferLength()
  3014.     /**
  3015.      * Taille du buffer en seconde
  3016.      *
  3017.      *
  3018.      * @param  int $len taille
  3019.      * @access public
  3020.      * @return int
  3021.      */
  3022.     public function getBufferLength($len=3)
  3023.     {
  3024.         $len 3// secondes par défaut
  3025.         if (isset($_REQUEST['bufferlength'])) {
  3026.             $len = (int)$_REQUEST['bufferlength'];
  3027.             if ($len 1$len 1;
  3028.             $bufferlength $len;
  3029.         } else if (isset($_REQUEST['blen'])) {
  3030.             $len = (int)$_REQUEST['blen'];
  3031.             if ($len 1$len 1;
  3032.             $bufferlength $len;
  3033.         }
  3034.         $bufferlength $len;
  3035.         return $bufferlength;
  3036.     }
  3037.     // }}}
  3038.     //  {{{ getBucket()
  3039.     /** Retourne le bucket utilise sur AWS
  3040.      *
  3041.      * @access  public
  3042.      * @return string
  3043.      */
  3044.     public function getBucket() { return $this->bucket; }
  3045.     // }}}
  3046.     //  {{{ isCloud()
  3047.     /** Est-ce qu'on utilise le cloud pour le chargement des videos ?
  3048.      *
  3049.      * @access  public
  3050.      * @return string
  3051.      */
  3052.     public function isCloud() { return $this->is_cloud; }
  3053.     // }}}
  3054.     //  {{{ getImageByUrl()
  3055.     /** Récupéer l'image depuis heywatch DEPRECATED
  3056.      *
  3057.      * @access  public
  3058.      * @return string
  3059.      */
  3060.     public function getImageByUrl($id_video,$idmultimedia,$size,$other_version='4:3',$replace=false,$start=15) {
  3061.         // répertoire des images taille exacte
  3062.         $dest $_ENV['PATH_IMG'].'img_tv/prop169/'.$idmultimedia.'.jpg';
  3063.         // supprimer ?
  3064.         if($replace) {
  3065.             @unlink($dest);
  3066.         }
  3067.         // image taille exacte
  3068.         $url 'https://'.HW_USERNAME.':'.HW_PASSWORD.'@'.HW_SERVER_SIMPLE.'encoded_video/'.$id_video.'.jpg?start='.$start.'&width='.$size['width'].'&height='.$size['height'];
  3069.         copy($url$dest);
  3070.         // version 4:3 demandée
  3071.         if($other_version=='4:3') {
  3072.             // rép 4:3
  3073.             $dest FINAL_DEST_JPG.$idmultimedia.'.jpg';
  3074.             // grande largeur et hauteur en 4:3 => pour les vignettes et autres
  3075.             $size_43['width'] = $size['width'];
  3076.             $size_43['height'] = round($size['width']*(3/4));
  3077.             // supprimer ?
  3078.             if($replace) {
  3079.                 @unlink($dest);
  3080.             }
  3081.             // image taille 4:34
  3082.             $url 'https://'.HW_USERNAME.':'.HW_PASSWORD.'@'.HW_SERVER_SIMPLE.'encoded_video/'.$id_video.'.jpg?start='.$start.'&width='.$size_43['width'].'&height='.$size_43['height'];
  3083.             copy($url$dest);
  3084.         }
  3085.     }
  3086.     // }}}
  3087.     //  {{{ getImageFromFile()
  3088.     /** Récupéer l'image depuis le fichier avec ffmpeg
  3089.      *
  3090.      * @access  public
  3091.      * @return string
  3092.      */
  3093.     public function getImageFromFile($infos,$other_version='4:3',$replace=false,$start=15) {
  3094.         // test du sysytème ,nouveau de génération de vignette
  3095.         /*if($_SERVER['REMOTE_ADDR']=='77.245.143.67') {
  3096.             return $this->New_getImageFromFile($infos,$other_version,$replace,$start);
  3097.         }*/
  3098.         // fichier source pour générer la vignette
  3099.         $orderSources = array(
  3100.             'upload',
  3101.             'hd720',
  3102.             'h264',
  3103.             'flv',
  3104.         );
  3105.         foreach($orderSources as $s) {
  3106.             if(!empty($infos['formats'][$s]['medialocalpath']) && file_exists($infos['formats'][$s]['medialocalpath'])) {
  3107.                 $format $s;
  3108.                 break;
  3109.             }
  3110.         }
  3111.         // taille de la vidéo
  3112.         $size $this->getSize($infos['formats'][$s]['medialocalpath']);
  3113.         // répertoire des images taille exacte
  3114.         $dest_169 $_ENV['PATH_IMG'].'img_tv/prop169/'.$infos['idmultimedia'].'.jpg';
  3115.         $ffmpeg '/usr/bin/ffmpeg';
  3116.         // supprimer ?
  3117.         if($replace) {
  3118.             @unlink($dest_169);
  3119.         }
  3120.         // image taille exacte
  3121.         $cmd $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$size['width'].'x'.$size['height'].' '.$dest_169;
  3122.         exec($cmd);
  3123.         // version 4:3 demandée
  3124.         if($other_version=='4:3') {
  3125.             // rép 4:3
  3126.             $dest_43 $_ENV['PATH_IMG'].'img_tv/'.$infos['idmultimedia'].'.jpg';
  3127.             // grande largeur et hauteur en 4:3 => pour les vignettes et autres
  3128.             $size_43['width'] = $size['width'];
  3129.             $size_43['height'] = round($size['width']*(3/4));
  3130.             // supprimer ?
  3131.             if($replace) {
  3132.                 @unlink($dest_43);
  3133.             }
  3134.             if(file_exists($dest_169)) {
  3135.                 $cmd DFT_MAGICK_CONVERT.' '.$dest_169.' -gravity center -background black -extent '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
  3136.                 exec($cmd);
  3137.                 $success true;
  3138.             }
  3139.             // image taille 4:3 depuis le fichier source
  3140.             if(empty($success)) {
  3141.                 $cmd $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
  3142.                 exec($cmd);
  3143.             }
  3144.         }
  3145.     }
  3146.     // }}}
  3147.     //  {{{ NewgetImageFromFile()
  3148.     /** Récupéer l'image depuis le fichier avec ffmpeg
  3149.      *
  3150.      * @access  public
  3151.      * @return string
  3152.      */
  3153.     public function New_getImageFromFile($infos,$other_version='4:3',$replace=false,$start=15) {
  3154.         // répertoire des images taille exacte
  3155.         $dest_169 FINAL_DEST_JPG.'prop169/'.$infos['idmultimedia'].'.jpg';
  3156.         $ffmpeg '/usr/bin/ffmpeg';
  3157.         $exiftool '/usr/bin/exiftool';
  3158.         // supprimer ?
  3159.         if($replace) {
  3160.             @unlink($dest_169);
  3161.         }
  3162.         // => en priorité, le fichier hd720, sinon, le flv
  3163.         // si on a pas la taille du hd720, la récupèrer avec exiftool
  3164.         if($infos['hd720']==1) {
  3165.             $cmd $exiftool.' -j '.$infos['formats']['hd720']['medialocalpath'];
  3166.             $videoinfos shell_exec($cmd);
  3167.             $videoinfos json_decode($videoinfos);
  3168.             if(!empty($videoinfos) && is_array($videoinfos)) {
  3169.                 $videoinfos $videoinfos[0];
  3170.                 if(!empty($videoinfos->ImageWidth)) {
  3171.                     $video_width $videoinfos->SourceImageWidth;
  3172.                     $video_height $videoinfos->SourceImageHeight;
  3173.                     $format 'hd720';
  3174.                 }
  3175.             }
  3176.         }
  3177.         if(empty($format)) {
  3178.             $video_width $infos['flv_width'];
  3179.             $video_height $infos['flv_height'];
  3180.             $format 'flv';
  3181.         }
  3182.         // image taille exacte
  3183.         $cmd $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$video_width.'x'.$video_height.' '.$dest_169;
  3184.         exec($cmd);
  3185.         // version 4:3 demandée
  3186.         if($other_version=='4:3') {
  3187.             // rép 4:3
  3188.             $dest_43 FINAL_DEST_JPG.$infos['idmultimedia'].'.jpg';
  3189.             // supprimer ?
  3190.             if($replace) {
  3191.                 @unlink($dest_43);
  3192.             }
  3193.             // grande largeur et hauteur en 4:3 => pour les vignettes et autres
  3194.             $size_43['width'] = $video_width;
  3195.             $size_43['height'] = round($video_width*(3/4));
  3196.             // si ratio de la vidéo = 16:9, on ajoute des bandes noires
  3197.             if($infos['ratio']=='16:9') {
  3198.                 // l'image 16:9 doit exister
  3199.                 // créer une image avec des bandes noires
  3200.                 if(file_exists($dest_169)) {
  3201.                     $cmd DFT_MAGICK_CONVERT.' '.$dest_169.' -gravity center -background black -extent '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
  3202.                     exec($cmd);
  3203.                     $success true;
  3204.                 }
  3205.             }
  3206.             // image taille 4:3 depuis le fichier source
  3207.             if(empty($success)) {
  3208.                 $cmd $ffmpeg.' -i '.$infos['formats'][$format]['medialocalpath'].' -f image2 -ss '.$start.' -vframes 1 -s '.$size_43['width'].'x'.$size_43['height'].' '.$dest_43;
  3209.                 exec($cmd);
  3210.             }
  3211.         }
  3212.     }
  3213.     // }}}
  3214.     //  {{{ getStatus()
  3215.     /** Le status en texte
  3216.      *
  3217.      * status (pour le player):
  3218.      * - 0 => publié et visible
  3219.      * - 1 => interdiction de l'embed
  3220.      * - 2 => supprimé
  3221.      * - 3 => non-accessible
  3222.      *
  3223.      * @access  public
  3224.      * @param   int     $status Le status de publication
  3225.      * @param   bool     $return_list Retourner une liste ou le code de status
  3226.      * @return string|array
  3227.      */
  3228.     public function getStatus($status,$return_list=false) {
  3229.         if($return_list) {
  3230.             foreach($this->status_types as $k=>$v) {
  3231.                 $status_list[$k] = $v['string'];
  3232.             }
  3233.             return $status_list;
  3234.         } else {
  3235.             return $this->status_types[$status]['code'];
  3236.         }
  3237.     }
  3238.     // }}}
  3239.     //  {{{ updateCloudAcl()
  3240.     /** mettre en privé sur S3
  3241.      *
  3242.      * @access  public
  3243.      * @param   array     $infos les infos sur le médias
  3244.      * @param   string    $format Type de fichier
  3245.      * @return bool
  3246.      */
  3247.     public function updateCloudAcl($idmultimedia,$format='flv')
  3248.     {
  3249.         // infos sur le format
  3250.         $f $this->getVideoFormats($format);
  3251.         if(!empty($f)) {
  3252.             $fichier $f['format'].'/'.$f['format'].'-'.$idmultimedia.'.'.$f['extension'];
  3253.             // classe AWS
  3254.             require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
  3255.             $s3 = new AmazonS3();
  3256.             $response $s3->set_object_acl($this->getBucket(), $fichier, array(
  3257.                 array('id' => $this->s3_canonical_user_id'permission' => $s3::GRANT_READ),
  3258.                 array('id' => AWS_CANONICAL_ID'permission' => $s3::GRANT_FULL_CONTROL),
  3259.             ));
  3260.             if($response->isOK()) {
  3261.                 return true;
  3262.             }
  3263.         }
  3264.         return false;
  3265.     }
  3266.     // }}}
  3267.     //  {{{ updateCloudStorageType()
  3268.     /** réduire le cout de stockage
  3269.      *
  3270.      * @access  public
  3271.      * @param   array     $infos les infos sur le médias
  3272.      * @return bool
  3273.      */
  3274.     public function updateCloudStorageType($idmultimedia,$format='flv')
  3275.     {
  3276.         // infos sur le format
  3277.         $f $this->getVideoFormats($format);
  3278.         if(!empty($f)) {
  3279.             $fichier $f['format'].'/'.$f['format'].'-'.$idmultimedia.'.'.$f['extension'];
  3280.             // classe AWS
  3281.             require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
  3282.             $s3 = new AmazonS3();
  3283.             $response $s3->change_storage_redundancy($this->getBucket(), $fichierAmazonS3::STORAGE_REDUCED);
  3284.             if($response->isOK()) {
  3285.                 return true;
  3286.             }
  3287.         }
  3288.         return false;
  3289.     }
  3290.     // }}}
  3291.     //  {{{ isOnCloud()
  3292.     /** tester si les fichiers sont sur le cloud
  3293.      *
  3294.      * @access  public
  3295.      * @param   array     $infos les infos sur le médias
  3296.      * @return array
  3297.      */
  3298.     public function isOnCloud($idmultimedia)
  3299.     {
  3300.         // classe AWS
  3301.         require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
  3302.         $s3 = new AmazonS3();
  3303.         $formats_multimedias $this->getVideoFormats();
  3304.         // on parcours les formats et on regarde s'ils sont sur le cloud
  3305.         foreach($formats_multimedias as $k=>$v) {
  3306.             // sur le bucket S3 ?
  3307.             $f $k.'/'.$k.'-'.$idmultimedia.'.'.$v['extension'];
  3308.             $response $s3->if_object_exists($this->getBucket(), $f);
  3309.             if($response) {
  3310.                 $formats[$k] = array(
  3311.                     'cloud_acl' => false
  3312.                 );
  3313.                 // tester également les droits sur cloudfront
  3314.                 $response_acls $s3->get_object_acl($this->getBucket(), $f);
  3315.                 if($response_acls->status=='200') {
  3316.                     $acls = (array)$response_acls->body->AccessControlList;
  3317.                     foreach($acls['Grant'] as $a) {
  3318.                         if($a->Grantee->ID==MY_S3_CANONICAL_USER_ID) {
  3319.                             $formats[$k]['cloud_acl'] = true;
  3320.                         }
  3321.                     }
  3322.                 }
  3323.             }
  3324.             // tester également le teaser
  3325.             if(!empty($v['teaser'])) {
  3326.                 $f $k.'/'.$k.'-'.$idmultimedia.'-vod.'.$formats_multimedias[$k]['extension'];
  3327.                 // sur le bucket S3 ?
  3328.                 $response $s3->if_object_exists($this->getBucket(), $f);
  3329.                 if($response) {
  3330.                     $formats[$k.'-teaser'] = array(
  3331.                         'cloud_acl' => false
  3332.                     );
  3333.                     // tester également les droits sur cloudfront
  3334.                     $response_acls $s3->get_object_acl($this->getBucket(), $f);
  3335.                     if($response_acls->status=='200') {
  3336.                         $acls = (array)$response_acls->body->AccessControlList;
  3337.                         foreach($acls['Grant'] as $a) {
  3338.                             if($a->Grantee->ID==MY_S3_CANONICAL_USER_ID) {
  3339.                                 $formats[$k.'-teaser']['cloud_acl'] = true;
  3340.                             }
  3341.                         }
  3342.                     }
  3343.                 }
  3344.             }
  3345.         }
  3346.         return $formats;
  3347.     }
  3348.     // }}}
  3349.     //  {{{ putOnCloud()
  3350.     /** Envoyer un fichier sur le cloud et changer les ACL
  3351.      *
  3352.      * @access  public
  3353.      * @param   array     $infos les infos sur le médias
  3354.      * @return array
  3355.      */
  3356.     public function putOnCloud($from,$to)
  3357.     {
  3358.         // commande
  3359.         $cmd PATH_LIBS.'Bin/put_to_cloud '.escapeshellcmd($from).' '.escapeshellcmd('s3://'.$this->getBucket().'/'.$to).' /tmp/put_file_to_cloud >/dev/null';
  3360.         $result exec($cmd);
  3361.         // classe AWS
  3362.         require_once PATH_LIBS.'Webservices/AWS/sdk.class.php';
  3363.         $s3 = new AmazonS3();
  3364.         $response $s3->set_object_acl($this->getBucket(), $to, array(
  3365.             array('id' => $this->s3_canonical_user_id'permission' => $s3::GRANT_READ),
  3366.             array('id' => AWS_CANONICAL_ID'permission' => $s3::GRANT_FULL_CONTROL),
  3367.         ));
  3368.         /*if($response->isOK()) {
  3369.         }*/
  3370.         $response $s3->change_storage_redundancy($this->getBucket(), $toAmazonS3::STORAGE_REDUCED);
  3371.         if($response->isOK()) {
  3372.             return true;
  3373.         }
  3374.     }
  3375.     // }}}
  3376.     //  {{{ setQualityList()
  3377.     /** Création de deux listes: videos_qualite_ok et videos_qualite_basse
  3378.      *
  3379.      * @access  public
  3380.      * @param   array $videos les infos sur le médias
  3381.      * @param   mixe $context le contexte
  3382.      * @return array
  3383.      */
  3384.     public function setQualityList($videos,&$context)
  3385.     {
  3386.         // 2 qualites
  3387.         $listes = array(
  3388.             => 'videos_qualite_basse',
  3389.             => 'videos_qualite_ok'
  3390.         );
  3391.         foreach($videos as $k => $v) {
  3392.             $name $listes[$videos[$k]['quality']];
  3393.             if (!isset($context['view']->$name)) {
  3394.                 $context['view']->$name = array();
  3395.             }
  3396.             $item = &$context['view']->$name;
  3397.             $item[$k] = $videos[$k];
  3398.         }
  3399.     }
  3400.     // }}}
  3401.     //  {{{ getApiTab()
  3402.     /** génére la version pour la diffusion API
  3403.      *
  3404.      * @see Theatre::getApiTab
  3405.      */
  3406.     public function getApiTab($data)
  3407.     {
  3408.         // généré à partir de getApiFields
  3409.         $data_api parent::getApiTab($data,$_ENV['URL_THTV']);
  3410.         return $data_api;
  3411.     }
  3412.     // }}}
  3413.     //  {{{ getApiFields()
  3414.     /** champs à renvoyer par l'API
  3415.      *
  3416.      * @access  public
  3417.      * @param array tableau de données
  3418.      */
  3419.     protected function getApiFields()
  3420.     {
  3421.         return array(
  3422.             'sujet_titre' => 'title',
  3423.             'permalink' => 'permalink',
  3424.             'url_clean' => 'permanent_url',
  3425.             'duree_site_sec' => 'duration',
  3426.             'quality' => 'quality',
  3427.             'language' => 'language',
  3428.             'description_html' => 'description',
  3429.             'date_en' => 'capture_date',
  3430.             'lieu' => 'capture_place',
  3431.             'authors' => array(
  3432.                 'lastname' => 'lastname',
  3433.                 'firstname' => 'firstname',
  3434.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
  3435.             ),
  3436.             'directors' => array(
  3437.                 'lastname' => 'lastname',
  3438.                 'firstname' => 'firstname',
  3439.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
  3440.             ),
  3441.             'actors' => array(
  3442.                 'lastname' => 'lastname',
  3443.                 'firstname' => 'firstname',
  3444.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
  3445.             ),
  3446.             'intervenants->others' => array(
  3447.                 'lastname' => 'lastname',
  3448.                 'firstname' => 'firstname',
  3449.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/artiste/${1}',
  3450.             ),
  3451.             'contacts' => array(
  3452.                 'organisation' => 'organisation',
  3453.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/contact/${1}',
  3454.             ),
  3455.             'partenaires->partners' => array(
  3456.                 'organisation' => 'organisation',
  3457.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/contact/${1}',
  3458.             ),
  3459.             'spectacles' => array(
  3460.                 'title' => 'title',
  3461.                 'url_clean' => 'permanent_url#(.*)#'.$_ENV['URL_THTV'].'/videos/spectacle/${1}',
  3462.             ),
  3463.             'keywords' => array(
  3464.                 'title' => 'title',
  3465.                 'url_clean' => 'slug',
  3466.             ),
  3467.             'vignette' => 'thumbnail',
  3468.             'image_media' => 'image',
  3469.             'images' => 'images',
  3470.             'embed' => 'player',
  3471.             'dateinsert' => 'insert_date',
  3472.         );
  3473.     }
  3474.     // }}}
  3475.     //  {{{ getContactGaTrackingId()
  3476.     /** voir si le partenaire à un ga_tracking_id
  3477.      *
  3478.      * @access  public
  3479.      * @param int $idmultimedia Identifiant du document
  3480.      * @return int
  3481.      */
  3482.     public function getContactGaTrackingId($idmultimedia)
  3483.     {
  3484.         $sql 'SELECT contacts.`ga_tracking_id` as ga_tracking_id FROM
  3485.                     object_multimedia JOIN contacts ON contacts.`idcontact`=object_multimedia.`idobject`
  3486.                     WHERE object_multimedia.`idmultimedia`='.$idmultimedia.'
  3487.                     AND object_multimedia.`object`=\'contacts\'
  3488.                     AND object_multimedia.`idrole`='.$this->getIdrole('multimedia_partenaire').'
  3489.                     AND contacts.`ga_tracking_id` IS NOT NULL';
  3490.         $tracking_id $this->queryOne($sql);
  3491.         if(!empty($tracking_id)) {
  3492.             return $tracking_id;
  3493.         } else {
  3494.             return null;
  3495.         }
  3496.     }
  3497.     // }}}
  3498.     public function setSizeToFormat($octet){
  3499.         // Array contenant les differents unités
  3500.         $unite = array('Octet','KO','MO','GO');
  3501.         if ($octet 1000// octet
  3502.         {
  3503.             return $octet." ".$unite[0];
  3504.         }
  3505.         else
  3506.         {
  3507.             if ($octet 1000000// ko
  3508.             {
  3509.                 $ko round($octet/1024,2);
  3510.                 return $ko." ".$unite[1];
  3511.             }
  3512.             else // Mo ou Go
  3513.             {
  3514.                 if ($octet 1000000000// Mo
  3515.                 {
  3516.                     $mo round($octet/(1024*1024),2);
  3517.                     return $mo." ".$unite[2];
  3518.                 }
  3519.                 else // Go
  3520.                 {
  3521.                     $go round($octet/(1024*1024*1024),2);
  3522.                     return $go." ".$unite[3];
  3523.                 }
  3524.             }
  3525.         }
  3526.     }
  3527. }