Programació shell script i la web de ccma

Ja fa uns anys em vaig veure en la necessitat de voler descarregar alguns programes que emetia TVC i que m’agradaria tenir per poder veure quan em vingués de gust.

Com sabeu, tv3alacarta sol donar una data de caducitat als seus programes, i molts cops no tenim temps de veure’ls però si que ens agradaria veurels en algunes hores mortes que tenim de tant en tant, i veuren uns quants de seguits.

Fa uns anys vaig trobar aquests treball que permet fer descarrega dels vídeos:

Descarrega't videos de tv3!

Per desgràcia la web de TVC ha anat canviant i millorant amb el temps, els formats dels vídeos actuals son mp4 en vers de flv o wmv del passat, però també han ampliat servidors, i el servidor que abans valia ara ja no val, necessitava renovar-se però sembla que no interessa gaire i el projecte esta parat.

La última modificació és de 2012:

Actualitzat el descarregador de videos de tv3 amb suport per mac (0.73)

Per sort és codi lliure i per tant esta compartit, en els comentaris podreu trobar versions que antigament vaig publicar, però amb el temps em vaig adonar que pel que a mí era molt senzill per altres no ho era. Per tant, lluny de compartir el codi modificat (que poca cosa més del que podreu trobar s’hi ha fet) us penjaré un parell d’exemples de codi en bash / shell script.

El meu objectiu, per poder facilitar-me la vida, és el de poder descarregar d’un sol cop tots els capítols d’un programa. A part, mitjançant un rudimentari sistema de fitxer com a base de dades sé els capítols que s’han posat a descarregar (ull, posat, no acabat, un dia ho tinc que resoldre) i per tant i cada dia passem el programa o el llencem diferents hores del dia, aquest sols descarregarà les novetats.

El que em porta a tot això, és el que m’encanta del bash/shell script, com pots simplificar les coses. Actualment per els vídeos de ccma faig servir el següent script:

#! /bin/bash

#TODO: evitar l'us del fitxer2 i utilitzar una tupla

#descarraguem el fitxer HTML
curl -s http://www.ccma.cat/tv3/$1/ > html.tmp

#convertim a format UTF-8
iconv -f ISO-8859-15 -t UTF8 html.tmp > html.utf

#borrem el temporal
rm html.tmp

#busquem els capítols amb AWK i treiem etiquetes i caràcters no permesos amb sed
#cat html.utf | awk '/auto46-item/{getline; print;}' | sed -e s/\<\\/span\>//g -e s/\<span\>//g -e s/\<h2\>//g -e s/\<\\/h2\>//g -e s/\ /_/g -e s/\'/_/g -e s/\:/_/g -e s/À/A/g -e s/à/a/g -e s/È/È/g -e s/è/è/g -e s/É/É/g -e s/é/é/g -e s/Í/I/g -e s/í/i/g -e s/Ò/O/g -e s/ò/o/g -e s/Ó/O/g -e s/ó/o/g -e s/·/_/g -e s/Ç/C/g -e s/ç/c/g -e s/?//g -e s/\\//-/g > fitxer2

#cat html.tmp | awk '/auto46-item/{print;}'
#això dona el numero de capitol - awk 'match($0, "\.id=") {print substr($0, RSTART-9, 7)}'

cat html.utf | awk 'match($0, "\.id=\"auto46-item") {print substr($0, RSTART-9, 7); getline; print;}' | sed -e s/\ \ //g | sed -e s/\"/_/g -e s/\ /_/g -e s/\'/_/g -e s/\:/_/g -e s/À/A/g -e s/à/a/g -e s/È/È/g -e s/è/è/g -e s/É/É/g -e s/é/é/g -e s/Í/I/g -e s/í/i/g -e s/Ò/O/g -e s/ò/o/g -e s/Ó/O/g -e s/ó/o/g -e s/·/_/g -e s/Ç/C/g -e s/ç/c/g -e s/?//g -e s/\\//-/g > fitxer2
#borrem el fitxer de desti
if [ -f "$2" ]
then
	rm $2
fi

#fem recorregut del fitxer2 per escriure el fitxer final
while read line
do 
	L1=$line
	read line
	L2=$line
    echo -e "$L1/$L2" >> $2
done < fitxer2

#borrem el fitxer2 i html.utf
rm fitxer2
rm html.utf

És un codi força “senzill” i fa el que ha de fer pas a pas, pràcticament com ho faríem amb pseudocodi, descarrega això, agafa aquests valors, posa’ls aquí i després els gires i els poses allà, en poques paraules és això el que fa.

Ara bé podem arribar a reduir aquest codi a 3 línies? 3 contat la capçalera i una línia en blanc! Oi tant que sí!

Però com? Gràcies a dues coses, les pipes (tuberies, connexions o com ho hagueu après) i a les meravelles d’eines que tenim en la línia de comandes dels nostres sistemes unix/linux.

Et voilà! Aquest és el resultat!

#! /bin/bash

curl www.ccma.cat/tv3/$1/ | grep "\" href=\"/tv3/alacarta/$1" | awk 'match($0,"/tv3/alacarta/") {print substr($0, RSTART+14,150);}' | awk -F '[\/]' '{print $4"/" $2}' | awk '!/\"/' | awk '{print; getline;}' > $2

La delicadesa junt amb la complexitat de awk sempre m’ha fascinat, per desgràcia el faig servir tant poc que cada cop que el necessito tinc que passar hores per obtenir el resultat desitjat.

Pels que us pregunteu, “això descarrega els vídeos?”, doncs no… i aquí rau la complexitat del sistema, un fitxer per lots s’encarrega de crear un fitxer amb els capítols disponibles per cada sèrie que necessitem (les sèries de tv3/33/esport3 sempre han estat tractades diferents que les del super4) per un cop es genera cada fitxer, es llegeix i es va descarregant capítol a capítol, sempre comprovant la base de dades creada per tal de saber si el fitxer s’ha descarregat o no.

Vaja, no és un click, però si es programa cada dia a certa hora no ens hem de preocupar per res.

Bé, tot això és una excusa per poder ensenya la potència de awk, i que en una futura entrada entraré a descriure les funcions que realitza en l’script que us he mostrat en aquesta.

2 comments

  • Guillem

    Hola, sóc el Guillem, moltes gràcies per referenciar el programa de baixar vídeos de tv3!

    Em preguntava si potser t’interessaria actualitzar el codi del programa de tv3. El vam ficar al sourceforge perquè altres hi puguessin contribuir:

    https://sourceforge.net/projects/gnulinuxcattv3/

    Si t’interessès diguem-ho i et faré administrado del programa.

    Records!

    Guillem

    • Doncs no et diria que no, no sé com esta ara el codi de l’aplicació, el meu codi és caòtic, la meva màxima és “si funciona ja va bé”, encara que sigui un caos… hahaha

      Pots contactar amb mí pel mail del perfil.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *