PDA

View Full Version : registrare in mp3?


estersandro
15-10-2009, 20:19
vorrei poter scaricare i files "podcast" di radio2 "alle 8 della sera". Si tratta di un grande numero di trasmissioni di RAI2 di argomento storico culturale ecc. Si possono ascoltare in podcast con real player, ma io vorrei averli come files mp3 da ascoltare in altro momento.
Come si può fare? C'è qualche software che scarica ed "ascolta" trasformando in mp3?
Grazie per un consiglio

Gimli[2BV!2B]
16-10-2009, 00:11
Script per scaricare tutto:#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indici generali: ogni pagina contiene max 10 link ad altrettante serie di puntate
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra

#cartella di lavoro
mkdir -p alle8dellasera
cd alle8dellasera

COUNTER=1
while [ $COUNTER -lt 14 ]; do
INDEX_ALLEOTTO="alleottodellasera$COUNTER.cfm"

#recupero indici generali
wget -O - "http://www.radio.rai.it/radio2/alleottodellasera.cfm?PageNum_Get_tipologie=$COUNTER" > $INDEX_ALLEOTTO

#estraggo i link alle serie di puntate
LINKS=`cat $INDEX_ALLEOTTO | sed -e '/href=\"http:\/\/www.radio.rai.it\/radio2\/alleotto\//!d' -e 's/.*href=[^h]*//' -e 's/".*$//' | uniq | sort`

#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$COUNTER" ]]; then
mkdir "serie$COUNTER"
fi

NR_INDEX=1
for serie in $LINKS; do
echo $serie
#recupero indici serie
wget -q -O - $serie > "serie$COUNTER/index$NR_INDEX.htm"

#estraggo i link ai file *.ram
RAMS=`cat "serie$COUNTER/index$NR_INDEX.htm" | sed -e '/Q_CANALE=http:\/\/www.radio.rai.it\/\/radio2\/alleotto\//!d' -e 's/.*Q_CANALE=[^h]*//' -e 's/.ram.,.*$/.ram/' | uniq | sort`

for ram in $RAMS; do
#recupero l'indirizzo dello stream *.ra
STREAM=`wget -q -O - $ram`
#pulizia necessaria...
STREAM=`echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/'`
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
STREAM=`echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//'`

#suddivido i file per serie: estraggo i nomi necessari
FILENAME=`echo $STREAM | sed -e 's/.*\///'`
SERIENAME=`echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///'`

#creazione cartelle serie
if [[ ! -d "../$SERIENAME" ]]; then
mkdir "../$SERIENAME"
fi
if [[ ! -f "../$SERIENAME/$FILENAME" ]]; then
#se il file non esiste procedo con il download
echo -e "\nIn download: $SERIENAME/$FILENAME = $STREAM"
if ! mplayer -prefer-ipv4 -noframedrop -dumpfile ../$SERIENAME/$FILENAME -dumpstream $STREAM ; then
echo -e "\n\nERROR! $STREAM -> $SERIENAME/$FILENAME\n\n"
exit 1
fi
else
#il file esiste già.
#Due casi possibili:
# - è già stato scaricato in un'esecuzione precedente
# - è stato solamente iniziato ed è incompleto...
# QUESTO SCRIPT NON SI ACCORGE DI AVENTUALI FILE INCOMPLETI E NON LI SCARICA PIU'
echo -e "\nGià scaricato o interrotto: $SERIENAME/$FILENAME = $STREAM\n"
fi
done

let NR_INDEX=NR_INDEX+1
done

let COUNTER=COUNTER+1
done
#Gimli

Scarica solo i file *.ra, non ho controllato per fare eventuali conversioni di formato.

Non ho idea di quanti file/dati e quanto tempo possa occorrere per un dump completo... (probabilmente proverò ad eseguirlo nel week-end).

Ho letto che stanno per chiuderla questa trasmissione? Un paio d'anni fa avevo orari che mi permettevano di seguirla ed era molto interessante.

estersandro
16-10-2009, 05:14
Ti ringrazio per la risposta, ma poichè la mia ignoranza è abissale, sono costretto a chiederti maggiori lumi; cosa devo fare con lo script? Da dove e come azionarlo?

Gimli[2BV!2B]
16-10-2009, 09:04
Devi salvarlo in un file di testo (tipo download_alle8dellasera.sh)
Dopodiché apri un terminale (Terminal in Gnome oppure Konsole in Kde)
Quindi ti sposti nella cartella dove hai salvato il file (se lo metti sul Desktop: cd Desktop)
Per finire lo lanci: bash download_alle8dellasera.sh

Verrà creata una cartella alle8dellasera nella stessa cartella che contiene lo script, ed al suo interno inizierà il download dei file.

Dipendenze che potrebbero mancarti per l'esecuzione: mplayer

estersandro
16-10-2009, 13:44
ecco cosa succede:

bash download_alle8dellasera.sh
--2009-10-16 14:39:33-- http://www.radio.rai.it/radio2/alleottodellasera.cfm?PageNum_Get_tipologie=1
Risoluzione di www.radio.rai.it... 212.162.68.25
Connessione a www.radio.rai.it|212.162.68.25|:80... connesso.
HTTP richiesta inviata, in attesa di risposta... 200 OK
Lunghezza: non specificato [text/html]
Salvataggio in: "STDOUT"

[ <=> ] 22.705 125K/s in 0,2s

2009-10-16 14:39:33 (125 KB/s) - "-" salvato [22705]

http://www.radio.rai.it/radio2/alleotto/1914/index.cfm

In download: 1914/1914guerra2004_01_19.ra = rtsp://mm3.rai.it/radio/radio2/torino/alle8/1914/1914guerra2004_01_19.ra
download_alle8dellasera.sh: line 54: mplayer: command not found


ERROR! rtsp://mm3.rai.it/radio/radio2/torino/alle8/1914/1914guerra2004_01_19.ra -> 1914/1914guerra2004_01_19.ra


[roberto@localhost 8sera]$ bash download_alle8dellasera.sh
--2009-10-16 14:40:56-- http://www.radio.rai.it/radio2/alleottodellasera.cfm?PageNum_Get_tipologie=1
Risoluzione di www.radio.rai.it... 212.162.68.25
Connessione a www.radio.rai.it|212.162.68.25|:80... connesso.
HTTP richiesta inviata, in attesa di risposta... 200 OK
Lunghezza: non specificato [text/html]
Salvataggio in: "STDOUT"

[ <=> ] 16.171 --.-K/s in 0,1s

2009-10-16 14:40:57 (128 KB/s) - "-" salvato [16171]

http://www.radio.rai.it/radio2/alleotto/1914/index.cfm

In download: 1914/1914guerra2004_01_19.ra = rtsp://mm3.rai.it/radio/radio2/torino/alle8/1914/1914guerra2004_01_19.ra
download_alle8dellasera.sh: line 54: mplayer: command not found


ERROR! rtsp://mm3.rai.it/radio/radio2/torino/alle8/1914/1914guerra2004_01_19.ra -> 1914/1914guerra2004_01_19

jeremy.83
16-10-2009, 14:58
Come ti aveva precedentemente detto il grande Gimli non hai installato mplayer

per farlo, se sei su ubuntu, basta aprire il terminale e dare:

sudo apt-get install mplayer

Damage92
16-10-2009, 15:01
vorrei poter scaricare i files "podcast" di radio2 "alle 8 della sera". Si tratta di un grande numero di trasmissioni di RAI2 di argomento storico culturale ecc. Si possono ascoltare in podcast con real player, ma io vorrei averli come files mp3 da ascoltare in altro momento.
Come si può fare? C'è qualche software che scarica ed "ascolta" trasformando in mp3?
Grazie per un consiglio

se è un podcast puoi usare rhytmobox... per il formato, se non dovesse essere in mp3, puoi usare "sound converter".

estersandro
16-10-2009, 19:26
Ehi! Sta funzionando!! (Ho installato Mplayer). E' grandioso!. Non avevo mai visto una roba simile.
Quindi basta che io cambi l' indirizzo URL all' interno dello script per scaricare anche altre fonti...
Bellissimo.
Grazie!

Gimli[2BV!2B]
16-10-2009, 20:40
Anch'io l'ho avviato da qualche minuto in una sessione screen in un pc che posso lasciare acceso a lungo. Vediamo come va a finire...

Riguardo alla riutilizzabilità, beh, sì, forse la struttura delle pagine di alcune trasmissioni sarà simile, ma non ne sono certo... mi perdo un po' nel sito Rai, tra schianti assortiti e mille doppioni...

Prego!

Gimli[2BV!2B]
18-10-2009, 20:38
Ora crea indici html per ogni pagina, scarica l'immagine collegata, scarica eventuali contenuti aggiuntivi e riscrive i collegamenti negli html per farli puntare ai file locali.#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indici generali: ogni pagina contiene max 10 link ad altrettante serie di puntate
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra
#
# Versione 1.1 (18/10/2009) Alcuni stream sono di tipo pnm, mplayer non li può usare
# Basta riscrivere l'indirizzo in rstp://...
# Versione 2 (18/10/2009) Recupero contenuti accessori: html, immagine, altri file...

#cartella di lavoro
mkdir -p alle8dellasera
cd alle8dellasera

#Viene creata una paginetta html con la descrizione di ogni serie
#testata html
HEAD="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
HEAD="$HEAD\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
HEAD="$HEAD<html>\n<head>\n"
HEAD="$HEAD<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\"/>\n"
HEAD="$HEAD<title>RADIO DUE</title>\n"
HEAD="$HEAD<style TYPE=\"text/css\">\n<!--\n\n"

#qui in mezzo includo le stile da css

#fine testata
HEAD_CLOSE="\n\n"
HEAD_CLOSE="$HEAD_CLOSE-->\n"
HEAD_CLOSE="$HEAD_CLOSE</style>\n</head>\n<body>\n"

#coda html
TAIL="</body>\n</html>"

if [[ ! -f "style.css" ]]; then
wget -O - "http://www.radio.rai.it/radio2/schede_interne_a4.css" > style.css
fi

COUNTER=1
while [ $COUNTER -lt 14 ]; do
INDEX_ALLEOTTO="alleottodellasera$COUNTER.cfm"

#recupero indici generali
if [[ ! -f "$INDEX_ALLEOTTO" ]]; then
wget -O - "http://www.radio.rai.it/radio2/alleottodellasera.cfm?PageNum_Get_tipologie=$COUNTER" > $INDEX_ALLEOTTO
fi

#estraggo i link alle serie di puntate
SERIES=`cat $INDEX_ALLEOTTO | sed -e '/href=\"http:\/\/www.radio.rai.it\/radio2\/alleotto\//!d' -e 's/.*href=[^h]*//' -e 's/".*$//' | uniq | sort`

#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$COUNTER" ]]; then
mkdir "serie$COUNTER"
fi

NR_INDEX=1
for serie in $SERIES; do
echo $serie
#recupero indici serie
if [[ ! -f "serie$COUNTER/index$NR_INDEX.htm" ]]; then
wget -q -O - $serie > "serie$COUNTER/index$NR_INDEX.htm"
fi

if [[ ! -f "serie$COUNTER/index$NR_INDEX.htm" ]]; then
exit 0 ;
fi

#estraggo i link ai file *.ram
RAMS=`cat "serie$COUNTER/index$NR_INDEX.htm" | sed -e '/Q_CANALE=http:\/\/www.radio.rai.it\/\/radio2\/alleotto\//!d' -e 's/.*Q_CANALE=[^h]*//' -e 's/.ram.,.*$/.ram/' | uniq | sort`

for ram in $RAMS; do
#recupero l'indirizzo dello stream *.ra
STREAM=`wget -q -O - $ram`
#pulizia necessaria...
STREAM=`echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/'`
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
STREAM=`echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//'`

#suddivido i file per serie: estraggo i nomi necessari
FILENAME=`echo $STREAM | sed -e 's/.*\///'`
SERIE_NAME=`echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///'`

#creazione cartelle serie
if [[ ! -d "../$SERIE_NAME" ]]; then
mkdir "../$SERIE_NAME"
fi

#creazione indice html
if [[ ! -f "../$SERIE_NAME/$SERIE_NAME.html" ]]; then
echo -e "\nCreazione indice html: $SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD > "../$SERIE_NAME/$SERIE_NAME.html"
cat style.css >> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD_CLOSE >> "../$SERIE_NAME/$SERIE_NAME.html"
cat "serie$COUNTER/index$NR_INDEX.htm" \
| sed -n -e '/<span class=\"solotesto\"> Alle otto della sera <\/span><\/div>/,/<div class=\"schede_interne_\(contenuti\|riascolta_a4\)\">/p' \
| sed -e '/<div class=\"schede_interne_\(contenuti\|riascolta_a4\)\">/d' \
>> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $TAIL >> "../$SERIE_NAME/$SERIE_NAME.html"

#recupero eventuale immagine
IMAGE=`cat "../$SERIE_NAME/$SERIE_NAME.html" | sed -e '/<img src=\"/!d' -e 's/.*<img src=\"//' -e 's/\" width=\".*$//'`
if [[ ! -z $IMAGE ]]; then
IMAGE_NAME=`echo $IMAGE | sed -e 's/.*\///'`
echo "L'indice contiene un'immagine -> $SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

if [[ ! -f "../$SERIE_NAME/contenuti/$IMAGE_NAME" ]]; then
wget -q -O - "http://www.radio.rai.it$IMAGE" > "../$SERIE_NAME/contenuti/$IMAGE_NAME"
fi

#riscritture indirizzo immagine: da remota a locale
LOCAL_NAME="contenuti/$IMAGE_NAME"
sed -i 's:'$IMAGE':'$LOCAL_NAME':g' "../$SERIE_NAME/$SERIE_NAME.html"
fi

#alcune serie hanno anche dei contenuti aggiuntivi: li recupero
LINKS=`sed -e '/<a href=\"/!d' -e 's/<a href=\"/\n/g' ../$SERIE_NAME/$SERIE_NAME.html | sed -e '/http:/!d' -e 's/\">.*$//'`
if [[ ! -z $LINKS ]]; then
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

for link in $LINKS; do
FILE_NAME=`echo $link | sed -e 's/.*\///'`
if [[ ! -f "../$SERIE_NAME/contenuti/$FILE_NAME" ]]; then
echo "Contenuto aggiuntivo -> $SERIE_NAME/contenuti/$FILE_NAME"
wget -q -O - "$link" > "../$SERIE_NAME/contenuti/$FILE_NAME"
fi

#riscrittura indirizzo contenuto
LOCAL_NAME="contenuti/$FILE_NAME"
sed -i 's*'$link'*'$LOCAL_NAME'*g' "../$SERIE_NAME/$SERIE_NAME.html"
done
fi
fi

if [[ ! -f "../$SERIE_NAME/$FILENAME" ]]; then
#se il file non esiste procedo con il download
echo -e "\nIn download: $SERIE_NAME/$FILENAME = $STREAM"
if ! mplayer -prefer-ipv4 -noframedrop -dumpfile ../$SERIE_NAME/$FILENAME -dumpstream $STREAM ; then
echo -e "\n\nERROR! $STREAM -> $SERIE_NAME/$FILENAME\n\n"
exit 1
fi
else
#il file esiste già.
#Due casi possibili:
# - è già stato scaricato in un'esecuzione precedente
# - è stato solamente iniziato ed è incompleto...
# QUESTO SCRIPT NON SI ACCORGE DI AVENTUALI FILE INCOMPLETI E NON LI SCARICA PIU'
echo -e "\nGià scaricato o interrotto: $SERIE_NAME/$FILENAME = $STREAM\n"
fi
done

let NR_INDEX=NR_INDEX+1
done

let COUNTER=COUNTER+1
done
#gimli

Gimli[2BV!2B]
08-06-2010, 23:40
#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indice generale
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra
#
# Versione 1.1 (18/10/2009) Alcuni stream sono di tipo pnm, mplayer non li può usare
# Basta riscrivere l'indirizzo in rstp://...
# Versione 2 (18/10/2009) Recupero contenuti accessori: html, immagine, altri file...
# Versione 2.1 (20/10/2009) Meno file *ram da scaricare in caso di download terminato
# File html migliorati
# Versione 3 (15/05/2010) Nuovo sito RAI; le nuove pagine dovrebbero rimanere stabili
# per qualche tempo dopo la grande migrazione a SilverLight...
# Versione 3.1 (09/06/2010) RealMedia Analyzer
# Nome stream o nome file?
# Riscrittura dei messaggi di output durante l'esecuzione
# Trap Ctrl C per pulire in uscita
# MPlayer non da errore in caso di Ctrl C, test output

# trap keyboard interrupt (control-c)
trap control_c SIGINT
# trap standart sigterm
trap control_c SIGTERM
EXIT_AS_SOON_AS_POSS=0

control_c()
{
printf "\n\n%s\n\n" "*** Richiesta uscita script: attendere, prego... ***"
EXIT_AS_SOON_AS_POSS=1
}

#cartella di lavoro
TEMP_FOLDER="alle8dellasera_TMP"
if [[ ! -d "$TEMP_FOLDER" ]]; then
printf "%s\n%s\n\n%s\n%s\n\n" \
"Benvenuto in \"Alle otto della sera\" downloader." \
"Prima esecuzione dello script: creo la certella temporanea \"$TEMP_FOLDER\"" \
" *** Potrai eliminare questa cartella al termine ***" \
" *** del download di tutte le serie che ti interessano ***"
fi

mkdir -p "$TEMP_FOLDER"
cd "$TEMP_FOLDER"

#RealMedia analyzer
RMA="./rma"

if [[ "$1" != "-no-rma" ]] && [[ ! -f "$RMA" ]]; then
RMA_FULL_NAME="rma-0.30.00-linux-i386"
printf "\n%s\n%s\n" "Sto scaricando una utilità per riparare gli stream: RealMedia Analyzer ($RMA_FULL_NAME)" \
"Eseguire lo script con argomento -no-rma per saltare questo passaggio."
if [[ ! -f "$RMA_FULL_NAME.gz" ]]; then
wget -q "http://users.i.com.ua/~alexeysp/rma/$RMA_FULL_NAME.gz"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget RMA failed!\n"; rm "$RMA_FULL_NAME.gz" ; fi
fi
gzip -qdc "$RMA_FULL_NAME.gz" > "$RMA"
chmod +x "$RMA"
fi

#Viene creata una paginetta html con la descrizione di ogni serie
#testata html
HEAD="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
HEAD="$HEAD\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
HEAD="$HEAD<html>\n<head>\n"
HEAD="$HEAD<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\"/>\n"
HEAD="$HEAD<title>RADIO DUE</title>\n"
HEAD="$HEAD<style TYPE=\"text/css\">\n<!--\n\n"

#qui in mezzo includo le stile da css

#fine testata
HEAD_CLOSE="\n\n"
HEAD_CLOSE="$HEAD_CLOSE-->\n"
HEAD_CLOSE="$HEAD_CLOSE</style>\n</head>\n<body>\n"

#coda html
TAIL="</body>\n</html>"

if [[ ! -f "style.css" ]]; then
wget -q -O - "http://www.rai.tv/dl/Radio2/css/Radio2.css" > style.css
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget css failed!\n"; rm style.css ; exit 1; fi
fi

INDEX_ALLEOTTO="alleottodellasera.html"

#recupero indice generale
if [[ ! -f "$INDEX_ALLEOTTO" ]]; then
wget -q -O - "http://www.rai.it/dl/Radio2/alleottodellasera.html" > $INDEX_ALLEOTTO
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget global index failed!\n"; rm $INDEX_ALLEOTTO; exit 1; fi
fi

#estraggo i link alle serie di puntate
SERIES=`cat $INDEX_ALLEOTTO | sed \
-e '/<a href="\/dl\/Radio2\/sito\/item\/ContentItem-[A-Za-z0-9-]\{36\}.html">segue...<\/a>/!d' \
-e 's;^<a href=";;' -e 's;".*$;;'`

NR_INDEX=1
for serie in $SERIES; do
#recupero indici serie
#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$NR_INDEX" ]]; then
mkdir "serie$NR_INDEX"
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]]; then
REDIRECT="$(wget -q -O - "http://www.rai.it/$serie")"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget redirect failed!\n"; exit 1; fi
LINK=`echo $REDIRECT | sed \
-e "s;.*document.location[[:space:]]*=[[:space:]]*';;" \
-e "s/'[[:space:]]*;.*//"`

wget -q -O - "http://www.rai.it/$LINK" > "serie$NR_INDEX/index.htm"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget index failed!\n"; rm "serie$NR_INDEX/index.htm"; exit 1; fi
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]]; then
exit 0 ;
fi

EPISODES=`cat "serie$NR_INDEX/index.htm" | sed \
-e '/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="/!d' \
-e 's/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="//' \
-e 's/.html">[^\n^$]*<\/a>/.html/'`

NR_EPISODE=1
for episode in $EPISODES; do
if [[ ! -f "serie$NR_INDEX/$NR_EPISODE.htm" ]]; then
wget -q -O - "$episode" > "serie$NR_INDEX/$NR_EPISODE.htm"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget episode failed!\n"; rm "serie$NR_INDEX/$NR_EPISODE.htm"; exit 1; fi
fi

#estraggo il link al file *.ram
RAM=`cat "serie$NR_INDEX/$NR_EPISODE.htm" | sed \
-e '/<embed CONSOLE="[[:alpha:]]*" NOLOGO="[[:alpha:]]*" autostart="[[:alpha:]]*" center="[[:alpha:]]*" CONTROLS="[[:alpha:]]*" src="http:\/\/www.rai.it\/dl\/audio\/[^\n^$]*.ram"/!d' \
-e 's/<embed CONSOLE="[[:alpha:]]*" NOLOGO="[[:alpha:]]*" autostart="[[:alpha:]]*" center="[[:alpha:]]*" CONTROLS="[[:alpha:]]*" src="//' \
-e 's/.ram".*$/.ram/'`

#recupero l'indirizzo dello stream *.ra
STREAM=`wget -q -O - $RAM`
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget ram failed!\n"; exit 1; fi
#pulizia necessaria...
STREAM=`echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/'`
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
STREAM=`echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//'`

#suddivido i file per serie: estraggo i nomi necessari
FILE_NAME=`echo $RAM | sed 's/.*\///' | sed 's/m$//'`
STREAM_NAME=`echo $STREAM | sed -e 's/.*\///'`
if [[ ${#FILE_NAME} -le ${#STREAM_NAME} ]]; then
FILE_NAME="$STREAM_NAME"
fi
SERIE_NAME_PREV="$SERIE_NAME"
SERIE_NAME=`echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///'`

#creazione cartelle serie
if [[ ! -d "../$SERIE_NAME" ]]; then
mkdir "../$SERIE_NAME"
printf "\n\n%s" "Inizio download serie \"$SERIE_NAME\"" ;
elif [[ -z $SERIE_NAME_PREV ]] || [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
printf "\n\n%s" "Proseguo download serie \"$SERIE_NAME\"" ;
fi

#creazione indice html
if [[ ! -f "../$SERIE_NAME/$SERIE_NAME.html" ]]; then
echo -e "\nCreazione indice html: $SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD > "../$SERIE_NAME/$SERIE_NAME.html"
cat style.css >> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD_CLOSE >> "../$SERIE_NAME/$SERIE_NAME.html"
cat "serie$NR_INDEX/index.htm" \
| sed -n -e '/ id=\"SitoBody\">/,/<div class=\"Bot\"><\/div>/p' -e 's/<div class=\"Bot\"><\/div>/<div class=\"Bot\"><\/div><\/div>/' \
>> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $TAIL >> "../$SERIE_NAME/$SERIE_NAME.html"

#recupero eventuale immagine
IMAGE=`sed -e '/<img src=\"/!d' -e 's/.*<img src=\"//' -e 's/\"[[:space:]]*[[:alpha:]]*=\".*$//' "../$SERIE_NAME/$SERIE_NAME.html"`
if [[ ! -z $IMAGE ]]; then
IMAGE_NAME=`echo $IMAGE | sed -e 's/.*\///'`
echo "L'indice contiene un'immagine -> $SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

if [[ ! -f "../$SERIE_NAME/contenuti/$IMAGE_NAME" ]]; then
wget -q -O - "$IMAGE" > "../$SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget image failed!\n"; rm "../$SERIE_NAME/contenuti/$IMAGE_NAME"; fi
fi

#riscritture indirizzo immagine: da remota a locale
LOCAL_NAME="contenuti/$IMAGE_NAME"
sed -i 's;'$IMAGE';'$LOCAL_NAME';g' "../$SERIE_NAME/$SERIE_NAME.html"
fi

#alcune serie hanno anche dei contenuti aggiuntivi: li recupero
LINKS=`sed -e '/<a href=\"/!d' -e 's/<a href=\"/\n/g' ../$SERIE_NAME/$SERIE_NAME.html | sed -e '/http:/!d' -e 's/\">.*$//'`
if [[ ! -z $LINKS ]]; then
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

for link in $LINKS; do
FILE_NAME=`echo $link | sed -e 's/.*\///'`
if [[ ! -f "../$SERIE_NAME/contenuti/$FILE_NAME" ]]; then
echo "Contenuto aggiuntivo -> $SERIE_NAME/contenuti/$FILE_NAME"
wget -q -O - "$link" > "../$SERIE_NAME/contenuti/$FILE_NAME"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget file failed!\n"; rm "../$SERIE_NAME/contenuti/$FILE_NAME"; fi
fi

#riscrittura indirizzo contenuto
LOCAL_NAME="contenuti/$FILE_NAME"
sed -i 's*'$link'*'$LOCAL_NAME'*g' "../$SERIE_NAME/$SERIE_NAME.html"
done
fi
fi

if [[ -n $STREAM_NAME ]] && [[ -f "../$SERIE_NAME/$STREAM_NAME" ]] && [[ "${STREAM_NAME}" != "${FILE_NAME}" ]]; then
mv "../$SERIE_NAME/$STREAM_NAME" "../$SERIE_NAME/$FILE_NAME"
fi

if [[ ! -f "../$SERIE_NAME/$FILE_NAME" ]]; then
#se il file non esiste procedo con il download
printf "\n%s" "In download: $FILE_NAME = $STREAM"
OUTPUT=$(mplayer -noconsolecontrols -nojoystick -nolirc -quiet -prefer-ipv4 -noframedrop -dumpfile \
../$SERIE_NAME/$FILE_NAME -dumpstream $STREAM 2>&1)

if [[ "$?" -ne 0 ]] || [[ ! -z $(echo $OUTPUT | grep "Core dumped") ]]; then
echo -ne "\nMPlayer failed!\n"
rm "../$SERIE_NAME/$FILE_NAME"
fi
else
#il file esiste già.
printf "\n%s" "Già scaricato o interrotto: $SERIE_NAME/$FILE_NAME = $STREAM"
fi

if [[ "$1" != "-no-rma" ]] && [[ ! "$RMA" ]]; then
PROCESSED=`$RMA -d "../$SERIE_NAME/$FILE_NAME" | grep "This file has been processed by RealMedia Analyzer"`
if [[ -f "../$SERIE_NAME/$FILE_NAME" ]] && [[ -z $PROCESSED ]]; then
if $RMA -ft "../$SERIE_NAME/$FILE_NAME" >/dev/null 2>&1 ; then
echo -n "."
else
echo -ne "\n*rma -ft warning*"
touch "../$SERIE_NAME/$FILE_NAME-rma_ft_WARNING"
fi
if $RMA -i "../$SERIE_NAME/$FILE_NAME" >/dev/null 2>&1 ; then
echo -n "."
else
echo -ne "\n*rma -i warning*"
touch "../$SERIE_NAME/$FILE_NAME-rma_i_WARNING"
fi
fi
fi

if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
exit 0 ;
fi

((NR_EPISODE++))
done
((NR_INDEX++))
done
#gimli

Gimli[2BV!2B]
21-08-2011, 23:22
#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indice generale
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra
#
# Versione 1.1 (18/10/2009) Alcuni stream sono di tipo pnm, mplayer non li può usare
# Basta riscrivere l'indirizzo in rstp://...
# Versione 2 (18/10/2009) Recupero contenuti accessori: html, immagine, altri file...
# Versione 2.1 (20/10/2009) Meno file *ram da scaricare in caso di download terminato
# File html migliorati
# Versione 3 (15/05/2010) Nuovo sito RAI; le nuove pagine dovrebbero rimanere stabili
# per qualche tempo dopo la grande migrazione a SilverLight...
# Versione 3.1 (09/06/2010) RealMedia Analyzer
# Nome stream o nome file?
# Riscrittura dei messaggi di output durante l'esecuzione
# Trap Ctrl C per pulire in uscita
# MPlayer non da errore in caso di Ctrl C, test output
# Versione 3.2 (21/08/2011) Maggiore efficienza riavviando lo script
# Vari controlli errori

# trap keyboard interrupt (control-c)
trap control_c SIGINT
# trap standart sigterm
trap control_c SIGTERM
EXIT_AS_SOON_AS_POSS=0

# file that flags a folder as completely downloaded
FILE_FLAG_DONE=".done"

control_c()
{
printf "\n\n%s\n\n" "*** Richiesta uscita script: attendere, prego... ***"
EXIT_AS_SOON_AS_POSS=1
}

#cartella di lavoro
TEMP_FOLDER="alle8dellasera_TMP"
if [[ ! -d "$TEMP_FOLDER" ]]; then
printf "%s\n%s\n\n%s\n%s\n\n" \
"Benvenuto in \"Alle otto della sera\" downloader." \
"Prima esecuzione dello script: creo la certella temporanea \"$TEMP_FOLDER\"" \
" *** Potrai eliminare questa cartella al termine ***" \
" *** del download di tutte le serie che ti interessano ***"
fi

mkdir -p "$TEMP_FOLDER"
cd "$TEMP_FOLDER"

#RealMedia analyzer
RMA="./rma"

if [[ "$1" != "-no-rma" ]] && [[ ! -f "$RMA" ]]; then
RMA_FULL_NAME="rma-0.30.00-linux-i386"
printf "\n%s\n%s\n" "Sto scaricando una utilità per riparare gli stream: RealMedia Analyzer ($RMA_FULL_NAME)" \
"Eseguire lo script con argomento -no-rma per saltare questo passaggio."
if [[ ! -f "$RMA_FULL_NAME.gz" ]]; then
wget -q "http://users.i.com.ua/~alexeysp/rma/$RMA_FULL_NAME.gz"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget RMA failed!\n"; rm "$RMA_FULL_NAME.gz" ; fi
fi
gzip -qdc "$RMA_FULL_NAME.gz" > "$RMA"
chmod +x "$RMA"
fi

#Viene creata una paginetta html con la descrizione di ogni serie
#testata html
HEAD="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
HEAD="$HEAD\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
HEAD="$HEAD<html>\n<head>\n"
HEAD="$HEAD<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\"/>\n"
HEAD="$HEAD<title>RADIO DUE</title>\n"
HEAD="$HEAD<style TYPE=\"text/css\">\n<!--\n\n"

#qui in mezzo includo le stile da css

#fine testata
HEAD_CLOSE="\n\n"
HEAD_CLOSE="$HEAD_CLOSE-->\n"
HEAD_CLOSE="$HEAD_CLOSE</style>\n</head>\n<body>\n"

#coda html
TAIL="</body>\n</html>"

if [[ ! -f "style.css" ]]; then
wget -q -O - "http://www.rai.tv/dl/Radio2/css/Radio2.css" > style.css
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget css failed!\n"; rm style.css ; exit 1; fi
fi

INDEX_ALLEOTTO="alleottodellasera.html"

#recupero indice generale
if [[ ! -f "$INDEX_ALLEOTTO" ]]; then
wget -q -O - "http://www.rai.it/dl/Radio2/alleottodellasera.html" > $INDEX_ALLEOTTO
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget global index failed!\n"; rm $INDEX_ALLEOTTO; exit 1; fi
fi

#estraggo i link alle serie di puntate
SERIES=`cat $INDEX_ALLEOTTO | sed \
-e '/<a href="\/dl\/Radio2\/sito\/item\/ContentItem-[A-Za-z0-9-]\{36\}.html">segue...<\/a>/!d' \
-e 's;^<a href=";;' -e 's;".*$;;'`

SERIE_DONE=0

NR_INDEX=1
for serie in $SERIES; do
#recupero indici serie
#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$NR_INDEX" ]]; then
mkdir "serie$NR_INDEX"
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]]; then
REDIRECT="$(wget -q -O - "http://www.rai.it/$serie")"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget redirect failed!\n"; exit 1; fi
LINK=`echo $REDIRECT | sed \
-e "s;.*document.location[[:space:]]*=[[:space:]]*';;" \
-e "s/'[[:space:]]*;.*//"`

wget -q -O - "http://www.rai.it/$LINK" > "serie$NR_INDEX/index.htm"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget index failed!\n"; rm "serie$NR_INDEX/index.htm"; exit 1; fi
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]]; then
exit 0 ;
fi

EPISODES=`cat "serie$NR_INDEX/index.htm" | sed \
-e '/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="/!d' \
-e 's/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="//' \
-e 's/.html">[^\n^$]*<\/a>/.html/'`

if [[ -z $EPISODES ]]; then
export TITLE=$(cat "serie$NR_INDEX/index.htm" | sed \
-e '/<div class="Titolo">/!d' \
-e 's/^[[:space:]]*<div class="Titolo">//' \
-e 's\</div>[[:space:]]*\\')

TITLE=$(perl -MHTML::Entities -e 'print decode_entities($ENV{'TITLE'});')
echo -ne "\n\nLa serie \"$TITLE\" non contiene nessuna puntata?!" ;
unset -v TITLE
echo -ne "\nURL: http://www.rai.it/$serie\n" ;
((NR_INDEX++))
continue ;
fi

NR_EPISODE=1
#questa flag viene portata a zero se un download di mplayer fallisce
#in questo caso non viene creato il file FILE_FLAG_DONE, che marca una cartella come terminata
SERIE_DONE=1

for episode in $EPISODES; do
if [[ ! -f "serie$NR_INDEX/$NR_EPISODE.htm" ]]; then
wget -q -O - "$episode" > "serie$NR_INDEX/$NR_EPISODE.htm"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget episode failed!\n"; rm "serie$NR_INDEX/$NR_EPISODE.htm"; exit 1; fi
fi

#estraggo il link al file *.ram
RAM=`cat "serie$NR_INDEX/$NR_EPISODE.htm" | sed \
-e '/<embed CONSOLE="[[:alpha:]]*" NOLOGO="[[:alpha:]]*" autostart="[[:alpha:]]*" center="[[:alpha:]]*" CONTROLS="[[:alpha:]]*" src="http:\/\/www.rai.it\/dl\/audio\/[^\n^$]*.ram"/!d' \
-e 's/<embed CONSOLE="[[:alpha:]]*" NOLOGO="[[:alpha:]]*" autostart="[[:alpha:]]*" center="[[:alpha:]]*" CONTROLS="[[:alpha:]]*" src="//' \
-e 's/.ram".*$/.ram/'`

#recupero l'indirizzo dello stream *.ra
STREAM=`wget -q -O - $RAM`
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget ram failed!\n"; exit 1; fi
#pulizia necessaria...
STREAM=`echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/'`
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
STREAM=`echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//'`

#suddivido i file per serie: estraggo i nomi necessari
FILE_NAME=`echo $RAM | sed 's/.*\///' | sed 's/m$//'`
STREAM_NAME=`echo $STREAM | sed -e 's/.*\///'`
if [[ ${#FILE_NAME} -le ${#STREAM_NAME} ]]; then
FILE_NAME="$STREAM_NAME"
fi
SERIE_NAME_PREV="$SERIE_NAME"
SERIE_NAME=`echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///'`

if [[ ! -z $SERIE_NAME_PREV ]] && [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ "$SERIE_NAME" =~ "$SERIE_NAME_PREV" ]] || [[ "$SERIE_NAME_PREV" =~ "$SERIE_NAME" ]]; then
echo -ne "\nDiscrepanze nel nome della serie? Prima: \"$SERIE_NAME_PREV\", ora: \"$SERIE_NAME\"" ;
echo -ne "\nMantengo nome serie \"$SERIE_NAME_PREV\"" ;
SERIE_NAME="$SERIE_NAME_PREV";
fi
fi

if [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
continue ;
fi

if [[ -z $SERIE_NAME_PREV ]] || [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
#creazione cartelle serie
if [[ ! -d "../$SERIE_NAME" ]]; then
mkdir "../$SERIE_NAME"
printf "\n\n%s" "Inizio download serie \"$SERIE_NAME\"" ;
else
printf "\n\n%s" "Proseguo download serie \"$SERIE_NAME\"" ;
fi
fi

#creazione indice html
if [[ ! -f "../$SERIE_NAME/$SERIE_NAME.html" ]]; then
echo -e "\nCreazione indice html: $SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD > "../$SERIE_NAME/$SERIE_NAME.html"
cat style.css >> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD_CLOSE >> "../$SERIE_NAME/$SERIE_NAME.html"
cat "serie$NR_INDEX/index.htm" \
| sed -n -e '/ id=\"SitoBody\">/,/<div class=\"Bot\"><\/div>/p' -e 's/<div class=\"Bot\"><\/div>/<div class=\"Bot\"><\/div><\/div>/' \
>> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $TAIL >> "../$SERIE_NAME/$SERIE_NAME.html"

#recupero eventuale immagine
IMAGE=`sed -e '/<img src=\"/!d' -e 's/.*<img src=\"//' -e 's/\"[[:space:]]*[[:alpha:]]*=\".*$//' "../$SERIE_NAME/$SERIE_NAME.html"`
if [[ ! -z $IMAGE ]]; then
IMAGE_NAME=`echo $IMAGE | sed -e 's/.*\///'`
echo "L'indice contiene un'immagine -> $SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

if [[ ! -f "../$SERIE_NAME/contenuti/$IMAGE_NAME" ]]; then
wget -q -O - "$IMAGE" > "../$SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget image failed!\n"; rm "../$SERIE_NAME/contenuti/$IMAGE_NAME"; fi
fi

#riscritture indirizzo immagine: da remota a locale
LOCAL_NAME="contenuti/$IMAGE_NAME"
sed -i 's;'$IMAGE';'$LOCAL_NAME';g' "../$SERIE_NAME/$SERIE_NAME.html"
fi

#alcune serie hanno anche dei contenuti aggiuntivi: li recupero
LINKS=`sed -e '/<a href=\"/!d' -e 's/<a href=\"/\n/g' ../$SERIE_NAME/$SERIE_NAME.html | sed -e '/http:/!d' -e 's/\">.*$//'`
if [[ ! -z $LINKS ]]; then
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

for link in $LINKS; do
FILE_NAME=`echo $link | sed -e 's/.*\///'`
if [[ ! -f "../$SERIE_NAME/contenuti/$FILE_NAME" ]]; then
echo "Contenuto aggiuntivo -> $SERIE_NAME/contenuti/$FILE_NAME"
wget -q -O - "$link" > "../$SERIE_NAME/contenuti/$FILE_NAME"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget file failed!\n"; rm "../$SERIE_NAME/contenuti/$FILE_NAME"; fi
fi

#riscrittura indirizzo contenuto
LOCAL_NAME="contenuti/$FILE_NAME"
sed -i 's*'$link'*'$LOCAL_NAME'*g' "../$SERIE_NAME/$SERIE_NAME.html"
done
fi
fi

if [[ -n $STREAM_NAME ]] && [[ -f "../$SERIE_NAME/$STREAM_NAME" ]] && [[ "${STREAM_NAME}" != "${FILE_NAME}" ]]; then
mv "../$SERIE_NAME/$STREAM_NAME" "../$SERIE_NAME/$FILE_NAME"
fi

if [[ ! -f "../$SERIE_NAME/$FILE_NAME" ]]; then
#se il file non esiste procedo con il download
printf "\n%s" "In download: $FILE_NAME = $STREAM"
OUTPUT=$(mplayer -noconsolecontrols -nojoystick -nolirc -quiet -prefer-ipv4 -noframedrop -dumpfile \
../$SERIE_NAME/$FILE_NAME -dumpstream $STREAM 2>&1)

if [[ "$?" -ne 0 ]] || [[ -z $(echo $OUTPUT | grep "Stream EOF detected") ]]; then
echo -ne "\nMPlayer failed!\n"
SERIE_DONE=0
rm "../$SERIE_NAME/$FILE_NAME"
fi
else
#il file esiste già.
#Due casi possibili:
# - è già stato scaricato in un'esecuzione precedente
# - è stato solamente iniziato, è sfuggito alle trap ed è incompleto...
# QUESTO SCRIPT NON SI ACCORGE DI EVENTUALI FILE INCOMPLETI E NON LI SCARICA PIU'
# Tenta di intercettare il termine dell'esecuzione dello script rimuovendo eventuali
# file incompleti (ma se, per esempio, manca la corrente...)
printf "\n%s" "Già scaricato: $SERIE_NAME/$FILE_NAME = $STREAM"
fi

if [[ "$1" != "-no-rma" ]] && [[ ! "$RMA" ]]; then
PROCESSED=`$RMA -d "../$SERIE_NAME/$FILE_NAME" | grep "This file has been processed by RealMedia Analyzer"`
if [[ -f "../$SERIE_NAME/$FILE_NAME" ]] && [[ -z $PROCESSED ]]; then
if $RMA -ft "../$SERIE_NAME/$FILE_NAME" >/dev/null 2>&1 ; then
echo -n "."
else
echo -ne "\n*rma -ft warning*"
touch "../$SERIE_NAME/$FILE_NAME-rma_ft_WARNING"
fi
if $RMA -i "../$SERIE_NAME/$FILE_NAME" >/dev/null 2>&1 ; then
echo -n "."
else
echo -ne "\n*rma -i warning*"
touch "../$SERIE_NAME/$FILE_NAME-rma_i_WARNING"
fi
fi
fi

if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
exit 0 ;
fi

((NR_EPISODE++))
done
((NR_INDEX++))
if [[ SERIE_DONE -eq 1 ]] && [[ ! -z $SERIE_NAME ]] && [[ ! -z $FILE_FLAG_DONE ]] && [[ ! -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" terminata!"
touch "../$SERIE_NAME/$FILE_FLAG_DONE"
elif [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" marcata come terminata (file \"$SERIE_NAME/$FILE_FLAG_DONE\")."
fi
done
#gimli

muzzle
18-11-2011, 10:35
Ciao Gimli,
il tuo script e' spettacolare! E anche ben scritto! Hai mai pensato di modificarlo per far scegliere all'utente quali serie scaricare piuttosto che tirar giu' tutto il mondo?

Io sto cercando di capire se c'e' un modo semplice di farlo, se hai suggerimenti fammi sapere (anche via email a <il mo username> chiocciola gmail punto com).

Gimli[2BV!2B]
19-11-2011, 00:07
Mi hai convinto, ora occorre specificare un'azione da svolgere:

all -> scarica il mondo
list -> elenca le serie disponibili
lista codici serie -> specificando una lista di codici di serie verranno scaricate solo quelle
Non è interattivo e per costruire la lista scarica tutte le pagine html delle serie, ma dopo la prima esecuzione verrà completamente inizializzata la "cache" di questi indici velocizzando le esecuzioni successive. Riduce anche il rischio che le pagine del sito vengano sconvolte a metà del download (tipo la prima volta che ho scritto e lasciato in esecuzione lo script) rendendo impossibile la prosecuzione salvo riscrittura dei parse.

Grazie alla funzione list mi sono accorto della presenza di una serie con indice inaccessibile e che ce ne saranno almeno quattro o cinque che non contengono link alle puntate (non vengono elencate nel list mentre gli errori vengono mostrati solo durante i comandi di download).#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indice generale
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra
#
# Versione 1.1 (18/10/2009) Alcuni stream sono di tipo pnm, mplayer non li può usare
# Basta riscrivere l'indirizzo in rstp://...
# Versione 2 (18/10/2009) Recupero contenuti accessori: html, immagine, altri file...
# Versione 2.1 (20/10/2009) Meno file *ram da scaricare in caso di download terminato
# File html migliorati
# Versione 3 (15/05/2010) Nuovo sito RAI; le nuove pagine dovrebbero rimanere stabili
# per qualche tempo dopo la grande migrazione a SilverLight...
# Versione 3.1 (09/06/2010) RealMedia Analyzer
# Nome stream o nome file?
# Riscrittura dei messaggi di output durante l'esecuzione
# Trap Ctrl C per pulire in uscita
# MPlayer non da errore in caso di Ctrl C, test output
# Versione 3.2 (21/08/2011) Maggiore efficienza riavviando lo script
# Vari controlli errori
# Versione 3.3 (19/11/2011) Argomento obbligatorio: all, list oppure lista codici serie
# Vari controlli errori

if [ $# -eq "0" ] # Nessun argomento?
then
echo "Utilizzo:"
echo " `basename $0` all -> Scarica tutte le serie"
echo " `basename $0` list -> Elenca le serie disponibili ed esce"
echo " `basename $0` [codice_serie] [codice_serie] -> Scarica la/le serie selezionata/e"
exit 1
fi

ALL=1
LIST=0
declare -a SERIES_SELECTED

NO_RMA=0

DELIM=""
for option in "$@"; do
case "$option" in
all) ALL=1;;
list) LIST=1; ALL=0;;
--no-rma) NO_RMA=1;;
*) ALL=0; SERIES_SELECTED+=("$option");;
esac
done

function IsSerieSelected()
{
if [ -z "$1" ]; then
return 1
fi

if [[ $ALL -eq 1 ]] && [[ ${#SERIES_SELECTED[@]} -eq 0 ]]; then
return 0
fi

for serie in ${SERIES_SELECTED[@]}; do
if [ "$serie" == "$1" ]; then
return 0
fi
done

return 1
}

function RemoveSelected()
{
IDX=0
for serie in ${SERIES_SELECTED[@]}; do
if [ "$serie" == "$1" ]; then
unset SERIES_SELECTED[IDX]
fi
((IDX++))
done
}

function CheckRemainingSelected()
{
if [[ $ALL -eq 0 ]] && [[ ${#SERIES_SELECTED[@]} -eq 0 ]]; then
return 1
fi

return 0
}

# trap keyboard interrupt (control-c)
trap control_c SIGINT
# trap standart sigterm
trap control_c SIGTERM
EXIT_AS_SOON_AS_POSS=0

# file that flags a folder as completely downloaded
FILE_FLAG_DONE=".done"

control_c()
{
printf "\n\n%s\n\n" "*** Richiesta uscita script: attendere, prego... ***"
EXIT_AS_SOON_AS_POSS=1
}

#cartella di lavoro
TEMP_FOLDER="alle8dellasera_TMP"
if [[ ! -d "$TEMP_FOLDER" ]]; then
printf "%s\n%s\n\n%s\n%s\n\n" \
"Benvenuto in \"Alle otto della sera\" downloader." \
"Prima esecuzione dello script: creo la certella temporanea \"$TEMP_FOLDER\"" \
" *** Potrai eliminare questa cartella al termine ***" \
" *** del download di tutte le serie che ti interessano ***"
fi

mkdir -p "$TEMP_FOLDER"
cd "$TEMP_FOLDER"

#RealMedia analyzer
RMA="./rma"

if [[ $LIST -eq 0 ]] && [[ $NO_RMA -eq 0 ]] && [[ ! -f "$RMA" ]]; then
RMA_FULL_NAME="rma-0.30.00-linux-i386"
printf "\n%s\n%s\n" "Sto scaricando una utilità per riparare gli stream: RealMedia Analyzer ($RMA_FULL_NAME)" \
"Eseguire lo script con argomento --no-rma per saltare questo passaggio."
if [[ ! -f "$RMA_FULL_NAME.gz" ]]; then
wget -q "http://users.i.com.ua/~alexeysp/rma/$RMA_FULL_NAME.gz"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget RMA failed!\n"; rm "$RMA_FULL_NAME.gz" ; fi
fi
gzip -qdc "$RMA_FULL_NAME.gz" > "$RMA"
chmod +x "$RMA"
fi

#Viene creata una paginetta html con la descrizione di ogni serie
#testata html
HEAD="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
HEAD="$HEAD\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
HEAD="$HEAD<html>\n<head>\n"
HEAD="$HEAD<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\"/>\n"
HEAD="$HEAD<title>RADIO DUE</title>\n"
HEAD="$HEAD<style TYPE=\"text/css\">\n<!--\n\n"

#qui in mezzo includo le stile da css

#fine testata
HEAD_CLOSE="\n\n"
HEAD_CLOSE="$HEAD_CLOSE-->\n"
HEAD_CLOSE="$HEAD_CLOSE</style>\n</head>\n<body>\n"

#coda html
TAIL="</body>\n</html>"

if [[ ! -f "style.css" ]]; then
wget -q -O - "http://www.rai.tv/dl/Radio2/css/Radio2.css" > style.css
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget css failed!\n"; rm style.css ; exit 1; fi
fi

INDEX_ALLEOTTO="alleottodellasera.html"

#recupero indice generale
if [[ ! -f "$INDEX_ALLEOTTO" ]]; then
wget -q -O - "http://www.rai.it/dl/Radio2/alleottodellasera.html" > $INDEX_ALLEOTTO
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget global index failed!\n"; rm $INDEX_ALLEOTTO; exit 1; fi
fi

#estraggo i link alle serie di puntate
SERIES=`cat $INDEX_ALLEOTTO | sed \
-e '/<a href="\/dl\/Radio2\/sito\/item\/ContentItem-[A-Za-z0-9-]\{36\}.html">segue...<\/a>/!d' \
-e 's;^<a href=";;' -e 's;".*$;;'`

SERIE_DONE=0

NR_INDEX=1
for serie in $SERIES; do
#recupero indici serie
#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$NR_INDEX" ]]; then
mkdir "serie$NR_INDEX"
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]]; then
REDIRECT="$(wget -q -O - "http://www.rai.it/$serie")"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget redirect failed!\n"; exit 1; fi
LINK=`echo $REDIRECT | sed \
-e "s;.*document.location[[:space:]]*=[[:space:]]*';;" \
-e "s/'[[:space:]]*;.*//"`

wget -q -O - "http://www.rai.it/$LINK" > "serie$NR_INDEX/index.htm"
if [[ "$?" -ne 0 ]]; then
if [[ $LIST -eq 0 ]]; then
echo -ne "\nwget index failed!\n";
fi
rm "serie$NR_INDEX/index.htm";
((NR_INDEX++))
continue
fi
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]]; then
exit 0 ;
fi

EPISODES=`cat "serie$NR_INDEX/index.htm" | sed \
-e '/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="/!d' \
-e 's/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="//' \
-e 's/.html">[^\n^$]*<\/a>/.html/'`

export TITLE_HTML=$(cat "serie$NR_INDEX/index.htm" | sed \
-e '/<div class="Titolo">/!d' \
-e 's/^[[:space:]]*<div class="Titolo">//' \
-e 's\</div>[[:space:]]*\\')

TITLE=$(perl -MHTML::Entities -e 'print decode_entities($ENV{'TITLE_HTML'});')
unset -v TITLE_HTML

if [[ -z $EPISODES ]]; then
if [[ $LIST -eq 0 ]]; then
echo -ne "\n\nLa serie \"$TITLE\" non contiene nessuna puntata?!" ;
echo -ne "\nURL: http://www.rai.it/$serie\n" ;
fi
((NR_INDEX++))
continue ;
fi

NR_EPISODE=1
#questa flag viene portata a zero se un download di mplayer fallisce
#in questo caso non viene creato il file FILE_FLAG_DONE, che marca una cartella come terminata
SERIE_DONE=1

for episode in $EPISODES; do
if [[ ! -f "serie$NR_INDEX/$NR_EPISODE.htm" ]]; then
wget -q -O - "$episode" > "serie$NR_INDEX/$NR_EPISODE.htm"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget episode failed!\n"; rm "serie$NR_INDEX/$NR_EPISODE.htm"; exit 1; fi
fi

#estraggo il link al file *.ram
RAM=`cat "serie$NR_INDEX/$NR_EPISODE.htm" | sed \
-e '/<embed [Cc][Oo][Nn][Ss][Oo][Ll][Ee]="[[:alpha:]]*" [Nn][Oo][Ll][Oo][Gg][Oo]="[[:alpha:]]*" [Aa][Uu][Tt][Oo][Ss][Tt][Aa][Rr][Tt]="[[:alpha:]]*" [Cc][Ee][Nn][Tt][Ee][Rr]="[[:alpha:]]*" [Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]="[[:alpha:]]*" src="http:\/\/www.rai.it\/dl\/audio\/[^\n^$]*.ram"/!d' \
-e 's/<embed [Cc][Oo][Nn][Ss][Oo][Ll][Ee]="[[:alpha:]]*" [Nn][Oo][Ll][Oo][Gg][Oo]="[[:alpha:]]*" [Aa][Uu][Tt][Oo][Ss][Tt][Aa][Rr][Tt]="[[:alpha:]]*" [Cc][Ee][Nn][Tt][Ee][Rr]="[[:alpha:]]*" [Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]="[[:alpha:]]*" src="//' \
-e 's/.ram".*$/.ram/'`

if [[ -z $RAM ]]; then
if [[ $LIST -eq 0 ]]; then
echo -ne "\n\"$TEMP_FOLDER/serie$NR_INDEX/$NR_EPISODE.htm\""
echo -ne "\nNon esiste un riferimento corretto al file audio\n" ;
echo -ne "Potrebbe trattarsi di un'errore nella pagina HTML o un tag <embed> dalla sintassi inaspettata\n" ;
fi
((NR_EPISODE++))
continue
fi

#recupero l'indirizzo dello stream *.ra
STREAM=`wget -q -O - $RAM`
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget ram failed!\n"; exit 1; fi
#pulizia necessaria...
STREAM=`echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/'`
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
STREAM=`echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//'`

#suddivido i file per serie: estraggo i nomi necessari
FILE_NAME=`echo $RAM | sed 's/.*\///' | sed 's/m$//'`
STREAM_NAME=`echo $STREAM | sed -e 's/.*\///'`
if [[ ${#FILE_NAME} -le ${#STREAM_NAME} ]]; then
FILE_NAME="$STREAM_NAME"
fi
SERIE_NAME_PREV="$SERIE_NAME"
SERIE_NAME=`echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///'`

if [[ ! -z $SERIE_NAME_PREV ]] && [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ "$SERIE_NAME" =~ "$SERIE_NAME_PREV" ]] || [[ "$SERIE_NAME_PREV" =~ "$SERIE_NAME" ]]; then
if [[ $LIST -eq 0 ]]; then
echo -ne "\nDiscrepanze nel nome della serie? Prima: \"$SERIE_NAME_PREV\", ora: \"$SERIE_NAME\"" ;
echo -ne "\nMantengo nome serie \"$SERIE_NAME_PREV\"" ;
fi
SERIE_NAME="$SERIE_NAME_PREV";
fi
fi

if [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
continue ;
fi

if [[ -z $SERIE_NAME_PREV ]] || [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ $LIST -eq 1 ]]; then
echo "Codice: $SERIE_NAME" ;
echo "Titolo: \"$TITLE\"" ;
echo -ne "URL: http://www.rai.it/$serie\n\n" ;
break
fi

if ( ! IsSerieSelected "$SERIE_NAME" ); then
break
fi

#creazione cartelle serie
if [[ ! -d "../$SERIE_NAME" ]]; then
mkdir "../$SERIE_NAME"
printf "\n\n%s" "Inizio download serie \"$SERIE_NAME\"" ;
else
printf "\n\n%s" "Proseguo download serie \"$SERIE_NAME\"" ;
fi
fi

if ( ! IsSerieSelected "$SERIE_NAME" ); then
break
fi

if [[ $LIST -eq 1 ]]; then
break
fi

#creazione indice html
if [[ ! -f "../$SERIE_NAME/$SERIE_NAME.html" ]]; then
echo -e "\nCreazione indice html: $SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD > "../$SERIE_NAME/$SERIE_NAME.html"
cat style.css >> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $HEAD_CLOSE >> "../$SERIE_NAME/$SERIE_NAME.html"
cat "serie$NR_INDEX/index.htm" \
| sed -n -e '/ id=\"SitoBody\">/,/<div class=\"Bot\"><\/div>/p' -e 's/<div class=\"Bot\"><\/div>/<div class=\"Bot\"><\/div><\/div>/' \
>> "../$SERIE_NAME/$SERIE_NAME.html"
echo -e $TAIL >> "../$SERIE_NAME/$SERIE_NAME.html"

#recupero eventuale immagine
IMAGE=`sed -e '/<img src=\"/!d' -e 's/.*<img src=\"//' -e 's/\"[[:space:]]*[[:alpha:]]*=\".*$//' "../$SERIE_NAME/$SERIE_NAME.html"`
if [[ ! -z $IMAGE ]]; then
IMAGE_NAME=`echo $IMAGE | sed -e 's/.*\///'`
echo "L'indice contiene un'immagine -> $SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

if [[ ! -f "../$SERIE_NAME/contenuti/$IMAGE_NAME" ]]; then
wget -q -O - "$IMAGE" > "../$SERIE_NAME/contenuti/$IMAGE_NAME"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget image failed!\n"; rm "../$SERIE_NAME/contenuti/$IMAGE_NAME"; fi
fi

#riscritture indirizzo immagine: da remota a locale
LOCAL_NAME="contenuti/$IMAGE_NAME"
sed -i 's;'$IMAGE';'$LOCAL_NAME';g' "../$SERIE_NAME/$SERIE_NAME.html"
fi

#alcune serie hanno anche dei contenuti aggiuntivi: li recupero
LINKS=`sed -e '/<a href=\"/!d' -e 's/<a href=\"/\n/g' ../$SERIE_NAME/$SERIE_NAME.html | sed -e '/http:/!d' -e 's/\">.*$//'`
if [[ ! -z $LINKS ]]; then
if [[ ! -d "../$SERIE_NAME/contenuti" ]]; then
mkdir "../$SERIE_NAME/contenuti"
fi

for link in $LINKS; do
FILE_NAME=`echo $link | sed -e 's/.*\///'`
if [[ ! -f "../$SERIE_NAME/contenuti/$FILE_NAME" ]]; then
echo "Contenuto aggiuntivo -> $SERIE_NAME/contenuti/$FILE_NAME"
wget -q -O - "$link" > "../$SERIE_NAME/contenuti/$FILE_NAME"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget file failed!\n"; rm "../$SERIE_NAME/contenuti/$FILE_NAME"; fi
fi

#riscrittura indirizzo contenuto
LOCAL_NAME="contenuti/$FILE_NAME"
sed -i 's*'$link'*'$LOCAL_NAME'*g' "../$SERIE_NAME/$SERIE_NAME.html"
done
fi
fi

if [[ -n $STREAM_NAME ]] && [[ -f "../$SERIE_NAME/$STREAM_NAME" ]] && [[ "${STREAM_NAME}" != "${FILE_NAME}" ]]; then
mv "../$SERIE_NAME/$STREAM_NAME" "../$SERIE_NAME/$FILE_NAME"
fi

if [[ ! -f "../$SERIE_NAME/$FILE_NAME" ]]; then
#se il file non esiste procedo con il download
printf "\n%s" "In download: $FILE_NAME = $STREAM"
OUTPUT=$(mplayer -noconsolecontrols -nojoystick -nolirc -quiet -prefer-ipv4 -noframedrop -dumpfile \
../$SERIE_NAME/$FILE_NAME -dumpstream $STREAM 2>&1)

if [[ "$?" -ne 0 ]] || [[ -z $(echo $OUTPUT | grep "Stream EOF detected") ]]; then
echo -ne "\nMPlayer failed!\n"
SERIE_DONE=0
rm "../$SERIE_NAME/$FILE_NAME"
fi
else
#il file esiste già.
#Due casi possibili:
# - è già stato scaricato in un'esecuzione precedente
# - è stato solamente iniziato, è sfuggito alle trap ed è incompleto...
# QUESTO SCRIPT NON SI ACCORGE DI EVENTUALI FILE INCOMPLETI E NON LI SCARICA PIU'
# Tenta di intercettare il termine dell'esecuzione dello script rimuovendo eventuali
# file incompleti (ma se, per esempio, manca la corrente...)
printf "\n%s" "Già scaricato: $SERIE_NAME/$FILE_NAME = $STREAM"
fi

if [[ "$1" != "-no-rma" ]] && [[ ! "$RMA" ]]; then
PROCESSED=`$RMA -d "../$SERIE_NAME/$FILE_NAME" | grep "This file has been processed by RealMedia Analyzer"`
if [[ -f "../$SERIE_NAME/$FILE_NAME" ]] && [[ -z $PROCESSED ]]; then
if $RMA -ft "../$SERIE_NAME/$FILE_NAME" >/dev/null 2>&1 ; then
echo -n "."
else
echo -ne "\n*rma -ft warning*"
touch "../$SERIE_NAME/$FILE_NAME-rma_ft_WARNING"
fi
if $RMA -i "../$SERIE_NAME/$FILE_NAME" >/dev/null 2>&1 ; then
echo -n "."
else
echo -ne "\n*rma -i warning*"
touch "../$SERIE_NAME/$FILE_NAME-rma_i_WARNING"
fi
fi
fi

if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
exit 0 ;
fi

((NR_EPISODE++))
done

((NR_INDEX++))

if ( ! IsSerieSelected "$SERIE_NAME" ); then
continue
fi
RemoveSelected "$SERIE_NAME"

if [[ $LIST -eq 1 ]]; then
continue
fi

if [[ SERIE_DONE -eq 1 ]] && [[ ! -z $SERIE_NAME ]] && [[ ! -z $FILE_FLAG_DONE ]] && [[ ! -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" terminata!"
touch "../$SERIE_NAME/$FILE_FLAG_DONE"
elif [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" marcata come terminata (file \"$SERIE_NAME/$FILE_FLAG_DONE\")."
fi

if ( ! CheckRemainingSelected ); then
echo
exit 0
fi
done
#gimli

Gimli[2BV!2B]
20-11-2011, 01:32
#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indice generale
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra
#
# Versione 1.1 (18/10/2009) Alcuni stream sono di tipo pnm, mplayer non li può usare
# Basta riscrivere l'indirizzo in rstp://...
# Versione 2 (18/10/2009) Recupero contenuti accessori: html, immagine, altri file...
# Versione 2.1 (20/10/2009) Meno file *ram da scaricare in caso di download terminato
# File html migliorati
# Versione 3 (15/05/2010) Nuovo sito RAI; le nuove pagine dovrebbero rimanere stabili
# per qualche tempo dopo la grande migrazione a SilverLight...
# Versione 3.1 (09/06/2010) RealMedia Analyzer
# Nome stream o nome file?
# Riscrittura dei messaggi di output durante l'esecuzione
# Trap Ctrl C per pulire in uscita
# MPlayer non da errore in caso di Ctrl C, test output
# Versione 3.2 (21/08/2011) Maggiore efficienza riavviando lo script
# Vari controlli errori
# Versione 3.3 (19/11/2011) Argomento obbligatorio: all, list oppure lista codici serie
# Vari controlli errori
# Versione 4.0 (20/11/2011) Recupero di alcune serie legacy inaccessibili
# Riscrittura spezzando la procedura in funzioni più leggibili

if [ $# -eq "0" ] # Nessun argomento?
then
echo "Utilizzo:"
echo " `basename $0` all -> Scarica tutte le serie"
echo " `basename $0` list -> Elenca le serie disponibili ed esce"
echo " `basename $0` [codice_serie] [codice_serie] -> Scarica la/le serie selezionata/e"
exit 0
fi

export ALL=1
export LIST=0
declare -a SERIES_SELECTED
declare -a SERIES_LEGACY_TITLE
declare -a SERIES_LEGACY_CODE

#Puntate non elencate nel nuovo sito RAI
SERIES_LEGACY_TITLE+=("Chung Kuo-Cina, l'Impero di Mezzo")
SERIES_LEGACY_CODE+=("chungkuo")
SERIES_LEGACY_TITLE+=("Il Globo, la mappa, il Mondo")
SERIES_LEGACY_CODE+=("globo")
SERIES_LEGACY_TITLE+=("Il mestiere dell'artista. L'Ottocento")
SERIES_LEGACY_CODE+=("ilmestieredellartista800")
SERIES_LEGACY_TITLE+=("Sex and the Polis")
SERIES_LEGACY_CODE+=("sexandthepolis")

#Completamente inaccessibile nel nuovo sito RAI
SERIES_LEGACY_TITLE+=("Le porte dei sogni")
SERIES_LEGACY_CODE+=("portedeisogni")

#Non so dove sia, i link sono rotti e non esite una pagina legacy
#SERIES_LEGACY_TITLE+=("Il divano di Istanbul")
#SERIES_LEGACY_CODE+=("ildivanodiistanbul")"

NO_RMA=0

DELIM=""
for option in "$@"; do
case "$option" in
all) ALL=1;;
list) export LIST=1; export ALL=0;;
--no-rma) export NO_RMA=1;;
*) export ALL=0; SERIES_SELECTED+=("$option");;
esac
done

function IsSerieSelected()
{
if [ -z "$1" ]; then
return 1
fi

if [[ $LIST -eq 1 ]]; then
return 0
fi

if [[ $ALL -eq 1 ]] && [[ ${#SERIES_SELECTED[@]} -eq 0 ]]; then
return 0
fi

for serie in ${SERIES_SELECTED[@]}; do
if [ "$serie" == "$1" ]; then
return 0
fi
done

return 1
}

function RemoveSelected()
{
IDX=0
for serie in ${SERIES_SELECTED[@]}; do
if [ "$serie" == "$1" ]; then
unset SERIES_SELECTED[IDX]
fi
((IDX++))
done
}

function CheckRemainingSelected()
{
if [[ $ALL -eq 0 ]] && [[ ${#SERIES_SELECTED[@]} -eq 0 ]]; then
return 1
fi

return 0
}

function GetCodeFromTitle()
{
if [ -z "$1" ]; then
return 1
fi

for (( i = 0 ; i < ${#SERIES_LEGACY_TITLE } ; i++ )); do
if [[ "${SERIES_LEGACY_TITLE[$i]}" =~ "$1" ]] || [[ "$1" =~ "${SERIES_LEGACY_TITLE[$i]}" ]]; then
echo ${SERIES_LEGACY_CODE[$i]}
return 0
fi
done

return 1
}

function GetDirectLink()
{
REDIRECT=$(wget -q -O - "http://www.rai.it/$1") ;
if [[ "$?" -ne 0 ]]; then
echo -ne "\nwget redirect failed!\n";
exit 1;
fi
echo -ne "http://www.rai.it/" ;
echo $(echo $REDIRECT | sed \
-e "s;.*document.location[[:space:]]*=[[:space:]]*';;" \
-e "s/'[[:space:]]*;.*//") ;
unset REDIRECT ;
}

function DownloadIndexSerie()
{
#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$1" ]]; then
mkdir "serie$1" ;
fi

SUFFIX="" ;
if [[ $3 -eq 0 ]]; then
LINK_DIRECT=$(GetDirectLink "$2") ;
else
LINK_DIRECT="$2" ;
SUFFIX="_legacy" ;
fi

if [[ ! -f "serie$1/index$SUFFIX.htm" ]]; then
wget -q -O - "$LINK_DIRECT" > "serie$1/index$SUFFIX.htm"
if [[ "$?" -ne 0 ]]; then
rm "serie$1/index$SUFFIX.htm" ;
unset LINK_DIRECT ;
return 1 ;
fi
unset LINK_DIRECT ;
fi
return 0 ;
}

function GetHTMLtitle()
{
export TITLE_HTML=$(sed \
-e '/<div class="Titolo">/!d' \
-e 's/^[[:space:]]*<div class="Titolo">//' \
-e 's\</div>[[:space:]]*\\' "$1") ;

TITLE=$(perl -MHTML::Entities -e 'print decode_entities($ENV{'TITLE_HTML'});') ;
unset -v TITLE_HTML ;
echo "$TITLE" ;
}

function GetSeries()
{
echo $(sed \
-e '/<a href="\/dl\/Radio2\/sito\/item\/ContentItem-[A-Za-z0-9-]\{36\}.html">segue...<\/a>/!d' \
-e 's;^<a href=";;' -e 's;".*$;;' "$1") ;
}

function GetEpisodes()
{
echo $(sed \
-e '/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="/!d' \
-e 's/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="//' \
-e 's/.html">[^\n^$]*<\/a>/.html/' "$1") ;
}

function GetRAM()
{
echo $(sed \
-e '/<embed [Cc][Oo][Nn][Ss][Oo][Ll][Ee]="[[:alpha:]]*" [Nn][Oo][Ll][Oo][Gg][Oo]="[[:alpha:]]*" [Aa][Uu][Tt][Oo][Ss][Tt][Aa][Rr][Tt]="[[:alpha:]]*" [Cc][Ee][Nn][Tt][Ee][Rr]="[[:alpha:]]*" [Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]="[[:alpha:]]*" src="http:\/\/www.rai.it\/dl\/audio\/[^\n^$]*.ram"/!d' \
-e 's/<embed [Cc][Oo][Nn][Ss][Oo][Ll][Ee]="[[:alpha:]]*" [Nn][Oo][Ll][Oo][Gg][Oo]="[[:alpha:]]*" [Aa][Uu][Tt][Oo][Ss][Tt][Aa][Rr][Tt]="[[:alpha:]]*" [Cc][Ee][Nn][Tt][Ee][Rr]="[[:alpha:]]*" [Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]="[[:alpha:]]*" src="//' \
-e 's/.ram".*$/.ram/' "$1") ;
}

function GetStream()
{
STREAM=$(wget -q -O - "$1") ;
if [[ "$?" -ne 0 ]]; then
return 1 ;
fi
#pulizia necessaria...
STREAM=$(echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/') ;
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
echo $(echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//') ;
unset STREAM ;
}

function DownloadStream()
{
if [[ ! -f "../$1/$2" ]]; then
#se il file non esiste procedo con il download
printf "\n%s" "In download: $2 = $3" ;
OUTPUT=$(mplayer -noconsolecontrols -nojoystick -nolirc -quiet -prefer-ipv4 -noframedrop -dumpfile \
../$1/$2 -dumpstream $3 2>&1) ;

if [[ "$?" -ne 0 ]] || [[ -z $(echo $OUTPUT | grep "Stream EOF detected") ]]; then
echo -ne "\nMPlayer failed!\n" ;
rm "../$1/$2" ;
return 1 ;
fi
if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
return 3 ;
fi
else
#il file esiste già.
#Due casi possibili:
# - è già stato scaricato in un'esecuzione precedente
# - è stato solamente iniziato, è sfuggito alle trap ed è incompleto...
# QUESTO SCRIPT NON SI ACCORGE DI EVENTUALI FILE INCOMPLETI E NON LI SCARICA PIU'
# Tenta di intercettare il termine dell'esecuzione dello script rimuovendo eventuali
# file incompleti (ma se, per esempio, manca la corrente...)
printf "\n%s" "Già scaricato: $1/$2 = $3" ;
fi
return 0 ;
}

function ProcessStandard()
{
NR_EPISODE=1 ;

for episode in $1; do
if [[ ! -f "serie$2/$NR_EPISODE.htm" ]]; then
wget -q -O - "$episode" > "serie$2/$NR_EPISODE.htm"
if [[ "$?" -ne 0 ]]; then
echo -ne "\nwget episode failed!\n" ;
rm "serie$2/$NR_EPISODE.htm" ;
return 1 ;
fi
fi

#estraggo il link al file *.ram
RAM=$(GetRAM "serie$2/$NR_EPISODE.htm")

if [[ -z $RAM ]]; then
if [[ $LIST -eq 0 ]]; then
echo -ne "\n\"$TEMP_FOLDER/serie$2/$NR_EPISODE.htm -> Non esiste un riferimento corretto al file audio\n" ;
echo -ne "Potrebbe trattarsi di un'errore nella pagina HTML o un tag <embed> dalla sintassi inaspettata\n" ;
fi
((NR_EPISODE++)) ;
continue ;
fi

ProcessStream "$RAM" "$2" 0 ;
case $? in
1) return 1 ;;
2) return 2 ;;
3) return 3 ;;
*) ;;
esac

((NR_EPISODE++)) ;
done
return 0 ;
}

function ProcessLegacy()
{
#recupero indici serie
SUFFIX="_legacy" ;
if ( ! DownloadIndexSerie "$NR_INDEX" "$1" 1 ); then
if [[ $LIST -eq 0 ]]; then
echo -ne "\nwget index $NR_INDEX failed!\n";
fi
return 1 ;
fi

if [[ ! -f "serie$2/index$SUFFIX.htm" ]]; then
return 1 ;
fi

RAMS=$(sed \
-e '/Q_CANALE=http:\/\/www.radio.rai.it\/\/radio2\/alleotto\//!d'\
-e 's/.*Q_CANALE=[^h]*//'\
-e 's/.ram.,.*$/.ram/' "serie$2/index$SUFFIX.htm" | uniq | sort) ;

for ram in $RAMS; do
ProcessStream "$ram" "$2" 1 ;
case $? in
1) return 1 ;;
2) return 2 ;;
3) return 3 ;;
*) ;;
esac
done
return 0 ;
}

function ProcessStream()
{
#recupero l'indirizzo dello stream *.ra
STREAM=$(GetStream "$1") ;

#suddivido i file per serie: estraggo i nomi necessari
FILE_NAME=$(echo $1 | sed 's/.*\///' | sed 's/m$//') ;
STREAM_NAME=$(echo $STREAM | sed -e 's/.*\///') ;
if [[ ${#FILE_NAME} -le ${#STREAM_NAME} ]]; then
FILE_NAME="$STREAM_NAME" ;
fi
SERIE_NAME_PREV="$SERIE_NAME" ;
export SERIE_NAME=$(echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///') ;

if [[ ! -z $SERIE_NAME_PREV ]] && [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ "$SERIE_NAME" =~ "$SERIE_NAME_PREV" ]] || [[ "$SERIE_NAME_PREV" =~ "$SERIE_NAME" ]]; then
export SERIE_NAME="$SERIE_NAME_PREV";
fi
fi

if [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
return 1
fi

if ( ! IsSerieSelected "$SERIE_NAME" ); then
return 1
fi

if [[ -z $SERIE_NAME_PREV ]] || [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ $LIST -eq 1 ]]; then
echo "Codice: $SERIE_NAME" ;
echo "Titolo: \"$TITLE\"" ;
echo -ne "URL: http://www.rai.it/$serie\n\n" ;
return 2
fi

#creazione cartelle serie
if [[ ! -d "../$SERIE_NAME" ]]; then
mkdir "../$SERIE_NAME"
printf "\n\n%s" "Inizio download serie \"$SERIE_NAME\"" ;
else
printf "\n\n%s" "Proseguo download serie \"$SERIE_NAME\"" ;
fi
fi

if [[ $LIST -eq 1 ]]; then
return 2
fi

#creazione indice html
CreateHTMLindex "$SERIE_NAME" "$2" "$3" ;

if [[ -n $STREAM_NAME ]] && [[ -f "../$SERIE_NAME/$STREAM_NAME" ]] && [[ "${STREAM_NAME}" != "${FILE_NAME}" ]]; then
mv "../$SERIE_NAME/$STREAM_NAME" "../$SERIE_NAME/$FILE_NAME"
fi

if ( ! DownloadStream "$SERIE_NAME" "$FILE_NAME" "$STREAM" ); then
export SERIE_DONE=0;
else
if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
if [[ -f "../$SERIE_NAME/$FILE_NAME" ]]; then
rm "../$SERIE_NAME/$FILE_NAME" ;
fi
return 3 ;
fi
ProcessRMA "$SERIE_NAME/$FILE_NAME" ;
fi

if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
return 3 ;
fi

return 0 ;
}

#Viene creata una paginetta html con la descrizione di ogni serie
#testata html
HEAD="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n"
HEAD="$HEAD\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"
HEAD="$HEAD<html>\n<head>\n"
HEAD="$HEAD<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\"/>\n"
HEAD="$HEAD<title>RADIO DUE</title>\n"
HEAD="$HEAD<style TYPE=\"text/css\">\n<!--\n\n"

#qui in mezzo includo le stile da css

#fine testata
HEAD_CLOSE="\n\n"
HEAD_CLOSE="$HEAD_CLOSE-->\n"
HEAD_CLOSE="$HEAD_CLOSE</style>\n</head>\n<body>\n"

#coda html
TAIL="</body>\n</html>"

function GetHTMLcontent()
{
echo $(sed \
-n -e '/ id=\"SitoBody\">/,/<div class=\"Bot\"><\/div>/p'\
-e 's/<div class=\"Bot\"><\/div>/<div class=\"Bot\"><\/div><\/div>/' "$1") ;
}

function GetHTMLcontentLegacy()
{
echo $(sed \
-n -e '/<span class=\"solotesto\"> Alle otto della sera <\/span><\/div>/,/<div class=\"schede_interne_\(contenuti\|riascolta_a4\)\">/p' \
-e '/<div class=\"schede_interne_\(contenuti\|riascolta_a4\)\">/d' "$1") ;
}

function CreateHTMLindex()
{
if [[ -f "../$1/$1.html" ]]; then
return 0
fi

LEGACY=$3 ;
if [ "$1" != "portedeisogni" ]; then
LEGACY=0 ;
fi

echo -e "\nCreazione indice html: $1/$1.html" ;
echo -e $HEAD > "../$1/$1.html" ;
cat style.css >> "../$1/$1.html" ;
echo -e $HEAD_CLOSE >> "../$1/$1.html" ;
SUFFIX="" ;
if [[ $LEGACY -eq 0 ]]; then
GetHTMLcontent "serie$2/index.htm" >> "../$1/$1.html"
else
SUFFIX="_legacy" ;
GetHTMLcontentLegacy "serie$2/index$SUFFIX.htm" >> "../$1/$1.html"
fi
echo -e $TAIL >> "../$1/$1.html" ;

#recupero eventuale immagine
IMAGE=$(sed -e '/<img src=\"/!d' -e 's/.*<img src=\"//' -e 's/\"[[:space:]]*[[:alpha:]]*=\".*$//' "../$1/$1.html") ;
if [[ ! -z $IMAGE ]]; then
IMAGE_NAME=`echo $IMAGE | sed -e 's/.*\///'`
echo "L'indice contiene un'immagine -> $1/contenuti/$IMAGE_NAME"
if [[ ! -d "../$1/contenuti" ]]; then
mkdir "../$1/contenuti"
fi

if [[ ! -f "../$1/contenuti/$IMAGE_NAME" ]]; then
if [[ $LEGACY -eq 0 ]]; then
wget -q -O - "$IMAGE" > "../$1/contenuti/$IMAGE_NAME" ;
else
wget -q -O - "http://www.radio.rai.it$IMAGE" > "../$1/contenuti/$IMAGE_NAME" ;
fi
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget image failed!\n"; rm "../$1/contenuti/$IMAGE_NAME"; fi
fi

#riscritture indirizzo immagine: da remota a locale
LOCAL_NAME="contenuti/$IMAGE_NAME"
sed -i 's;'$IMAGE';'$LOCAL_NAME';g' "../$1/$1.html"
fi

#alcune serie hanno anche dei contenuti aggiuntivi: li recupero
LINKS=$(sed -e '/<a href=\"/!d' -e 's/<a href=\"/\n/g' ../$1/$1.html | sed -e '/http:/!d' -e 's/\">.*$//') ;
if [[ ! -z $LINKS ]]; then
if [[ ! -d "../$1/contenuti" ]]; then
mkdir "../$1/contenuti" ;
fi

for link in $LINKS; do
FILE_NAME=`echo $link | sed -e 's/.*\///'`
if [[ ! -f "../$1/contenuti/$FILE_NAME" ]]; then
echo "Contenuto aggiuntivo -> $1/contenuti/$FILE_NAME" ;
wget -q -O - "$link" > "../$1/contenuti/$FILE_NAME" ;
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget file failed!\n"; rm "../$1/contenuti/$FILE_NAME"; fi
fi

#riscrittura indirizzo contenuto
LOCAL_NAME="contenuti/$FILE_NAME" ;
sed -i 's*'$link'*'$LOCAL_NAME'*g' "../$1/$1.html" ;
done
fi
}

function ProcessRMA()
{
if [[ $NO_RMA -eq 0 ]] && [[ ! "$RMA" ]]; then
return 0 ;
fi

PROCESSED=`$RMA -d "../$1" | grep "This file has been processed by RealMedia Analyzer"`
if [[ -f "../$1" ]] && [[ -z $PROCESSED ]]; then
if $RMA -ft "../$1" >/dev/null 2>&1 ; then
echo -n "." ;
else
echo -ne "\n*rma -ft warning*" ;
touch "../$1-rma_ft_WARNING" ;
fi
if $RMA -i "../$1" >/dev/null 2>&1 ; then
echo -n "." ;
else
echo -ne "\n*rma -i warning*" ;
touch "../$1-rma_i_WARNING" ;
fi
fi
unset PROCESSED ;
}

# trap keyboard interrupt (control-c)
trap control_c SIGINT
# trap standart sigterm
trap control_c SIGTERM
EXIT_AS_SOON_AS_POSS=0

# file that flags a folder as completely downloaded
FILE_FLAG_DONE=".done"

control_c()
{
printf "\n\n%s\n\n" "*** Richiesta uscita script: attendere, prego... ***"
EXIT_AS_SOON_AS_POSS=1
}

#cartella di lavoro
TEMP_FOLDER="alle8dellasera_TMP"
if [[ ! -d "$TEMP_FOLDER" ]]; then
printf "%s\n%s\n\n%s\n%s\n\n" \
"Benvenuto in \"Alle otto della sera\" downloader." \
"Prima esecuzione dello script: creo la certella temporanea \"$TEMP_FOLDER\"" \
" *** Potrai eliminare questa cartella al termine ***" \
" *** del download di tutte le serie che ti interessano ***"
fi

mkdir -p "$TEMP_FOLDER"
cd "$TEMP_FOLDER"

#RealMedia analyzer
RMA="./rma"

if [[ $LIST -eq 0 ]] && [[ $NO_RMA -eq 0 ]] && [[ ! -f "$RMA" ]]; then
RMA_FULL_NAME="rma-0.30.00-linux-i386"
printf "\n%s\n%s\n" "Sto scaricando una utilità per riparare gli stream: RealMedia Analyzer ($RMA_FULL_NAME)" \
"Eseguire lo script con argomento --no-rma per saltare questo passaggio."
if [[ ! -f "$RMA_FULL_NAME.gz" ]]; then
wget -q "http://users.i.com.ua/~alexeysp/rma/$RMA_FULL_NAME.gz"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget RMA failed!\n"; rm "$RMA_FULL_NAME.gz" ; fi
fi
gzip -qdc "$RMA_FULL_NAME.gz" > "$RMA"
chmod +x "$RMA"
fi

if [[ ! -f "style.css" ]]; then
wget -q -O - "http://www.rai.tv/dl/Radio2/css/Radio2.css" > style.css
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget css failed!\n"; rm style.css ; exit 1; fi
fi

INDEX_ALLEOTTO="alleottodellasera.html"

#recupero indice generale
if [[ ! -f "$INDEX_ALLEOTTO" ]]; then
wget -q -O - "http://www.rai.it/dl/Radio2/alleottodellasera.html" > $INDEX_ALLEOTTO
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget global index failed!\n"; rm $INDEX_ALLEOTTO; exit 1; fi
fi

#estraggo i link alle serie di puntate
SERIES=$(GetSeries "$INDEX_ALLEOTTO") ;

SERIE_DONE=0

NR_INDEX=1
LEPORTEDEISOGNI=0
for serie in $SERIES; do
if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
exit 0 ;
fi

#recupero indici serie
if ( ! DownloadIndexSerie "$NR_INDEX" "$serie" 0 ); then
if [[ $LIST -eq 0 ]]; then
echo -ne "\nwget index $NR_INDEX failed!\n" ;
fi
if [[ $NR_INDEX -ne 74 ]]; then
((NR_INDEX++))
continue
else
touch "serie$NR_INDEX/index.htm" ;
LEPORTEDEISOGNI=1
fi
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]] && [[ $NR_INDEX -ne 74 ]]; then
exit 0 ;
fi

EPISODES=$(GetEpisodes "serie$NR_INDEX/index.htm") ;
TITLE=$(GetHTMLtitle "serie$NR_INDEX/index.htm") ;
LEGACY=0 ; #flag modalità legacy
LEGACY_URL="" ;

if [[ $LEPORTEDEISOGNI -eq 1 ]]; then
TITLE="Le porte dei sogni" ;
LEGACY=1 ;
fi

if [[ -z $EPISODES ]]; then
#Alcune serie non sono state migrate completamente al nuovo sito RAI, gli unici link
#alle puntate sono ancora presenti nelle vecchie pagine che potrebbero finire offline
#in qualsiasi momento...
CODE=$(GetCodeFromTitle "$TITLE") ;
if [[ ! -z $CODE ]]; then
LEGACY_URL="http://www.radio.rai.it/radio2/alleotto/$CODE/" ;
fi

if [[ ! -z $LEGACY_URL ]]; then
LEGACY=1 ;
fi
if [[ $LEGACY -eq 0 ]]; then
((NR_INDEX++))
continue ;
fi
fi

#questa flag viene portata a zero se un download di mplayer fallisce
#in questo caso non viene creato il file FILE_FLAG_DONE, che marca una cartella come terminata
export SERIE_DONE=1
export SERIE_NAME="" ;
if [[ $LEGACY -eq 0 ]]; then
ProcessStandard "$EPISODES" "$NR_INDEX" ;
else
ProcessLegacy "$LEGACY_URL" "$NR_INDEX" ;
fi

if [[ $? -eq 3 ]]; then
exit 0 ;
fi

((NR_INDEX++))

if ( ! IsSerieSelected "$SERIE_NAME" ); then
continue
fi
RemoveSelected "$SERIE_NAME"

if [[ $LIST -eq 1 ]]; then
continue
fi

if [[ SERIE_DONE -eq 1 ]] && [[ ! -z $SERIE_NAME ]] && [[ ! -z $FILE_FLAG_DONE ]] && [[ ! -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" terminata!\n"
touch "../$SERIE_NAME/$FILE_FLAG_DONE"
elif [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" marcata come terminata (file \"$SERIE_NAME/$FILE_FLAG_DONE\")."
fi

if ( ! CheckRemainingSelected ); then
exit 0
fi
done
#gimliSerie scaricabili: Codice: krusciov
Titolo: "1956: Krusciov contro Stalin" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-8f49203c-e327-45d3-a6a9-515723f63959.html)
Codice: 1956lannospartiacque
Titolo: "1956. L'anno spartiacque" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-6c3e418e-6a87-4a40-90e3-e9d9a09b4431.html)
Codice: costantinopoli
Titolo: "29 maggio 1453: la caduta di Costantinopoli" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-4dfb7eff-e458-46df-a905-0c618fe06fba.html)
Codice: degasperi
Titolo: "Alcide De Gasperi" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-eef12f76-4fc8-421a-a4c3-1f05e46389a1.html)
Codice: aldomoro
Titolo: "Aldo Moro" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-41ad8553-44b8-4f2f-826a-90fd3ef89ac5.html)
Codice: alexandros
Titolo: "Alexandros" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-f0ee7a65-676e-4d84-ae56-09f0f7c3b7bf.html)
Codice: magnani
Titolo: "Anna Magnani" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-4a6aa799-1267-490a-aef5-e738a0fe9ded.html)
Codice: annibale
Titolo: "Annibale" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-729274fd-c015-4be3-bdf0-d2bdd80acc29.html)
Codice: conversazione
Titolo: "Arte e Conversazione" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-8f0f4904-04ad-4375-b548-e7cbde980be6.html)
Codice: attila
Titolo: "Attila" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-48577649-7817-411c-9891-8edf17a23ddc.html)
Codice: avanguardie
Titolo: "Avanguardie 900" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-67fae4f6-d71d-4ef4-8d62-19904354ca9c.html)
Codice: betasom
Titolo: "Betasom" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-8bcfd414-2db5-46d4-8227-cc529f5f2209.html)
Codice: ceraunavoltailmito
Titolo: "C'ERA UNA VOLTA IL MITO" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-5fd9fbe5-6d05-43dc-bf51-4fe0cda1227b.html)
Codice: carlo_magno
Titolo: "Carlo Magno" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-f88f807b-2d9f-4062-a310-5f081149934e.html)
Codice: italia
Titolo: "Chi comanda in Italia" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2a3f0263-142e-4246-9a1d-cf2080a5c8cf.html)
Codice: chungkuo
Titolo: "Chung Kuo-Cina, l'Impero di Mezzo" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-1119d30a-2abb-46e6-afcd-c3211f67d6e0.html)
Codice: cielo_terra
Titolo: "Cielo e terra" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2be3ba8c-a499-44a6-8a51-2aea4ec2b89b.html)
Codice: pierfrancescolistri
Titolo: "Città e Scrittori" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-b66b4209-5701-4e47-91fa-d9d95eac203b.html)
Codice: crack
Titolo: "Crack" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-a47f8470-e204-4b5d-a35d-6270b8d2d20f.html)
Codice: crociate
Titolo: "Crociate" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-7c7cbf48-a4a4-4081-a089-f42f190e939b.html)
Codice: mestiere_artista
Titolo: "Da Giotto a Leonardo da Vinci" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-29207496-a74b-415b-9a4c-764a7bd608c2.html)
Codice: dallafameallasazieta
Titolo: "Dalla fame alla sazietà" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-0bd33234-436e-4e7e-b6e8-de7677813256.html)
Codice: sputnik
Titolo: "Dallo Sputnik allo Shuttle" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-fc4d3b26-d1a6-4edf-9a3b-eb8dfc7288eb.html)
Codice: 10poeti
Titolo: "Dieci poeti" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-19e1e99b-6762-486b-9bc7-03ba2b36aee2.html)
Codice: francocroce
Titolo: "Dieci romanzi" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-c56972cb-4343-4826-894c-4b1d5697e316.html)
Codice: elica
Titolo: "Doppia elica" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-112ac508-df13-4647-8aec-92258768248e.html)
Codice: edda_galeazzo
Titolo: "Edda e Galeazzo" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-aa0f3541-7926-4ed9-ae84-0f196d7a0991.html)
Codice: eduardodefilippo
Titolo: "Eduardo de Filippo" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-7171e0dd-6a57-47e2-bcad-86b71131a039.html)
Codice: eroi
Titolo: "Eroi e Mostri" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-357614d5-2ef1-40ae-8471-8007bb120272.html)
Codice: montale
Titolo: "Eugenio Montale" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-1e825f35-1430-430d-9e8f-1aeb9996ead2.html)
Codice: fabbriche
Titolo: "Fabbriche" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-adb9d5d0-e21d-460c-9d3e-ceb7d65daa3a.html)
Codice: federicofellini
Titolo: "Federico Fellini" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-4f300c4a-a164-4ee9-98cd-d3023909d9e7.html)
Codice: federicosecondo
Titolo: "Federico II" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-c56d184a-8064-41a7-b87b-31f309da0e10.html)
Codice: fermat
Titolo: "Fermat" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-1a34c66f-d437-42a9-b953-a4026a4d5234.html)
Codice: flaiano
Titolo: "Flaiano" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-ad9deb19-93d6-4507-abf8-49dd359a6bca.html)
Codice: francesco_giuseppe
Titolo: "Francesco Giuseppe" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-bacfabb0-ac36-4ea1-9585-892b8fafda18.html)
Codice: gengiskhan
Titolo: "Gengis Khan" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-71303e4c-f291-4740-a4b8-74291aadbd3a.html)
Codice: ghetto
Titolo: "Ghetto" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-9a5923e1-51f9-44ec-bb9a-f776467add49.html)
Codice: giorgio_caproni
Titolo: "Giorgio Caproni" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-f4ba2237-599f-43e5-a2fe-4430a822249b.html)
Codice: alinari
Titolo: "Gli Alinari" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-0431334a-db88-49ea-90e3-7f344099b692.html)
Codice: hitchcock
Titolo: "hitchcock" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-cf872c7d-c006-4ae6-aace-24e89c1e6c20.html)
Codice: fabbro
Titolo: "Il figlio del fabbro" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-5aff8e11-4232-464e-bd09-73b56a5a1641.html)
Codice: fiore_spada
Titolo: "Il fiore e la spada" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-5db3bf7a-71e5-41f6-8e38-71b01e39c8b6.html)
Codice: fuoco_ghiaccio
Titolo: "Il fuoco e il ghiaccio" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-8d9efaa7-5a6f-4e59-86b3-d636e84e8015.html)
Codice: globo
Titolo: "Il Globo, la mappa, il Mondo " (http://www.rai.it//dl/Radio2/sito/item/ContentItem-d0ffba66-18d8-4bcf-8bb7-08266d9a1586.html)
Codice: libro_moschetto
Titolo: "Il Libro Moschetto" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-e825a3dc-968e-4dcb-a663-f8107da528ac.html)
Codice: mestiere_artista
Titolo: "Il mestiere dell'artista" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-62d60f5b-b229-42d6-bd8f-40211438a947.html)
Codice: mestiere_artista
Titolo: "Il mestiere dell'artista" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-475927e4-41b5-4d86-98f9-fc6470a2c4d1.html)
Codice: ilmestieredellartista800
Titolo: "Il mestiere dell'artista. L'Ottocento" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-d6152525-3c9d-46e6-872e-665910907497.html)
Codice: ilmestieredellartista
Titolo: "IL MESTIERE DELL'ARTISTA. SCULTORI E PITTORI DEL '700" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-fc234502-32a2-4ab8-afc8-d7b715ddb29b.html)
Codice: 11settembre
Titolo: "Il mondo dopo l'11 settembre" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-339bed3a-a6e6-429b-9a09-a49c7adbf1ca.html)
Codice: paradiso
Titolo: "Il Paradiso" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-da744aa5-6141-423a-995c-297b56e505b2.html)
Codice: ilparadisointerra
Titolo: "Il paradiso in terra" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-18c508a2-4447-4382-b5c0-bd78ff31c1ba.html)
Codice: einstein
Titolo: "Il Socrate della Fisica" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-784ef1d4-2bcd-43b4-ae13-005481902ce8.html)
Codice: ilturcoavienna
Titolo: "Il turco a Vienna" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-59dc04f8-7585-4b2b-a918-11737efb8052.html)
Codice: imestieridegliscrittori
Titolo: "I mestieri degli scrittori" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-eaa58cbc-d14b-4b15-842b-88fe5eed9704.html)
Codice: iosonolaltro
Titolo: "Io sono l'altro" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-37166f62-cecf-433d-b153-c1473f06a288.html)
Codice: potere
Titolo: "I palazzi del potere" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-3fa6165c-8c97-498d-b7e0-60cef238d810.html)
Codice: lammiragliodellezanzare
Titolo: "L'ammiraglio delle zanzare" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-56f594b5-f114-4ac1-97e7-e21423cc361d.html)
Codice: ignazio_loyola
Titolo: "L'esercito del Papa" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-029b2eec-f00f-4f5c-8319-ca55150bb5be.html)
Codice: invenzione_terra
Titolo: "L'invenzione della Terra" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2c95bd84-628d-4677-ac99-8b167dae327e.html)
Codice: guerra_fredda
Titolo: "L'Italia negli anni della Guerra Fredda" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-b3396d6c-05f6-4445-a107-e18ffd46d0c6.html)
Codice: orobianco
Titolo: "L'oro bianco. L'avventura del sale " (http://www.rai.it//dl/Radio2/sito/item/ContentItem-5e7b4ff8-447d-4f22-a5fb-06f97c5b778d.html)
Codice: adrianopoli
Titolo: "La Battaglia di Adrianopoli" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-a441b422-6c4c-4700-9215-ef1007f0371a.html)
Codice: lente
Titolo: "La Lente del Critico" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2adb3033-43b9-4c51-8c70-215f5d8b1575.html)
Codice: laprimaveradipraga
Titolo: "La primavera di Praga" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-8ea8a72c-d2f2-4bd8-bfb7-f834c51a2ede.html)
Codice: lastasisopraberlino
Titolo: "La Stasi sopra Berlino" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-f99a2c01-f338-4db6-8e33-c9715a0b7c9a.html)
Codice: rossellini
Titolo: "La vita avventurosa di Roberto Rossellini" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-6aa00c71-b5b9-4e35-9075-b4b4f684d69d.html)
Codice: lavitavissuta
Titolo: "La vita vissuta" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-edc0294b-8b8f-461f-93b9-51b642cdb602.html)
Codice: arte_contemporanea
Titolo: "Le origini dell'arte contemporanea" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-b704fc81-c3d7-47b1-9196-9a3accf7498f.html)
Codice: lepietre
Titolo: "Le pietre e la luce: la cattedrale del Medioevo" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-d74cf38e-8b4f-4026-91e5-0d5dd52a1e73.html)
Codice: radici
Titolo: "Le radici della scienza" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-798cb7f9-9f50-44eb-aee1-374047300996.html)
Codice: scandalose
Titolo: "Le Scandalose" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-dbde8499-9cc2-4abc-8dd4-b89997e874af.html)
Codice: liberi_faziosi
Titolo: "Liberi e faziosi" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-80a723df-1ad6-4eec-9af6-213d11b2bdfd.html)
Codice: specchio_della_mente
Titolo: "Lo specchio della mente" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-c91fa050-e570-48b6-adb9-4104106f0220.html)
Codice: lucianobonaparte
Titolo: "Luciano Bonaparte" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-27176e83-ccac-4898-9f68-fc25048cd084.html)
Codice: marcopolo
Titolo: "Marco Polo: un mercante a Pechino" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-7a583498-28a7-4e60-aabf-3f1bf0a32cba.html)
Codice: marinetti
Titolo: "Marinetti" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-9265dd7f-6667-4656-a5ee-01da3ddee814.html)
Codice: mattei
Titolo: "Mattei" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-30cbe75b-e7b7-487b-bf9d-08343810b06d.html)
Codice: napoleone
Titolo: "Napoleone" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-5a73e884-33d8-48a2-8bd6-3868a77c92b4.html)
Codice: napoleoneterzo
Titolo: "Napoleone 3°" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-06df39f9-cf76-4013-8d47-e88e77f23699.html)
Codice: nietzsche
Titolo: "Nietzsche" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-1f31291f-6fe4-470b-9f62-9b9cd99ef33d.html)
Codice: nipponga
Titolo: "Nipponga" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-db84eaa5-391f-4963-8c97-8004c390effa.html)
Codice: severgnini
Titolo: "Oggetti del 2000" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2d2c4851-f11e-4109-a8bc-8b99d50d9e4d.html)
Codice: conte
Titolo: "Paolo Conte" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-9eb64141-3a97-4237-8de5-4882b6a01d2d.html)
Codice: ipiccolimozart
Titolo: "Piccoli Mozart" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-207d5579-3535-4739-aa52-1f2a2575bccc.html)
Codice: popoliinmovimento
Titolo: "Popoli in movimento" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-1fe59905-5d3a-4d3e-9101-6d359f69678e.html)
Codice: quellestatedel92
Titolo: "Quell'estate del '92" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-f198188f-3ee5-4c7c-ab3f-abafca558120.html)
Codice: redidenari
Titolo: "RE DI DENARI" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-c150653d-a4b7-4234-accd-af48222960bd.html)
Codice: rock_involution
Titolo: "Rock Involution" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-1de5c585-5474-48a4-8a91-86f2b3346de0.html)
Codice: roosvelt
Titolo: "ROOSVELT" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-8d5cb018-27a7-4eb1-8aa1-3a420cdfb371.html)
Codice: santagostino
Titolo: "Sant'Agostino" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-eb34b0d4-19d5-439b-8a3f-f5e020401d01.html)
Codice: santiimprenditori
Titolo: "Santi imprenditori" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-aef68800-70fe-4432-8acc-98eac44749e7.html)
Codice: scipionelafricano
Titolo: "Scipione l'Africano" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-67b93ac5-5364-4b0c-90f2-afbf1546605d.html)
Codice: segretidoriente
Titolo: "Segreti d'Oriente" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-14060b39-f626-4aad-9629-f9697e929270.html)
Codice: senzaconfine
Titolo: "Senza confine" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-b059e357-49cc-46af-9f50-d6bf879be160.html)
Codice: sergioleone
Titolo: "Sergio Leone" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-71f06222-0658-48e2-a899-051ebb665681.html)
Codice: sesterzi
Titolo: "Sesterzi,talleri ed euro" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-af1f9f0f-561e-4128-9644-d200c9594873.html)
Codice: sexandthepolis
Titolo: "Sex and the Polis" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2f33f0a5-b174-4982-8cbe-5d49a80579bb.html)
Codice: silla
Titolo: "Silla" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-3695f394-bb43-4f6c-b89b-ef6c9bf3e3b9.html)
Codice: socrate
Titolo: "Socrate" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-e967b4ed-f7fc-4316-b69d-6cf2072bd4e2.html)
Codice: valzania
Titolo: "Sparta e Atene" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-21d7fb6f-6522-4b42-abf6-35d32e0e09ca.html)
Codice: stalin
Titolo: "Stalin" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-18000510-1248-4e59-a021-77638e445c3d.html)
Codice: karol
Titolo: "Storia di Karol" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-476e03c2-138f-4b08-bc63-c4a6cf2b8589.html)
Codice: divi_film
Titolo: "Storie di divi e di film" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-dbfd1753-6948-4b0a-925b-c68074a5ab75.html)
Codice: hermes
Titolo: "Sussurri di Hermes" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-deffaf8f-2be2-4e9a-9005-91aafe85102b.html)
Codice: tamerlano
Titolo: "Tamerlano" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-2340d3ee-2c7c-43a4-b94f-af9c35667d81.html)
Codice: thebellocivili
Titolo: "The bello civili" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-cde044ee-1e4b-40e9-9a20-9cbe644ecdf3.html)
Codice: bello_gallico
Titolo: "The Bello Gallico" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-4eb67005-1f9e-483b-a807-890cbeacee07.html)
Codice: thomasmore
Titolo: "THOMAS MORE" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-c9ddd1ef-9fd0-4d4a-9c64-2153f6c33308.html)
Codice: vangogh
Titolo: "Van Gogh" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-4afee10f-4d3d-413c-98e9-1aa3918de820.html)
Codice: venti
Titolo: "Venti divi, venti film" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-b8be2949-0d34-4a7a-83a6-7f96d48ac531.html)
Codice: ventiimperatori
Titolo: "Venti imperatori romani" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-9135f793-0bbe-41f1-a9c3-5b5f831b4e9d.html)
Codice: vitesprecone
Titolo: "Vite sprecone" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-d4d7b3df-1efc-4960-ab4a-4b2f34e777a5.html)
Codice: vittorio_desica
Titolo: "Vittorio De Sica" (http://www.rai.it//dl/Radio2/sito/item/ContentItem-d6032703-3446-4e8a-92f7-b2df324e9115.html)Problema rimanente: ci son 2 mestiere_artista, la seconda lo script non è in grado di scaricarla...

Gimli[2BV!2B]
20-11-2011, 14:43
#!/bin/bash

#Script per il recupero dei file *.ra della trasmissione radiofonica "Alle otto della sera"
#Organizzazione dati sui server:
# - Indice generale
# - Indici serie: ogni indice di serie contiene link a file *.ram, uno per puntata
# - File *.ram: contengono praticamente solo del testo, cioè il link allo stream .*ra
#
# Versione 1.1 (18/10/2009) Alcuni stream sono di tipo pnm, mplayer non li può usare
# Basta riscrivere l'indirizzo in rstp://...
# Versione 2 (18/10/2009) Recupero contenuti accessori: html, immagine, altri file...
# Versione 2.1 (20/10/2009) Meno file *ram da scaricare in caso di download terminato
# File html migliorati
# Versione 3 (15/05/2010) Nuovo sito RAI; le nuove pagine dovrebbero rimanere stabili
# per qualche tempo dopo la grande migrazione a SilverLight...
# Versione 3.1 (09/06/2010) RealMedia Analyzer
# Nome stream o nome file?
# Riscrittura dei messaggi di output durante l'esecuzione
# Trap Ctrl C per pulire in uscita
# MPlayer non da errore in caso di Ctrl C, test output
# Versione 3.2 (21/08/2011) Maggiore efficienza riavviando lo script
# Vari controlli errori
# Versione 3.3 (19/11/2011) Argomento obbligatorio: all, list oppure lista codici serie
# Vari controlli errori
# Versione 4.0 (20/11/2011) Recupero di alcune serie legacy inaccessibili
# Riscrittura spezzando la procedura in funzioni più leggibili
# Versione 4.1 (20/11/2011) Gestione corretta delle 3 serie con codice "mestiere_artista"

if [ $# -eq "0" ] # Nessun argomento?
then
echo "Utilizzo:"
echo " `basename $0` all -> Scarica tutte le serie"
echo " `basename $0` list -> Elenca le serie disponibili ed esce"
echo " `basename $0` [codice_serie] [codice_serie] -> Scarica la/le serie selezionata/e"
exit 0
fi

export ALL=1
export LIST=0
declare -a SERIES_SELECTED
declare -a SERIES_LEGACY_TITLE
declare -a SERIES_LEGACY_CODE

#Puntate non elencate nel nuovo sito RAI
SERIES_LEGACY_TITLE+=("Chung Kuo-Cina, l'Impero di Mezzo")
SERIES_LEGACY_CODE+=("chungkuo")
SERIES_LEGACY_TITLE+=("Il Globo, la mappa, il Mondo")
SERIES_LEGACY_CODE+=("globo")
SERIES_LEGACY_TITLE+=("Il mestiere dell'artista. L'Ottocento")
SERIES_LEGACY_CODE+=("ilmestieredellartista800")
SERIES_LEGACY_TITLE+=("Sex and the Polis")
SERIES_LEGACY_CODE+=("sexandthepolis")

#Completamente inaccessibile nel nuovo sito RAI
SERIES_LEGACY_TITLE+=("Le porte dei sogni")
SERIES_LEGACY_CODE+=("portedeisogni")

#Il codice utilizzato non è univoco.
ARTISTI_CODE+=("mestiere_artista1")
ARTISTI_TEXT+=("Strinati preferisce raccontare quelle vicende attraverso le testimonianze dei contemporanei")
ARTISTI_CODE+=("mestiere_artista2")
ARTISTI_TEXT+=("vivo per secoli e ancora adesso influenza il nostro modo di porci di fronte")

#Non so dove sia, i link sono rotti e non esite una pagina legacy
#SERIES_LEGACY_TITLE+=("Il divano di Istanbul")
#SERIES_LEGACY_CODE+=("ildivanodiistanbul")"

NO_RMA=0

DELIM=""
for option in "$@"; do
case "$option" in
all) ALL=1;;
list) export LIST=1; export ALL=0;;
--no-rma) export NO_RMA=1;;
*) export ALL=0; SERIES_SELECTED+=("$option");;
esac
done

