AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1024105
Accepted
Glutanimate
Glutanimate
Asked: 2018-04-12 10:09:52 +0800 CST2018-04-12 10:09:52 +0800 CST 2018-04-12 10:09:52 +0800 CST

如何在 KDE / Dolphin 上提前生成缩略图?

  • 772

重温这个关于在 Nautilus/GNOME 上预生成缩略图的Q&A我最近不得不发现那里发布的所有脚本都不能在 Dolphin 文件管理器中的 KDE Plasma 5 上运行。

有什么方法可以在 KDE 上预先生成缩略图,而无需手动浏览每个文件夹?

kde pdf dolphin thumbnails
  • 1 1 个回答
  • 2644 Views

1 个回答

  • Voted
  1. Best Answer
    Glutanimate
    2018-04-12T10:09:52+08:002018-04-12T10:09:52+08:00

    介绍

    因此,KDE 和 GNOME 现在遵循稍微不同的缩略图命名和元数据约定。这是非常不幸的,因为这些问题本应通过自由标准组的工作消除。

    我已经向KDE 提交了一份错误报告,希望最终能解决这个问题,但是目前由 KDE 和 GNOME 生成的缩略图令人遗憾地彼此不兼容。

    缩小 KDE/GNOME 差距的缩略图脚本

    为了解决这种不兼容问题,我最终修改了 James Henstridge 在上面链接到的问答中发布的 Python 脚本。我实现的主要更改是更新生成的缩略图以被 KDE 识别的功能(通过重命名它们并更新 PNG 元数据块)。

    这是当前版本中的上述脚本:

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

    安装

    将上面的代码部分复制并粘贴到一个新文件中,为其选择合适的名称(例如thumbnailer),并将其标记为可执行。

    依赖项

    要使脚本正常工作,您需要安装 GNOME 的 python 绑定。该脚本还依赖于 Python 的pillow库,可以通过pip.

    以下命令应处理所有依赖项:

    sudo apt install gir1.2-gnomedesktop-3.0 python3-pip
    pip3 install pillow
    

    缩略图首先通过 GNOME 的缩略图工厂生成,然后与 KDE 兼容。因此,您仍然需要安装所有相应的 GNOME 缩略图模块。不支持 KDE 自己的缩略图。例如:要让脚本支持生成 PDF 缩略图,您必须安装evince.

    (我很想直接使用 KDE 的 python 绑定,但看起来 pykde4 和 pykde5 都已被废弃多年)。

    用法

    一般用途与任何其他缩略图脚本相同。只需使用要在其中生成缩略图作为参数的文件或文件夹来调用它,例如:

    thumbnailer /home/Documents
    

    参考

    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

    设置 PNG 元数据:

    • http://pillow.readthedocs.io/en/5.1.x/PIL.html#PIL.PngImagePlugin.PngInfo
    • https://stackoverflow.com/a/10552742/1708932
    • 5

相关问题

  • 如何安装 KDE?

  • 为什么我的 Kubuntu 会话在恢复后需要相当长的时间才能响应?

  • 如何防止自己在多用户设置中自动注销?

  • KATE 总是忘记我启用了 shell 插件

  • 安装 XFCE 后如何返回 KDE 启动/登录?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve