¿Cómo puedo instruir a Nautilus para que pregenere las miniaturas?

33

Tengo una gran biblioteca de documentos PDF (documentos, conferencias, folletos) por los que quiero poder navegar rápidamente. Para eso necesito miniaturas.

Al mismo tiempo, sin embargo, veo que la ~/.thumbnailscarpeta se está acumulando con los pulgares que realmente no necesito. Eliminar basura en miniatura sin eliminar los pulgares importantes es imposible. Si tuviera que eliminarlos, tendría que ir a todas y cada una de las carpetas con documentos PDF importantes y dejar que se regenere el caché de miniaturas.

Me encantaría poder automatizar este proceso. ¿Hay alguna forma de decirle a Nautilus que guarde previamente los pulgares para un conjunto de directorios dados?

Nota : Encontré un conjunto de scripts de bash que parecen hacer esto para imágenes y videos, pero no para ningún otro documento. Tal vez alguien con más experiencia en secuencias de comandos pueda ajustar estos para documentos PDF o al menos señalarme en la dirección correcta sobre lo que tendría que modificar para que esto funcione también con documentos PDF.


Editar :

La respuesta a esta pregunta ha sido bastante abrumadora. Permítanme primero agradecer a todos los que participaron en la resolución de esto. La pregunta, sus respuestas y toda la discusión en torno a ella son un gran ejemplo de cómo el esfuerzo de colaboración de muchas partes puede conducir a una solución óptima. Esto es exactamente lo que hace que Linux y Open Source sean tan geniales.

Todas las respuestas proporcionadas merecerían la recompensa que originalmente ofrecí por esta pregunta. Aún así, solo hay una recompensa para otorgar. A todos los futuros lectores les debo elegir la respuesta que resuelva el problema de la manera más eficiente. Para determinar qué solución es, realicé una prueba final, comparando los tres scripts en compatibilidad, velocidad y calidad de salida. Aquí están los resultados:


Miniatura 1 , por rosch:

Compatibilidad : ✔ espacios en el nombre del archivo; ✔ espacios en el nombre del directorio; ✘ compatible con freedesktop

Velocidad : 95 archivos PDF en 12,6 segundos

Calidad : calidad de stock nautilus

Beneficios adicionales : 1.) omite automáticamente los archivos con los pulgares preexistentes; 2.) No se necesitan paquetes adicionales

Miniatura 2 , por Martin Orda:

Compatibilidad : ✔ espacios en el nombre del archivo; ✔ espacios en el nombre del directorio; ✘ compatible con freedesktop

Velocidad : 95 archivos PDF en 70,0 segundos

Calidad : escalamiento significativamente mejor que las imágenes de stock.

Beneficios adicionales : 1.) omite automáticamente los archivos con los pulgares preexistentes 2.) compatible con una amplia gama de formatos de imagen además de PDF 3.) independiente de la plataforma, no se basa en componentes GNOME

Miniatura 3 , de James Henstridge:

Compatibilidad : ✔ espacios en el nombre del archivo; ✔ espacios en el nombre del directorio; ✔ compatible con freedesktop

Velocidad : 95 archivos PDF en 10,8 segundos

Calidad : calidad de stock nautilus

Beneficios adicionales : 1.) omite automáticamente los archivos con los pulgares preexistentes 2.) compatible con todos los formatos de archivo identificados por los miniaturas preinstalados


Los tres guiones son excelentes. Cada uno tiene su conjunto distintivo de ventajas y desventajas. La solución de Rosch funciona de inmediato y podría ser la opción correcta para los usuarios con una instalación mínima.

Martin Orda creó un script muy versátil que funciona con una variedad de formatos de archivo y es independiente de DE. Se destaca en calidad de miniatura, pero lo hace a expensas de la velocidad.

Al final fue la solución de James la que mejor se ajustaba a mi caso de uso. Es rápido, versátil y ofrece las opciones para omitir archivos con miniaturas preexistentes.


Ganador general: James Henstridge


Información adicional : Los tres scripts son totalmente compatibles con nautilus-scripts . Puede instalarlos fácilmente siguiendo este tutorial .


