Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Modifica metadatos de libros-e

Aquí dejo un script para modificar/consultar los metadatos de una biblioteca de libros-e.
La idea base es que puedo partir de una biblioteca organizada con subdirectorios y modificar/consultar todos los libros-e.
Para casos más sencillo basta con ebook-meta del que este script es tan solo un ‘wrapper’.

#!/bin/bash
#
# libros-e_metadata.sh
# Por Guimi 2013/01 - http://www.guimi.net
#

####################################
# REQUISITOS
# calibre -> ebook-metadata


####################################
#### ERRORES
E_PARAMINVAL=64     # Parametro invalido

####################################
#### AYUDA
muestra_ayuda ()
{
  echo "Use `basename $0` -h para ver la ayuda" >&2
}

muestra_ayuda_larga ()
{
  more << EOF

libros-e_metadata.sh
(c) 2013 Guimi (http://guimi.net)
This software is under the GNU Public License (GPL) v.2

Este script utiliza ebook-meta (calibre) para modificar y mostrar metadatos de ficheros epub de forma recurrente (subdirectorios)

Options:
---------
  -a
  --auto
	Utiliza el nombre del fichero para escribir el autor y titulo del libro en los metadatos
	Presupone el siguiente formato de nombre de archivo: autor-titulo.epub
	Ademas presupone que [autor] es: [1er apellido]_[resto] o [solo una palabra]

	Ejemplos:
		Platon-Escritos_completos.epub
		Sagan_Carl-Cosmos-ed.aniversario.epub

  -h
  --help
    Muestra esta ayuda

  -l
  --limpia
	Borra los metadatos de los campos comentarios, titulo de orden, productor y publicación

  -m [metadatos]
  --metadatos [metadatos]
	Escribe los metadatos dados, utilizando ebook-meta (ver ebook-meta --help)
	La cadena de metadatos debe estar entrecomillada

	Ejemplo:
		libros-e_metadata.sh -m "-l es -c 'Excelente libro'"

  -v
  --verbose
    Muestra todos los metadatos

EOF
}


####################################
# PARAMETROS

# Parámetros por omisión
string_parametros=""

# Comprobacion de parametros
while [ $# -gt 0 ]; do    # Mientras tenemos parámetros...
  case "$1" in
    -a|--auto) # Escribe metadatos a partir del nombre de fichero
      AUTO='0'
      ;;
    -h|--help) # Muestra la ayuda larga
	  muestra_ayuda_larga
      exit 0
      ;;
    -l|--limpia) # Limpia algunos metadatos
	  LIMPIA='0'
      ;;
    -m|--metadatos) # Escribe metadatos
      # Comprobando si hay mas parámetros
      if [ -z "$2" ]
      then
        echo "Error: Falta la cadena de metadatos" >&2
        muestra_ayuda
        exit $E_PARAMINVAL
      else
        string_parametros="$2"
        shift
      fi
      ;;
    -v|--verbose) # Muestra todos los metadatos
      VERBORREICO='0'
      ;;
    -*) # Parametro desconocido
      echo "Error: Parametro desconocido $1" >&2
      muestra_ayuda
      exit $E_PARAMINVAL
      ;;
  esac
  shift # Pasar al siguiente parámetro
done


####################################
# BUCLE PRINCIPAL
# Listamos los ficheros, incluidos subdirectorios
#

# Modificamos el separador de archivos (IFS), por si algun fichero contiene espacios en el nombre
SAVEIFS=$IFS
IFS=$'\n'
# Realizamos el bucle
for x in `find . -type f -iname "*.epub" | sort`
do
	# Limpiamos la cadena de comando del bucle anterior (si lo hubiere)
	string_comando=""

	# COMPROBAMOS SI HEMOS DE ESCRIBIR AUTOR Y TITULO A PARTIR DEL NOMBRE DEL FICHERO
	if [ -n "$AUTO" ]
	then
		# Tomamos los datos del nombre del fichero
		nombre_base=$(basename "$x")
		nombre_base="${nombre_base%.*}"
		libro_autor="${nombre_base%%-*}"
		libro_autor_esp="${libro_autor//_/ }"
		libro_autor_apellido="${libro_autor_esp%% *}"
		libro_autor_resto="${libro_autor_esp#* }"
		libro_autor_largo="$libro_autor_resto $libro_autor_apellido"
		libro_autor_orden="$libro_autor_apellido, $libro_autor_resto"
		libro_titulo="${nombre_base#*-}"
		libro_titulo_esp="${libro_titulo//_/ }"
		#echo  "[$libro_autor_largo] [$libro_autor_orden] [$libro_titulo]"

		# Anotamos los parametros para el conversor
		string_comando="-a '$libro_autor_largo' --author-sort '$libro_autor_orden' -t '$libro_titulo_esp' --title-sort ''"
	fi

	# COMPROBAMOS SI HEMOS DE LIMPIAR METADATOS
	if [ -n "$LIMPIA" ]
	then
		# Anotamos los parametros para el conversor
		string_comando=$string_comando" -c '' -p '' -k '' -d '' --title-sort ''"
	fi

	# COMPONEMOS LA ORDEN E INDICAMOS POR QUÉ FICHERO VAMOS
	if [ -n "$VERBORREICO" ]
	then
		comando="ebook-meta $string_comando $string_parametros '$x'"
		echo  "----------- $x ----------"
	else
		if [ "$string_comando" == "" ] && [ "$string_parametros" == "" ]
		then
			comando="ebook-meta '$x' | grep -e Title -e Author -e Language"
			echo  "----------- $x ----------"
		else
			comando="ebook-meta $string_comando $string_parametros '$x' > /dev/null"
			echo  "$x ..."
		fi
	fi

	# LANZAMOS EL CONVERTIDOR
	eval $comando

done
# Restauramos el separador de archivos (IFS)
IFS=$SAVEIFS

####################################
# Terminamos
exit 0