Outils pour utilisateurs

Outils du site


php:projet_de_portail_video_simplifie

Projet de portail vidéo simplifié

J'ai eu dans l'idée de faire un truc simple à maintenir, à la “upload and forget” . Alors j'ai pris mes petites mains et j'ai commis quelques heures de codage. Selon mes tests, c'est fonctionnel mais aussi très brouillon. Et, non, c'est pas pour Fansub Streaming: je tiens à mon blog, cette intégration “tout en un” de passions compatibles. J'imagine plutôt ce genre de portail pour le cadre familial, une gestion simplifiée pour ranger et partager des vidéos selon les sujets (un dossier “Vacances à Cannes” , un dossier “Anniversaire de Lulu” ,..).

Vraiment simple à maintenir: créer un dossier, et mettre dedans les vidéos WebM. C'est tout: PHP se charge de créer les listes, le titre de page, et afficher la vidéo, tout en 1 fichier PHP.

Je bosserai dessus de temps en temps, j'ai par exemple quelques idées comme: génération de balises meta description (ça c'est franchement facultatif, c'est pas destiné à une SEO de la mort), utiliser une image d'illustration pour la liste des dossiers, changer la couleur du dégradé CSS facilement en éditant une variable, compter et afficher à côté de la liste des dossiers le nombre de vidéos que chacun contient,… Et rationaliser le code existant (parce que là pour l'instant c'est très artisanal, même si avec le recul je me dis que ça permet à PHP de traiter juste ce qu'il faut).

Maintenant, important: remontez-moi des vulnérabilités de parcours (faire lister un autre dossier à PHP, l'ouverture de fichiers qui ne devraient pas l'être genre un WebM sur un serveur externe,…). J'ai bien fait plusieurs barrages notamment contre le listing de dossier parent, si un truc anormal est possible sans que ça sorte un code erreur 404 non trouvé ou 400 mauvaise requête, courir m'avertir :) Aussi si vous arrivez à obtenir des pages avec des messages d'erreur PHP (vu que le serveur retourne un état 200 ok, pas bon).

Principe de fonctionnement: le PHP a 3 “modes de fonctionnement”: si rien n'est donné, lister les dossiers. Si un dossier est donné (serie), lister le contenu du dossier. Si dossier est donné et un fichier est donné (episode), afficher la lecture de la vidéo. Dans les listings, les “-” (tirets/moins) sont remplacés par des “ ” (espaces) et le texte est capitalisé en mode titre (première lettre de chaque mot en majuscule). Le listing des fichiers montre sous la forme: dossier - fichier. Pour des raisons de sécurité, seuls les fichiers WebM peuvent être appelés via le PHP (si vous essayez de passer “index.php” en fichier, PHP retournerait un code de lecture vidéo pour “index.php.webm” - sauf que PHP vérifie la présence effective du fichier WebM).

index.php
<?php
/*
Streamlist Beta [version 0.3-pre]
Ce code est à l'état d'ébauche non optimisée et ne DOIT PAS être utilisé en environnement de production en l'état. Considérez-le avant tout comme une démonstration technique et comme support d'inspiration.
Le projet est publié sous licence Creative Commons by-sa 3.0 ( https://creativecommons.org/licenses/by-sa/3.0/ )
Écrit et publié par Mitsukarenai [mitsukarenai-at-fansub-streaming.eu]
*/
/*
Vous pouvez personnaliser les variables ci-dessous (préfixe du titre, logo, variables des dossiers et fichiers):
*/
$title = "[Streamlist beta]";
$logo = "logo.png";
$def_dossier = "serie";
$def_fichier = "episode";
/*
Fin des personnalisations PHP (vous pouvez éditer le CSS, la notice, ...)
*/
// protections anti-parcours et détection de 404
$get_dossier = $_GET[$def_dossier];
$get_fichier = $_GET[$def_fichier];
if (isset($get_dossier)){
settype($get_dossier, "string");
}
if (isset($get_fichier)){
settype($get_fichier, "string");
}
if (strpos($get_dossier,'/') !== false or strpos($get_dossier,'\\') !== false or strpos($get_fichier,'/') !== false or strpos($get_fichier,'\\') !== false ) {
   header("HTTP/1.0 400 Bad Request");
   die;
}
if (substr($get_dossier, 0, 1) == "." or substr($get_fichier, 0, 1) == "."){
   header("HTTP/1.0 400 Bad Request");
   die;
}
if (isset($get_dossier)){
if (!file_exists($get_dossier)) {
   header("HTTP/1.0 404 Not Found");
echo 'Erreur 404: s&eacute;rie non trouv&eacute;e. <a href=".">Retour</a>';
    die;
}
if (!is_dir($get_dossier)) {
header("HTTP/1.0 404 Not Found");
echo 'Erreur 404: s&eacute;rie non trouv&eacute;e. <a href=".">Retour</a>';
    die;
}
}
if (isset($get_fichier)){
$episode404 = $get_dossier.'/'.$get_fichier.'.webm';
if (!file_exists($episode404)) {
   header("HTTP/1.0 404 Not Found");
echo 'Erreur 404: &eacute;pisode non trouv&eacute;. <a href=".">Retour</a>';
    die;
}
}
?>
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title><?php echo $title; if (isset($get_dossier)){ $titre_space = str_replace("_", " ", $get_dossier); $titre_human = ucwords($titre_space); echo ' - '.$titre_human;} if (isset($get_fichier)){ $titre_space_ep = str_replace("_", " ", $get_fichier); $titre_human_ep = ucwords($titre_space_ep); echo ': '.$titre_human_ep; } ?></title>
<style type="text/css">
<!--
body {margin-left:20px;font-family:monospace;background-image: -webkit-gradient(
    linear,
    left top,
    left bottom,
    color-stop(0, #FF0000),
    color-stop(0.70, #FFFFFF)
);
background-image: -moz-linear-gradient(
    center top,
    #FF0000 0%,
    #FFFFFF 70%
);
background-repeat:repeat-x;
background-attachment:fixed;
}
a { font-weight:bold;text-decoration:none;}
img {border:1px solid;}
.logo {text-align:center;}
.notice {text-align:left;margin-bottom:10px;margin-left:20px;}
video { width:50% }
-->
</style>
</head>
<body><div class="logo"><a href="."><img alt="logo" src="./<?php echo $logo; ?>"></a></div><br>
<div class="notice">
C'est un projet open-source pour faire un mini-espace ultra-simple à maintenir, pour permettre aux novices de streamer des fichiers WebM tout en PHP.
</div>
<?php
// serie renseigné ?
if (isset($get_dossier))
 {
   // episode renseigné ? Si oui, lecture
   if (isset($get_fichier))
     {	$file_url = rawurlencode($get_fichier); print '<div style="text-align:center;"><video src="'.htmlspecialchars($get_dossier).'/'.$file_url.'.webm" controls autoplay>Votre navigateur ne supporte pas la balise HTML 5 video</video><br><a href="?'.$def_dossier.'='.htmlspecialchars($get_dossier).'">Retour au contenu du dossier '.$titre_human.'</a></div>';
     }
   // Si non, listage dossier série
  else
     {
print('<a href=".">Retour à la liste des dossiers</a><br><br>'."\n"."\n");
function returnFileName($fileName) {
return key(explode(".", $fileName));
}
$myDirectory = opendir($get_dossier);
while($entryName = readdir($myDirectory)) {
	$dirArray[] = $entryName;
 }
closedir($myDirectory);
$indexCount = count($dirArray);
sort($dirArray);
$file_space = str_replace("_", " ", $get_dossier); $file_human = ucwords($file_space); 
for ($index = 0 ; $index < $indexCount ; $index++) {
	if (substr("$dirArray[$index]", 0, 1) != "." and "$dirArray[$index]" != "index.php") { 
                $fichier_sans_extension = substr($dirArray[$index], 0, -5);
		print('<a class="list" title="Regarder '.$file_human.' '.$fichier_sans_extension.' en streaming" href="?'.$def_dossier.'='.htmlspecialchars($get_dossier).'&'.$def_fichier.'='.$fichier_sans_extension.'">'.$file_human.' - '.$fichier_sans_extension.'</a><br>'."\n");
	} // cond liste
 } // cond index
     }  // cond episode
}  // cond serie
// série non renseigné ? lister séries.
else
{
function checkdossiers($racine)
{
$exclus = array('.', '..');
$rtn = array();
foreach(scandir($racine) as $item)
{
if (in_array($item, $exclus) || !is_dir($item)) {
continue;
}
$rtn[] = $item;
}
return $rtn;
} 
$dir = '.';
foreach(checkdossiers($dir) as $folder)
{
$file_space = str_replace("_", " ", $folder); $folder_human = ucwords($file_space);
print('<a title="Parcourir le dossier '.$folder_human.'" href="?'.$def_dossier.'='.$folder.'">'.$folder_human.'</a>'."<br>\n");
}
}
?>
</body>
</html>
php/projet_de_portail_video_simplifie.txt · Dernière modification: 2013/02/19 19:28 (modification externe)