Autor Tema: Script BASH para crear Playlists en Linux.  (Leído 10365 veces)

0 Usuarios y 5 Visitantes están viendo este tema.

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Script BASH para crear Playlists en Linux.
« : septiembre 09, 2006, 10:43:48 pm »
Bueno gente... ayer estaba que quería meter toda la música al XMMS, pero resulta, que mis mp3 los tengo bieeen ordenaditos por todo el disco duro, repartidos en cuatro particiones.

Ciertamente, el XMMS tiene una opción para cargar directorios completos, pero por alguna razon, si hay demasiados directorios por revisar, tarda demasiado.

Así que bueno, me busque una forma de hacer los playlist con un un comando de shell, y aquí esta el resultado.

Nota: El formato de salida es m3u, usé ese formato porque es el mas simple, solo va en cada linea la ruta completa al mp3.

Primero, la función más basica que nos permite hacer algo como eso es la siguiente:
Código: [Seleccionar]
$ find /directorio | grep mp3$ > lista.m3u

Para crear la lista, solo debemos de cambiar "/directorio" por la ruta completa de donde queremos buscar los mp3, y "lista.m3u" por el nombre de archivo de lista que querramos.

Sin embargo, como nunca estoy conforme decidí hacer un pequeño script que toma dos argumentos de entrada, el directorio y el nombre de la lista, y genera automaticamente el comando adecuado para buscar los mp3. Además revisa si existe una lista previa y pregunta si deseamos anexar los mp3 al final del archivo.

Esta bastante útil para hacer listas, espero que les guste, aquí les dejo el codigo completo:

La sintaxis simple:

Citar
$ ./newPlaylist.sh /ruta/a/mis/mp3 milista

Código: [Seleccionar]
#!/bin/bash
# Copyright 2005-2006 Mario Gomez
# Software propiedad de Mario Enrique Gomez Argueta
# Se permite su copia/modificacion/distribucion bajo los
# terminos de la licencia GNU/GPL V2.0 que puede ser
# obtenida de www.fsf.org

# Variable que almacena el directorio
DIRECTORIO=$1
# Variable que almacena el nombre de la lista
ARCHIVOLISTA=$2

# Archivo que guarda la informacion de errores
ERRORLOG=".playListError.log"

# Funcion que crea/anexa a una lista existente
function appendPlaylist {
  echo "Anexando $1 a $2.m3u"
  echo "ErrorLog para $2.m3u" >> $HOME/$ERRORLOG 
  find $1 2>> $HOME/.playListError.log | egrep '\.mp3$|\.ogg$' >> "$2.m3u"
}

# Funcion que crea una nueva lista
function createPlaylist {
  echo "Creando $2.m3u con $1"
  echo "ErrorLog para $2.m3u" >> $HOME/$ERRORLOG
  find $1 2>> $HOME/$ERRORLOG | egrep '\.mp3$|\.ogg$' > "$2.m3u" 2> /dev/null
}

# Numero de argumentos del script
NARGS=2

# Error de argumentos invalidos
E_BADARGS=65
# Error de directorio invalido
E_NODIR=66

# Si el numero de argumentos es 1
if [ $# -eq "1" ]
then
  # Si el argumento es "-e"
  if [ $1 = "-e" ]
  then
    # Muestra el archivo de errores
    less $HOME/$ERRORLOG
    exit 0
  else
    echo "Uso: ./newPlaylist.sh -e"
    echo "     Muestra el log de errores"
  fi
fi

if [ $# -ne "$NARGS" ] # Si no coincide el numero de argumentos
then
  # Se muestra la ayuda
  echo "Uso: ./newPlaylist.sh directorio nombreLista"
  echo "Nota: Debe colocar la ruta completa al directorio"
  echo "      No es necesario agregar la extension m3u"
  exit $E_BADARGS # Termina con el error
fi

if [ ! -d "$DIRECTORIO" ] # Si no existe el directorio
then
  # Muestra el error
  echo "Error: Debe de ingresar un nombre de directorio valido"
  exit $E_NODIR # Termina con el error
fi

# Si ya existe un archivo de lista
if [ -e "$ARCHIVOLISTA.m3u" ]
then
  # Se muestra el mensaje de informacion
  echo "Advertencia: Ya existe un archivo llamado $ARCHIVOLISTA.m3u."
  # Esperamos por una entrada valida
  while [ "1" ]
  do
    # Lee la entrada del teclado y la almacena en $opcion
    read -p "Deseea sobreescribir o anexar? (c para cancelar) (s/a/c) " option
    # Se evalua la entrada
    case $option in
      S | s) createPlaylist $DIRECTORIO $ARCHIVOLISTA # Con S se sobreescribe la lista
         exit 0
      ;;
      A | a) appendPlaylist $DIRECTORIO $ARCHIVOLISTA # Con a se anexa al final
         exit 0
      ;;
      C | c ) exit 0 # Con c se sale del script
      ;;
    esac
  done
else # Si no existe el archivo de lista
  createPlaylist $DIRECTORIO $ARCHIVOLISTA # Se crea una nueva lista
  exit 0 # Se termina correctamente
fi

Modificado:

Se me olvidaba, para que puedan usarlo, tienen que hacer algo como los siguiente:

Código: [Seleccionar]
$ unzip newPlaylist.zip
$ chmod 755 newPlaylist.sh

Para ver el log de errores:

Código: [Seleccionar]
$ ./newPlaylist.sh -e

Si les gustó el script, pueden copiarlo a /usr/bin (como root)

Código: [Seleccionar]
# cp newPlaylist.sh /usr/bin/newPlaylist

Y así lo van a poder accesar como:

Código: [Seleccionar]
$ newPlaylist /directorio nombreLista

« Última Modificación: septiembre 10, 2006, 10:02:54 am por mxgxw »


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #1 : septiembre 09, 2006, 11:08:28 pm »
wow! esta extremadamente rapido, intenté encontrarle errores pero esta todo controlado:

-Meter menos parametros
-Directorio fuente invalido

Lo que si no me gusto es que tiene que ir pegado el nombre de la lista generada, no sería mejor que tomaras todo lo que venga despues del directorio fuente como nombre de lista?, por todo lo demas esta excelente, repito que me sorprende la velocidad, 5435 canciones listadas en menos de 10segs.

PD: deberias extender el grep para los oggs y wav, mas de alguno puede que los use ;)

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Script BASH para crear Playlists en Linux.
« Respuesta #2 : septiembre 09, 2006, 11:13:14 pm »
fijate que si tiene un bug fdlsjhfdlakhfkjfdas XD ya lo corrijo perame.

Modificado: Hoy si listo, ya lo pueden usar con plena confianza :roll:

Mañana le hago las mods que pedis... hoy ya me dio hueva fkslahfdlkajfas (ni que fueran grandes las mods)
« Última Modificación: septiembre 09, 2006, 11:17:46 pm por mxgxw »


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #3 : septiembre 09, 2006, 11:18:35 pm »
Cúal?, cuando pones un directorio que existe pero que no tenes permiso de acceso?... de que se queda trabado en "Find: /tal cosa/: Permiso denegado" ?

ej:
Código: [Seleccionar]
newPlaylist / algo
Te muestra:
Cita de: Bash
find: /var/lock/lvm: Permiso denegado
find: /var/run/sudo: Permiso denegado
find: /var/run/cups/certs: Permiso denegado
find: /var/cache/setup-tool-backends/debug: Permiso denegado
find: /var/cache/setup-tool-backends/backup: Permiso denegado
find: /var/lib/gdm: Permiso denegado
find: /var/lib/slocate: Permiso denegado
find: /var/spool/cron/atjobs: Permiso denegado
find: /var/spool/cron/atspool: Permiso denegado
find: /var/spool/cron/crontabs: Permiso denegado
find: /var/spool/cups: Permiso denegado
find: /var/tmp/kdecache-root: Permiso denegado
find: /etc/cups/ssl: Permiso denegado
find: /etc/gnome-system-tools/network: Permiso denegado
find: /etc/ssl/private: Permiso denegado
find: /proc/tty/driver: Permiso denegado
find: /proc/1/task/1/fd: Permiso denegado
find: /proc/1/fd: Permiso denegado
find: /proc/2/task/2/fd: Permiso denegado
find: /proc/2/fd: Permiso denegado
find: /proc/3/task/3/fd: Permiso denegado
find: /proc/3/fd: Permiso denegado
find: /proc/4/task/4/fd: Permiso denegado
find: /proc/4/fd: Permiso denegado
find: /proc/5/task/5/fd: Permiso denegado
find: /proc/5/fd: Permiso denegado
find: /proc/6/task/6/fd: Permiso denegado
find: /proc/6/fd: Permiso denegado
find: /proc/8/task/8/fd: Permiso denegado
find: /proc/8/fd: Permiso denegado
find: /proc/9/task/9/fd: Permiso denegado
find: /proc/9/fd: Permiso denegado
find: /proc/128/task/128/fd: Permiso denegado
find: /proc/128/fd: Permiso denegado
find: /proc/129/task/129/fd: Permiso denegado
find: /proc/129/fd: Permiso denegado
find: /proc/131/task/131/fd: Permiso denegado
find: /proc/131/fd: Permiso denegado
find: /proc/130/task/130/fd: Permiso denegado
find: /proc/130/fd: Permiso denegado
find: /proc/718/task/718/fd: Permiso denegado
find: /proc/718/fd: Permiso denegado
find: /proc/1732/task/1732/fd: Permiso denegado
find: /proc/1732/fd: Permiso denegado
find: /proc/1733/task/1733/fd: Permiso denegado
find: /proc/1733/fd: Permiso denegado
find: /proc/1736/task/1736/fd: Permiso denegado
find: /proc/1736/fd: Permiso denegado
find: /proc/1737/task/1737/fd: Permiso denegado
find: /proc/1737/fd: Permiso denegado
find: /proc/1870/task/1870/fd: Permiso denegado
find: /proc/1870/fd: Permiso denegado
find: /proc/1989/task/1989/fd: Permiso denegado
find: /proc/1989/fd: Permiso denegado
find: /proc/2219/task/2219/fd: Permiso denegado
find: /proc/2219/fd: Permiso denegado
find: /proc/3072/task/3072/fd: Permiso denegado
find: /proc/3072/fd: Permiso denegado
find: /proc/3186/task/3186/fd: Permiso denegado
find: /proc/3186/fd: Permiso denegado
find: /proc/3978/task/3978/fd: Permiso denegado
find: /proc/3978/fd: Permiso denegado
find: /proc/4097/task/4097/fd: Permiso denegado
find: /proc/4097/fd: Permiso denegado
find: /proc/4099/task/4099/fd: Permiso denegado
find: /proc/4099/fd: Permiso denegado
find: /proc/4418/task/4418/fd: Permiso denegado
find: /proc/4418/fd: Permiso denegado
find: /proc/4430/task/4430/fd: Permiso denegado
find: /proc/4430/fd: Permiso denegado
find: /proc/4452/task/4452/fd: Permiso denegado
find: /proc/4452/fd: Permiso denegado
find: /proc/4481/task/4481/fd: Permiso denegado
find: /proc/4481/task/4486/fd: Permiso denegado
find: /proc/4481/fd: Permiso denegado
find: /proc/4485/task/4485/fd: Permiso denegado
find: /proc/4485/fd: Permiso denegado
find: /proc/4566/task/4566/fd: Permiso denegado
find: /proc/4566/fd: Permiso denegado
find: /proc/4581/task/4581/fd: Permiso denegado
find: /proc/4581/fd: Permiso denegado
find: /proc/4582/task/4582/fd: Permiso denegado
find: /proc/4582/fd: Permiso denegado
find: /proc/4587/task/4587/fd: Permiso denegado
find: /proc/4587/fd: Permiso denegado
find: /proc/4637/task/4637/fd: Permiso denegado
find: /proc/4637/fd: Permiso denegado
find: /proc/4657/task/4657/fd: Permiso denegado
find: /proc/4657/fd: Permiso denegado
find: /proc/4658/task/4658/fd: Permiso denegado
find: /proc/4658/fd: Permiso denegado
find: /proc/4724/task/4724/fd: Permiso denegado
find: /proc/4724/fd: Permiso denegado
find: /proc/4757/task/4757/fd: Permiso denegado
find: /proc/4757/fd: Permiso denegado
find: /proc/4793/task/4793/fd: Permiso denegado
find: /proc/4793/fd: Permiso denegado
find: /proc/4857/task/4857/fd: Permiso denegado
find: /proc/4857/task/4860/fd: Permiso denegado
find: /proc/4857/task/4861/fd: Permiso denegado
find: /proc/4857/task/4862/fd: Permiso denegado
find: /proc/4857/task/4863/fd: Permiso denegado
find: /proc/4857/task/4874/fd: Permiso denegado
find: /proc/4857/task/4875/fd: Permiso denegado
find: /proc/4857/task/4876/fd: Permiso denegado
find: /proc/4857/task/4881/fd: Permiso denegado
find: /proc/4857/fd: Permiso denegado
find: /proc/4858/task/4858/fd: Permiso denegado
find: /proc/4858/fd: Permiso denegado
find: /proc/5021/task/5021/fd: Permiso denegado
find: /proc/5021/fd: Permiso denegado
find: /proc/5026/task/5026/fd: Permiso denegado
find: /proc/5026/fd: Permiso denegado
find: /proc/5041/task/5041/fd: Permiso denegado
find: /proc/5041/fd: Permiso denegado
find: /proc/5054/task/5054/fd: Permiso denegado
find: /proc/5054/fd: Permiso denegado
find: /proc/5088/task/5088/fd: Permiso denegado
find: /proc/5088/fd: Permiso denegado
find: /proc/5101/task/5101/fd: Permiso denegado
find: /proc/5101/fd: Permiso denegado
find: /proc/5171/task/5171/fd: Permiso denegado
find: /proc/5171/fd: Permiso denegado
find: /proc/5172/task/5172/fd: Permiso denegado
find: /proc/5172/fd: Permiso denegado
find: /proc/5173/task/5173/fd: Permiso denegado
find: /proc/5173/fd: Permiso denegado
find: /proc/5174/task/5174/fd: Permiso denegado
find: /proc/5174/fd: Permiso denegado
find: /proc/5175/task/5175/fd: Permiso denegado
find: /proc/5175/fd: Permiso denegado
find: /proc/5176/task/5176/fd: Permiso denegado
find: /proc/5176/fd: Permiso denegado
find: /proc/5270/task/5270/fd: Permiso denegado
find: /proc/5270/task/5917/fd: Permiso denegado
find: /proc/5270/fd: Permiso denegado
find: /proc/5274/task/5274/fd: Permiso denegado
find: /proc/5274/fd: Permiso denegado
find: /proc/5408/task/5408/fd: Permiso denegado
find: /proc/5408/fd: Permiso denegado
find: /proc/5572/task/5572/fd: Permiso denegado
find: /proc/5572/fd: Permiso denegado
find: /proc/5666/task/5666/fd: Permiso denegado
find: /proc/5666/fd: Permiso denegado
find: /proc/5918/task/5918/fd: Permiso denegado
find: /proc/5918/fd: Permiso denegado
find: /proc/5923/task/5923/fd: Permiso denegado
find: /proc/5923/fd: Permiso denegado
find: /root/.gnome2: Permiso denegado
find: /root/.gnome2_private: Permiso denegado
find: /root/.gconf: Permiso denegado
find: /root/.gconfd: Permiso denegado
find: /root/.synaptic: Permiso denegado
find: /root/.kde: Permiso denegado
find: /root/share: Permiso denegado
find: /root/.aptitude: Permiso denegado
find: /tmp/orbit-root: Permiso denegado
find: /tmp/gconfd-root: Permiso denegado

Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #4 : septiembre 09, 2006, 11:20:05 pm »
fijate que si tiene un bug fdlsjhfdlakhfkjfdas XD ya lo corrijo perame.

Modificado: Hoy si listo, ya lo pueden usar con plena confianza :roll:

Mañana le hago las mods que pedis... hoy ya me dio hueva fkslahfdlkajfas (ni que fueran grandes las mods)

Gracias, por cierto, que era el problema?

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Script BASH para crear Playlists en Linux.
« Respuesta #5 : septiembre 09, 2006, 11:23:19 pm »
Gracias, por cierto, que era el problema?

jajaja pues mira, con los directorios sin permiso pues como que siempre te va a tirar ese error, lo que se podria hacer es mandar la salida de errores a /dev/null flksjhfkljfas para que queden guardados en el limbo.

Ahora.... el error era este...

A donde dice:

Código: [Seleccionar]
createPlaylist $DIRECTORIO $ARCHIVOLISTA # Con S se sobreescribe la lista

Decía:

Código: [Seleccionar]
createPlaylist uno dos $DIRECTORIO $ARCHIVOLISTA # Con S se sobreescribe la lista

fdlsahfkjas esque no me estaba pasando los parametros, y le habia puesto "uno" y "dos" para debuggear, y lo subi y se me olvido quitarlo jejejeje



Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #6 : septiembre 09, 2006, 11:28:13 pm »
Sería bueno que con los errores los mandara al limbo ó a un archivo $ARCHIVOLISTA.err y te dijera el script: "Hubo error de permisos, consulte $ARCHIVOLISTA.err para detalles"

