Labs: Instants Chile Get Improved – Descarga todos esos “momentos”

Supongo que hacer una introducción a los “instants” sería un pérdida de tiempo y caracteres, pues no conocerlos sería similar a vivir fuera del planeta o bajo una piedra.

Si eres alguno de los últimos (nunca faltan), paso a dar una pequeña descripción: los instants son esos pequeños momentos que por alguna razón pasaron a la historia, tenemos el clásico joJÓjo de Carlitox, el archi-conocido (al menos en Chile)  “¡Aer quien e’ el dostor!”, el semipterno Rick Roll o el clásico “EA Sports It’s in the game”, todo ello al alcance de un botón rojo.

¿Cuántas veces han querido tener ese sonido en su computador o en el celular para complementar ese momento que también lo ameritaba? Todo ello y más luego del salto…

La buena noticia es que acabo de desarrollar un pequeño script de Bash que obtiene todos, ¡sí! ¡todos! los sonidos desde instants.cl. Esto no habría sido posible sin los trabajos previos de Gon y Felipe Astroza.

Respecto a sus versiones anteriores, este script:

  • Descarga los sonidos sólo una vez (el de Gon lo hacía dos veces)
  • El código ha sido “simplificado”
  • Utilicé Arrays (sí, de BASH) para establecer las “dependencias”
  • Mejoré un poco la interfaz y las salidas son más explicativas

Si miran se podrán dar cuenta que aún hay algunas cosas que mejorar y que faltan:

  • Utilizar un directorio temporal (en /tmp), en vez de crear una carpeta “on-the-fly” y luego eliminarla
  • Preguntar al usuario dónde descargar los sonidos
  • Dejar opcional la posibilidad de utilizar curl o wget
  • Preguntar a qué formato el usuario quiere transformar los archivos (actualmente lo hace a mp3 y wav)

El script está disponible aquí, en un gist de Github, o a continuación. Me gustaría detenerme en lo de “un gist” (un especie de lugar para almacenar snippets) , esto significa que está funcionando como repositorio (de git por supuesto), pueden descargarlo, hacer un fork, clonarlo y ver los logs del desarrollo y lo más interesante, pueden hacer mejoras para luego yo incluirlas en la versión definitiva.

Si quiere algo más simple, también lo incluyo acá (click para desplegar):

[bash title=”InstantsFunGet Improved” collapse=”true”]
#!/usr/bin/env bash
#
###############################################################################
# #
# (c) 2010, Pablo Olmos de Aguilera <pablo[at}glatelier.org>; #
# Based on work from Gonzalo Diaz <me{at)gon.cl>; #
# http://gon.pastebin.com/zanh8uAq #
# #
# Based on InstantsFunGet from Felipe Astroza <felipe(at]astroza.cl> #
# http://felipe.astroza.cl/news/2010/05/08/audios-de-instantsfun-es-en-mp3/ #
# #
# This program is free software: you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation, either version 3 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program. If not, see <http://www.gnu.org/licenses/&gt;. #
# #
###############################################################################

#==============================================================================
#
# FILE: instants_cl_mp3_downloader.sh
#
# DESCRIPTION: Download every ‘instant’ from instants.cl to a folder.
#
# REVISION: 0.9
#==============================================================================

#
# Constants
#

SOURCE_HOST=http://www.instants.cl/search?max-results=1000

# TODO: Use mktemp
TEMP_DIR=tmp

# TODO: Ask user
COLLECTION_DIR=collection

# TODO: make optional wget or curl
# TODO: ask if the user wants to convert to wav
REQUIREMENTS=( lame wget swfextract )