function IsSerieSelected()
{
if [ -z "$1" ]; then
return 1
fi

if [[ $LIST -eq 1 ]]; then
return 0
fi

if [[ $ALL -eq 1 ]] && [[ ${#SERIES_SELECTED[@]} -eq 0 ]]; then
return 0
fi

for serie in ${SERIES_SELECTED[@]}; do
if [ "$serie" == "$1" ]; then
return 0
fi
done

return 1
}

function RemoveSelected()
{
IDX=0
for serie in ${SERIES_SELECTED[@]}; do
if [[ "$serie" == "$1" ]]; then
unset SERIES_SELECTED[IDX]
fi
((IDX++))
done
}

function CheckRemainingSelected()
{
if [[ $ALL -eq 0 ]] && [[ ${#SERIES_SELECTED[@]} -eq 0 ]]; then
return 1
fi

return 0
}

function GetCodeFromTitle()
{
if [[ -z "$1" ]]; then
return 1
fi

for (( i = 0 ; i < ${#SERIES_LEGACY_TITLE } ; i++ )); do
if [[ "${SERIES_LEGACY_TITLE[$i]}" =~ "$1" ]] || [[ "$1" =~ "${SERIES_LEGACY_TITLE[$i]}" ]]; then
echo ${SERIES_LEGACY_CODE[$i]}
return 0
fi
done

return 1
}

function GetCodeFromText()
{
if [[ ! -z "$1" ]] && [[ -f "$1" ]]; then
for (( i = 0 ; i < ${#ARTISTI_TEXT } ; i++ )); do
RESULT_GREP=$(grep -c "${ARTISTI_TEXT[$i]}" "$1");
if [[ $RESULT_GREP -gt 0 ]]; then
echo "${ARTISTI_CODE[$i]}"
break ;
fi
done
fi
}

function GetDirectLink()
{
REDIRECT=$(wget -q -O - "http://www.rai.it/$1") ;
if [[ "$?" -ne 0 ]]; then
echo -ne "\nwget redirect failed!\n";
exit 1;
fi
echo -ne "http://www.rai.it/" ;
echo $REDIRECT | sed \
-e "s;.*document.location[[:space:]]*=[[:space:]]*';;" \
-e "s/'[[:space:]]*;.*//" ;
unset REDIRECT ;
}

function DownloadIndexSerie()
{
#creo cartelle di lavoro numerate, una per serie
if [[ ! -d "serie$1" ]]; then
mkdir "serie$1" ;
fi

SUFFIX="" ;
if [[ $3 -eq 0 ]]; then
LINK_DIRECT=$(GetDirectLink "$2") ;
else
LINK_DIRECT="$2" ;
SUFFIX="_legacy" ;
fi

if [[ ! -f "serie$1/index$SUFFIX.htm" ]]; then
wget -q -O - "$LINK_DIRECT" > "serie$1/index$SUFFIX.htm"
if [[ "$?" -ne 0 ]]; then
rm "serie$1/index$SUFFIX.htm" ;
unset LINK_DIRECT ;
return 1 ;
fi
unset LINK_DIRECT ;
fi
return 0 ;
}

function GetHTMLtitle()
{
export TITLE_HTML=$(sed \
-e '/<div class="Titolo">/!d' \
-e 's/^[[:space:]]*<div class="Titolo">//' \
-e 's\</div>[[:space:]]*\\' "$1") ;

TITLE=$(perl -MHTML::Entities -e 'print decode_entities($ENV{'TITLE_HTML'});') ;
unset -v TITLE_HTML ;
echo "$TITLE" ;
}

function GetSeries()
{
sed \
-e '/<a href="\/dl\/Radio2\/sito\/item\/ContentItem-[A-Za-z0-9-]\{36\}.html">segue...<\/a>/!d' \
-e 's;^<a href=";;' -e 's;".*$;;' "$1" ;
}

function GetEpisodes()
{
sed \
-e '/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="/!d' \
-e 's/^<a onclick="return[[:space:]]*openAudioPopup(.ContentItem-[A-Za-z0-9-]\{36\}.)[[:space:]]*;"[[:space:]]*href="//' \
-e 's/.html">[^\n^$]*<\/a>/.html/' "$1" ;
}

function GetRAM()
{
sed \
-e '/<embed [Cc][Oo][Nn][Ss][Oo][Ll][Ee]="[[:alpha:]]*" [Nn][Oo][Ll][Oo][Gg][Oo]="[[:alpha:]]*" [Aa][Uu][Tt][Oo][Ss][Tt][Aa][Rr][Tt]="[[:alpha:]]*" [Cc][Ee][Nn][Tt][Ee][Rr]="[[:alpha:]]*" [Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]="[[:alpha:]]*" src="http:\/\/www.rai.it\/dl\/audio\/[^\n^$]*.ram"/!d' \
-e 's/<embed [Cc][Oo][Nn][Ss][Oo][Ll][Ee]="[[:alpha:]]*" [Nn][Oo][Ll][Oo][Gg][Oo]="[[:alpha:]]*" [Aa][Uu][Tt][Oo][Ss][Tt][Aa][Rr][Tt]="[[:alpha:]]*" [Cc][Ee][Nn][Tt][Ee][Rr]="[[:alpha:]]*" [Cc][Oo][Nn][Tt][Rr][Oo][Ll][Ss]="[[:alpha:]]*" src="//' \
-e 's/.ram".*$/.ram/' "$1" ;
}

function GetStream()
{
STREAM=$(wget -q -O - "$1") ;
if [[ "$?" -ne 0 ]]; then
return 1 ;
fi
#pulizia necessaria...
STREAM=$(echo $STREAM | sed -e 's/.*rtsp:\/\/*/rtsp:\/\//' -e 's/.ra[^[:print:]]*$/.ra/') ;
#alcuni sono rappresentati come stream pnm -> li forzo ad rtsp
echo $(echo $STREAM | sed -e 's/.*pnm:\/\/*/rtsp:\/\//') ;
unset STREAM ;
}

function DownloadStream()
{
if [[ ! -f "../$1/$2" ]]; then
#se il file non esiste procedo con il download
printf "\n%s" "In download: $2 = $3" ;
OUTPUT=$(mplayer -noconsolecontrols -nojoystick -nolirc -quiet -prefer-ipv4 -noframedrop -dumpfile \
../$1/$2 -dumpstream $3 2>&1) ;

if [[ "$?" -ne 0 ]] || [[ -z $(echo $OUTPUT | grep "Stream EOF detected") ]]; then
echo -ne "\nMPlayer failed!\n" ;
rm "../$1/$2" ;
return 1 ;
fi
if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
return 3 ;
fi
else
#il file esiste già.
#Due casi possibili:
# - è già stato scaricato in un'esecuzione precedente
# - è stato solamente iniziato, è sfuggito alle trap ed è incompleto...
# QUESTO SCRIPT NON SI ACCORGE DI EVENTUALI FILE INCOMPLETI E NON LI SCARICA PIU'
# Tenta di intercettare il termine dell'esecuzione dello script rimuovendo eventuali
# file incompleti (ma se, per esempio, manca la corrente...)
printf "\n%s" "Già scaricato: $1/$2 = $3" ;
fi
return 0 ;
}

function ProcessStandard()
{
# 1 -> $EPISODES
# 2 -> $NR_INDEX
NR_EPISODE=1 ;

for episode in $1; do
if [[ ! -f "serie$2/$NR_EPISODE.htm" ]]; then
wget -q -O - "$episode" > "serie$2/$NR_EPISODE.htm"
if [[ "$?" -ne 0 ]]; then
echo -ne "\nwget episode failed!\n" ;
rm "serie$2/$NR_EPISODE.htm" ;
return 1 ;
fi
fi

#estraggo il link al file *.ram
RAM=$(GetRAM "serie$2/$NR_EPISODE.htm")

if [[ -z $RAM ]]; then
if [[ $LIST -eq 0 ]]; then
echo -ne "\n\"$TEMP_FOLDER/serie$2/$NR_EPISODE.htm -> Non esiste un riferimento corretto al file audio\n" ;
echo -ne "Potrebbe trattarsi di un'errore nella pagina HTML o un tag <embed> dalla sintassi inaspettata\n" ;
fi
((NR_EPISODE++)) ;
continue ;
fi

ProcessStream "$RAM" "$2" 0 ;
case $? in
1) return 1 ;;
2) return 2 ;;
3) return 3 ;;
*) ;;
esac

((NR_EPISODE++)) ;
done
return 0 ;
}

function ProcessLegacy()
{
#recupero indici serie
SUFFIX="_legacy" ;
if ( ! DownloadIndexSerie "$NR_INDEX" "$1" 1 ); then
if [[ $LIST -eq 0 ]]; then
echo -ne "\nwget index $NR_INDEX failed!\n";
fi
return 1 ;
fi

if [[ ! -f "serie$2/index$SUFFIX.htm" ]]; then
return 1 ;
fi

RAMS=$(sed \
-e '/Q_CANALE=http:\/\/www.radio.rai.it\/\/radio2\/alleotto\//!d'\
-e 's/.*Q_CANALE=[^h]*//'\
-e 's/.ram.,.*$/.ram/' "serie$2/index$SUFFIX.htm" | uniq | sort) ;

for ram in $RAMS; do
ProcessStream "$ram" "$2" 1 ;
case $? in
1) return 1 ;;
2) return 2 ;;
3) return 3 ;;
*) ;;
esac
done
return 0 ;
}

function ProcessStream()
{
# 1 -> $ram
# 2 -> $NR_INDEX
# 3 -> $FLAG_LEGACY
#recupero l'indirizzo dello stream *.ra
STREAM=$(GetStream "$1") ;

#suddivido i file per serie: estraggo i nomi necessari
FILE_NAME=$(echo $1 | sed 's/.*\///' | sed 's/m$//') ;
STREAM_NAME=$(echo $STREAM | sed -e 's/.*\///') ;
if [[ ${#FILE_NAME} -le ${#STREAM_NAME} ]]; then
FILE_NAME="$STREAM_NAME" ;
fi
SERIE_NAME_PREV="$SERIE_NAME" ;
export SERIE_NAME=$(echo $STREAM | sed -e 's/\/[^\/]*$//' -e 's/.*\///') ;

if [[ "$SERIE_NAME" == "mestiere_artista" ]]; then
SERIE_NAME_TMP=$(GetCodeFromText "serie$2/index.htm") ;
if [[ ! -z "$SERIE_NAME_TMP" ]]; then
SERIE_NAME="$SERIE_NAME_TMP" ;
fi
fi

if [[ ! -z $SERIE_NAME_PREV ]] && [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ "$SERIE_NAME" =~ "$SERIE_NAME_PREV" ]] || [[ "$SERIE_NAME_PREV" =~ "$SERIE_NAME" ]]; then
export SERIE_NAME="$SERIE_NAME_PREV";
fi
fi

if [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
return 1
fi

if ( ! IsSerieSelected "$SERIE_NAME" ); then
return 1
fi

if [[ -z $SERIE_NAME_PREV ]] || [[ "$SERIE_NAME_PREV" != "$SERIE_NAME" ]]; then
if [[ $LIST -eq 1 ]]; then
# echo " Codice: $SERIE_NAME" ;
# echo "Titolo: \"$TITLE\" (http://www.rai.it/$serie)" ;
echo "Codice: $SERIE_NAME" ;
echo "Titolo: \"$TITLE\"" ;
echo -ne "URL: http://www.rai.it/$serie\n\n" ;
return 2
fi

#creazione cartelle serie
if [[ ! -d "../$SERIE_NAME" ]]; then
mkdir "../$SERIE_NAME"
printf "\n\n%s" "Inizio download serie \"$SERIE_NAME\"" ;
else
printf "\n\n%s" "Proseguo download serie \"$SERIE_NAME\"" ;
fi
fi

if [[ $LIST -eq 1 ]]; then
return 2
fi

#creazione indice html
CreateHTMLindex "$SERIE_NAME" "$2" "$3" ;

if [[ -n $STREAM_NAME ]] && [[ -f "../$SERIE_NAME/$STREAM_NAME" ]] && [[ "${STREAM_NAME}" != "${FILE_NAME}" ]]; then
mv "../$SERIE_NAME/$STREAM_NAME" "../$SERIE_NAME/$FILE_NAME"
fi

if ( ! DownloadStream "$SERIE_NAME" "$FILE_NAME" "$STREAM" ); then
export SERIE_DONE=0;
else
if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
if [[ -f "../$SERIE_NAME/$FILE_NAME" ]]; then
rm "../$SERIE_NAME/$FILE_NAME" ;
fi
return 3 ;
fi
ProcessRMA "$SERIE_NAME/$FILE_NAME" ;
fi

if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
return 3 ;
fi

return 0 ;
}

#Viene creata una paginetta html con la descrizione di ogni serie
#testata html
function GetHead()
{
echo -ne "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" ;
echo -ne "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" ;
echo -ne "<html>\n<head>\n" ;
echo -ne "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf8\"/>\n" ;
echo -ne "<title>RADIO DUE - Alle 8 della sera - $1</title>\n" ;
echo -ne "<style TYPE=\"text/css\">\n<!--\n\n" ;
}

#qui in mezzo includo le stile da css

#fine testata
HEAD_CLOSE="\n\n"
HEAD_CLOSE="$HEAD_CLOSE-->\n"
HEAD_CLOSE="$HEAD_CLOSE</style>\n</head>\n<body>\n"

#coda html
TAIL="</body>\n</html>"

function GetHTMLcontent()
{
sed \
-n -e '/ id=\"SitoBody\">/,/<div class=\"Bot\"><\/div>/p'\
-e 's/<div class=\"Bot\"><\/div>/<div class=\"Bot\"><\/div><\/div>/' "$1" ;
}

function GetHTMLcontentLegacy()
{
sed \
-n -e '/<span class=\"solotesto\"> Alle otto della sera <\/span><\/div>/,/<div class=\"schede_interne_\(contenuti\|riascolta_a4\)\">/p' \
-e '/<div class=\"schede_interne_\(contenuti\|riascolta_a4\)\">/d' "$1" ;
}

function CreateHTMLindex()
{
if [[ -f "../$1/$1.html" ]]; then
return 0
fi

LEGACY=$3 ;
if [ "$1" != "portedeisogni" ]; then
LEGACY=0 ;
fi

echo -e "\nCreazione indice html: $1/$1.html" ;
GetHead "$TITLE" > "../$1/$1.html" ;
cat style.css >> "../$1/$1.html" ;
echo -e $HEAD_CLOSE >> "../$1/$1.html" ;
SUFFIX="" ;
if [[ $LEGACY -eq 0 ]]; then
GetHTMLcontent "serie$2/index.htm" >> "../$1/$1.html"
else
SUFFIX="_legacy" ;
GetHTMLcontentLegacy "serie$2/index$SUFFIX.htm" >> "../$1/$1.html"
fi
echo -e $TAIL >> "../$1/$1.html" ;

#recupero eventuale immagine
IMAGE=$(sed -e '/<img src=\"/!d' -e 's/.*<img src=\"//' -e 's/\"[[:space:]]*[[:alpha:]]*=\".*$//' "../$1/$1.html") ;
if [[ ! -z $IMAGE ]]; then
IMAGE_NAME=`echo $IMAGE | sed -e 's/.*\///'`
echo "L'indice contiene un'immagine -> $1/contenuti/$IMAGE_NAME"
if [[ ! -d "../$1/contenuti" ]]; then
mkdir "../$1/contenuti"
fi

if [[ ! -f "../$1/contenuti/$IMAGE_NAME" ]]; then
if [[ $LEGACY -eq 0 ]]; then
wget -q -O - "$IMAGE" > "../$1/contenuti/$IMAGE_NAME" ;
else
wget -q -O - "http://www.radio.rai.it$IMAGE" > "../$1/contenuti/$IMAGE_NAME" ;
fi
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget image failed!\n"; rm "../$1/contenuti/$IMAGE_NAME"; fi
fi

#riscritture indirizzo immagine: da remota a locale
LOCAL_NAME="contenuti/$IMAGE_NAME"
sed -i 's;'$IMAGE';'$LOCAL_NAME';g' "../$1/$1.html"
fi

#alcune serie hanno anche dei contenuti aggiuntivi: li recupero
LINKS=$(sed -e '/<a href=\"/!d' -e 's/<a href=\"/\n/g' ../$1/$1.html | sed -e '/http:/!d' -e 's/\">.*$//') ;
if [[ ! -z $LINKS ]]; then
if [[ ! -d "../$1/contenuti" ]]; then
mkdir "../$1/contenuti" ;
fi

for link in $LINKS; do
FILE_NAME=`echo $link | sed -e 's/.*\///'`
if [[ ! -f "../$1/contenuti/$FILE_NAME" ]]; then
echo "Contenuto aggiuntivo -> $1/contenuti/$FILE_NAME" ;
wget -q -O - "$link" > "../$1/contenuti/$FILE_NAME" ;
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget file failed!\n"; rm "../$1/contenuti/$FILE_NAME"; fi
fi

#riscrittura indirizzo contenuto
LOCAL_NAME="contenuti/$FILE_NAME" ;
sed -i 's*'$link'*'$LOCAL_NAME'*g' "../$1/$1.html" ;
done
fi
}

function ProcessRMA()
{
if [[ $NO_RMA -eq 0 ]] && [[ ! "$RMA" ]]; then
return 0 ;
fi

PROCESSED=`$RMA -d "../$1" | grep "This file has been processed by RealMedia Analyzer"`
if [[ -f "../$1" ]] && [[ -z $PROCESSED ]]; then
if $RMA -ft "../$1" >/dev/null 2>&1 ; then
echo -n "." ;
else
echo -ne "\n*rma -ft warning*" ;
touch "../$1-rma_ft_WARNING" ;
fi
if $RMA -i "../$1" >/dev/null 2>&1 ; then
echo -n "." ;
else
echo -ne "\n*rma -i warning*" ;
touch "../$1-rma_i_WARNING" ;
fi
fi
unset PROCESSED ;
}

# trap keyboard interrupt (control-c)
trap control_c SIGINT
# trap standart sigterm
trap control_c SIGTERM
EXIT_AS_SOON_AS_POSS=0

# file that flags a folder as completely downloaded
FILE_FLAG_DONE=".done"

control_c()
{
printf "\n\n%s\n\n" "*** Richiesta uscita script: attendere, prego... ***"
EXIT_AS_SOON_AS_POSS=1
}

#cartella di lavoro
TEMP_FOLDER="alle8dellasera_TMP"
if [[ ! -d "$TEMP_FOLDER" ]]; then
printf "%s\n%s\n\n%s\n%s\n\n" \
"Benvenuto in \"Alle otto della sera\" downloader." \
"Prima esecuzione dello script: creo la certella temporanea \"$TEMP_FOLDER\"" \
" *** Potrai eliminare questa cartella al termine ***" \
" *** del download di tutte le serie che ti interessano ***"
fi

mkdir -p "$TEMP_FOLDER"
cd "$TEMP_FOLDER"

#RealMedia analyzer
RMA="./rma"

if [[ $LIST -eq 0 ]] && [[ $NO_RMA -eq 0 ]] && [[ ! -f "$RMA" ]]; then
RMA_FULL_NAME="rma-0.30.00-linux-i386"
printf "\n%s\n%s\n" "Sto scaricando una utilità per riparare gli stream: RealMedia Analyzer ($RMA_FULL_NAME)" \
"Eseguire lo script con argomento --no-rma per saltare questo passaggio."
if [[ ! -f "$RMA_FULL_NAME.gz" ]]; then
wget -q "http://users.i.com.ua/~alexeysp/rma/$RMA_FULL_NAME.gz"
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget RMA failed!\n"; rm "$RMA_FULL_NAME.gz" ; fi
fi
gzip -qdc "$RMA_FULL_NAME.gz" > "$RMA"
chmod +x "$RMA"
fi

if [[ ! -f "style.css" ]]; then
wget -q -O - "http://www.rai.tv/dl/Radio2/css/Radio2.css" > style.css
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget css failed!\n"; rm style.css ; exit 1; fi
fi

INDEX_ALLEOTTO="alleottodellasera.html"

#recupero indice generale
if [[ ! -f "$INDEX_ALLEOTTO" ]]; then
wget -q -O - "http://www.rai.it/dl/Radio2/alleottodellasera.html" > $INDEX_ALLEOTTO
if [[ "$?" -ne 0 ]]; then echo -ne "\nwget global index failed!\n"; rm $INDEX_ALLEOTTO; exit 1; fi
fi

#estraggo i link alle serie di puntate
SERIES=$(GetSeries "$INDEX_ALLEOTTO") ;

SERIE_DONE=0

NR_INDEX=1
LEPORTEDEISOGNI=0
for serie in $SERIES; do
if [[ EXIT_AS_SOON_AS_POSS -eq 1 ]]; then
exit 0 ;
fi

#recupero indici serie
if ( ! DownloadIndexSerie "$NR_INDEX" "$serie" 0 ); then
if [[ $LIST -eq 0 ]]; then
echo -ne "\nwget index $NR_INDEX failed!\n" ;
fi
if [[ $NR_INDEX -ne 74 ]]; then
((NR_INDEX++))
continue
else
touch "serie$NR_INDEX/index.htm" ;
LEPORTEDEISOGNI=1
fi
fi

if [[ ! -f "serie$NR_INDEX/index.htm" ]] && [[ $NR_INDEX -ne 74 ]]; then
exit 0 ;
fi

EPISODES=$(GetEpisodes "serie$NR_INDEX/index.htm") ;
TITLE=$(GetHTMLtitle "serie$NR_INDEX/index.htm") ;
LEGACY=0 ; #flag modalità legacy
LEGACY_URL="" ;

if [[ $LEPORTEDEISOGNI -eq 1 ]]; then
TITLE="Le porte dei sogni" ;
LEGACY=1 ;
fi

if [[ -z $EPISODES ]]; then
#Alcune serie non sono state migrate completamente al nuovo sito RAI, gli unici link
#alle puntate sono ancora presenti nelle vecchie pagine che potrebbero finire offline
#in qualsiasi momento...
CODE=$(GetCodeFromTitle "$TITLE") ;
if [[ ! -z $CODE ]]; then
LEGACY_URL="http://www.radio.rai.it/radio2/alleotto/$CODE/" ;
fi

if [[ ! -z $LEGACY_URL ]]; then
LEGACY=1 ;
fi
if [[ $LEGACY -eq 0 ]]; then
((NR_INDEX++))
continue ;
fi
fi

#questa flag viene portata a zero se un download di mplayer fallisce
#in questo caso non viene creato il file FILE_FLAG_DONE, che marca una cartella come terminata
export SERIE_DONE=1
export SERIE_NAME="" ;
if [[ $LEGACY -eq 0 ]]; then
ProcessStandard "$EPISODES" "$NR_INDEX" ;
else
ProcessLegacy "$LEGACY_URL" "$NR_INDEX" ;
fi

if [[ $? -eq 3 ]]; then
exit 0 ;
fi

((NR_INDEX++))

if ( ! IsSerieSelected "$SERIE_NAME" ); then
continue
fi
RemoveSelected "$SERIE_NAME"

if [[ $LIST -eq 1 ]]; then
continue
fi

if [[ SERIE_DONE -eq 1 ]] && [[ ! -z $SERIE_NAME ]] && [[ ! -z $FILE_FLAG_DONE ]] && [[ ! -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" terminata!\n"
touch "../$SERIE_NAME/$FILE_FLAG_DONE"
elif [[ -f "../$SERIE_NAME/$FILE_FLAG_DONE" ]]; then
echo -ne "\n\"$SERIE_NAME\" marcata come terminata (file \"$SERIE_NAME/$FILE_FLAG_DONE\")."
fi

if ( ! CheckRemainingSelected ); then
exit 0
fi
done
#gimli

muzzle
23-11-2011, 01:01
;36382738']Mi hai convinto, ora occorre specificare un'azione da svolgere:

all -> scarica il mondo
list -> elenca le serie disponibili
lista codici serie -> specificando una lista di codici di serie verranno scaricate solo quelle
Non è interattivo e per costruire la lista scarica tutte le pagine html delle serie, ma dopo la prima esecuzione verrà completamente inizializzata la "cache" di questi indici velocizzando le esecuzioni successive. Riduce anche il rischio che le pagine del sito vengano sconvolte a metà del download (tipo la prima volta che ho scritto e lasciato in esecuzione lo script) rendendo impossibile la prosecuzione salvo riscrittura dei parse.

Grazie alla funzione list mi sono accorto della presenza di una serie con indice inaccessibile e che ce ne saranno almeno quattro o cinque che non contengono link alle puntate (non vengono elencate nel list mentre gli errori vengono mostrati solo durante i comandi di download).

Fantastico, sono senza parole! Che dire? Grazie!