Je m'embêtais ce matin alors j'ai décidé de me faire un serveur de VOD à l'aide de VLC. En distribution j'utilise Fedora 16 mais ça changera pas grand chose d'un linux à l'autre, surtout que j'ai pratiquement tout rendu paramétrable dans l'ignoble (c'est le cas !

C'est la version 1.0 on va dire. Ça a l'air de fonctionner pas trop mal (prise en charge des accents et caractères à la con dans les noms de fichiers). Ca recréé l'arborescence d'un seul dossier Vidéos et ça créé des vignettes pour les vidéos.
Donc c'est parti !
Ce qu'il vous faut :
- vlc avec le bit SUID root
- un serveur web
- un nom de serveur ou une adresse ip
- bash
- ffmpeg (pour les miniatures)
- ImageMagick (pour pas faire de grosses miniatures, on doit pouvoir le faire avec ffmpeg mais c'est une usine à gaz ce truc)
- md5sum (il est installé par défaut, s'il l'est pas, changez de système immédiatement !

Ce qu'il ne faut pas :
- critiquer la non-lisibilité et la syntaxe de mon script qui est moche
Cas concret (le mien) :
Mes fichiers vidéos se trouvent dans /data/partage/Videos
La racine de mon serveur web se trouve dans /var/www/html/ (vérifier le droit d'écriture ! )
Mon répertoire perso est /home/zplay/
Les vignettes se trouvent par rapport à la racine du serveur web dans vignettes/
La liste des vidéos se trouve par rapport à la racine du serveur web dans vod/
Pourquoi j'ai pas mis vignettes dans vod ? Parce que le dossier vod est SUPPRIMÉ lors de la regénération de l'index des vidéos, et que les vignettes n'ont pas à être refaites et que ça prend trois plombes à générer ces vignettes

LE SCRIPT :
#!/bin/bash #* Copyright (c) 1998, Regents of the University of California #* All rights reserved. #* Redistribution and use in source and binary forms, with or without #* modification, are permitted provided that the following conditions are met: #* #* * Redistributions of source code must retain the above copyright #* notice, this list of conditions and the following disclaimer. #* * Redistributions in binary form must reproduce the above copyright #* notice, this list of conditions and the following disclaimer in the #* documentation and/or other materials provided with the distribution. #* * Neither the name of the University of California, Berkeley nor the #* names of its contributors may be used to endorse or promote products #* derived from this software without specific prior written permission. #* #* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY #* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED #* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE #* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY #* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES #* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; #* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND #* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT #* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS #* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. export IFS=$'\n' DEBUG=1 REP=/var/www/html/vod # repertoire qui contient l'arborescence VIGNETTES=$REP/../vignettes/ # repertoire qui contient les vignettes (corriger un truc a la fin) CONFIG=/home/zplay/config.vlc # fichier de config de vlc DATA=/data/partage/Videos/ # dossier avec les videos ADDRESS=monserveurrienquamoi.no-ip.org # adresse du serveur PORT=554 # port de RTSP rm -fr $REP && mkdir $REP # RESET de l'arborescence !!! rm $CONFIG cd /$DATA # pour tous les repertoiers des videos for dir in `find . -type d` do # creation d'un repertoire sans espaces dir2=$(echo $dir | sed 's/ /_/g') if [ $DEBUG -ne 0 ]; then echo "Creation de $REP/$dir2" ; fi mkdir -p $REP/$dir2 echo "$dir" > $REP/$dir2/index.html # si le repertoire ne contient que des repertoires if [ $(find "$dir" -maxdepth 1 -type f | wc -l) -eq 0 ] then # On fait l'index des dossiers dossiers=$(find "$dir" -maxdepth 1 -type d | sort) for dossier in $dossiers do path_dossier=$(basename $dossier) dossier2=$(echo $path_dossier | sed 's/ /_/g') if [[ "$dossier" == "$dir" ]] then if [ $DEBUG -ne 0 ]; then echo "Creation de la remontee pour $path_dossier" ; fi echo "$path_dossier" >> $REP/$dir2/index.html else if [ $DEBUG -ne 0 ]; then echo "Creation des liens pour $path_dossier" ; fi echo "$path_dossier" >> $REP/$dir2/index.html fi done # si le repertoire ne contient que des fichiers ! else # On fait l'index des fichiers for fichier in `find "$dir" -maxdepth 1 -type f | sort` do fichier=$(basename $fichier) touch $REP/$dir2/$fichier echo " $fichier" >> $REP/$dir2/index.html # CREATION CONFIG VLC # --------------------------------------------------------------- nom=$fichier nom=$(echo $nom | sed 's/ /_/g') echo "new \"$(echo $nom | md5sum | cut -d ' ' -f 1)\" vod enabled" >> $CONFIG echo "setup \"$(echo $nom | md5sum | cut -d ' ' -f 1)\" input \"$DATA/$dir/$fichier\"" >> $CONFIG # --------------------------------------------------------------- # CREATION VIGNETTES + RESIZE # --------------------------------------------------------------- if [ ! -f "$VIGNETTES/$fichier.jpg" ] then if [ $DEBUG -ne 0 ]; then echo "ffmpeg -loglevel quiet \"$dir/$fichier\" -ss 120 -t 1 -f image2 -sameq -vcodec mjpeg \"$VIGNETTES/$fichier.jpg\"" ; fi ffmpeg -loglevel quiet -i "$dir/$fichier" -ss 120 -t 1 -f image2 -sameq -vcodec mjpeg "$VIGNETTES/$fichier.jpg" convert "$VIGNETTES/$fichier.jpg" -resize 256x256 "$VIGNETTES/$fichier.jpg" fi # --------------------------------------------------------------- done echo "" >> $REP/$dir2/index.html fi done unset $IFS echo "FIN DU SCRIPT"
Ensuite il suffit de lancer vlc avec le petit script suivant pour faire un peu propre. Vous inquiétez pas si c'est lent à se lancer, vlc utilise un cpu complet pendant 8 minutes sur un E8400 avec 380 vidéos.
#!/bin/bash test -S /var/run/screen/S-zplay/*.vlc if [ $? -ne 0 ] then screen -dmS vlc vlc --vlm-conf /home/zplay/config.vlc else echo "VLC est deja en cours d'execution !" fi
Améliorations à faire :
- Mettre des CSS et faire des pages plus jolies
- Permettre de mélanger dossiers et fichiers dans un même répertoire
- Offrir une option de réencodage par défaut, si ça peut être utile.. pour faire de la vod avec un petit débit
Comment ça marche :
Le script parcours le dossier des Vidéos.
Pour chaque dossier, il regarde s'il y a des fichiers
- S'il y a des fichiers : il fait un fichier index.html avec la liste des fichiers, les ajoutes à la liste des fichiers VOD et fait les imagettes
- Sinon il fait un dossier index.html avec la liste des dossiers du dossier
Le nom du fichier dans le VOD est son nom passé au md5, ça évite d'avoir une url de streaming avec des accents, ce qui marche pas. C'est à peu près tout...
Limitation :
- Pour le moment, il n'est pas possible d'afficher un dossier qui contient des vidéos et des dossiers avec des vidéos. Selon la condition du dessus, s'il y a des fichiers, on ne scan pas les dossiers, faut que j'améliore ça mais comme mon arborescence est faite de cette manière, je ne rencontre pas le problème..