web-dev-qa-db-fra.com

Comment puis-je générer des vignettes à l'avance sur KDE / Dolphin?

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?

3
Glutanimate

Introduction

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.

Script Thumbnailer pour combler le fossé entre KDE et GNOME

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

Installation

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.

Les dépendances

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

Usage

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

Références

Spécifications des vignettes dans KDE/GNOME:

Définition des métadonnées PNG:

4
Glutanimate