function prepare() {
for app in ${REQUIREMENTS[@]}; do
if ! type -P ${app} &>/dev/null; then
# TODO: Find a way to make bash find that swfextract is part from swftools
[[ $app = "swfextract" ]] && app="swftools"
not_installed=("${not_installed[@]}" "$app")
fi
done

if [ ${#not_installed[@]} != 0 ]; then
echo "Sorry, the following apps have to be installed to run this script:" >&2
for required_app in ${not_installed[@]}; do
printf " %sn" $required_app
done
exit 1
fi

mkdir -p $TEMP_DIR $COLLECTION_DIR
}

function cleanup() { rm -fr $TEMP_DIR; }
function get_swf_list() {
echo $(cat $1 | grep swf | awk ‘BEGIN {FS="""}; {print $12}’);
}

function get_index() {
wget -q $1 -O $TEMP_DIR/index
echo "$TEMP_DIR/index"
}

#
# Starting Application
#

prepare

echo "InstantsChileGet-Improved – (C) 2010 Pablo Olmos de Aguilera"
echo "Based on: InstantsChileGet – (C) 2010 Gonzalo Diaz"
echo "based on: InstantsFunGet – (C) 2010 Felipe Astroza"
echo -n -e "Reading indexr"
swf_list=$(get_swf_list $(get_index $SOURCE_HOST))

# Deleting $TEMP_DIR/to_download if exists
[[ -e $TEMP_DIR/to_download ]] && rm $TEMP_DIR/to_download

for swf in $swf_list; do
echo $swf >> $TEMP_DIR/to_download
done

# Remove duplicated entries
swf_list=$(cat $TEMP_DIR/to_download | uniq )

TOTAL=$(echo $swf_list | wc -w)
current=1

for swf in $swf_list; do
name=$(echo $swf | awk ‘BEGIN {FS="/"}; {print $6}’)
echo -e -n "r[$current of $TOTAL]e[0K $swf => $TEMP_DIR/$namen"
wget -q -nc $swf -P $TEMP_DIR/
let "current++"
done

echo "Now we are going to extract the sound…"
sleep 5

current=1

for swf in $TEMP_DIR/*.swf; do
filename=$(basename $swf)
name=${filename%.*}
echo -e -n "r[$current of $TOTAL]e[0K Extracting sound from:
$swf => $COLLECTION_DIR/$name.mp3n"
sound_id=$(swfextract $swf | grep Sound: | awk ‘{print $5}’)
swfextract -s $sound_id $swf -o $COLLECTION_DIR/$name.mp3
lame –decode $COLLECTION_DIR/$name.mp3 $COLLECTION_DIR/$name.wav
let "current++"
done

cleanup
[/bash]

Para los que les interese un poco más aprender algo de scripting, les cuento que este script contiene varias a respuestas a problemas típicos (extraer campos de una dirección, obtener el nombre sin extensión, entre otros), por lo que revisar el código les puede ser bien útil.

De hecho, comenzaré una serie de artículos donde iremos paso a paso desarrollando este script, desde la ideación, prueba de concepto, pseudocódigo y finalmente el código propiamente tal. Todo esto, para que podamos ir aprendido “abstracciones” y responder al cómo programar, más que a “aprender Bash”.

PS.- Este artículo va con trackbacks para ambos Felipe y Gon, espero que funcionen.

10 thoughts on “Labs: Instants Chile Get Improved – Descarga todos esos “momentos”

  1. […] This post was mentioned on Twitter by Angelo Bernardi O, Pablo Olmos de A. C., Pablo N. , Geeks & Linux!, Mauro Morel and others. Mauro Morel said: Labs: Instants Chile Get Improved – Descarga todos esos “momentos”: Supongo que hacer una introducción a los “in… http://bit.ly/e79NZ5 […]

    Me gusta

  2. Lalo: Creo que la próxima semana comenzaremos ;).

    Gon: Más o menos xD. Pero igual tiene un problema de implementación. Lo que pasa es que me fijé en la opción del no clobber… eso no descarga si hay un archivo con el mismo nombre, pero presenta algunos problemas:

    * No hace diferencia si el archivo tiene un cambio de nombre, o es actualizado (no logré que wget comparar las fechas de última modificación no sé por qué, quizá tengas más suerte =))
    * La naturaleza del script, es borrar los swf descargados, por lo que para que noclobber fuera útil habría que dejar los archivos, esto obviamente no puede ser en un tmp/

    La solución que se me ocurre para lo último, es generar una lista con los archivos descargados y que quede en $HOME/.instantsfunget (o algo así xD), de esa forma, la segunda vez podrían compararse ambas listas y sólo descargar los nuevos. ¿Qué se te ocurre a ti?

    Me gusta

  3. Que buena, no había visto este post.
    Como me entusiasme hice mi versión del script, acá esta el código

    #!/bin/bash

    die() {
    echo "ERROR: $1" >&2
    exit 1
    }

    warn() { echo "WARN: $1" >&2; }

    DIR=/tmp/dir-$RANDOM

    [ $# -ne 1 ] && die "Uso: $0 DIR"

    DST_DIR=$1

    [ -d $DST_DIR ] || die "$DST_DIR: no es un directorio."

    for P in lame wget swfextract curl; do
    which $P &>/dev/null || die "$P: no encontrado"
    done

    mkdir $DIR &>/dev/null || die "$DIR: no se pudo crear"

    for URL in $(curl -s 'http://www.instants.cl/search?max-results=1000'
    | perl -ne 'print "$1n" if /.*(http://.*?.swf).*/' | uniq); do

    echo "Bajando: $URL"

    SWF_FILE=${URL##*/}
    DST_SWF_FILE=$DIR/$SWF_FILE
    DST_AUDIO_FILE=$DST_DIR/${SWF_FILE%.*}.mp3

    if [ -f $DST_AUDIO_FILE ]; then
    warn "$DST_AUDIO_FILE: existe, saltando"
    continue
    fi

    wget -q -O $DST_SWF_FILE $URL

    SOUND_ID=$(swfextract $DST_SWF_FILE | grep Sound: | awk '{print $5}')
    swfextract -s $SOUND_ID -o $DST_AUDIO_FILE $DST_SWF_FILE
    done

    rm -fr $DIR

    Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s