Un semplice script per scaricare in mp3 la traccia di un video su YouTube

Postato da ROb | nella categoria Linux, Utilità | domenica, 20 marzo 2011

2

In questi giorni ho avuto la necessità di scaricare la traccia audio di un video caricato su YouTube.

Per farlo conoscevo già diversi servizi online ma, visto la potenza della shell Linux, ho pensato di scrivere un piccolo script che assolvesse al compito e che potesse sfruttare alcune utility scritte proprio per questi scopi.

La mia intenzione era quella di avere a disposizione uno script a cui potessi passare un solo parametro, l’url della pagina, e che mi salvasse il file in formato mp3 possibilmente con un nome abbastanza esplicativo. Per riuscire a tale scopo mi sono avvalso di due soli comandi: youtube-dl e ffmpeg.

youtube-dl è uno script python in grado di estrarre un file in formato .flv semplicemente passando il path HTTP alla pagina del video. Questa utility compie tutto il lavoro “duro” del mio semplice script ed è anche in grado di scaricare il nome del video legato all’url. Nel mio caso youtube-dl è servito a salvare il titolo del video, per rinominare correttamente il file mp3 e successivamente è servito per fare il download del file video in formato .flv.

La separazione della traccia audio da quella video e la successiva codifica nel formato mp3 è stata invece assegnata a ffmpeg, uno dei più apprezzati comandi per la gestione e fruizione dei video in Linux (e non solo).

Per entrambi i software mi sono però avvalso di versioni più aggiornate di quelle presenti nella mia distribuzione Ubuntu 8.04. Nelle versioni disponibili nei miei repository infatti youtube-dl non era in grado di effettuare il download del video mentre ffmpeg non riusciva a gestire i video nel formato .flv . Per aggiornare lo script python è stato sufficiente effettuare il download del nuovo script e metterlo nella mia cartella di binari dentro ~/bin/ . Per quanto riguarda ffmpeg invece ho prima provato a effettuare una compilazione della distribuzione per rigenerare la nuova versione. Dopo alcuni tentativi falliti, ho deciso di optare per un binario precompilato linkato staticamente per Linux 32bit. Una valida compilazione l’ho trovata al seguente indirizzo: http://horsfall.eu/2010/11/27/ffmpeg-full/ . Il file binario contenente ffmpeg è stato quindi salvato, con i corretti permessi di esecuzione, nella cartella ~/bin.Tale cartella è nella prima posizione della variabile $PATH. In questo modo i binari che si trovano in tale cartella hanno la precedenza su quelli presenti nelle altre cartelle di binari del sistema.

Veniamo ora al mio script, salvato con il nome: youtube2mp3.sh :

#!/bin/bash

url=$1
flvfile=/var/tmp/$$.flv

title=`youtube-dl -e ${url}`
mp3file=~/Desktop/${title}.mp3

youtube-dl ${url} -o ${flvfile}

ffmpeg -i ${flvfile} "${mp3file}"

rm ${flvfile}

L’unico parametro gestito dalla script, il primo, è l’url della pagina in cui si trova il video in YouTube. Lo script estra prima l’informazione del titolo del filmato e la memorizza nella variabile “title”.
Quindi effettua il download del video salvandolo in un file temporaneo che ha come nome il pid del processo bash invocato.
Successivamente converte il video nella traccia audio mp3 che viene salvata nel Desktop con il nome del titolo e suffisso .mp3.
Infine il file temporaneo .flv viene cancellato dalla directory temporanea.

Sostituzioni di testo multilinea in un file con sed

Postato da ROb | nella categoria Linux | venerdì, 12 marzo 2010

0

Proprio ieri ho dovuto necessità di costruire uno script che mi permettesse di sostituire in un file xml n occorrenze di un certo tag con il contenuto di un altro file xml.

sostituzione sed

Probabilmente esistono mille modi diversi per farlo, come mi avete sempre insegnato con i vostri mitici commenti.
Voglio postare la soluzione che ho trovato girovagando qua e là nei vari forum e che nel mio caso ha funzionato alla perfezione sfruttando la bash e il comando sed.

Valorizziamo innanzitutto la variabile str che contiene il testo da rimpiazzare.
Sia test.xml il file che contiene la stringa da rimpiazzare e contenuto.xml il file con il testo da sostiruire nel file test.xml al posto della stringa contenuta nella variabile str, ecco il comando sed che permette di farlo:

str="<rimpiazzo\/>"
sed -e "/$str/r contenuto.xml" -e "/$str/d" test.xml

Questi sono i due file xml:

test.xml

<prova>

  <rimpiazzo/>

</prova>

contenuto.xml

   <rimpiazzo>
      ciao
   </rimpiazzo>

Prima si valorizza la variabile str con il testo da rimpiazzare (in questo caso il testo rimpiazzo) quindi si lancia il comando sed.
E’ importante notare che il testo da rimpiazzare valorizzato nella variabile str deve essere valorizzato secondo la sintassi sed quindi con l’escaping di eventuali caratteri speciali sed o di espressioni regolare. In questo caso è stato fatto l’escaping del carattere /.

Ecco l’output in console ottenuto dal comando:

<prova>

   <rimpiazzo>
      ciao
   </rimpiazzo>

</prova>

Fusione xml completata!

Rimuovere i file che iniziano con il trattino

Postato da ROb | nella categoria Linux | martedì, 9 marzo 2010

3

File con trattino

Mi è capitato spesso di creare inavvertitamente dei file che iniziano con il trattino.
Quando ho provato a cancellarli o semplicemente a farne il listing i comandi bash tradizionali mi davano errore.

Facciamo infatti questa prova. Creiamo nella directory /tmp due file con il trattino in questo modo (digitate anche il carattere “>“):

cd /tmp/
> '-foo.txt'
> '--bar.txt'

A questo punto se provate a farne il listing in questo modo modo resterete sorpresi:

ls -l *.txt
ls: unrecognized option '--bar.txt'
Try `ls --help' for more information.

Esiste però un’opzione importante di molti comandi bash che ci viene in aiuto e delimita la lista delle opzioni dei comandi stessi. Quest’opzione è ““.
Se infatti proviamo il seguente comando i file “speciali” verranno listati correttamente:

ls -l -- *.txt

In pratica senza specificare quest’opzione i comandi espandono la lista dei file e interpretano quelli che iniziano con il trattino come se fossero delle opzioni del comando stesso. Sfruttando invece l’opzione speciale “–” il comando conosce esattamente dove termina la lista delle opzioni specificate dall’utente.

Tale logica è applicabile anche per molti altri comandi quali: rm, mv e cp. In generale la regola è:

comando opzioni -- '--filename'

L’articolo originale che tratta questo problema lo trovate su NixCraft.

Operazioni massive sui file contenenti spazi (mastering Linux Bash)

Postato da ROb | nella categoria Linux | mercoledì, 24 febbraio 2010

4

Molte volte mi sono imbatutto in questo problema nella mia bash in Linux.

In generale è molto semplice operare sui file in Bash in modo massivo. Possiamo usare infatti dei cicli for, delle pipe oppure il comodo backtick.

Operazioni massive sui file

Tutte queste opzioni funzionano bene se il file non contiene però spazi. In questi casi infatti succede che il file con lo spazio viene diviso in due token e il comando successivo che deve processare il file non riesce a trovarlo.

Il metodo più efficace che ho trovato e ho provato per questi casi è il seguente:

find ${path} -name "${name}" | while read i

do
  cp "$i" ${dest}
done

La variabile ${path} contiene il percorso di ricerca del find, la variabile ${name} l’espressione di ricerca in sintassi find. L’output del comando find viene passato a un ciclo while bash che inserisce ogni riga nella variabile $i.
All’interno del ciclo viene eseguito il comando, in questo la copia del file nella directory (variabile ${dest}) sul file contenuto nella variabile $i.
E’ importante notare come la variabile $i sia compresi fra doppi apici, altrimenti gli spazi caurebbero problemi al comando cp.