jueves, julio 12, 2007

Ingenieria inversa para la web 2.0 (II)

Esta es la segunda parte de mi reciente post Ingeniería inversa para la web 2.0, y es debido a que shinchandmc me dijo en un comentario que mi script fallaba, me dejo una url con la que mi script no funcionaba bien, y llevaba razón, nada mas ver la url lo supe. Mi respuesta la podéis leer en los comments de ese post, pero de todas formas voy a explicar un poco mas despacio porque falla, que falla y como lo he arreglado.

Mirar estas dos urls, la primera es la que puso sinchandmc y la segunda la que yo use en mi ejemplo y la que use durante la elaboración del script:

http://mp3tube.net/musics/Black-eyed-peace-Pump-it/45/
http://www.mp3tube.net/es/musics/Camaron-Como-el-agua/4844/

Mi script lo que fallaba en mi script es la parte donde obtiene el nombre de la canción, mirar esta línea:

NOMBRE=$(echo $1 | cut -f6 -d"/")

Lo que hace es dividir la url (el argumento 1, $1) según los símbolos "/", y se queda con la sexta parte, tomemos mi ejemplo:

http:, , www.mp3tube.net, es, musics, Camaron-Como-el-agua, 4844

Si contamos, "Camaron-Como-el-agua" es el número seis, y es con el que se queda el comando cut y lo que se almacena en la variable $NOMBRE. Sin embargo, tomemos ahora la url de shinchandmc:

http:, , mp3tube.net, musics, Black-eyed-peace-Pump-it, 45

Si contamos, el trozo número seis es "45" y no el nombre de la canción, esto es debido a que en la primera url había un trozo más, el "es" y en esta no lo hay, por lo que al haberme basado en la url que si incluye ese dato el script no funcionará bien con los que no tengan dicho dato.

Antes de ponerme a pensar una solución debía comprobar cuantos tipos de url hay en esa web, porque yo quiero que mi script sea universal, no que solo valga para algunas versiones de la web. Nada mas entrar en la web le di a una canción de la lista last music para comprobar como era la url, esta url no tenía ni "es" ni nada parecido. Luego probé eligiendo la versión en español de la web, ahora todas las canciones llevaban el "es" y por último probé la versión brasileña, en esta ocasión lo que se incluía era "br". La versión en inglés, la internacional, no incluye nada de ese estilo. Quedaba hacer una comprobación mas si yo tomo una url con el "es" o con "br" y se lo quito qué pasaría, lo hice y siguió funcionando bien, podía oir la canción tranquilamente, lo mismo pasa a la inversa, si yo tomo una url "internacional" sigue funcionando si le añado "br" o "es". Podéis comprobarlo entrar en estas tres páginas:

http://www.mp3tube.net/musics/Camaron-Como-el-agua/4844/
http://www.mp3tube.net/es/musics/Camaron-Como-el-agua/4844/
http://www.mp3tube.net/br/musics/Camaron-Como-el-agua/4844/

Entonces, la solución es de lo mas obvia, hay que identificar de alguna manera las url y ver cuales llevan "es" o "br" y cuales no, después mediante cut se usará -f6 para las primeras y -f5 para las segundas. La forma de hacerlo que a mi se me ha ocurrido es coger con cut el trozo número 4, el que corresponde a "es" y "br", pero en las url que no llevan ese parámetro sería "musics" en lugar de "es" o "br". Esta es la teoría, el pseudocódigo. Ahora vamos a programarlo de verdad.

Primero creamos una variable, en la que se almacenará el valor del trozo número 4, es decir o "es" o "br" o "musics", será la variable $TYPE:

TYPE=$(echo $1 | cut -f4 -d"/")

A continuación un simple if nos solucionará el problema:

Si $TYPE es igual a "es" -> cut va con -f6
Si $TYPE es igual a "br" -> cut va con -f6
Si $TYPE es igual a otra cosa -> cut va con -f5

if [ $TYPE = "es" ] ; then
 NOMBRE=$(echo $1 | cut -f6 -d"/")

elif [ $TYPE = "br" ] ; then

 NOMBRE=$(echo $1 | cut -f6 -d"/")

else

 NOMBRE=$(echo $1 | cut -f5 -d"/")
fi

Y por último, con la variable nombre elegida de forma correcta se cambia el nombre del archivo descargado:

mv $CANCION.tube $NOMBRE.mp3

Y para acabar sale un mensaje diciendo que el archivo $NOMBRE.mp3 ha sido guardado:

echo "El archivo $NOMBRE.mp3 ha sido guardado"

Esa es la solución que he programado, sin embargo se me ocurrieron otras dos mal útiles y elegantes, os pongo pseudocódigo porque no se programarlo así que no puedo poner otra cosa:

Otra forma de haberlo hecho hubiera sido poner solo un if/else y no un if/elif/else, así:

-Si $TYPE es igual a "es" o a "br" -> cut va con -f6
-Si $TYPE es igual a otra cosa -> cut va con -f5

El problema es que no sabía como poner ese parámetro lógico "o", así que esta no he podido hacerla.

Y la última solución, y para mi la mejor, sería usando comodines:

-Si $TYPE es igual a dos caracteres cualesquiera -> cut va con -f6
-Si $TYPE es igual a otra cosa -> cut va con -f5

Pero claro el problema es que tampoco se como ponerle el comodín necesario, ésta solución es la mejor por una razón básicamente: vale para siempre, si para las url "internacionales" sirve y también vale para las url de cualquier nuevo país que se añada a la lista, por ejemplo si ahora sacan una versión en francés ese parámetro sería "fr", mi script actualmente no funcionaría bien con eso, solo entiende de "es" y de "br". Sin embargo esta última solución es compatible con cualquiera porque solo comprueba que $TYPE es igual a dos caracteres, los que sean, y como todos los países se pueden representar con 2 letras pues ya estaría todo solucionado.

Si averiguo como solucionar ese pequeño problema lo haré y todos contentos :D

Para acabar comunicar una cosa, el nuevo script se puede descargar de aquí:

http://neobiusnet.googlepages.com/mp3tube.sh

Y cada vez que haya alguna actualización se podrá descargar desde ahí, porque las nuevas versiones siempre las voy a subir como mp3tube.sh, las antiguas tendrán un número adecuado, la primera versión todavía puede descargarse desde aquí:

http://neobiusnet.googlepages.com/mp3tube0.1.sh

Aunque no os lo recomiendo porque no funciona bien.

No hay comentarios: