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

33

J'ai une grande bibliothèque de documents PDF (documents, 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 ~/.thumbnailsdossier s’empile 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 des documents PDF importants et laisser le cache de vignettes se régénérer.

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

Remarque : j'ai trouvé un ensemble de scripts bash qui semblent le faire pour les images et les vidéos, mais pour aucun autre document. Peut-être qu'une personne plus expérimentée en scripts pourra-t-elle 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 également avec les documents PDF.


Modifier :

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 aboutir à 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é stock 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 sec

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

Autres avantages : 1.) saute automatiquement les fichiers avec des pouces préexistants 2.) compatible avec une large gamme de formats d'image en plus de PDF 3.) indépendant de la plate-forme, ne repose pas sur des composants GNOME

Thumbnailer 3 , de 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é stock nautile

Avantages supplémentaires : 1.) Ignore automatiquement les fichiers avec des vignettes préexistantes. 2.) Compatible avec tous les formats de fichiers identifiés par les vignettes 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é.

En fin de compte, 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 en suivant ce tutoriel .


Éditer 2 : Avis mis à jour avec un script amélioré par rosch.

Glutanimate
la source
Parce que beaucoup de petits fichiers finissent toujours mal. Connaissez-vous la taille de votre dossier ~ / .thumbnails?
Antoine Rodriguez
Vous voulez dire la taille c'est en ce moment? environ 85 Mo après environ un mois d'utilisation.
Glutanimate
Et combien de fichiers a votre bibliothèque? (c'est pour des raisons techniques / limitations)
Antoine Rodriguez
ah, attends, j'ai mal calculé; cela inclut certains fichiers de données. Documents seulement son environ 2000.
Glutanimate
Juste pour vous mettre à jour: j'ai une solution pour vous. C'est long à rédiger, alors laissez-moi quelques jours. Regards;)
Antoine Rodriguez

Réponses:

35

Les routines de vignettes de Nautilus proviennent en fait de la libgnome-desktopbibliothèque. 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 __name__ == '__main__':
    sys.exit(main(sys.argv))

Enregistrez ceci dans un fichier et marquez-le comme exécutable. Vous devrez peut-être également installer le gir1.2-gnomedesktop-3.0package 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 ~/.thumbnailslà où des applications telles que Nautilus s'attendent à les trouver.

James Henstridge
la source
1
Merci, James, d'avoir pris le temps d'écrire ce script. Cela fonctionne comme annoncé pour des fichiers uniques. Parmi les solutions publiées, c'est la seule dont la sortie est reconnue par le système (le nom de fichier correct 48eebea785a185cdfc9d8f1a2ed34400.pngest utilisé). À ce stade, cependant, il ne semble pas prendre en charge les répertoires. Pourriez-vous le faire passer récursivement dans les répertoires?
Glutanimate
Terminé. J'ai aussi simplifié un peu la sortie aussi.
James Henstridge
Votre script fonctionne absolument bien. C'est exactement ce que je cherchais, alors je vous ai remis la prime. J'ai rencontré quelques messages d'erreur lors de mon dernier test, mais ils ne semblaient pas entraver la génération de vignettes. Les erreurs peuvent être liées au fait que certains noms de fichiers incluent des trémas allemands ("ä, ü, ö"). Merci encore d'avoir fourni cette excellente solution. Cela me facilitera beaucoup la vie désormais.
Glutanimate
1
Ces erreurs proviennent d'un analyseur XML utilisé par l'un des vignettes. Elles seraient donc liées au contenu d'un fichier plutôt qu'à son nom. Le script vignette ci-dessus traitera tous les fichiers du répertoire. Ce ne sera donc peut-être pas un fichier PDF avec lequel il aura des problèmes.
James Henstridge
Je ne parviens pas à créer de vignettes pour les fichiers de texte brut. Dois-je configurer quelque chose pour que cela fonctionne?
krasnaya
18

Le script ci-dessous devrait faire le travail. Il utilise evince-thumbnailerqui - pour autant que je sache - Avec chaque installation de GNOME et est le thumbnailer par défaut.
Enregistrer sous pdfthumbnailer.sh et le rendre 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'à présent, je n'ai vu aucune preuve que ce soit le cas par défaut evince-thumbnailer. 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
  • vitesse: 37 fichiers pdf testés avec evince-thumbnaileret convert(de imagemagick): 3 secondes pour evince-thumbnaileret 14 secondes 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)
  • besoins perl, présents dans une installation par défaut
  • les fichiers non gérés généreront evince-thumbnailersimplement une erreur - en sourdine2>/dev/null
  • regardez la ligne MimeType /usr/share/thumbnailers/evince.thumbnailerpour 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

rosch
la source
Tout d’abord, merci pour votre réponse et les efforts que vous avez déployés. J'ai fait quelques essais et voici mes résultats: 1.) la génération de vignettes ne fonctionne pas pour les répertoires avec des espaces dans leurs noms; 2.) les vignettes créées avec votre script et celles de @Martin Orda ne sont pas reconnues par le système; les fichiers traités avec votre script sont traités comme s'il n'y avait pas de vignettes -> le résultat: dupliquer les vignettes dans le répertoire des vignettes
Glutanimate
Hm, eh bien mes tests étaient positifs jusqu'à présent: le nautile a reconnu les vignettes et ne les a pas régénérées. Ugh, les espaces dans les noms de dossier sont quelque chose que je trouve une mauvaise pratique .. mais je vais modifier le script. Dupliquer les vignettes? Quel est le nom de la nouvelle miniature pour un fichier donné alors?
Rosch
Ok, a essayé à nouveau et j'ai bien peur que ce soit le même résultat que la dernière fois. Voici le nom d'un produit miniature votre script: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Voici comment la même vignette est nommé par nautilus: 48eebea785a185cdfc9d8f1a2ed34400.png. J'ai également remarqué que les vignettes créées avec votre script ont une taille de 128x171 pixels alors que le miniature intégré ne crée que des vignettes de 96 x 128 pixels.
Glutanimate
Voici une comparaison .
Glutanimate
En ce qui concerne votre commentaire sur l’ evince-thumbnailerajout des balises PNG, c’est exact: le code qui appelle les vignettes externes réécrit les images pour inclure les balises. Vous devriez pouvoir le vérifier en exécutant l' strings -aune des miniatures générées par Nautilus.
James Henstridge
10

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.shet exécutez-le avec des chemins absolus comme arguments (vous pouvez utiliser -s en tant que premier paramètre pour éviter de générer des vignettes existantes), c'est-à-dire:

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 prendre en charge 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.
Marcin Kaminski
la source
Merci également d'avoir fourni un excellent script. J'ai fait quelques essais et voici mes résultats: 1.) la génération de vignettes fonctionne bien et est plus rapide que evince-thumbnailer; 2.) les miniatures créées à la fois avec votre script et @ rosch ne sont pas reconnues par le système; Les fichiers traités avec votre script sont traités comme s'il n'y avait pas de vignettes. De nouveaux thumbs sont créés lors de l'accès manuel aux répertoires -> le résultat: duplicate thumbs dans le répertoire des miniatures
Glutanimate
Vous avez raison - j'ai vérifié à nouveau et trouvé que le nautile les génère à nouveau (je pense que ce n'était pas le cas lorsque je l'ai testé la nuit dernière mais je peux me tromper, il était déjà tard). Si c'est effectivement plus rapide comme vous l'avez écrit (je n'ai pas encore utilisé d'autres méthodes), je vais y travailler dans quelques heures. Le seul problème que je trouve avec cela est que les fichiers générés par mon script et par Nautilus présentent les mêmes propriétés: "PNG 97x128 97x128 + 0 + 0 DirectClass 20 bits, 20,4 Ko 0,000u 0: 00.000" lorsque j'utilise identifier <thumbnail>.
Marcin Kaminski
Non, nous avions tous les deux tort :) Il s'est avéré que j'avais oublié que le nom de fichier de la vignette était un hachage md5 de 'fichier: //' + chemin_absolu et que, par erreur, mon script était appelé ./mkthumb.sh -s Téléchargements / pdf / test au lieu de. /mkthumb.sh -s / home / utilisateur / Téléchargements / pdf / test. Essayez de recommencer.
Marcin Kaminski
Bon, j’ai fait un autre test et ce qui est curieux, c’est que votre script rosch semble avoir le même problème: le nom du fichier avec votre script est 2a43dc2774e3dfe45a4337e0304e5b0a.pngpendant que nautilus le nomme 48eebea785a185cdfc9d8f1a2ed34400.png. Les dimensions, cependant, sont correctes avec votre script. Voici une comparaison
Glutanimate
J'aimerais ajouter que votre script est toujours le plus rapide de ceux affichés ici. imagemagicksemble également gérer la mise à l’échelle bien mieux que evince-thumbnailer(voir la comparaison ci-dessus pour référence).
Glutanimate
1

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 au lieu de laisser chaque utilisateur 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é, éliminant ainsi la nécessité 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.

Bob
la source
1

J'ai écrit un package qui modifiait le script de James pour inclure le multitraitement et l'option permettant de générer de manière récursive des vignettes. Le paquet est pip-installable. Vérifiez ici pour les instructions d'installation.

Un exemple d'utilisation est:

thumbgen -w 4 -r -d your_directory
  • -r: générer récursivement des vignettes

  • -w: nombre de cœurs à utiliser

mudassirkhan19
la source