Revisiting this Q & A à propos de la pré-génération de vignettes sur Nautilus/GNOME J'ai récemment dû découvrir qu'aucun des scripts publiés ici ne fonctionnerait sur KDE Plasma 5/dans le gestionnaire de fichiers Dolphin.
Est-il possible de générer des miniatures à l'avance sur KDE sans avoir à parcourir manuellement chaque dossier?
Il s'avère donc que KDE et GNOME suivent maintenant des conventions de dénomination des vignettes et de métadonnées légèrement différentes. C'est assez regrettable car de tels problèmes devaient être éliminés avec les travaux du Free Standards Group .
J'ai déposé un rapport de bogue avec KDE qui, espérons-le, finira par résoudre ce problème, mais pour le moment, les vignettes générées par KDE et GNOME sont malheureusement incompatibles.
Afin de contourner cette incompatibilité, je me suis retrouvé en modifiant le script Python que James Henstridge a publié dans le Q & A lié au précédent . Le principal changement que j'ai mis en place est une fonction qui met à jour les vignettes générées afin qu'elles soient reconnues par KDE (en les renommant et en mettant à jour le bloc de métadonnées PNG).
Voici le script susmentionné dans sa révision actuelle:
#!/usr/bin/python3
"""
Thumbnail generator for KDE/GNOME
Largely based on a script by James Henstridge
(https://askubuntu.com/a/201997)
Unfortunately there seems to be some disagreement between GNOME and KDE
towards how to follow the XDG specs for saving thumbnails. This script
is meant as a workaround to that issue, generating thumbnails that follow
both specifications.
Dependencies: python3 gir1.2-gnomedesktop-3.0 python-pillow
pillow can be installed with `pip install pillow`
You will also need to have the corresponding thumbnailers installed (e.g.
evince-thumbnailer). KDE thumbnailers are not supported. All previews are
generated through GNOME's thumbnail factory and then made compatible with KDE.
Further references:
Thumbnail specifications in KDE/GNOME:
- https://bugs.kde.org/show_bug.cgi?id=393015
- https://api.kde.org/frameworks/kio/html/previewjob_8cpp_source.html
- https://lazka.github.io/pgi-docs/GnomeDesktop-3.0/classes/DesktopThumbnailFactory.html
Setting PNG metadata:
- http://pillow.readthedocs.io/en/5.1.x/PIL.html#PIL.PngImagePlugin.PngInfo
- https://stackoverflow.com/a/10552742/1708932
Copyright: (c) 2012 James Henstridge <https://launchpad.net/~jamesh>
(c) 2018 Glutanimate <https://glutanimate.com/>
License: MIT license
"""
import os
import sys
from hashlib import md5
from PIL import Image
from PIL import PngImagePlugin
import gi
gi.require_version('GnomeDesktop', '3.0')
from gi.repository import Gio, GnomeDesktop
# FIXME: Hardcoding the Thumbnailer to a generic name
# regardless of MIME type might not always work
KDE_THUMBNAILER = "KDE Thumbnail Generator"
def update_name_and_meta(thumb_path, filename, mtime, mime_type, size):
print("Making thumb compatible with KDE...")
abs_path = os.path.abspath(filename)
# The spaces in our URI are not escaped. This is not in accordance
# with the URI RFC2396 which is listed in the freedesktop specs,
# but it's what KDE currently uses
# (cf.: https://bugs.kde.org/show_bug.cgi?id=393015)
kde_uri = "file://" + abs_path
kde_md5 = md5(kde_uri.encode("utf-8")).hexdigest()
thumb_dir = os.path.dirname(thumb_path)
kde_thumb_path = os.path.join(thumb_dir, kde_md5 + ".png")
if os.path.exists(kde_thumb_path):
print("KDE thumb already exists. Skipping")
return
im = Image.open(thumb_path)
# Set PNG metadata chunk
meta = PngImagePlugin.PngInfo()
meta.add_itxt("Software", KDE_THUMBNAILER)
meta.add_text("Thumb::MTime", str(int(mtime)))
meta.add_text("Thumb::Mimetype", mime_type)
meta.add_text("Thumb::Size", str(size))
meta.add_itxt("Thumb::URI", kde_uri)
im.save(kde_thumb_path, "png", pnginfo=meta)
# uncomment this to remove GNOME thumbnails:
# os.remove(thumb_path)
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()
size = info.get_size()
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
factory.save_thumbnail(thumbnail, uri, mtime)
thumb_path = factory.lookup(uri, mtime)
update_name_and_meta(thumb_path, filename, mtime, mime_type, size)
print("OK %s" % uri)
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))
Copiez et collez la section de code ci-dessus dans un nouveau fichier, choisissez un nom approprié (par exemple, thumbnailer
) et marquez-la comme exécutable.
Pour que le script fonctionne correctement, vous devez avoir installé les liaisons python pour GNOME. Le script dépend également de la bibliothèque pillow
de Python, qui peut être installée via pip
.
Les commandes suivantes doivent prendre en charge toutes les dépendances:
Sudo apt install gir1.2-gnomedesktop-3.0 python3-pip
pip3 install pillow
Les miniatures sont d'abord générées via la fabrique de miniatures de GNOME, puis compatibles avec KDE. Il vous faudra donc toujours installer tous les modules GNOME Thumbnailer correspondants. Les propres vignettes de KDE ne sont pas prises en charge. Exemple: pour que le script prenne en charge la génération de PDF miniatures, vous devez installer evince
.
(J'aurais adoré utiliser les liaisons de KDE python directement, mais il semble que pykde4 et pykde5 ont été abandonnés depuis des années).
L'utilisation générale est la même que pour tout autre script de vignettes. Appelez-le simplement avec les fichiers ou les dossiers dans lesquels vous souhaitez générer des vignettes en tant qu'arguments, par exemple:
thumbnailer /home/Documents
Spécifications des vignettes dans KDE/GNOME:
Définition des métadonnées PNG: