web-dev-qa-db-fra.com

Comment puis-je demander à Nautilus de pré-générer des vignettes?

J'ai une grande bibliothèque de PDF documents (exposés, conférences, documents) que je veux pouvoir parcourir rapidement. Pour cela, j'ai besoin de vignettes.

En même temps, je constate cependant que le dossier ~/.thumbnails s’accumule de pouces dont je n’ai pas vraiment besoin. Il est impossible de supprimer des fichiers inutiles sans supprimer les pouces importants. Si je devais les supprimer, je devrais accéder à chaque dossier contenant d'importants documents PDF et laisser le cache de vignettes se régénérer.

J'aimerais pouvoir automatiser ce processus. Est-il possible de dire à Nautilus de pré-mettre en cache les vignettes pour un ensemble de répertoires donnés?

Remarque : J'ai trouvé n ensemble de scripts bash qui semblent le faire pour les images et les vidéos, mais pas pour les autres. documents. Une personne plus expérimentée en scripts pourra peut-être les ajuster pour les documents PDF ou au moins me diriger dans la bonne direction sur ce que je devrais modifier pour que cela fonctionne avec PDF documents aussi bien.


Éditer :

La réponse à cette question a été assez impressionnante. Permettez-moi d'abord de remercier tous ceux qui ont participé à la résolution de ce problème. La question, ses réponses et toutes les discussions autour de celle-ci sont un excellent exemple de la manière dont les efforts de collaboration de nombreuses parties peuvent conduire à une solution optimale. C'est exactement ce qui rend Linux et l'Open Source si formidables.

Toutes les réponses fournies mériteraient la prime que j'ai initialement mise en place pour cette question. Pourtant, il n'y a qu'une prime à attribuer. Je dois à tous les futurs lecteurs de choisir la réponse qui résout le problème de la manière la plus efficace. Pour déterminer la solution, j'ai effectué un dernier test en comparant les trois scripts en termes de compatibilité, de rapidité et de qualité de sortie. Voici les résultats:


Thumbnailer 1 , par rosch:

Compatibilité : ✔ espaces dans le nom du fichier; ✔ espaces dans le nom du répertoire; Compl conforme à freedesktop

Vitesse : 95 PDF en 12,6 secondes

Qualité : qualité du stock en nautile

Avantages supplémentaires : 1.) ignore automatiquement les fichiers avec des vignettes préexistantes; 2.) Aucun paquet supplémentaire nécessaire

Thumbnailer 2 , de Martin Orda:

Compatibilité : ✔ espaces dans le nom du fichier; ✔ espaces dans le nom du répertoire; Compl conforme à freedesktop

Vitesse : 95 PDF en 70,0 s

Qualité : mise à l'échelle nettement meilleure que celle des images de stock.

autres avantages : 1.) ignore automatiquement les fichiers avec des pouces existants 2.) compatibles avec un large éventail de formats d'image en plus de PDF 3.), indépendant de la plate-forme, ne repose pas sur des composants GNOME

Thumbnailer 3 , par James Henstridge:

Compatibilité : ✔ espaces dans le nom du fichier; ✔ espaces dans le nom du répertoire; ✔ conforme à freedesktop

Vitesse : 95 PDF en 10,8 secondes

Qualité : qualité du stock en nautile

Avantages supplémentaires : 1.) Ignore automatiquement les fichiers avec des vignettes préexistantes 2.) compatibles avec tous les formats de fichiers identifiés par les miniatures préinstallées


Les trois scripts sont excellents. Chacun a ses avantages et ses inconvénients. La solution de Rosch fonctionne immédiatement et peut constituer le bon choix pour les utilisateurs nécessitant une installation minimale.

Martin Orda a créé un script très polyvalent qui fonctionne avec une variété de formats de fichiers et qui est indépendant de DE. Il excelle par la qualité des vignettes mais aux dépens de la rapidité.

Au final, c’est la solution de James qui convient le mieux à mon cas d’utilisation. Rapide, polyvalent, il offre la possibilité de sauter des fichiers contenant des vignettes préexistantes.


Vainqueur: James Henstridge


Informations complémentaires : Les trois scripts sont entièrement compatibles avec les scripts nautilus . Vous pouvez facilement les installer après ce tutoriel .


Edit 2 : révision mise à jour avec un script amélioré par rosch.

33
Glutanimate

Les routines de vignettes de Nautilus proviennent en fait de la bibliothèque libgnome-desktop. Il est donc possible d'exécuter les mêmes vignettes en dehors du gestionnaire de fichiers.

L'API est un peu complexe, mais le script Python suivant devrait vous aider:

#!/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 __== '__main__':
    sys.exit(main(sys.argv))

Enregistrez ceci dans un fichier et marquez-le comme exécutable. Vous devrez peut-être également installer le package gir1.2-gnomedesktop-3.0 s'il n'est pas déjà installé.

Après cela, appelez simplement le script avec les fichiers ou les dossiers que vous souhaitez imaginer en tant qu'arguments. Les miniatures seront enregistrées dans ~/.thumbnails où des applications telles que Nautilus s’attendent à les trouver.

35
James Henstridge

Le script ci-dessous devrait faire le travail. Il utilise evince-thumbnailer qui - pour autant que je sache - est fourni avec chaque installation de gnome et constitue le miniature par défaut.
Enregistrez sous pdfthumbnailer.sh et rendez-le exécutable.
Utilisation : 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

Restriction :

  • n'ajoute pas d'attributs Thumb :: URI et Thumb :: MTime aux vignettes, comme l'a souligné James Henstridge. Jusqu'ici, je n'ai vu aucune preuve que le evince-thumbnailer par défaut le fasse. En d'autres termes ... tant que nautilus ne régénère pas les vignettes, le script peut être utilisé pour le travail.

Notes :

  • affiche le nom du fichier lors de la génération d'une nouvelle vignette, ignore la génération si elle existe
  • speed: 37 fichiers pdf testés avec evince-thumbnailer et convert (de imagemagick): 3secondes pour evince-thumbnailer et 14secondes pour convert.
  • génère des vignettes reconnues par nautile
  • noms de chemins gérés par l'URL Perl: module de fichier (les espaces et autres caractères sont correctement traduits dans un fichier URI)
  • need Perl, présent dans une installation par défaut
  • les fichiers non gérés par evince-thumbnailer généreront simplement une erreur - en sourdine avec 2>/dev/null
  • regardez la ligne MimeType dans /usr/share/thumbnailers/evince.thumbnailer pour voir une liste des types de fichiers traités.
  • mises à jour: à partir de 12.04, le dossier des miniatures semble être ~/.cache/thumbnails.
    Des chemins plus robustes utilisant readlink.

Inspiration :
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394

18
rosch

J'ai été distrait pendant un moment et Rosch m'a battu. Je ne savais pas qu'il existait un éditeur de vignettes (je ne suis pas un utilisateur de Gnome), mais de toute façon, puisque je l'ai déjà écrit, ça y est. Imagemagick doit être installé, vérifiez et installez-le s'il ne contient pas:

which convert || Sudo apt-get install imagemagick

Enregistrez sous mkthumb.sh (par exemple), chmod +x mkthumb.sh et exécutez-le avec des chemins d'accès absolus comme arguments (vous pouvez utiliser -s en tant que premier paramètre pour éviter de générer des vignettes existantes), à savoir:

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
....

Le script (je l'ai légèrement modifié pour supporter la plupart des images, vous pouvez ajouter d'autres extensions si vous en avez besoin):

#!/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}"

Il gère les fichiers avec des espaces dans leurs noms sans problèmes.

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.
10
Marcin Kaminski

La spécification de vignettes comprend des référentiels de vignettes partagées, qui permettent de distribuer les vignettes de pré-génération avec les fichiers associés plutôt que de demander à chaque utilisateur de générer sa propre vignette. Donc, en théorie, vous pouvez générer des vignettes, puis les ajouter à un référentiel partagé, vous évitant ainsi de les générer à l'avenir si vous effacez votre répertoire de vignettes ou si vous les déplacez tous vers un autre ordinateur.

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

Cette page Ask Ubuntu apparaît dans les résultats d'une recherche lorsque j'essayais de déterminer si une application prenait en charge les référentiels de miniatures partagés. Malheureusement, il semble qu'aucune application ne les supporte.

1
Bob