Torna indietro   Hardware Upgrade Forum > Software > Linux, Unix, OS alternativi > Linux per newbies

HONOR 400 Pro trasforma ogni scatto in capolavoro animato. Recensione
HONOR 400 Pro trasforma ogni scatto in capolavoro animato. Recensione
HONOR sorprende il mercato dei medio gamma e lo fa con il nuovo HONOR 400 Pro dal design sottile, sensore principale da 200 MP, display a 5.000 nit e AI evoluta. Lo smartphone ridefinisce la fotografia mobile in una fascia di prezzo sempre più difficile.
Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media
Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media
Intel ha introdotto le CPU Core Ultra 200S "non K" a inizio 2025. I nuovi modelli stanno arrivando sul mercato e abbiamo avuto l'opportunità di provare le soluzioni Core Ultra 5 235 e Core Ultra 5 225F, confrontandole con il Core i5-14400F di precedente generazione. Come si comportano i processori Arrow Lake per la massa? Scopriamolo insieme.
Roborock Saros Z70: un braccio meccanico per fare ordine in casa
Roborock Saros Z70: un braccio meccanico per fare ordine in casa
Dotato di tutte le ultime innovazioni in tema di aspirazione della polvere e pulizia dei pavimenti di casa, Roborock Saros Z70 integra un braccio meccanico che promette di rendere più efficiente la pulizia di casa spostando oggetti presenti sul pavimento e riordinandoli. Una idea bella e pratica, ma che all'atto pratico è pressoché inutilizzabile e dalle ricadute nulle
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-10-2009, 20:19   #1
estersandro
Member
 
Iscritto dal: Feb 2007
Messaggi: 165
registrare in mp3?

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
estersandro è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 00:11   #2
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Script per scaricare tutto:
Codice:
#!/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.
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)

Ultima modifica di Gimli[2BV!2B] : 18-10-2009 alle 02:22. Motivo: pnm -> rstp
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 05:14   #3
estersandro
Member
 
Iscritto dal: Feb 2007
Messaggi: 165
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?
estersandro è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 09:04   #4
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
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
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 13:44   #5
estersandro
Member
 
Iscritto dal: Feb 2007
Messaggi: 165
ecco cosa succede:

bash download_alle8dellasera.sh
--2009-10-16 14:39:33-- http://www.radio.rai.it/radio2/alleo...et_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/alleo...et_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
estersandro è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 14:58   #6
jeremy.83
Senior Member
 
L'Avatar di jeremy.83
 
Iscritto dal: May 2007
Città: DiSaronno Originale
Messaggi: 2374
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
__________________
Dell XPS 9570 Powered by Arch Linux || Motorola One Vision
Ho concluso con raffaelev, Iceworld, stebru, Dichy, AXIP, Quakeman e Swampo
jeremy.83 è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 15:01   #7
Damage92
Senior Member
 
L'Avatar di Damage92
 
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
Quote:
Originariamente inviato da estersandro Guarda i messaggi
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".
Damage92 è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 19:26   #8
estersandro
Member
 
Iscritto dal: Feb 2007
Messaggi: 165
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!
estersandro è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2009, 20:40   #9
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
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!
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2009, 20:38   #10
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Versione 2

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.
Codice:
#!/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
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 08-06-2010, 23:40   #11
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Codice:
#!/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
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 21-08-2011, 23:22   #12
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Codice:
#!/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
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2011, 10:35   #13
muzzle
Junior Member
 
Iscritto dal: Jan 2006
Messaggi: 2
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).
muzzle è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2011, 00:07   #14
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
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).
Codice:
#!/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
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)

Ultima modifica di Gimli[2BV!2B] : 19-11-2011 alle 00:47. Motivo: Baco nel list
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2011, 01:32   #15
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Codice:
#!/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
#gimli
Serie scaricabili:Problema rimanente: ci son 2 mestiere_artista, la seconda lo script non è in grado di scaricarla...
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2011, 14:43   #16
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Codice:
#!/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 "[*][b]Codice[/b]: $SERIE_NAME" ;
#      echo "[b]Titolo[/b]: [url=http://www.rai.it/$serie]\"$TITLE\"[/url]" ;
      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
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)

Ultima modifica di Gimli[2BV!2B] : 20-11-2011 alle 15:45. Motivo: noparse bbcode e piccoli dettagli stilistici
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2011, 01:01   #17
muzzle
Junior Member
 
Iscritto dal: Jan 2006
Messaggi: 2
Quote:
Originariamente inviato da Gimli[2BV!2B] Guarda i messaggi
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!
muzzle è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR 400 Pro trasforma ogni scatto in capolavoro animato. Recensione HONOR 400 Pro trasforma ogni scatto in capolavor...
Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU Arrow Lake per la fascia media Intel Core Ultra 5 235 e Core Ultra 5 225F, CPU ...
Roborock Saros Z70: un braccio meccanico per fare ordine in casa Roborock Saros Z70: un braccio meccanico per far...
I nuovi notebook Acer al debutto al Computex 2025 I nuovi notebook Acer al debutto al Computex 202...
Nutanix .NEXT: così l'azienda vuole aiutare i clienti a limitare la dipendenza da Broadcom Nutanix .NEXT: così l'azienda vuole aiuta...
La letteratura può essere potenzi...
OpenAI, Altman e Ive: il dispositivo IA ...
PlayStation Stars, chiude il programma f...
Torino dichiara guerra agli incivili in ...
Seat sulla buona strada per produrre la ...
Le novità Cryorig al Computex 202...
ASUS svela i nuovi ExpertBook ed ExpertC...
HONOR 400 Pro 5G e 400 5G ufficiali! L’A...
Intel lancia nuovi processori Xeon 6 ott...
Xiaomi raddoppia con YU7: fino a 835 km ...
Al via la sesta edizione di Startup Mara...
Google Cloud potenzia l'offerta per il c...
Google rivoluziona Chrome: il browser ca...
Nissan Micra EV: ecco svelata l'erede el...
La partita del secolo: 143.000 giocatori...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v