MediaVideo.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. namespace App\Entity;
  3. use Doctrine\ORM\Mapping as ORM;
  4. use Symfony\Component\Validator\Constraints as Assert;
  5. /**
  6. * MediaVideo
  7. *
  8. * @ORM\Table(name="media_video")
  9. * @ORM\Entity(repositoryClass="App\Repository\MediaVideoRepository")
  10. * @ORM\HasLifecycleCallbacks // Permet d’utiliser des événements
  11. */
  12. class MediaVideo
  13. {
  14. /**
  15. * @var int
  16. *
  17. * @ORM\Column(name="id", type="integer")
  18. * @ORM\Id
  19. * @ORM\GeneratedValue(strategy="AUTO")
  20. */
  21. private $id;
  22. /**
  23. * @var string
  24. *
  25. * @ORM\Column(name="type", type="string", length=191)
  26. */
  27. private $type;
  28. /**
  29. * @var string
  30. *
  31. * @ORM\Column(name="identif", type="string", length=191)
  32. */
  33. private $identif;
  34. /**
  35. * @Assert\Regex(
  36. * pattern="#^(http|https)://(youtu.be|www.youtube.com|www.dailymotion.com|vimeo.com|video.fdlibre.eu)/#",
  37. * match=true,
  38. * message="L'url doit correspondre à l'url d'une vidéo Youtube, DailyMotion, Vimeo ou Peertube(fdlibre)"
  39. * )
  40. */
  41. private $url;
  42. /**
  43. * Get id
  44. *
  45. * @return int
  46. */
  47. public function getId()
  48. {
  49. return $this->id;
  50. }
  51. /**
  52. * @return string
  53. *
  54. */
  55. public function getUrl()
  56. {
  57. return $this->url;
  58. }
  59. public function setUrl($url)
  60. {
  61. return $this->url = $url;
  62. }
  63. /**
  64. * Set type
  65. *
  66. * @param string $type
  67. *
  68. * @return MediaVideo
  69. */
  70. public function setType($type)
  71. {
  72. $this->type = $type;
  73. return $this;
  74. }
  75. /**
  76. * Get type
  77. *
  78. * @return string
  79. */
  80. public function getType()
  81. {
  82. return $this->type;
  83. }
  84. /**
  85. * Set identif
  86. *
  87. * @param string $identif
  88. *
  89. * @return MediaVideo
  90. */
  91. public function setIdentif($identif)
  92. {
  93. $this->identif = $identif;
  94. return $this;
  95. }
  96. /**
  97. * Get identif
  98. *
  99. * @return string
  100. */
  101. public function getIdentif()
  102. {
  103. return $this->identif;
  104. }
  105. /////////////////////
  106. // Méthodes
  107. private function peertubeId($url)
  108. {
  109. $tableau = explode("/", $url);
  110. $id = $tableau[count($tableau)-1];
  111. $this->setIdentif($id);
  112. $this->setType('peertube');
  113. }
  114. private function youtubeId($url)
  115. {
  116. $tableaux = explode("=", $url); // découpe l’url en deux avec le signe ‘=’
  117. $this->setIdentif($tableaux[1]); // ajoute l’identifiant à l’attribut identif
  118. $this->setType('youtube'); // signale qu’il s’agit d’une video youtube et l’inscrit dans l’attribut $type
  119. }
  120. private function youtubeCourteId($url)
  121. {
  122. $tableaux = explode("/", $url); // on découpe l’url grâce au « / »
  123. $id = $tableaux[count($tableaux)-1]; // on retient la dernière partie qui contient l’identifiant
  124. $this->setIdentif($id); // ajoute l’identifiant à l’attribut identif
  125. $this->setType('youtube'); // signale qu’il s’agit d’une video youtube et l’inscrit dans l’attribut $type
  126. }
  127. private function dailymotionId($url)
  128. {
  129. $cas = explode("/", $url); // On sépare la première partie de l'url des 2 autres
  130. $idb = $cas[4]; // On récupère la partie qui nous intéressent
  131. $bp = explode("_", $idb); // On sépare l'identifiant du reste
  132. $id = $bp[0]; // On récupère l'identifiant
  133. $this->setIdentif($id); // ajoute l’identifiant à l’attribut identif
  134. $this->setType('dailymotion'); // signale qu’il s’agit d’une video dailymotion et l’inscrit dans l’attribut $type
  135. }
  136. private function vimeoId($url)
  137. {
  138. $tableaux = explode("/", $url); // on découpe l’url grâce au « / »
  139. $id = $tableaux[count($tableaux)-1]; // on reticent la dernière partie qui contient l’identifiant
  140. $this->setIdentif($id); // ajoute l’identifiant à l’attribut identif
  141. $this->setType('vimeo'); // signale qu’il s’agit d’une video vimeo et l’inscrit dans l’attribut $type
  142. }
  143. /**
  144. * @ORM\PrePersist() // Les trois événement suivant s’exécute avant que l’entité soit enregistée
  145. * @ORM\PreUpdate()
  146. * @ORM\PreFlush()
  147. */
  148. public function extractIdentif()
  149. {
  150. $url = $this->getUrl(); // on récupère l’url
  151. if (preg_match("#^(http|https)://video.fdlibre.eu/#", $url)) // Si c'est peertube fdlibre
  152. {
  153. $this->peertubeId($url);
  154. }
  155. if (preg_match("#^(http|https)://www.youtube.com/#", $url)) // Si c’est une url Youtube on execute la fonction correspondante
  156. {
  157. $this->youtubeId($url);
  158. }
  159. if (preg_match("#^(http|https)://youtu.be/#", $url)) // Si c’est une url Youtube on execute la fonction correspondante
  160. {
  161. $this->youtubeCourteId($url);
  162. }
  163. else if((preg_match("#^(http|https)://www.dailymotion.com/#", $url))) // Si c’est une url Dailymotion on execute la fonction correspondante
  164. {
  165. $this->dailymotionId($url);
  166. }
  167. else if((preg_match("#^(http|https)://vimeo.com/#", $url))) // Si c’est une url Vimeo on execute la fonction correspondante
  168. {
  169. $this->vimeoId($url);
  170. }
  171. }
  172. private function embedUrl()
  173. {
  174. $control = $this->getType(); // on récupère le type de la vidéo
  175. $id = strip_tags($this->getIdentif()); // on récupère son identifiant
  176. if ($control == 'youtube') {
  177. $embed = "https://www.youtube-nocookie.com/embed/" . $id;
  178. return $embed;
  179. } else if ($control == 'dailymotion') {
  180. $embed = "https://www.dailymotion.com/embed/video/" . $id;
  181. return $embed;
  182. } else if ($control == 'vimeo') {
  183. $embed = "https://player.vimeo.com/video/" . $id;
  184. return $embed;
  185. } else if ($control == 'peertube') {
  186. $embed = "https://video.fdlibre.eu/videos/embed/" . $id;
  187. return $embed;
  188. }
  189. }
  190. private function url()
  191. {
  192. $control = $this->getType(); // on récupère le type de la vidéo
  193. $id = strip_tags($this->getIdentif()); // on récupère son identifiant
  194. if ($control == 'youtube') {
  195. $embed = "https://www.youtube.com/watch?v=" . $id;
  196. return $embed;
  197. } else if ($control == 'dailymotion') {
  198. $embed = "https://www.dailymotion.com/video/" . $id;
  199. return $embed;
  200. } else if ($control == 'vimeo') {
  201. $embed = "https://vimeo.com/" . $id;
  202. return $embed;
  203. } else if ($control == 'peertube') {
  204. $embed = "https://video.fdlibre.eu/videos/watch/" . $id;
  205. return $embed;
  206. }
  207. }
  208. public function image()
  209. {
  210. $control = $this->getType(); // on récupère le type de la vidéo
  211. $id = strip_tags($this->getIdentif()); // on récupère son identifiant
  212. if ($control == 'youtube') {
  213. $image = 'https://img.youtube.com/vi/' . $id . '/hqdefault.jpg';
  214. return $image;
  215. } else if ($control == 'dailymotion') {
  216. $image = 'https://www.dailymotion.com/thumbnail/150x120/video/' . $id . '';
  217. return $image;
  218. } else if ($control == 'vimeo') {
  219. $hash = unserialize(file_get_contents("https://vimeo.com/api/v2/video/" . $id . ".php"));
  220. $image = $hash[0]['thumbnail_small'];
  221. return $image;
  222. }
  223. }
  224. public function video()
  225. {
  226. $video = "<iframe src='".$this->embedUrl()."' allowfullscreen></iframe>";
  227. return $video;
  228. }
  229. }