#!/bin/bash # # $Rev: 424 $ $Date: 2006-04-01 05:04:30 +0200 (ds, 01 abr 2006) $ # # Historia: # 0.4 (7 oct 2006): # - Bashificada # - Salida unicode opcional # - Valores de retorno estandarizados # - echo's movidos del bucle a uno único fuera # - "Throbber" # 0.3 (18 feb 2006): Añadido soporte de lectura de etiquetas ogg # # Public Domain, original (c) 2004-2006 Toni Corvera # # Este script está incompleto y es un trabajo en progreso # VERSION=0.4 filtro='*.ogg *.mp3 *.mpc *.mpp *.wav *.mp2' SALIDA_POR_DEFECTO=/dev/stdout MPLAYER=$(which mplayer) TAGMP3=$(which tagmp3) OGGINFO=$(which ogginfo) MPLAYER_OPTS=" -vc dummy -vo null -ao null -frames 0 -identify " # Comando iconv si se pide salida unicode ICONV= # Contendrá la salida antes de imprimirla OUT= # Contendrá el archivo de salida salida= # Important: after the which'es! set -e op=$1 if [ -z "$1" ]; then op=-c fi ayuda() { echo "dir2m3u ${VERSION} (c) 2004-2006 Toni Corvera" echo echo "Opciones:" echo " -h Mostrar esta ayuda" echo " -a Usar archivo de salida deducido del nombre del directorio" echo " -c Mostrar salida por la consola [por defecto]" echo " -U Usar salida UTF-8" echo } declare -r THROBBER=( '|' '/' '-' "\\" ) N_THROBBER=0 throbber() { echo -ne "[ ${THROBBER[$N_THROBBER]} ]\r" >&2 N_THROBBER=$(( ( $N_THROBBER + 1 ) % ${#THROBBER[*]} )) } while getopts "hacU" option; do case $option in h) ayuda && exit 0 ;; a) salida="00. "$(basename "$(pwd)")".m3u" ;; c) salida=/dev/stdout ;; U) if ! which iconv >/dev/null 2>&1 ; then echo "Iconv no disponible, no se puede transformar a UTF-8" >&2 else ICONV=" $(which iconv) -f iso-8859-15 -t utf-8 " fi ;; ?) echo "ERROR: Usa -h para ver las opciones" exit 68 ;; esac done shift $(($OPTIND - 1)) # Si se ha pasado un nombre, usarlo if [ -z "$salida" ] && [ "$1" ]; then salida="$1" ext=${salida:$(( ${#salida} - 4)):4} # Añadir .m3u si hace falta if [ '.m3u' != "$ext" ]; then salida="${salida}.m3u" fi elif [ -z "$salida" ]; then salida=$SALIDA_POR_DEFECTO fi # void duracion_mp3(string archivo) duracion_mp3() { if [ -z "$MPLAYER" ]; then echo -n 0 else echo -n $($MPLAYER $MPLAYER_OPTS "$1" 2>/dev/null | grep ID_LENGTH | cut -d'=' -f2) fi } # void autor_mp3(string archivo) autor_mp3() { if [ "$TAGMP3" ]; then echo -n $($TAGMP3 show "$1" 2>/dev/null | egrep ' +Artist' | sed 's/^.*: //') fi } # void titulo_mp3(string archivo) titulo_mp3() { if [ "$TAGMP3" ]; then echo -n $($TAGMP3 show "$1" 2>/dev/null | egrep ' +Title' | sed 's/^.*: //') fi } # void duracion_off(string archivo) duracion_ogg() { t=`ogginfo "$1" | egrep -i '^[[:space:]]*Playback length:' | cut -d' ' -f3` m=`echo $t | cut -d'm' -f1` s=`echo $t | cut -d':' -f2 | cut -d'.' -f1` expr $m \* 60 + $s } # void autor_mp3(string archivo) autor_ogg() { echo -n `ogginfo "$1" | grep 'ARTIST=' | sed 's/.*ARTIST=//'` } # void titulo_mp3(string archivo) titulo_ogg() { echo -n `ogginfo "$1" | grep 'TITLE=' | sed 's/.*TITLE=//'` } OUT="#EXTM3U" for f in $filtro ; do ls "$f" >/dev/null 2>/dev/null || { # Uno de los filtros de $filtro no se corresponde con archivos true # Evitar el set -e continue } archivo=$f extension=${archivo:$((${#archivo}-3)):3} # 3 últimos caracteres case $extension in ogg) f_duracion='duracion_ogg' f_autor='autor_ogg' f_titulo='titulo_ogg' ;; mp3|*) f_duracion='duracion_mp3' f_autor='autor_mp3' f_titulo='titulo_mp3' ;; esac autor=$( $f_autor "$archivo" ) titulo=$( $f_titulo "$archivo" ) duracion=$( $f_duracion "$archivo" ) OUT+="\n#EXTINF:${duracion},${autor} - ${titulo}\n${archivo}" throbber done if [ "$ICONV" ]; then echo -e $OUT | $ICONV else echo -e $OUT fi >> "$salida" exit 0