Nuovo script per la
RAI, sia dirette che RaiReplay, usando gli stream ad alta definizione destinati alla piattaforma mobile.
Parto subito da un paio di premesse per chiarire alcune cose e non farvi perdere tempo.
1) Lo script richiede una versione di ffplay (pacchetto ffmpeg) con supporto allo stream adattivo Apple (HLS), che tradotto in distribuzioni significa, per Ubuntu, Oneiric (credo) o Precise, per Debian, Squeeze con backports/marillat o testing/sid. Versioni recenti di altre distribuzioni, tipo Arch e Fedora, dovrebbero avere il supporto necessario.
È possibile verificarne la presenza con un comando del tipo:
Che deve restituire qualcosa del tipo:
L'output potrebbe anche differire leggermente, il protocollo ad un certo punto è stato
rinominato, ma non dovrebbe essere difficile capire se il supporto c'è o meno.
2) Lo script è troppo complesso per poter essere implementato con Zenity (o meglio, si potrebbe, ma risulterebbe scomodo da usare...), per cui usa YAD, un fork di zenity.
http://code.google.com/p/yad/
YAD non è presente nei repo, ma lo si può reperire in formato deb seguendo le indicazioni che si trovano su sito del progetto. Per Ubuntu si può usare questo PPA:
https://launchpad.net/~webupd8team/+arc ... pa-manager
Per quanto mi risulti intuitivo nell'uso, un chiarimento sull'interfaccia, che include si le dirette che i replay. A seconda di quello che volete vedere, basta selezionare le opzioni che fanno al caso nei menu a tendina e poi confermare con i bottoni "Diretta" o "Replay".
Posto uno screen per chiarezza.

Per intenderci, per vedere la diretta di Rai3, selezionare Rai3 alla voce "Rai Live" e poi confermare premendo il tasto "Diretta", per un replay, selezionare il canale in "RaiReplay", la data in "Data" e poi confermare con il tasto "Replay".
Sulla scelta dello stream, HLS, al pari di smooth-stream, e un protocollo adattivo con stream a risoluzione multipla, il dialogo di scelta li separa e consente di scegliere la risoluzione che si preferisce.
rai-mobile-yad
Codice: Seleziona tutto
#!/bin/bash
## Rai-Mobile
# Copyleft 2012 gajm/lihin
# Released under WTFPL v2.0
## Set Player
player="ffplay -autoexit"
# Relinker iPhone/iPad
live_chan='Rai1@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=180134
Rai2@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=308718
Rai3@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=308709
Rai4@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=746966
Rai5@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=395276
Raimovie@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=395276
Raipremium@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=746992
Raigulp@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=746953
Raiyoyo@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=746899
Raistoria@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=746990
Raiscuola@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=747011
Rainews@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=489110
Raisport1@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=358025
Raisport2@http://mediapolis.rai.it/relinker/relinkerServlet.htm?cont=358071'
live_list=`echo "$live_chan" | cut -d'@' -f1`
rep_list='RaiUno
RaiDue
RaiTre
RaiCinque'
rep_date=`for i in {1..7}; do date -d "$i day ago" +%Y-%m-%d" "%A; done`
aspect_ratio='originale
4:3
16:9'
function raimobile(){
yad --width=200 --form --title="Rai-Mobile" --text="Scegli cosa vuoi vedere:" --item-separator="\n" --field="Rai Live:CB" "$live_list" --field="RaiReplay:CB" "$rep_list" --field="Data:CB" "$rep_date" --field="Aspect:CB" "$aspect_ratio" --field "Televideo - Programmi":BTN "xterm -geometry 116x39 -e w3m http://www.televideo.rai.it/televideo/pub/solotesto.jsp?pagina=501" --button="gtk-cancel:1" --button="_Diretta:100" --button="_Replay:200" > /tmp/raimob-param
case $? in
100) railive ;;
200) raireplay ;;
*) exit ;;
esac
}
function railive(){
live_chan_ch=`cut -d'|' -f1 /tmp/raimob-param`
relinker=`echo "$live_chan" | grep "$live_chan_ch" | cut -d'@' -f2`
stream_rel=`curl -I "$relinker" | grep 'Location: ' | awk '{print $2}'`
if [ "$stream_rel" == "" ]; then
yad --title="Error" --window-icon="dialog-error" --image="dialog-error" --text="ERRORE:\nStream non disponibile " --button="gtk-ok:0"
continue
fi
qual_level=`curl "$stream_rel" | grep -v \# | sed 's/\r//'`
qual_ch=`echo "$qual_level" | yad --list --height=250 --width=500 --title "Rai-Mobile - Diretta $live_chan_ch" --text="Seleziona lo stream da usare:" --column="Streams"`
if [[ $? -ne 0 || "$qual_ch" == "" ]]; then continue; fi
if [ X"$(echo "$qual_ch" | grep 'http://')" == "X" ]; then
## TODO Caratteristica del formato (format=m3u8-aapl)?
stream_base_url=`echo "$stream_rel" | awk -F"[Mm]anifest" '{print $1}'`
## Stiamo usando yad... bisogna eliminare "|" alla fine di "$qual_ch".
stream="$stream_base_url${qual_ch%?}"
else
stream="${qual_ch%?}"
fi
aspect=`cut -d'|' -f4 /tmp/raimob-param`
if [ "$aspect" == "originale" ]; then
$player -window_title "Diretta - $live_chan_ch" "$stream"
else
$player -window_title "Diretta - $live_chan_ch" -vf setdar="$aspect" "$stream"
fi
}
function raireplay(){
rep_chan_ch=`cut -d'|' -f2 /tmp/raimob-param`
rep_date_ch=`cut -d'|' -f3 /tmp/raimob-param | cut -d' ' -f1`
wget -q http://www.rai.tv/dl/portale/html/palinsesti/replaytv/static/"$rep_chan_ch"_"${rep_date_ch//-/_}".html -O /tmp/rairep-idx
grep -B1 '"t":' /tmp/rairep-idx | awk 'NR%3!=0 && NR%3!=2' | cut -d'"' -f2 > /tmp/rairep-tmp-hour
grep '"t":' /tmp/rairep-idx | cut -d'"' -f4 > /tmp/rairep-tmp-title
grep '"i":' /tmp/rairep-idx | cut -d'"' -f4 | awk '{print "id"$0}' > /tmp/rairep-tmp-idx_num
grep '"urlTablet":' /tmp/rairep-idx | cut -d'"' -f4 > /tmp/rairep-tmp-ipad
grep '"urlSmartPhone":' /tmp/rairep-idx | cut -d'"' -f4 > /tmp/rairep-tmp-iphone
grep '"h264":' /tmp/rairep-idx | cut -d'"' -f4 > /tmp/rairep-tmp-android
paste -d'|' /tmp/rairep-tmp-hour /tmp/rairep-tmp-title /tmp/rairep-tmp-idx_num /tmp/rairep-tmp-iphone /tmp/rairep-tmp-ipad /tmp/rairep-tmp-android > /tmp/rairep-param
rm /tmp/rairep-tmp-*
prog_ch=`grep -v '|||' /tmp/rairep-param | awk -F'|' '{print $1" - "$2" - "$3}' | yad --list --height=500 --width=450 --title "Replay - $rep_chan_ch - $rep_date_ch" --text="Seleziona il programma:" --column="Programmi"`
if [[ $? -ne 0 || "$prog_ch" == "" ]]; then continue; fi
prog_id="${prog_ch##*id}"
## Non può sbagliare il grep dell'id, l'output è tipo "12345|"
prog_param=`grep "id$prog_id" /tmp/rairep-param`
rm /tmp/rairep-* && touch /tmp/rairep-stream
## Stream HLS akami "http://rai-i.akamaihd.net/[...].10.00_,600,800,1200,1500,.mp4.csmil/master.m3u8"
iph_adap_stream=`echo "$prog_param" | awk -F'|' '{print $4}'`
if [ X"$iph_adap_stream" != "X" ]; then
iph_res=`echo "$iph_adap_stream" | grep -o ',[^,]*' | grep -v m3u8 | cut -d',' -f2`
echo "$iph_res" | while read line; do
iph_stream=`echo "$iph_adap_stream" | sed "s/\(,\)..*\(,\)/\1$line\2/"`
echo "iPhone-$line|$iph_stream" > /tmp/rairep-stream
done
fi
ipa_adap_stream=`echo "$prog_param" | awk -F'|' '{print $5}'`
if [ X"$ipa_adap_stream" != "X" ]; then
ipa_res=`echo "$ipa_adap_stream" | grep -o ',[^,]*' | grep -v m3u8 | cut -d',' -f2`
echo "$ipa_res" | while read line; do
ipa_stream=`echo "$ipa_adap_stream" | sed "s/\(,\)..*\(,\)/\1$line\2/"`
echo "iPad-$line|$ipa_stream" >> /tmp/rairep-stream
done
fi
## Stream .mp4 non adattivo
and_relinker=`echo "$prog_param" | awk -F'|' '{print $6}'`
and_stream=`curl -I "$and_relinker" | grep 'Location: ' | awk '{print $2}' | sed 's/\r//'`
if [ X"$and_stream" != "X" ]; then
echo "Android-h264|$and_stream" >> /tmp/rairep-stream
fi
stream_ch=`cat /tmp/rairep-stream | yad --list --height=300 --width=500 --title "Replay - ${prog_ch%- id*}- $rep_date_ch" --text="Seleziona lo stream da usare:" --column="Streams"`
if [[ $? -ne 0 || "$stream_ch" == "" ]]; then continue; fi
stream=`echo "$stream_ch" | awk -F'|' '{print $2}'`
aspect=`cut -d'|' -f4 /tmp/raimob-param`
if [ "$aspect" == "originale" ]; then
$player -window_title "Replay - ${prog_ch%- id*}- $rep_date_ch" "$stream"
else
$player -window_title "Replay - ${prog_ch%- id*}- $rep_date_ch" -vf setdar="$aspect" "$stream"
fi
rm /tmp/rairep-*
}
while [ $? -eq 0 ]; do
raimobile
done
P.S. Per i replay, il seek di ffplay è un po' particolare, in pratica ci si sposta nello stream cliccando nella finestra, la sinistra corrisponde all'inizio del filmato, la destra alla fine, il centro a metà della durata totale.
P.P.S. Allego anche come archivio, perché mi è stato detto che in passato ci sono stati dei problemi col copia-incolla.
Ciao