diff options
| author | polo <ordipolo@gmx.fr> | 2022-02-17 18:13:00 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2022-02-17 18:13:00 +0100 |
| commit | 787d03e48471ba62cd830379428f04d996f0b74b (patch) | |
| tree | e9f98c7b9288c4530b50985688dd82622106ba2d /controller/media.php | |
| parent | 29df6f1362745eabf4fbcaedf309eb63795152fa (diff) | |
| download | melaine-787d03e48471ba62cd830379428f04d996f0b74b.tar.gz melaine-787d03e48471ba62cd830379428f04d996f0b74b.tar.bz2 melaine-787d03e48471ba62cd830379428f04d996f0b74b.zip | |
model update
Diffstat (limited to 'controller/media.php')
| -rw-r--r-- | controller/media.php | 424 |
1 files changed, 212 insertions, 212 deletions
diff --git a/controller/media.php b/controller/media.php index 8105b4d..c6682df 100644 --- a/controller/media.php +++ b/controller/media.php | |||
| @@ -1,212 +1,212 @@ | |||
| 1 | <?php | 1 | <?php |
| 2 | 2 | ||
| 3 | // traitement avant enregistrement dans le fichier submit.php | 3 | // traitement avant enregistrement dans le fichier submit.php |
| 4 | // cette fonction extrait les liens pointant vers des medias embarqués | 4 | // cette fonction extrait les liens pointant vers des medias embarqués |
| 5 | // (liste de sites) et les restituent nus, sans les balises | 5 | // (liste de sites) et les restituent nus, sans les balises |
| 6 | function mediaSubmit($chaine) | 6 | function mediaSubmit($chaine) |
| 7 | { | 7 | { |
| 8 | // liste de sites concernés par les fonctions de ce fichiers | 8 | // liste de sites concernés par les fonctions de ce fichiers |
| 9 | $listeMedia = "youtube.com|vimeo.com|dailymotion.com|spotify.com|soundcloud.com|instagram.com|twitter.com|flickr.com|facebook.com|fb.watch|deezer.com|openstreetmap.org|goo.gl/maps|google.com/maps|itunes.apple.com|wordpress.com"; | 9 | $listeMedia = "youtube.com|vimeo.com|dailymotion.com|spotify.com|soundcloud.com|instagram.com|twitter.com|flickr.com|facebook.com|fb.watch|deezer.com|openstreetmap.org|goo.gl/maps|google.com/maps|itunes.apple.com|wordpress.com"; |
| 10 | 10 | ||
| 11 | // sites gérés manuellement (l'éditeur semble ne pas les connaître) | 11 | // sites gérés manuellement (l'éditeur semble ne pas les connaître) |
| 12 | $regexListeNonGeree = 'https://open.spotify.com/embed/\w+/\w+'; | 12 | $regexListeNonGeree = 'https://open.spotify.com/embed/\w+/\w+'; |
| 13 | 13 | ||
| 14 | // à faire plus tard | 14 | // à faire plus tard |
| 15 | //https://www.openstreetmap.org.*layer=mapnik | 15 | //https://www.openstreetmap.org.*layer=mapnik |
| 16 | 16 | ||
| 17 | //global $listeMedia; // avec global, au lieu de créer une variable locale, on crée une référence vers celle à l'extérieur | 17 | //global $listeMedia; // avec global, au lieu de créer une variable locale, on crée une référence vers celle à l'extérieur |
| 18 | //global $regexListeNonGeree; | 18 | //global $regexListeNonGeree; |
| 19 | 19 | ||
| 20 | //echo($chaine . "\n"); | 20 | //echo($chaine . "\n"); |
| 21 | 21 | ||
| 22 | // pour embarquer spotify, l'url doit ressembler à https://open.spotify.com/embed/... | 22 | // pour embarquer spotify, l'url doit ressembler à https://open.spotify.com/embed/... |
| 23 | // on ajoute "/embed" si necessaire | 23 | // on ajoute "/embed" si necessaire |
| 24 | $chaine = preg_replace('#spotify.com(?!/embed)#', '$0/embed', $chaine); | 24 | $chaine = preg_replace('#spotify.com(?!/embed)#', '$0/embed', $chaine); |
| 25 | 25 | ||
| 26 | // adaptation pour les sites non gérés par l'éditeur | 26 | // adaptation pour les sites non gérés par l'éditeur |
| 27 | // on gère deux cas: celui ou l'éditeur ne fait rien (lien nu) et celui où l'utilisateur a créé un lien <a> | 27 | // on gère deux cas: celui ou l'éditeur ne fait rien (lien nu) et celui où l'utilisateur a créé un lien <a> |
| 28 | 28 | ||
| 29 | // on vire les balises <a> et ce qu'il y a entre les deux pour ne garder que les liens | 29 | // on vire les balises <a> et ce qu'il y a entre les deux pour ne garder que les liens |
| 30 | // on pourra ensuite traiter ensemble les url avec et sans balises <a> | 30 | // on pourra ensuite traiter ensemble les url avec et sans balises <a> |
| 31 | // (?:) permet de matcher sans capturer, donc de retirer des choses | 31 | // (?:) permet de matcher sans capturer, donc de retirer des choses |
| 32 | // pour la variable $tolere, on met: | 32 | // pour la variable $tolere, on met: |
| 33 | // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n, | 33 | // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n, |
| 34 | // /, @, %, deux-points ';', virgule ',' et point-virgule ; | 34 | // /, @, %, deux-points ';', virgule ',' et point-virgule ; |
| 35 | // et devant être échappés: . # ( ) ] { } ? ! | et le tiret qui est placé au début ou la fin | 35 | // et devant être échappés: . # ( ) ] { } ? ! | et le tiret qui est placé au début ou la fin |
| 36 | $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-'; | 36 | $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-'; |
| 37 | $pattern = '#(?:<a href=")([' . $tolere . ']{1,})?(' . $regexListeNonGeree . ')([' . $tolere . ']{1,})?(?:">[' . $tolere . ']+</a>)#'; | 37 | $pattern = '#(?:<a href=")([' . $tolere . ']{1,})?(' . $regexListeNonGeree . ')([' . $tolere . ']{1,})?(?:">[' . $tolere . ']+</a>)#'; |
| 38 | $chaine = preg_replace($pattern, '$2', $chaine); | 38 | $chaine = preg_replace($pattern, '$2', $chaine); |
| 39 | //echo($chaine . "\n"); | 39 | //echo($chaine . "\n"); |
| 40 | 40 | ||
| 41 | // on met les balises <span> | 41 | // on met les balises <span> |
| 42 | $pattern = '#' . $regexListeNonGeree . '#'; | 42 | $pattern = '#' . $regexListeNonGeree . '#'; |
| 43 | $remplacement = '<span class="media_embed">$0</span>'; | 43 | $remplacement = '<span class="media_embed">$0</span>'; |
| 44 | $chaine = preg_replace($pattern, $remplacement, $chaine); | 44 | $chaine = preg_replace($pattern, $remplacement, $chaine); |
| 45 | 45 | ||
| 46 | // c'est quoi cette merde? | 46 | // c'est quoi cette merde? |
| 47 | // l'API DOM de PHP bien sur!! pour manipuler le "document object model" | 47 | // l'API DOM de PHP bien sur!! pour manipuler le "document object model" |
| 48 | // c'est du complètement calqué sur le javascript, avec une syntaxe PHP | 48 | // c'est du complètement calqué sur le javascript, avec une syntaxe PHP |
| 49 | // et en plus elle est super vieille, elle ne connaît pas les balises HTML5 ! | 49 | // et en plus elle est super vieille, elle ne connaît pas les balises HTML5 ! |
| 50 | // mais une balise c'est une balise donc ça marche quand même | 50 | // mais une balise c'est une balise donc ça marche quand même |
| 51 | // la doc de PHP est comme toujours plutôt bonne, elle indique les types de données manipulées | 51 | // la doc de PHP est comme toujours plutôt bonne, elle indique les types de données manipulées |
| 52 | // https://www.php.net/manual/fr/book.dom.php | 52 | // https://www.php.net/manual/fr/book.dom.php |
| 53 | $dom = new DOMDocument; | 53 | $dom = new DOMDocument; |
| 54 | 54 | ||
| 55 | // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises | 55 | // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises |
| 56 | libxml_use_internal_errors(true); | 56 | libxml_use_internal_errors(true); |
| 57 | 57 | ||
| 58 | if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML | 58 | if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML |
| 59 | { | 59 | { |
| 60 | // <figure> | 60 | // <figure> |
| 61 | // détecter <figure class="media"><oembed url="http://..."> | 61 | // détecter <figure class="media"><oembed url="http://..."> |
| 62 | // puis extraire le lien et supprimer les balises autour | 62 | // puis extraire le lien et supprimer les balises autour |
| 63 | if(preg_match("#<figure class=\"media\"><oembed url=\".+\"></oembed></figure>#", $chaine)) | 63 | if(preg_match("#<figure class=\"media\"><oembed url=\".+\"></oembed></figure>#", $chaine)) |
| 64 | { | 64 | { |
| 65 | $nbFigures = $dom->getElementsByTagName('figure')->length; | 65 | $nbFigures = $dom->getElementsByTagName('figure')->length; |
| 66 | 66 | ||
| 67 | $j = 0; | 67 | $j = 0; |
| 68 | for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une <figure> disparaît à chaque tour | 68 | for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une <figure> disparaît à chaque tour |
| 69 | { | 69 | { |
| 70 | $balisesFigure = $dom->getElementsByTagName('figure'); | 70 | $balisesFigure = $dom->getElementsByTagName('figure'); |
| 71 | $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc | 71 | $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc |
| 72 | $parent = $figure->parentNode; | 72 | $parent = $figure->parentNode; |
| 73 | 73 | ||
| 74 | if($figure->getAttribute("class") == 'media') | 74 | if($figure->getAttribute("class") == 'media') |
| 75 | { | 75 | { |
| 76 | $oembed = $figure->getElementsByTagName('oembed'); // tableau d'une seule case | 76 | $oembed = $figure->getElementsByTagName('oembed'); // tableau d'une seule case |
| 77 | $div = $figure->getElementsByTagName('div'); // tableau d'une seule case | 77 | $div = $figure->getElementsByTagName('div'); // tableau d'une seule case |
| 78 | if($oembed->length > 0) // si taille = 0, c'est que la balise figure contient autre chose qu'une oembed | 78 | if($oembed->length > 0) // si taille = 0, c'est que la balise figure contient autre chose qu'une oembed |
| 79 | { | 79 | { |
| 80 | $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses | 80 | $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses |
| 81 | $span = $dom->createElement('span', $lien); | 81 | $span = $dom->createElement('span', $lien); |
| 82 | $class = $dom->createAttribute('class'); | 82 | $class = $dom->createAttribute('class'); |
| 83 | $class->value = 'media_embed'; | 83 | $class->value = 'media_embed'; |
| 84 | $span->appendChild($class); | 84 | $span->appendChild($class); |
| 85 | $parent->replaceChild($span, $figure); | 85 | $parent->replaceChild($span, $figure); |
| 86 | } | 86 | } |
| 87 | elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe | 87 | elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe |
| 88 | { | 88 | { |
| 89 | $lien = $div->item(0)->getAttribute('data-oembed-url') . ' '; | 89 | $lien = $div->item(0)->getAttribute('data-oembed-url') . ' '; |
| 90 | $span = $dom->createElement('span', $lien); | 90 | $span = $dom->createElement('span', $lien); |
| 91 | $class = $dom->createAttribute('class'); | 91 | $class = $dom->createAttribute('class'); |
| 92 | $class->value = 'media_embed'; | 92 | $class->value = 'media_embed'; |
| 93 | $span->appendChild($class); | 93 | $span->appendChild($class); |
| 94 | $parent->replaceChild($span, $figure); | 94 | $parent->replaceChild($span, $figure); |
| 95 | } | 95 | } |
| 96 | else | 96 | else |
| 97 | { | 97 | { |
| 98 | $j++; // la balise <figure> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini | 98 | $j++; // la balise <figure> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini |
| 99 | } | 99 | } |
| 100 | } | 100 | } |
| 101 | } | 101 | } |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | // <iframe> | 104 | // <iframe> |
| 105 | // détecter <iframe src="http://..." et remplacer par le lien nu, comme au dessus | 105 | // détecter <iframe src="http://..." et remplacer par le lien nu, comme au dessus |
| 106 | // site sans oembed? | 106 | // site sans oembed? |
| 107 | if(preg_match("#<iframe src=\".+\"></iframe>#", $chaine)) | 107 | if(preg_match("#<iframe src=\".+\"></iframe>#", $chaine)) |
| 108 | { | 108 | { |
| 109 | $nbIframes = $dom->getElementsByTagName('iframe')->length; | 109 | $nbIframes = $dom->getElementsByTagName('iframe')->length; |
| 110 | 110 | ||
| 111 | for($i = 0; $i < $nbIframes ; $i++) | 111 | for($i = 0; $i < $nbIframes ; $i++) |
| 112 | { | 112 | { |
| 113 | $balisesIframe = $dom->getElementsByTagName('iframe'); | 113 | $balisesIframe = $dom->getElementsByTagName('iframe'); |
| 114 | $iframe = $balisesIframe->item(0); | 114 | $iframe = $balisesIframe->item(0); |
| 115 | $parent = $iframe->parentNode; | 115 | $parent = $iframe->parentNode; |
| 116 | 116 | ||
| 117 | $lien = $iframe->getAttribute('src') . ' '; | 117 | $lien = $iframe->getAttribute('src') . ' '; |
| 118 | $span = $dom->createElement('span', $lien); | 118 | $span = $dom->createElement('span', $lien); |
| 119 | $class = $dom->createAttribute('class'); | 119 | $class = $dom->createAttribute('class'); |
| 120 | $class->value = 'media_embed'; | 120 | $class->value = 'media_embed'; |
| 121 | $span->appendChild($class); | 121 | $span->appendChild($class); |
| 122 | $parent->replaceChild($span, $$iframe); | 122 | $parent->replaceChild($span, $$iframe); |
| 123 | } | 123 | } |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | // <a> | 126 | // <a> |
| 127 | // pour tout les sites multimedia, remplacer les balises <a> par les liens nus | 127 | // pour tout les sites multimedia, remplacer les balises <a> par les liens nus |
| 128 | // en effet, en revenant dans l'éditeur les liens ne déclenchent pas automatiquement "l'embarquement" | 128 | // en effet, en revenant dans l'éditeur les liens ne déclenchent pas automatiquement "l'embarquement" |
| 129 | // cliquer à la fin d'un lien et passer à la ligne a pour effet de créer des balises <a> | 129 | // cliquer à la fin d'un lien et passer à la ligne a pour effet de créer des balises <a> |
| 130 | // ça pose un problème parce que la bibliothèque "embera" ne gère pas les liens dans des balises | 130 | // ça pose un problème parce que la bibliothèque "embera" ne gère pas les liens dans des balises |
| 131 | if(preg_match("#<a href=\".+\">.*</a>#", $chaine)) | 131 | if(preg_match("#<a href=\".+\">.*</a>#", $chaine)) |
| 132 | { | 132 | { |
| 133 | $nbA = $dom->getElementsByTagName('a')->length; | 133 | $nbA = $dom->getElementsByTagName('a')->length; |
| 134 | 134 | ||
| 135 | $j = 0; | 135 | $j = 0; |
| 136 | for($i = 0; $i < $nbA ; $i++) | 136 | for($i = 0; $i < $nbA ; $i++) |
| 137 | { | 137 | { |
| 138 | $balisesA = $dom->getElementsByTagName('a'); | 138 | $balisesA = $dom->getElementsByTagName('a'); |
| 139 | $a = $balisesA->item($j); | 139 | $a = $balisesA->item($j); |
| 140 | $parent = $a->parentNode; | 140 | $parent = $a->parentNode; |
| 141 | 141 | ||
| 142 | $lien = $a->getAttribute('href') . ' '; | 142 | $lien = $a->getAttribute('href') . ' '; |
| 143 | 143 | ||
| 144 | // seules les liens pointant vers une des adresses de la liste sont concernés | 144 | // seules les liens pointant vers une des adresses de la liste sont concernés |
| 145 | if(preg_match("#" . $listeMedia . "#", $lien)) | 145 | if(preg_match("#" . $listeMedia . "#", $lien)) |
| 146 | { | 146 | { |
| 147 | $span = $dom->createElement('span', $lien); | 147 | $span = $dom->createElement('span', $lien); |
| 148 | $class = $dom->createAttribute('class'); | 148 | $class = $dom->createAttribute('class'); |
| 149 | $class->value = 'media_embed'; | 149 | $class->value = 'media_embed'; |
| 150 | $span->appendChild($class); | 150 | $span->appendChild($class); |
| 151 | $parent->replaceChild($span, $a); | 151 | $parent->replaceChild($span, $a); |
| 152 | } | 152 | } |
| 153 | else | 153 | else |
| 154 | { | 154 | { |
| 155 | $j++; // la balise <a> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini | 155 | $j++; // la balise <a> n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini |
| 156 | } | 156 | } |
| 157 | } | 157 | } |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log | 160 | // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log |
| 161 | libxml_clear_errors(); | 161 | libxml_clear_errors(); |
| 162 | // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous | 162 | // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous |
| 163 | //~ $errors = libxml_get_errors(); | 163 | //~ $errors = libxml_get_errors(); |
| 164 | //~ var_dump($errors); | 164 | //~ var_dump($errors); |
| 165 | 165 | ||
| 166 | // mettre à jour le DOM et enlever le DOCTYPE et les balises <html> et <body> | 166 | // mettre à jour le DOM et enlever le DOCTYPE et les balises <html> et <body> |
| 167 | $chaine = $dom->saveHTML($dom); | 167 | $chaine = $dom->saveHTML($dom); |
| 168 | $pattern = array ('#<!DOCTYPE.*>#', '#<html><body>#', '#</html></body>#'); | 168 | $pattern = array ('#<!DOCTYPE.*>#', '#<html><body>#', '#</html></body>#'); |
| 169 | $remplacement = array ('', '', ''); | 169 | $remplacement = array ('', '', ''); |
| 170 | $chaine = preg_replace($pattern, $remplacement, $chaine); | 170 | $chaine = preg_replace($pattern, $remplacement, $chaine); |
| 171 | } | 171 | } |
| 172 | else | 172 | else |
| 173 | { | 173 | { |
| 174 | echo "Impossible de charger le HTML"; | 174 | echo "Impossible de charger le HTML"; |
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | 177 | ||
| 178 | 178 | ||
| 179 | // détecter soundcloud | 179 | // détecter soundcloud |
| 180 | // normallement il n'y a rien à faire ici mais on sait jamais (une mise à jour du ckeditor?) | 180 | // normallement il n'y a rien à faire ici mais on sait jamais (une mise à jour du ckeditor?) |
| 181 | if(preg_match("#soundcloud.com#", $chaine)) | 181 | if(preg_match("#soundcloud.com#", $chaine)) |
| 182 | {} | 182 | {} |
| 183 | 183 | ||
| 184 | // détecter facebook (éventuellement fb.watch) | 184 | // détecter facebook (éventuellement fb.watch) |
| 185 | // je crois que ça va être compliqué ici | 185 | // je crois que ça va être compliqué ici |
| 186 | if(preg_match("#facebook.com|fb.watch#", $chaine)) | 186 | if(preg_match("#facebook.com|fb.watch#", $chaine)) |
| 187 | {} | 187 | {} |
| 188 | 188 | ||
| 189 | return($chaine); // = $contenu | 189 | return($chaine); // = $contenu |
| 190 | } | 190 | } |
| 191 | 191 | ||
| 192 | 192 | ||
| 193 | // embarquement !! | 193 | // embarquement !! |
| 194 | function mediaEmbed($chaine) | 194 | function mediaEmbed($chaine) |
| 195 | { | 195 | { |
| 196 | //require("../Embera/src/Autoloader.php"); | 196 | //require("../Embera/src/Autoloader.php"); |
| 197 | //$embera = new Embera\Embera(); | 197 | //$embera = new Embera\Embera(); |
| 198 | //$chaine = $embera->autoEmbed($chaine); | 198 | //$chaine = $embera->autoEmbed($chaine); |
| 199 | 199 | ||
| 200 | $pattern = '#<span class="media_embed">(.+)</span>#'; | 200 | $pattern = '#<span class="media_embed">(.+)</span>#'; |
| 201 | $remplacement = '<iframe src="$1" frameborder="0" allowtransparency="true"></iframe>'; | 201 | $remplacement = '<iframe src="$1" frameborder="0" allowtransparency="true"></iframe>'; |
| 202 | $chaine = preg_replace($pattern, $remplacement, $chaine); | 202 | $chaine = preg_replace($pattern, $remplacement, $chaine); |
| 203 | 203 | ||
| 204 | // requête oembed | 204 | // requête oembed |
| 205 | //~ echo('<br/><br/>'); | 205 | //~ echo('<br/><br/>'); |
| 206 | //~ print_r($embera->getUrlData([ | 206 | //~ print_r($embera->getUrlData([ |
| 207 | //~ 'https://vimeo.com/374131624', | 207 | //~ 'https://vimeo.com/374131624', |
| 208 | //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream', | 208 | //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream', |
| 209 | //~ ])); | 209 | //~ ])); |
| 210 | 210 | ||
| 211 | return($chaine); // = $contenu | 211 | return($chaine); // = $contenu |
| 212 | } | 212 | } |
