Yo,
je traficote un bout de script depuis avant-hier, et voilà le résultat.
J'en suis assez content sur ce qu'il fait, mais plus j'avance, plus j'apprends sur la synthaxe ; et donc je trouve que j'aurais dû faire les choses autrement...
Cela dit, pour les curieux, avec ça quelque part et un boutton dans la barre des lanceurs, et/ou comme lanceur par défaut des fichiers vidéos , ça fonctionne assez bien (par contre y a un peu une chiée de dépendance :X)
L'intêret est d'avoir quelque chose qui "trouve une solution" dans le plus de cas possible. A la base, ce script faisait exactement la même chose et faisait trois lignes ; seulement si la vidéo était censurée on ne pouvait rien, si la vidéo n'avait pas de format pour omxplayer, on ne pouvait rien, etc.
Tout le code ci-dessous est une tentative pour "fonctionner tout le temps" et d'informer en temps réel ce qu'il se passe pendant qu'il le fait, en s'interrompant proprement s'il est interrompu.
...Pourquoi les commentaires sont en anglais ? Parce que toute la doc l'est ! Et du coup je pensais anglais quand j'écrivais ;..;
#!/bin/bash
#wrapper to get most video work just by puting it as argument or in clipboard, and playit
#for RPi which only suitable player is omxplayer but can't play everything :
#try to detect when omxplayer will fail then display alternatives (like vlc)
#2016-09-22 : raspbian jessie
#
#depends :
# zenity: for interactivity & indications
# xclip : use your clipboard
# xterm : for black screen
# tor: for country censure (tested only on youtube)
# avconv : for checking encoding (omxplayer could do it, but is slower)
# omxplayer : reads videos...
# vlc : alternative reader
#OPTIONAL :
# devilespie: for having always xterm in front : autostart devilspie at boot somehow && in ~/.devilspie/omxplayersh.ds :
#if (is (application_name) "omxplayer+")
# (begin
# (above)
# (focus)
# (pin)
# (stick)
# (fullscreen)
# )
#)
#
#Init
#
verbose=0 #complete verbose for console
uverbose=1 #verbose for gui users ; explain why the script ended
tmpdir='/tmp/omxplayer+/'
lock="${tmpdir}lck"
pipef0="${tmpdir}pipe0" #Just temporary files for background tasks
pipef1="${tmpdir}pipe1"
pipef2="${tmpdir}pipe2"
y_args="-f mp4[height<=720],mp4[height<=460],mp4,worst" #TODO:https://github.com/rg3/youtube-dl/blob/master/README.md : could use vcodec in stead, no need to use avconv then
z_args="--title=omxplayer+ --width=300"
z_max=40 #maxlength of urls
#verbose
function logg {
[ $verbose -eq 0 ] && echo "$1"
return 0
}
#trivial exit case
function exitt {
[ $verbose -eq 0 ] && [ $uverbose -ne 0 ] && echo "$1"
[ $uverbose -eq 0 ] && exitw "$1"
exit 1
}
#not trivial exit case
function exitw {
zenity --info ${z_args} --text="$1" 2>"/dev/null"
[ $verbose -eq 0 ] && echo "$1"
exit 1
}
#usage : interupt $pid1 $pid2 > /tmp/pipef && exit "pid 1 was killed so pid2 was interrupted and returned $(cat $pipef1)"
function interupt {
wait -n $1 $2
echo $?
kill -s 0 $1 2>'/dev/null'
[ $? -ne 0 ] && kill $2 && return 0
return 1
}
#incremental traping
function trapp {
trap+="${1} ;"
trap "$trap" EXIT
}
#
#Pre-start
#
#abort if locked
[ -f "$lock" ] && exitt "Fichier de verrouillage présent -> $lock"
#locking & auto-unlock
mkdir -p "$tmpdir"
echo $BASHPID > "$lock"
trapp "rm $lock"
#
#Input validity test
#
#looking for anything : fallback on xclip
[ $# -eq 0 ] && link="$(xclip -o)" || link="$1"
[ -z "$link" ] && exitt "Pas de lien trouvé"
#web or local
if [ -f "$link" ]; then
web=1
else
web=0
#parse url structure
dns=$(echo "$link" | sed -r 's#(https?://)?([^/]+\.[^/]{2,})?.*#\2#')
[ -z "$dns" ] && exitt "Le lien ne semble pas valide -> $link"
#try to resolve it
getent hosts "$dns" &>"/dev/null"
[ $? -ne 0 ] && exitt "Impossible de résoudre -> $dns"
#add http if it misses for omxplayer/avconv (it needs that to know it's not a localfile)
[[ ! "$link" =~ ^https?:// ]] && link="http://${link}"
fi
#
#Analyze the video's codec
#
if [ $web -ne 0 ]; then
#local analyze (fast)
logg "Local analyze"
v=$(avconv -i "$link" 2>&1)
else
#direct analyze (1-5sec)
logg "Direct analyze"
(avconv -i "$link" &>"$pipef0")&
pid_worker=$!
#tell user
z_str=$(echo "$link" | sed 's/&/&/g'); [ ${#z_str} -gt $z_max ] && z_str=${z_str:0:${z_max}}'...'
coproc zenity --progress --pulsate ${z_args} --text="(1/3)Test direct\n$z_str" &>'/dev/null'
pid_visual=$!
#fermer la barre de chargement si crash
trapp "kill $pid_visual"
#could get interupted
interupt $pid_visual $pid_worker >'/dev/null' && exitt "Tâche interrompue"
v=$(cat "$pipef0")
#could not find a video Input
if [[ ! "$v" =~ "Input #" ]]; then
#parser, go ! (10-15sec)
logg "Youtube-dl"
(youtube-dl $y_args -g "$link" 1>"$pipef0" 2>"$pipef1")&
pid_worker=$!
#tell user
echo "#(2/3)Recherche du flux vidéo\n$z_str" >&${COPROC[1]}
#could get interupted
interupt $pid_visual $pid_worker >"$pipef2" && exitt "Tâche interrompue"
y_ret=$(cat "$pipef2")
#could not find anything
if [ "$y_ret" -ne 0 ]; then
y_err=$(cat "$pipef1")
if [[ "$y_err" =~ "who has blocked it in your country" ]]; then
#case we can deal with (tested only on youtube)
logg "Torified youtube-dl"
#could also use --proxy 127.0.0.1:9050 in stead of torify
(torify youtube-dl $y_args -g "$link" 1>"$pipef0" 2>"$pipef1")&
pid_worker=$!
echo "#(2+/3)Video censurée en France, contournement !" >&${COPROC[1]}
#could get interupted
interupt $pid_visual $pid_worker >"$pipef2" && exitt "Tâche interrompue"
y_ret=$(cat "$pipef2")
#could not find anything (agaiiiin)
y_err=$(tail -n1 "$pipef1")
[ "$y_ret" -ne 0 ] && echo "100" >&${COPROC[1]} && echo "#${y_err}" >&${COPROC[1]} && exit 1
#everything is fin : need to use tor afterward
tor="torify"
else
#case we couldn't deal with
echo "100" >&${COPROC[1]} && echo "#${y_err}" >&${COPROC[1]} && exit 1
fi
fi
#load what ytdl found
link=$(head -n1 "$pipef0")
#now we can scan the motherfucker (1-5)
logg "Analyze of parsed link"
($tor avconv -i "$link" &>"$pipef0")&
pid_worker=$!
#tell user
z_str=$(echo "$link" | sed 's/&/&/g'); [ ${#z_str} -gt $z_max ] && z_str=${z_str:0:${z_max}}'...'
echo "#Test du flux extrait\n$z_str" >&${COPROC[1]}
#could get interupted
interupt $pid_visual $pid_worker >'/dev/null' && exitt "Tâche interrompue"
v=$(cat "$pipef0")
fi
#remove progressbar
kill $pid_visual &>'/dev/null'
fi
#
#Read it !
#
#check for "some video stream"
[[ ! "$v" =~ 'Input #' ]] && exitw "Ce n'est pas une vidéo !"
echo "$v"
#TODO I'm only checking the 1st stream
#no video found
v=$(echo "$v" | grep "Video:" | head -n1)
[ -z "$v" ] && exitw "Contenaire vidéo sans vidéo (douteux)"
#parse video format
v=$(echo "$v" | sed 's/.*Video: \([^,]*\).*/\1/')
#if not readable format, drop (TODO:may be incomplete list)
if [[ "$v" =~ ^("h264"|"VC-1"|"mpeg4") ]]; then
#THERE WE GO
xterm -T "omxplayer+" -fullscreen -fg "black" -bg "black" -e $tor omxplayer "$link"
else
zenity --question $z_args --text "Format ${v} non supporté sur RPi ; utiliser VLC ?" 2>'/dev/null' && (vlc "$link")&
disown $!
fi
C'est encore à améliorer, mais bon, si y a des retours tout ça. Je pense faire quelque chose de plus simple pour télécharger via youtube-dl, un client "vnc over reverse ssh" (qui nécessiterai 0 configuration de la part du client), et un moyen de faire une mise à jour de sécurité sans que ce soit compliqué pour monsieur Michu (y a rien de bien sexy sous debian ).
Bref : autant d'outils que je n'ai pas trouvé ! ...Mais ils existent peut-être
Donc avant de me prendre la tête à trouver des rustines, hésitez pas, hein. Je me focalise vraiment à trouver des solutions à la fois transparentes et jamais techniques pour l'utilisateur (genre pas lui dire de cliquer trois fois en haut, deux fois à droite quand ça pourrait être fait en un click). Beaucoup veulent beaucoup d'options, mais encore plus veulent qu'on les laisse tranquille.
Edit : ahem.
Me suis un peu trop précipité, je me trouve des bugs.
Je vais probablement tout réécrire en mieux ce soir
Dernière modification par otyugh (25-09-2016 10:26:46)