<?php
namespace App\Controller;
use App\ClassTheatre\asides;
use App\ClassTheatre\TheatreController;
use App\Exception\RedirectException;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use TheatreCore\Entity\Extranetusers;
use TheatreCore\Entity\Multimedias;
/**
* Page d'une vidéo emebed en iframe
*
* PHP versions 4 and 5
*
* LICENSE: Ce programme est un logiciel libre distribue sous licence GNU/GPL
*
* @author Yves Tannier <yves.tannier@theatre-contemporain.net>
* @copyright 2008 C.R.I.S.
* @license http://www.gnu.org/copyleft/lesser.html LGPL License 2.1
* @version 0.1.0
* @link https://www.theatre-contemporain.net
*/
/**
* Mise-à-jour du player
*
* 12/12/2017 (@Boussad)
* J'ai customisé le plugin vod-quality-selector.js de flowplayer
* 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.
*/
/**
* Modification 0 :
* Pour que flowplayer connaisse le nombre de qualité disponible pour une vidéo,
* j'ai eu à rajouter une ligne dans le fichier multimedias.php
* $format_avaibles_count = array();
* (lire le fichier à partir de cette ligne pour y voir le traitement effectué)
*
* S'en suit un passage des données au plugin à travers les data-* de la div (embed/view.html)
* data-qualities="{video[format_avaibles_count]}"
*
*/
/**
* Modification A :
* - J'ai customisé le plugin vod-quality-selector.js de flowplayer
* Celui-ci nécessite une architecture de fichier spécifique non disponible sur thnet
* https://flowplayer.com/docs/plugins.html#vod-quality-selector-prerequisites
* exemple de flowplayer :
* /dossier/84049-bauhaus.mp4 # default quality, 260p
* /dossier/84049-bauhaus-530p.mp4 # HD
*
* architecture thnet :
* /h264/h264-idvideo.mp4
* /hd720/hd720-idvideo.mp4 # HD
*
* Les modications sont les suivantes : (je prends en exemple le code non minifé)
* ligne 44 ajout de la source thnet en brut
* m = "http://st.theatre-contemporain.net/{q}/{q}-{codevideo}.mp4",
*
* ligne 45 je rajoute cette ligne pour rempacer la clé "codevideo" par l'ID de la vidéo passer en paramètre au player
* mm = m = m.replace(/{codevideo}/, i['conf'].idmultimedia);
*
* après le forEach de la ligne 46 je rajoute un premier replace
* mm = mm.replace(/{q}/, thnet_quality[h -1]);
* et remplace m en mm à la ligne 50
*
*/
/**
* Modification B :
* La deuxième modification concerne multimedias.php ainsi que vod-quality-selector.js de flowplayer
* Cette fois le problèmem touche au menu de sélection des qualités (HD/SD)
* Si je ne fait pas d'erreur dans ma compréhension du plugin et de l'utilisation que j'en fait,
* celui-ci reprends pour label les qualités passés au plugin pour charger les vidéos.
*
* Si nous lui indiquons un tableau avec les qualités suivantes :
* h264m, h264, hd720
*
* Il générera les sources avec les modifications du code de l'exemple ci-dessus
* et générera les labels suivants pour le menu de sélection :
* h264m,
* h264,
* hd720
*
* Ces labels n'étant pas sexy pour l'utilisateur, j'ai eu à faire quelques modifications pour permettre leur customisation
*
* 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)
* $format_avaibles_array = array('h264m' => 'Mobile','h264' => '240p','hd720' => '720HD','hd1080' => '1080HD', 'hd2160' => '2160HD');
* (lire le fichier à partir de cette ligne pour y voir le traitement effectué)
*
* S'en suit un passage des données au plugin à travers les data-* de la div (embed/view.html)
* data-qualities-thnet="{video[format_avaibles]}"
* data-qualities-thnet-label="{video[format_avaibles_label]}" *
*
* Pour que flowplayer comprenne ces nouvelles données, j'ai rajouté à partir de la ligne 34 les lignes suivantes : (vod-quality-selector.js)
* thnet_quality_label = i['conf'].qualitiesThnetLabel;
* thnet_quality_label = thnet_quality_label.split(",");
*
* Pour afficher ces nouveaux labels, j'ai remplacé à la ligne 85
* label: e
* par :
* label: thnet_quality_label[e -1]
*
*/
class EmbedController extends TheatreController
{
// {{{ _construct()
/** constructeur hérité
*
*/
public function __construct(
EntityManagerInterface $em,
TranslatorInterface $translator,
TokenStorageInterface $tokenStorage,
ParameterBagInterface $parameterBag
)
{
// load new aside
$this->asides = new asides();
$GLOBALS['rub_courante'] = 'contacts';
$this->em = $em;
$this->parameterBag = $parameterBag;
// hérite du constructeur parent
parent::__construct($translator, $tokenStorage);
}
/**
* @Route("/embed/{code}", name="embed")
*/
public function index(Request $request, $code = null)
{
$params['code'] = $code;
if (empty($params['code'])) {
throw new RedirectException($this->generateUrl('erreur_type', ['type' => 'introuvable']));
}
$multimedias = $this->em->getRepository(Multimedias::class);
$this->context['view']->is_new_player = true;
// video
$format_vignette_video = array('width' => $_ENV['VIGN_VIDEO_WIDTH'], 'height' => $_ENV['VIGN_VIDEO_HEIGHT'], 'fleche' => 'none', 'ratio' => '169');
$video = $multimedias->getInfosMultimedia(null, false, false, array('tableau' => true, 'vignette' => $format_vignette_video), $params['code']);
if (!empty($video)) {
// calcul de la hauteur de la vidéo pour une argeur de 560
$width_video = 560;
$height_video = round(($width_video * $video['flv_height']) / $video['flv_width']);
// 100%
$multimedias->setDimensions(array('width' => '100%', 'height' => '100%', 'percent' => true));
//$multimedias->setStatsParameters();
$video['player'] = $multimedias->getPlayer($video);
$video['player_title'] = "";
if (!isset($_GET['no_title'])) {
//Si ce n'est pas le festival-avignon
if (
//Si nous sommes sur le site du festival d'avignon
strpos($_SERVER['HTTP_REFERER'] ?? "", 'festival-avignon.com') !== false ||
//Si nous sommes dans l'application du festival d'avignon
(!empty($_GET['partenaire']) && $_GET['partenaire'] == '67de08a071f1019e5113b9ec6fa1ad5efdbecd75')
) {
$this->view->is_festival_avignon = true;
$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>";
$video['player_title'] .= "<a href='" . $video['permalink'] . "' target='__blank'>" . $video['sujet_titre'] . "</a><br/>";
} else {
$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>";
$video['player_title'] .= "<a href='" . $video['permalink'] . "' target='__blank'>" . $video['sujet_titre'] . "</a><br/>";
$arrayPartenaires = array_values($video['partenaires']);
$partenaire = array_shift($arrayPartenaires);
$url_partenaire = $_ENV['URL_THNET'] . "/contacts/" . $partenaire['url_clean'];
if (!empty($partenaire['organisation'])) {
$video['player_title'] .= "<span class='fp-partenaires'>Partenaire : <a href='" . $url_partenaire . "' target='__blank' class='ui-partenaire'>" . $partenaire['organisation'] . "</a></span>";
// $video['player_title'] .= "<span class='fp-partenaires'>Partenaire : ".$partenaire['organisation']."</span>";
}
$video['player_title'] .= "</a>";
}
}
// $video['player_title'] = '</div>';
$video['permalink_thnet'] = $_ENV['URL_THNET'];
if (!empty($video['spectacles'])) {
$video['permalink_thnet'] = $_ENV['URL_THNET'] . "/spectacles/" . reset($video['spectacles'])['url_clean'] . "/videos/" . $video['url_clean'];
}
// calculer la hauteur à partir de la largeur
$width_video_embed = 480;
$height_video_embed = round(($width_video_embed * $video['flv_height']) / $video['flv_width']);
// trouver si il faut afficher en 16/9 ou en 4/3 (560x440)
if (!empty($video['embed'])) {
$video['embed'] = str_replace('560', $width_video_embed, $video['embed']);
$video['embed'] = str_replace($height_video, $height_video_embed, $video['embed']);
}
// pour le 100% autre que flash
$video['flv_height'] = '100%';
$video['flv_width'] = '100%';
// video non publiée ??
if (!$video['publish']) {
// si pas authentifie, on redirige sur la page de connexion
if (!$this->getUser() instanceof Extranetusers) {
return $this->redirect('/montheatre/connexion');
}
$idextranetuser = $this->getUser()->getIdextranetuser();
if ($video['idextranetuser']->getIdextranetuser() != $idextranetuser && !isset($_GET['nopublish'])) {
return $this->redirect('/');
}
$this->view->unpublished_video = true;
}
// renvoyer l'image
if (isset($_REQUEST['thumbnail'])) {
header('Content-type: image/jpeg');
$image = PATH_IMG . 'img_tv/prop169/' . $video['idmultimedia'] . '.jpg';
echo file_get_contents($image);
exit;
}
if (isset($video['status_publication']) && in_array($video['status_publication'], array('nodispo', 'nodelete', 'montheatre'))) {
$this->view->{$video['status_publication']} = true;
$this->view->permalink = $video['permalink'];
$this->view->nameview = $video['nameview'];
} else {
$lecture = true;
if (isset($video['status_publication']) && in_array($video['status_publication'], array('noexport')) && $request->getSession()->get('currentVideo') != md5($video['idmultimedia'])) {
$lecture = false;
$this->view->{$video['status_publication']} = true;
$this->view->permalink = $video['permalink'];
$this->view->nameview = $video['nameview'];
}
if ($lecture) {
$this->view->video = $video;
$this->view->title_page = $video['sujet_titre'];
$request->getSession()->set('currentVideo', '');
}
}
} else {
$this->view->title_page = 'Vidéo non disponible';
}
// dump($this->view->video);
// exit;
$this->view->js_more = array(
'flowplayer/flowplayer.js',
'flowplayer/flowplayer.hlsjs.light.min.js',
'flowplayer/flowplayer.vod-quality-selector.js'
);
return $this->view('embed/view.html.twig');
}
}