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.

Cependant, je constate en même temps que le dossier ~/.thumbnails 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. Est-il possible de demander à Nautilus de mettre en cache préalable les pouces pour un ensemble de répertoires donnés?

Remarque : j'ai trouvé une série de scripts bash qui semblent fonctionner. ceci 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 é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 aussi formidables.

Toutes les réponses fournies mériteraient la prime que j'avais initialement proposée 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:

Vignette 1 , par rosch:

Compatibilité : ✔ les 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 Nautilus

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

Thumbnailer 2 , de Martin Orda:

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

Vitesse : 95 PDF en 70,0 secondes

Qualité : une mise à l’échelle bien meilleure que celle des images de stock.

Autres avantages : 1.) Ignore automatiquement les fichiers avec des pouces déjà existants. 2.) Compatible 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é : ✔ les 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 Nautilus

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 en qualité de vignette, mais aux dépens de la vitesse.

Au final, c’est la solution de James qui convient le mieux à mon cas d’utilisation. Rapide, polyvalent, il offre la possibilité d’éviter les 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 didacticiel .

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

    
posée Glutanimate 13.04.2017 - 14:23
la source

4 réponses

34

Les routines de vignettes de Nautilus proviennent en réalité 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 __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 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 là où des applications telles que Nautilus s’attendent à les trouver.

    
réponse donnée James Henstridge 17.10.2012 - 10:36
la source
18

Le script ci-dessous devrait faire l'affaire. Il utilise evince-thumbnailer qui, à ma connaissance, est fourni avec toutes les installations de gnome et constitue le miniature 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 "[email protected]" ; do
    find "$folder" -type f -exec bash -c evincethumb {} \;
done

Restriction :

  • n'ajoute pas les 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 de 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.

Remarques :

  • imprime 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): 3 secondes pour evince-thumbnailer et 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)
  • a besoin de 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
  • examinez la ligne MimeType dans /usr/share/thumbnailers/evince.thumbnailer pour afficher une liste des types de fichiers gérés
  • mises à jour: à partir de 12.04, le dossier des miniatures semble être ~/.cache/thumbnails .
    Des chemins plus robustes utilisant readlink .

Inspiration :
lien

    
réponse donnée rosch 16.10.2012 - 23:33
la source
10

Je suis resté distrait pendant un moment et Rosch m'a battu. Je ne savais pas que evince-thumbnailer existait (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-le et installez-le s'il n'y en a 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 absolus comme arguments (vous pouvez utiliser -s en tant que premier paramètre pour éviter de générer des vignettes qui existent déjà) i.e.:

[email protected] $ ./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 [email protected]; 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ème.

A bit of testing here:

[email protected] $ find .thumbnails/
.thumbnails/
.thumbnails/fail
.thumbnails/fail/gnome-thumbnail-factory
.thumbnails/normal

# ok - no thumbnails present.

[email protected] $ ./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

[email protected] $ touch tstamp

[email protected] $ ./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:

[email protected] $ find .thumbnails/ -newer tstamp

# None.
    
réponse donnée Marcin Kaminski 17.10.2012 - 00:09
la source
1

La spécification de vignette comprend des référentiels de vignettes partagés, qui permettent de distribuer les vignettes de pré-génération avec les fichiers associés au lieu 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 sur une autre machine ou quoi que ce soit.

lien

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, aucune application ne les prend en charge.

    
réponse donnée Bob 11.08.2014 - 12:47
la source

Lire d'autres questions sur les étiquettes