Edición 2 : Revisión actualizada con guión mejorado de rosch.

Glutanimate
fuente
Porque muchos archivos pequeños siempre terminan mal. ¿Conoces el tamaño de tu carpeta ~ / .thumbnails?
Antoine Rodriguez
¿Te refieres al tamaño que tiene ahora? aproximadamente 85 MB después de ~ 1 mes de uso.
Glutanimate
¿Y cuántos archivos tiene tu biblioteca? (Eso es por razones técnicas / limitaciones)
Antoine Rodriguez
ah espera, calculé mal; eso incluye algunos archivos de datos. Los documentos solo son aproximadamente 2000.
Glutanimate
Solo para actualizarlo: tengo una solución para usted. Es largo para redactar, así que permíteme un par de días. Saludos;)
Antoine Rodriguez

Respuestas:

35

Las rutinas de miniaturas de Nautilus en realidad provienen de la libgnome-desktopbiblioteca, por lo que es posible ejecutar las mismas miniaturas fuera del administrador de archivos.

La API es un poco compleja, pero el siguiente script de Python debería ayudar:

#!/usr/bin/python
import os
import sys

from gi.repository import Gio, GnomeDesktop

def make_thumbnail(factory, filename):
    mtime = os.path.getmtime(filename)
    # Use Gio to determine the URI and mime type
    f = Gio.file_new_for_path(filename)
    uri = f.get_uri()
    info = f.query_info(
        'standard::content-type', Gio.FileQueryInfoFlags.NONE, None)
    mime_type = info.get_content_type()

    if factory.lookup(uri, mtime) is not None:
        print "FRESH       %s" % uri
        return False

    if not factory.can_thumbnail(uri, mime_type, mtime):
        print "UNSUPPORTED %s" % uri
        return False

    thumbnail = factory.generate_thumbnail(uri, mime_type)
    if thumbnail is None:
        print "ERROR       %s" % uri
        return False

    print "OK          %s" % uri
    factory.save_thumbnail(thumbnail, uri, mtime)
    return True

def thumbnail_folder(factory, folder):
    for dirpath, dirnames, filenames in os.walk(folder):
        for filename in filenames:
            make_thumbnail(factory, os.path.join(dirpath, filename))

def main(argv):
    factory = GnomeDesktop.DesktopThumbnailFactory()
    for filename in argv[1:]:
        if os.path.isdir(filename):
            thumbnail_folder(factory, filename)
        else:
            make_thumbnail(factory, filename)

if __name__ == '__main__':
    sys.exit(main(sys.argv))

Guarde esto en un archivo y márquelo como ejecutable. Es posible que también necesite instalar el gir1.2-gnomedesktop-3.0paquete si aún no está instalado.

Después de eso, simplemente invoque el script con los archivos o carpetas que desea en miniatura como argumentos. Las miniaturas se guardarán ~/.thumbnailsdonde las aplicaciones como Nautilus esperan encontrarlas.

James Henstridge
fuente
1
Gracias, James, por tomarte el tiempo de escribir este guión. Funciona tal como se anuncia para archivos individuales. De las soluciones publicadas, es la única cuya salida es reconocida por el sistema ( 48eebea785a185cdfc9d8f1a2ed34400.pngse utiliza el nombre de archivo correcto ). En este punto, sin embargo, no parece admitir directorios. ¿Hay alguna forma en que puedas hacer que revise directorios de manera recursiva?
Glutanimate
Hecho. También simplifiqué un poco la salida también.
James Henstridge
Tu guión funciona absolutamente genial. Es exactamente lo que estaba buscando, así que te recompensé con la recompensa. Encontré algunos mensajes de error mientras realizaba mi prueba final, pero no parecían obstaculizar la generación de miniaturas. Los errores pueden estar relacionados con el hecho de que algunos de los nombres de archivo incluyen Umlauts alemanes ("ä, ü, ö"). Gracias, nuevamente, por proporcionar esta excelente solución. Hará mi vida mucho más fácil de ahora en adelante.
Glutanimate
1
Esos errores provienen de un analizador XML utilizado por una de las miniaturas, por lo que estaría relacionado con el contenido de algún archivo en lugar de su nombre. El script de miniaturas anterior procesará todos los archivos en el directorio, por lo que podría no ser un PDF con el que tenga problemas.
James Henstridge
No puedo crear miniaturas para archivos de texto sin formato. ¿Hay algo que deba configurar para que esto funcione?
krasnaya
18

El siguiente script debería hacer el trabajo. Utiliza lo evince-thumbnailerque, hasta donde yo sé, viene con cada instalación de gnome y es la miniatura predeterminada.
Guardar como pdfthumbnailer.sh y hacerlo ejecutable.
Uso :pdfthumbnailer.sh dir1 [dir2, ...]

#!/bin/bash

F1=$HOME/.thumbnails/normal
F2=$HOME/.cache/thumbnails/normal
SAVE_FOLDER=$F1
[ -e $F2 ] && SAVE_FOLDER=$F2

# the thumbnailing function
evincethumb() {
    outname=$(echo -n "$(readlink -f "$0")" | \
    perl -MURI::file -MDigest::MD5=md5_hex -ne 'print md5_hex(URI::file->new($_));')
    # no work if thumbnail already present
    [ ! -e $SAVE_FOLDER/${outname}.png ] && {
        echo "$0"
        #uncomment only one of both thumbnailers
        #convert -thumbnail 128x128 "$0"[0] $SAVE_FOLDER/${outname}.png 2>/dev/null
        evince-thumbnailer -s 128 "$0" $SAVE_FOLDER/${outname}.png 2>/dev/null
    }
}

# make our function visible to the subshell in "find -exec" below
export -f evincethumb

# loop through all given folders
for folder in "$@" ; do
    find "$folder" -type f -exec bash -c evincethumb {} \;
done

Restriccion :

  • no agrega los atributos Thumb :: URI y Thumb :: MTime a las miniaturas como lo señala James Henstridge. Hasta ahora no he visto evidencia de que el valor predeterminado lo evince-thumbnaileresté haciendo. En otras palabras ... siempre y cuando nautilus no regenere las miniaturas, el script puede usarse para el trabajo.

Notas :

  • imprime el nombre del archivo al generar una nueva miniatura, omite la generación si existe
  • velocidad: 37 archivos pdf probados con ambos evince-thumbnailery convert(de imagemagick): 3 segundos para evince-thumbnailery 14 segundos para convert.
  • genera miniaturas reconocidas por nautilus
  • nombres de ruta manejados por la URL perl: módulo de archivo (los espacios y otros caracteres se traducen correctamente en un archivo uri)
  • necesidades perl, presente en una instalación predeterminada
  • los archivos no manejados evince-thumbnailersimplemente generarán un error, silenciado con2>/dev/null
  • mira la línea MimeType /usr/share/thumbnailers/evince.thumbnailerpara ver una lista de los tipos de archivos manejados
  • actualizaciones: a partir de 12.04 la carpeta de miniaturas parece ser ~/.cache/thumbnails.
    Rutas más robustas utilizando readlink.

Inspiración :
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394

rosch
fuente
En primer lugar, gracias por su respuesta y el esfuerzo que puso en ello. Hice algunas ejecuciones de prueba y aquí están mis resultados: 1.) la generación de miniaturas no funciona para directorios con espacios en sus nombres; 2.) el sistema no reconoce las miniaturas creadas tanto con su script como con @Martin Orda; los archivos procesados ​​con su script se manejan como si no hubiera una miniatura presente -> el resultado: pulgares duplicados en el directorio de miniaturas
Glutanimate
Hm, bueno, mis pruebas fueron positivas hasta ahora: nautilus reconoció las miniaturas y no las regeneró. Ugh, los espacios en los nombres de las carpetas es algo que considero una mala práctica ... pero modificaré el script. ¿Miniaturas duplicadas? ¿Cuál es el nombre de la nueva imagen para un archivo de donación?
rosch
Ok, lo probé nuevamente y me temo que es el mismo resultado que la última vez. Aquí está el nombre de archivo de una imagen en miniatura de su secuencia de comandos generada: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Esta es la forma en la misma miniatura es nombrado por Nautilus: 48eebea785a185cdfc9d8f1a2ed34400.png. También he notado que los pulgares creados con su secuencia de comandos son 128x171px, mientras que la miniatura incorporada solo crea 96x128px miniaturas.
Glutanimate
Acerca de su comentario sobre evince-thumbnailerno agregar las etiquetas PNG, eso es correcto: el código que llama a las miniaturas externas en realidad reescribe las imágenes para incluir las etiquetas. Debería poder verificar esto ejecutando strings -auna de las miniaturas generadas por Nautilus.
James Henstridge
10

Me distraje por un tiempo y Rosch me ganó :) No sabía que existía una miniaturas (no soy un usuario de Gnome) pero de todos modos, como ya lo he escrito, aquí está. Requiere imagemagick instalado, verifique e instale si no está allí con:

which convert || sudo apt-get install imagemagick

Guardar como mkthumb.sh(por ejemplo), chmod +x mkthumb.shy ejecutarlo con rutas absolutas como argumentos (puede usar -s como su primer parámetro para omitir la generación de miniaturas que ya existen), es decir:

user@host $ ./mkthumb.sh -s /home/user/Downloads /home/user/blah
Processing directory /home/user/Downloads/pics/
OK   /home/user/Downloads/pics/FeO08.jpg
OK   /home/user/Downloads/pics/UrOCu.jpg
OK   /home/user/Downloads/pics/34ATZ.gif
OK   /home/user/Downloads/pics/WBRE3.jpg
OK   /home/user/Downloads/pics/LjLdH.jpg
OK   /home/user/Downloads/pics/xvvae (1).jpg
SKIP /home/user/Downloads/pics/itcrowd.jpg
OK   /home/user/Downloads/pics/76180344.jpg
OK   /home/user/Downloads/pics/fgk5N.jpg
....

El script (lo he modificado ligeramente para admitir la mayoría de las imágenes, puede agregar más extensiones si las necesita):

#!/bin/bash

# USAGE: mkthumb.sh [-s] <abs_path> [abs_path]
# create nautilus thumbnails for images and PDFs in the directories (and their
# sub-directories) given as parameters.
# -s is used to skip generating thumbnails that already exist

skip_existing=0
if [[ "${1}" == "-s" ]]; then
  skip_existing=1
  shift
fi

mkthumb() {
  file="${1}"
  dest="${2}"
  convert -thumbnail 128x128 "${file}[0]" "${dest}" &>/dev/null
  if (( $? == 0 )); then
    echo "OK   ${file}"
  else
    echo "FAIL ${file}"
  fi
}

OLDIFS="${IFS}"
IFS=$'\n'
for dir in $@; do
  realdir=`realpath "${dir}"`
  echo "Processing directory ${realdir}"
  for file in $(find "${realdir}" -regextype posix-egrep -iregex \
  '.*\.(pdf|png|jpg|gif|jpeg)'); do
    md5=$(echo -n "${file}" | perl -MURI::file -MDigest::MD5=md5_hex -ne \
          'print md5_hex(URI::file->new($_));')
    dest="${HOME}/.thumbnails/normal/${md5}.png"
    if [[ -f "${dest}" ]]; then
      if [[ "${skip_existing}" == "0" ]]; then
        mkthumb "${file}" "${dest}"
      else
        echo "SKIP ${file}"
      fi
    else
      mkthumb "${file}" "${dest}"
    fi
  done
done
IFS="${OLDIFS}"

Maneja archivos con espacios en sus nombres sin problemas.

A bit of testing here:

user@host $ find .thumbnails/
.thumbnails/
.thumbnails/fail
.thumbnails/fail/gnome-thumbnail-factory
.thumbnails/normal

# ok - no thumbnails present.

user@host $ ./mkthumb.sh -s /home/user/Downloads/pdf/test/
Processing directory /home/user/Downloads/pdf/test/
OK   /home/user/Downloads/pdf/test/800pdf.pdf
OK   /home/user/Downloads/pdf/test/3_TO_pricelist.pdf
OK   /home/user/Downloads/pdf/test/111011-speisekarte-mit-desserts.pdf
OK   /home/user/Downloads/pdf/test/1186157_r4f3a355eb104a (1).pdf

user@host $ touch tstamp

user@host $ ./mkthumb.sh -s /home/user/Downloads/pdf/test/
Processing directory /home/user/Downloads/pdf/test/
SKIP /home/user/Downloads/pdf/test/800pdf.pdf
SKIP /home/user/Downloads/pdf/test/3_TO_pricelist.pdf
SKIP /home/user/Downloads/pdf/test/111011-speisekarte-mit-desserts.pdf
SKIP /home/user/Downloads/pdf/test/1186157_r4f3a355eb104a (1).pdf

# running nautilus once now to see if it generates new thumbnails

# checking for new thumbnails:

user@host $ find .thumbnails/ -newer tstamp

# None.
Marcin Kaminski
fuente
Gracias también por proporcionar un excelente guión. Hice algunas pruebas y aquí están mis resultados: 1.) la generación de miniaturas funciona bien y es más rápida que evince-thumbnailer; 2.) las miniaturas creadas con su script y @ rosch no son reconocidas por el sistema; los archivos procesados ​​con su script se manejan como si no hubiera una miniatura presente. Se crean nuevos pulgares al acceder manualmente a los directorios -> el resultado: pulgares duplicados en el directorio de miniaturas
Glutanimate
Tienes razón: he comprobado esto de nuevo y descubrí que el nautilus los genera de nuevo (creo que ese no fue el caso cuando lo probé anoche, pero podría estar equivocado, ya era tarde). Si de hecho es más rápido como escribiste (todavía no he usado otros métodos), trabajaré en ello en unas pocas horas. El único problema que encuentro con esto es que ambos archivos generados por mi script y nautilus exhiben las mismas propiedades: "PNG 97x128 97x128 + 0 + 0 8 bits DirectClass 20.4KB 0.000u 0: 00.000" cuando uso identificador <thumbnail>.
Marcin Kaminski
No, ambos estábamos equivocados :) Resulta que olvidé que el nombre de archivo de la miniatura es un hash md5 de 'file: //' + absolute_path y ejecuté por error mi script como ./mkthumb.sh -s Downloads / pdf / test en lugar de. /mkthumb.sh -s / home / user / Downloads / pdf / test. Intenta intentarlo de nuevo.
Marcin Kaminski
Muy bien, hice otra prueba de funcionamiento y lo peculiar es que tanto el rosch de su script parece tener el mismo problema: el nombre de archivo con su script es 2a43dc2774e3dfe45a4337e0304e5b0a.pngmientras que nautilus lo nombra como 48eebea785a185cdfc9d8f1a2ed34400.png. Las dimensiones, sin embargo, son correctas con su script. Aquí hay una comparación
Glutanimate
Me gustaría agregar que su script aún es el más rápido de los publicados aquí. imagemagickTambién parece manejar la escala mucho mejor que evince-thumbnailer(ver la comparación anterior para referencia).
Glutanimate
1

La especificación de miniaturas incluye repositorios de miniaturas compartidas, que permiten que las miniaturas de pregeneración se distribuyan junto con los archivos asociados en lugar de que cada usuario genere su propia miniatura. Entonces, en teoría, podría generar miniaturas y luego agregarlas a un repositorio compartido, eliminando así la necesidad de generarlas en el futuro si borró su directorio de miniaturas o las movió a una máquina diferente o lo que sea.

http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#DIRECTORY

Esta página de Ask Ubuntu aparece en los resultados de una búsqueda cuando intentaba averiguar si alguna aplicación admite repositorios de miniaturas compartidas. Lamentablemente, parece que ninguna aplicación los admite.

Mover
fuente
1

Escribí un paquete que modificó el script de James para incluir multiprocesamiento y la opción de generar miniaturas de forma recursiva. El paquete es pip-instalable. Consulte aquí las instrucciones de instalación.

Un ejemplo de uso es:

thumbgen -w 4 -r -d your_directory
  • -r: generar recursivamente miniaturas

  • -w: número de núcleos a utilizar

mudassirkhan19
fuente