Con lo otro... un pequeño error no grave, y no probé sobreescribir ni añadir.

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Script BASH para crear Playlists en Linux.
« Respuesta #7 : septiembre 09, 2006, 11:40:46 pm »
Sería bueno que con los errores los mandara al limbo ó a un archivo $ARCHIVOLISTA.err y te dijera el script: "Hubo error de permisos, consulte $ARCHIVOLISTA.err para detalles"

Con lo otro... un pequeño error no grave, y no probé sobreescribir ni añadir.

Vaya.... los errores ahorita me dan igual hahaha igual yo lo queria mantener sencillito, todo error de find se manda al limbo. Ahora ya lista ogg tambien, wav no meti pk no creo que el promedio este interesado en listar en wav :P


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #8 : septiembre 09, 2006, 11:48:26 pm »
Uh.. lo siento, otro bug muy menor, no solo lo que esta despues del punto en el nombre del archivo esta siendo procesado, por lo que este archivo se termina agregando:

Citar
/usr/share/doc/gstreamer0.10-fluendo-mp3

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Script BASH para crear Playlists en Linux.
« Respuesta #9 : septiembre 09, 2006, 11:50:25 pm »
Uh.. lo siento, otro bug muy menor, no solo lo que esta despues del punto en el nombre del archivo esta siendo procesado, por lo que este archivo se termina agregando:

Citar
/usr/share/doc/gstreamer0.10-fluendo-mp3

awebo eso es por la extension... solo es de agregarle el punto :P


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #10 : septiembre 09, 2006, 11:53:28 pm »
Esa solucion es con respecto a tu codigo de ponerlo en
Código: [Seleccionar]
egrep '.mp3$|.ogg$'? ó que busque en los archivos y los arregle? XD... me imagino que te referis a la primera cuando decis "solo es de agregarle el punto"

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Script BASH para crear Playlists en Linux.
« Respuesta #11 : septiembre 09, 2006, 11:57:00 pm »
Esa solucion es con respecto a tu codigo de ponerlo en
Código: [Seleccionar]
egrep '.mp3$|.ogg$'? ó que busque en los archivos y los arregle? XD... me imagino que te referis a la primera cuando decis "solo es de agregarle el punto"

Vaya ya lo arregle...., siiip es mas o menos como decis, solo que es así:

Código: [Seleccionar]
'\.mp3$|\.ogg$'

El backslash es para evitar que el "." se evalue como expresion regular de cualquier caracter :P


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #12 : septiembre 09, 2006, 11:59:17 pm »
=0 ya decía yo porque mi "fix local" no servía XD. Gracias nuevamente, este script si me va a servir  :thumbsup:

PD: Andabas repartiendo -1 Ks pero te acabas de ganar un +1 ;)

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Script BASH para crear Playlists en Linux.
« Respuesta #13 : septiembre 10, 2006, 09:21:44 am »
Esta interesante , no acostumbro hacer playlists pero algun dia me podria server  :thumbsup: , veo que ya mandastes la salida del stderr al /dev/null

Vladimir si queres que lo mensajes de errores se almacenen en un archivo cambiale algo asi como esto en donde dice

Código: [Seleccionar]
find $1 2> /dev/null ...
pasalo a

Código: [Seleccionar]
find $1 2>$HOME/errores.txt ...
de esa manera todo lo del stderr te lo va/deberia guardar en el achivo errores.txt, al final podrias leer el archivo y si no esta vacio decir que hubieron errores  :thumbsup:


Desconectado vlad

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 6351
    • Qualium.net
Re: Script BASH para crear Playlists en Linux.
« Respuesta #14 : septiembre 10, 2006, 09:38:15 am »
Vladimir si queres que lo mensajes de errores se almacenen en un archivo cambiale algo asi como esto en donde dice

Código: [Seleccionar]
find $1 2> /dev/null ...
pasalo a

Código: [Seleccionar]
find $1 2>$HOME/errores.txt ...
de esa manera todo lo del stderr te lo va/deberia guardar en el achivo errores.txt, al final podrias leer el archivo y si no esta vacio decir que hubieron errores  :thumbsup:

:thx: :thumbsup:, creo que lo voy a dejar algo así:
Código: [Seleccionar]
find $1 2>$ARCHIVOLISTA.errPara tener la lista de errores por cada lista y no perderlos cada ves que haga uno nueva lista [si si, ¿que para qué puedo querer almacenar los errores?... pues en el caso de hacer varias lista por carpeta, mejor reviso los errores al final y no cada ves que hago una lista]