src/Controller/EmbedController.php line 131

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\ClassTheatre\asides;
  4. use App\ClassTheatre\TheatreController;
  5. use App\Exception\RedirectException;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. use TheatreCore\Entity\Extranetusers;
  13. use TheatreCore\Entity\Multimedias;
  14. /**
  15.  * Page d'une vidéo emebed en iframe
  16.  *
  17.  * PHP versions 4 and 5
  18.  *
  19.  * LICENSE: Ce programme est un logiciel libre distribue sous licence GNU/GPL
  20.  *
  21.  * @author     Yves Tannier <yves.tannier@theatre-contemporain.net>
  22.  * @copyright  2008 C.R.I.S.
  23.  * @license    http://www.gnu.org/copyleft/lesser.html  LGPL License 2.1
  24.  * @version    0.1.0
  25.  * @link       https://www.theatre-contemporain.net
  26.  */
  27. /**
  28.  * Mise-à-jour du player
  29.  *
  30.  * 12/12/2017 (@Boussad)
  31.  * J'ai customisé le plugin vod-quality-selector.js de flowplayer
  32.  * Il y a sûrement moyen de mieux faire, et d'optimiser la chose, mais je ne pense pas avoir le temps de faire ça.
  33.  */
  34. /**
  35.  * Modification 0 :
  36.  *     Pour que flowplayer connaisse le nombre de qualité disponible pour une vidéo,
  37.  *     j'ai eu à rajouter une ligne dans le fichier multimedias.php
  38.  *     $format_avaibles_count = array();
  39.  *     (lire le fichier à partir de cette ligne pour y voir le traitement effectué)
  40.  *
  41.  *     S'en suit un passage des données au plugin à travers les data-* de la div (embed/view.html)
  42.  *        data-qualities="{video[format_avaibles_count]}"
  43.  *
  44.  */
  45. /**
  46.  * Modification A :
  47.  *     - J'ai customisé le plugin vod-quality-selector.js de flowplayer
  48.  *     Celui-ci nécessite une architecture de fichier spécifique non disponible sur thnet
  49.  *     https://flowplayer.com/docs/plugins.html#vod-quality-selector-prerequisites
  50.  *     exemple de flowplayer :
  51.  *         /dossier/84049-bauhaus.mp4        # default quality, 260p
  52.  *         /dossier/84049-bauhaus-530p.mp4   # HD
  53.  *
  54.  *     architecture thnet :
  55.  *         /h264/h264-idvideo.mp4
  56.  *         /hd720/hd720-idvideo.mp4   # HD
  57.  *
  58.  * Les modications sont les suivantes : (je prends en exemple le code non minifé)
  59.  * ligne 44 ajout de la source thnet en brut
  60.  *     m = "http://st.theatre-contemporain.net/{q}/{q}-{codevideo}.mp4",
  61.  *
  62.  * ligne 45 je rajoute cette ligne pour rempacer la clé "codevideo" par l'ID de la vidéo passer en paramètre au player
  63.  *     mm = m = m.replace(/{codevideo}/, i['conf'].idmultimedia);
  64.  *
  65.  * après le forEach de la ligne 46 je rajoute un premier replace
  66.  *     mm = mm.replace(/{q}/,  thnet_quality[h -1]);
  67.  * et remplace m en mm à la ligne 50
  68.  *
  69.  */
  70. /**
  71.  * Modification B :
  72.  *    La deuxième modification concerne multimedias.php ainsi que vod-quality-selector.js de flowplayer
  73.  *    Cette fois le problèmem touche au menu de sélection des qualités (HD/SD)
  74.  *    Si je ne fait pas d'erreur dans ma compréhension du plugin et de l'utilisation que j'en fait,
  75.  *    celui-ci reprends pour label les qualités passés au plugin pour charger les vidéos.
  76.  *
  77.  *    Si nous lui indiquons un tableau avec les qualités suivantes :
  78.  *        h264m, h264, hd720
  79.  *
  80.  *    Il générera les sources avec les modifications du code de l'exemple ci-dessus
  81.  *    et générera les labels suivants pour le menu de sélection :
  82.  *        h264m,
  83.  *        h264,
  84.  *        hd720
  85.  *
  86.  *    Ces labels n'étant pas sexy pour l'utilisateur, j'ai eu à faire quelques modifications pour permettre leur customisation
  87.  *
  88.  *    Pour définir les labels voulus, dans le fichier Multimedias.php, j'ai assigné de nouvelles variables à la vue après traitement (à partir de la ligne 565)
  89.  *    $format_avaibles_array = array('h264m' => 'Mobile','h264' => '240p','hd720' => '720HD','hd1080' => '1080HD', 'hd2160' => '2160HD');
  90.  *    (lire le fichier à partir de cette ligne pour y voir le traitement effectué)
  91.  *
  92.  *    S'en suit un passage des données au plugin à travers les data-* de la div (embed/view.html)
  93.  *        data-qualities-thnet="{video[format_avaibles]}"
  94.  *        data-qualities-thnet-label="{video[format_avaibles_label]}"   *
  95.  *
  96.  *    Pour que flowplayer comprenne ces nouvelles données, j'ai rajouté à partir de la ligne 34 les lignes suivantes : (vod-quality-selector.js)
  97.  *        thnet_quality_label = i['conf'].qualitiesThnetLabel;
  98.  *        thnet_quality_label = thnet_quality_label.split(",");
  99.  *
  100.  *    Pour afficher ces nouveaux labels, j'ai remplacé à la ligne 85
  101.  *        label: e
  102.  *    par :
  103.  *        label: thnet_quality_label[e -1]
  104.  *
  105.  */
  106. class EmbedController extends TheatreController
  107. {
  108.     // {{{ _construct()
  109.     /** constructeur hérité
  110.      *
  111.      */
  112.     public function __construct(
  113.         EntityManagerInterface $em,
  114.         TranslatorInterface $translator,
  115.         TokenStorageInterface $tokenStorage,
  116.         ParameterBagInterface $parameterBag
  117.     )
  118.     {
  119.         // load new aside
  120.         $this->asides = new asides();
  121.         $GLOBALS['rub_courante'] = 'contacts';
  122.         $this->em $em;
  123.         $this->parameterBag $parameterBag;
  124.         // hérite du constructeur parent
  125.         parent::__construct($translator$tokenStorage);
  126.     }
  127.     /**
  128.      * @Route("/embed/{code}", name="embed")
  129.      */
  130.     public function index(Request $request$code null)
  131.     {
  132.         $params['code'] = $code;
  133.         if (empty($params['code'])) {
  134.             throw new RedirectException($this->generateUrl('erreur_type', ['type' => 'introuvable']));
  135.         }
  136.         $multimedias $this->em->getRepository(Multimedias::class);
  137.         $this->context['view']->is_new_player true;
  138. // video
  139.         $format_vignette_video = array('width' => $_ENV['VIGN_VIDEO_WIDTH'], 'height' => $_ENV['VIGN_VIDEO_HEIGHT'], 'fleche' => 'none''ratio' => '169');
  140.         $video $multimedias->getInfosMultimedia(nullfalsefalse, array('tableau' => true'vignette' => $format_vignette_video), $params['code']);
  141.         if (!empty($video)) {
  142.             // calcul de la hauteur de la vidéo pour une argeur de 560
  143.             $width_video 560;
  144.             $height_video round(($width_video $video['flv_height']) / $video['flv_width']);
  145.             // 100%
  146.             $multimedias->setDimensions(array('width' => '100%''height' => '100%''percent' => true));
  147.             //$multimedias->setStatsParameters();
  148.             $video['player'] = $multimedias->getPlayer($video);
  149.             $video['player_title'] = "";
  150.             if (!isset($_GET['no_title'])) {
  151.                 //Si ce n'est pas le festival-avignon
  152.                 if (
  153.                     //Si nous sommes sur le site du festival d'avignon
  154.                     strpos($_SERVER['HTTP_REFERER'] ?? ""'festival-avignon.com') !== false ||
  155.                     //Si nous sommes dans l'application du festival d'avignon
  156.                     (!empty($_GET['partenaire']) && $_GET['partenaire'] == '67de08a071f1019e5113b9ec6fa1ad5efdbecd75')
  157.                 ) {
  158.                     $this->view->is_festival_avignon true;
  159.                     $video['player_title'] = "<a href='" $_ENV['URL_THNET'] . "' target='__blank'><img src='https://www.theatre-contemporain.net/images/menu/logo/logo-montheatre-123x74.gif' class='fp-title-thnet-logo' width='18px' /></a>";
  160.                     $video['player_title'] .= "<a href='" $video['permalink'] . "' target='__blank'>" $video['sujet_titre'] . "</a><br/>";
  161.                 } else {
  162.                     $video['player_title'] = "<a href='" $_ENV['URL_THNET'] . "' target='__blank'><img src='https://www.theatre-contemporain.net/images/menu/logo/logo-montheatre-123x74.gif' class='fp-title-thnet-logo' /></a>";
  163.                     $video['player_title'] .= "<a href='" $video['permalink'] . "' target='__blank'>" $video['sujet_titre'] . "</a><br/>";
  164.                     $arrayPartenaires array_values($video['partenaires']);
  165.                     $partenaire array_shift($arrayPartenaires);
  166.                     $url_partenaire $_ENV['URL_THNET'] . "/contacts/" $partenaire['url_clean'];
  167.                     if (!empty($partenaire['organisation'])) {
  168.                         $video['player_title'] .= "<span class='fp-partenaires'>Partenaire : <a href='" $url_partenaire "' target='__blank' class='ui-partenaire'>" $partenaire['organisation'] . "</a></span>";
  169.                         // $video['player_title'] .= "<span class='fp-partenaires'>Partenaire : ".$partenaire['organisation']."</span>";
  170.                     }
  171.                     $video['player_title'] .= "</a>";
  172.                 }
  173.             }
  174.             // $video['player_title'] = '</div>';
  175.             $video['permalink_thnet'] = $_ENV['URL_THNET'];
  176.             if (!empty($video['spectacles'])) {
  177.                 $video['permalink_thnet'] = $_ENV['URL_THNET'] . "/spectacles/" reset($video['spectacles'])['url_clean'] . "/videos/" $video['url_clean'];
  178.             }
  179.             // calculer la hauteur à partir de la largeur
  180.             $width_video_embed 480;
  181.             $height_video_embed round(($width_video_embed $video['flv_height']) / $video['flv_width']);
  182.             // trouver si il faut afficher en 16/9 ou en 4/3 (560x440)
  183.             if (!empty($video['embed'])) {
  184.                 $video['embed'] = str_replace('560'$width_video_embed$video['embed']);
  185.                 $video['embed'] = str_replace($height_video$height_video_embed$video['embed']);
  186.             }
  187.             // pour le 100% autre que flash
  188.             $video['flv_height'] = '100%';
  189.             $video['flv_width'] = '100%';
  190.             // video non publiée ??
  191.             if (!$video['publish']) {
  192.                 // si pas authentifie, on redirige sur la page de connexion
  193.                 if (!$this->getUser() instanceof Extranetusers) {
  194.                     return $this->redirect('/montheatre/connexion');
  195.                 }
  196.                 $idextranetuser $this->getUser()->getIdextranetuser();
  197.                 if ($video['idextranetuser']->getIdextranetuser() != $idextranetuser && !isset($_GET['nopublish'])) {
  198.                     return $this->redirect('/');
  199.                 }
  200.                 $this->view->unpublished_video true;
  201.             }
  202.             // renvoyer l'image
  203.             if (isset($_REQUEST['thumbnail'])) {
  204.                 header('Content-type: image/jpeg');
  205.                 $image PATH_IMG 'img_tv/prop169/' $video['idmultimedia'] . '.jpg';
  206.                 echo file_get_contents($image);
  207.                 exit;
  208.             }
  209.             if (isset($video['status_publication']) && in_array($video['status_publication'], array('nodispo''nodelete''montheatre'))) {
  210.                 $this->view->{$video['status_publication']} = true;
  211.                 $this->view->permalink $video['permalink'];
  212.                 $this->view->nameview $video['nameview'];
  213.             } else {
  214.                 $lecture true;
  215.                 if (isset($video['status_publication']) && in_array($video['status_publication'], array('noexport')) && $request->getSession()->get('currentVideo') != md5($video['idmultimedia'])) {
  216.                     $lecture false;
  217.                     $this->view->{$video['status_publication']} = true;
  218.                     $this->view->permalink $video['permalink'];
  219.                     $this->view->nameview $video['nameview'];
  220.                 }
  221.                 if ($lecture) {
  222.                     $this->view->video $video;
  223.                     $this->view->title_page $video['sujet_titre'];
  224.                     $request->getSession()->set('currentVideo''');
  225.                 }
  226.             }
  227.         } else {
  228.             $this->view->title_page 'Vidéo non disponible';
  229.         }
  230. //        dump($this->view->video);
  231. //        exit;
  232.         $this->view->js_more = array(
  233.             'flowplayer/flowplayer.js',
  234.             'flowplayer/flowplayer.hlsjs.light.min.js',
  235.             'flowplayer/flowplayer.vod-quality-selector.js'
  236.         );
  237.         return $this->view('embed/view.html.twig');
  238.     }
  239. }