h1

Scaricare le puntate di Report dal sito RAI, un pretesto per esercitarsi

2008 Dic 15

Questo fine settimana ho letto un post di rainbowbreeze in cui spiegava come scaricare i video della trasmissione RAI Report.

Visto che sono pigro ho tradotto in uno script le istruzioni per eseguire il compito in automatico.

Attenzione lo script viene messo online principalmente per:

  1. Dimostrare l’utilità della conoscenza di qualche comando base di unix
  2. Spingere i membri del gruppo, sviluppatori e non a partecipare attivamente nella realizzazione di un software open

Il software trattato non è nato e pubblicato per consentire lo scaricamento e la riproduzione non in streaming delle puntate di Report e come membro del freegloo invito a non farlo, perchè questo violerebbe il diritto d’autore:

Tutti i contenuti di questo sito sono coperti da copyright e di esclusiva proprietà della Rai Radiotelevisione Italiana e ne è vietata la riproduzione, anche parziale, su qualunque media e supporto.

Sicuramente se i contenuti del sito RAI fossero liberamente fruibili da tutti (la RAI è pur sempre un servizio pubblico, quindi pagato da noi tutti), non avrei utilizzato la trasmissione Report come pretesto per esercitarci.

Tornando allo script e alle sue finalità, dovete aiutarmi a migliarlo discutendo qui tutte le modifiche che vi vengono in mente, poi magari alla prossima cena o birra verranno dati dei premi!

Allo stesso modo voglio sentirvi se qualche riga non è chiara. Sicuramente qualcosa è anche contorto e inutile.

Qui di seguito trovate lo script  (buona visione!).

Lo script scarica_report.sh si aspetta come unico parametro l’url del video di Report, questo il testo:

requisiti=”tempfile mplayer wget”
for r in $requisiti
do
if [ ! -x “$(which $r)” ]; then
echo >&2 “Per far funzionare lo script e’ necessario il programma $r. Fine del processo.”
exit 1
fi
done

# ottengo un file temporaneo da riutilizzare
TMPDIR=${TMPDIR:-/tmp}
TMPFILE=$(tempfile -d $TMPDIR -p report)
if [ -z “$TMPFILE” ]; then
echo >&2 “Non sono riuscito a creare il file temporaneo. Problemi di permessi?. Fine del processo.”
exit 1
fi

msg_no_download()
{
echo >&2 “Non sono riuscito a scaricare la pagina internet $lnk.”
echo >&2 “Controlla se il proxy e’ stato impostato nella variabile di ambiente HTTP_PROXY o la connnessione di rete e’ attiva.”
echo >&2 “Uscita dalla procedura.”
exit 1
}

msg_bad_format()
{
echo >&2 “Il contenuto della pagina ‘$lnk’ e’ diverso da quello previsto.”
echo >&2 “Probabilmente la RAI ha apportato delle modifiche alla struttura del sito.”
echo >&2 “Si prega di informarne l’autore dello script.”
exit 1
}

echo “viene utilizzato il file temporaneo $TMPFILE”

lnk=$1

# scarico la pagina nel file temporaneo
if ! wget $lnk -O $TMPFILE >/dev/null 2>&1; then
msg_no_download
fi

if ! file $TMPFILE | grep HTML >/dev/null; then
msg_bad_format
fi

lnk=$(grep -A5 ‘<OBJECT ID=”mediaPlayer”‘ $TMPFILE | grep ‘NAME=”URL” VALUE=”/mpASX/’ | head -n1 | grep -o ‘/mpASX/.*.html’  )

echo “scaricamento dell’url: http://www.rai.tv$lnk&#8221;
if ! wget “http://www.rai.tv$lnk&#8221; -O $TMPFILE >/dev/null 2>&1; then
msg_no_download
fi
if ! file $TMPFILE | grep ASCII >/dev/null; then
msg_bad_format
fi

lnk=$(grep -o ‘mms://.*.wmv’ $TMPFILE )

echo “scaricamento del video $lnk”
mplayer -dumpstream $lnk -dumpfile $TMPFILE && \
file $TMPFILE | grep ASF && \
cp $TMPFILE ~/report.wmv

In attesa che la trasmissione riprenda ho pensato di preparare anche uno script per scaricare l’ultima puntata, così da poterlo lanciare ogni settimana.

scarica_ultimo_report.sh:

requisiti=”lynx awk”
for r in $requisiti
do
if [ ! -x “$(which $r)” ]; then
echo >&2 “Per far funzionare lo script e’ necessario il programma $r. Fine del processo.”
exit 1
fi
done

# ottengo l’url al redirect giornaliero
lnk=$(lynx -dump -listonly http://www.report.rai.it | grep ‘1. http’ | awk ‘{print $2}’)
echo “pagina da cui scaricare l’ultimo video: $lnk”

# ottengo l’url del video giornaliero
lnk=$(lynx -dump -listonly $lnk | grep mpplaymedia | head -1 | awk ‘NR==1{print $2}’)
echo “indirizzo dell’ultimo video: $lnk”

./scarica_report.sh “$lnk”

Come vedete i comandi usati alla fine non sono tanti, ma ogni riga può essere sostituita… perchè alla fine su linux tutto può essere fatto in almeno un paio di modi diversi.

Quindi vi chiedo di suggerire e discutere alternative ad ogni istruzione :)

Provate ad adattare lo script in modo che supporti anche l’assenza di wget o lynx, considerando ad esempio curl o w3m. Come avrei potuto usare mencoder? Come salvare il video senza mplayer? Usate tutti la bash?

Fatevi sentire e buona visione!

Costantino Giuliodori (ilkosta)

3 commenti

  1. # Visto che il nome del file è univoco, non sarebbe sbagliato
    # mantenerlo, in modo tale da non sovrascrivere i vecchi
    # video scaricati. Esempio:

    # Genero la variabile $lnk
    #
    lnk='mms://server.it/path/121008_report.wmv&apos;
    #
    # Costruisco un array che contenga mms:, server.it, …
    #
    lnk_elements=( $(echo $lnk | tr '/' ' ') )
    #
    # Prendo in considerazione solo l’ultimo elemento
    #
    echo 'File Donwloaded: '${lnk_elements[@]: -1}
    Downloaded File: 121008_report.wmv

    # Altro modo di costruire l’array.
    lnk_elements=( ${lnk//\// } )
    echo 'File Donwloaded: '${lnk_elements[@]: -1}
    Downloaded File: 121008_report.wmv

    La BASH non rappresenta il linguaggio di scripting adatto alla manipolazione delle URL, più appropiato ne sarebbe uno con delle librerie dedicate (python, php/cli, …). La SHELL, seppur strumento indispensabile, costituisce un coltellino svizzero per l’amministratore di sistema e viene sempre utilizzata assieme a comandi/utility esterni (coreutils, sed, awk, wget, …).


  2. e bravo Tibberio! ottima osservazione!
    Non è per niente serio cablare il nome del filmato nel file e tantomeno salvarlo brutalmente nella home.

    Non avevo mai usato questa sintassi. 10x

    Sono anche colpito dalla soluzione proposta, perchè all’interno degli script si fà parecchio screenscraping e parsing mi aspettavo che qualcuno proponesse una correzione del nome del file-filmato usando lo stesso sistema piuttosto che usare il nome del file di origine (vi domandate come? continuate a pensarci… più sotto comunque svelo il mistero).

    Lati positivi della tua soluzione(+):
    + Semplice nello script. E’ un grosso plus. Anche se osservi che ci sono linguaggi più adatti alla manipolazione degli url, per la funzionalità che proponi la shell è adatta e anche facilmente comprensibile.
    + Breve
    + Il file risultante sarà sicuramente univoco
    + Sembra una soluzione robusta

    Aspetti negativi(-):
    – Il nome del file che ne risulta non è molto espressivo. Non è detto che tutti i file saranno nominati in base alla data della puntata. Dal sito RAI non è possibile risalire velocemente dalla data di una puntata all’argomento trattato.

    Aspetti interessanti(i):
    i Utilizzando lo stesso nome di file si potrebbe facilmente dire allo script di evitare di scaricare un filmato già salvato. In questo modo se si lancia lo scaricamento dell’ultima puntata quando ancora il sito non è stato aggiornato, si evita di rifare il download di tutto.
    i Se i nomi dei file sono sempre basati sulle date, l’ordinamento dei filmati nella cartella è avvantaggiato

    Bravo tib!

    Come dicevo sopra, ragionando sulla falsariga dello script mi aspettavo che qualcuno proponesse di estrarre il titolo del video dalla pagina dell’ultima puntata.

    Se ad esempio la pagina dell’ultimo video è
    echo “pagina da cui scaricare l’ultimo video: $lnk”
    pagina da cui scaricare l’ultimo video: http://www.report.rai.it/R2_HPprogramma/0,,243,00.html
    (per intenderci dopo il secondo commento del secondo script), possiamo ottenere il titolo del video e salvarlo in una variabile ‘fname’ con qualcosa del genere:

    wget $lnk -O $TMPFILE
    fname=$(grep -A5 boxbianco $TMPFILE | grep -o ‘h1>.*// -e s/\<.*//).wmv
    [ -e $fname ] && exit 1

    Provo a valutarlo come sopra (sempre con +-i):
    + anche questo è breve
    + non mi sembra complicato
    + ottengo un nome significativo e univoco
    + già dall’esame della prima pagina si può capire se lo script deve interrompersi perchè la puntata è già stata scaricata
    – non è robustissima come soluzione, però in fin dei conti usa un id ‘boxbianco’ e la stessa logica del resto degli script, quindi nel caso in cui la RAI cambia la struttura delle pagine… bisogna ricontrollare tutto comunque
    – non abbiamo la data della puntata…(però mi aspetto suggerimenti!:)

    Perchè poi l’ho scritto in bash quando potevo proporre la stessa cosa in python o altro?
    Perchè alla fin fine per un compito del genere non servono altro che gli strumenti classici unix: tanti piccoli programmini da combinare come i blocchi delle costruzioni.

    Perchè nel gruppo ci sono più utilizzatori di linux/unix che sviluppatori e volevo coinvolgere più persone possibile in qualcosa di formativo/produttivo.

    Per un compito del genere dover parlare di memoria, oggetti, interfacce e librerie rappresenta più un esercizio intellettuale che una necessità.

    Usare affondo linux non è per i soli programmatori.
    Qui si prendono comandi comuni: lynx, wget, grep per eseguire un compito dove su windows bisogna avere un programma ad-hoc.

    Poi è anche la scusa per dire che oltre al grep e wget esistono altre utility che una volta cominciate ad usare diventano quotidiane come sed e awk.

    PS:
    “dovete aiutarmi a migliarlo discutendo qui tutte le modifiche che vi vengono in mente, poi magari alla prossima cena o birra verranno dati dei premi!”

    e chi è il primo che si butta nella mischia?
    Non poteva essere altro che lui!


  3. pardon, dal commento di prima è stato segato un pezzetto, la sintassi è questa:

    wget $lnk -O $TMPFILE
    fname=$(grep -A5 boxbianco $TMPFILE | grep -o ‘h1>.*</h1' )
    fname=$(echo $fname | sed -e s/.*\>// -e s/\<.*//).wmv
    [ -e $fname ] && exit 1

    per chi non se ne era accorto:
    visto che il titolo è contenuto nella parte centrale della pagina (con id boxbianco), chiedo a grep di estrarmi le prime 5 righe dopo l’id boxbianco.

    Tra queste prime 5 righe cerco il titolo h1 che è il titolo del video.

    Pulisco in qualche modo di tag dal titolo e gli accodo .wmv prima di mettere tutto nella varaibile fname.



Lascia un commento

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: