当前位置: 首页>>技术教程>>正文


如何向Nautilus指示pre-generate缩略图?

, , , ,

问题描述

我有一个庞大的PDF文档库(论文,讲座,讲义),我希望能够快速浏览。为此,我需要缩略图。

然而,与此同时,我看到~/.thumbnails文件夹堆积着我并不真正需要的拇指。删除缩略图垃圾而不删除重要的拇指是不可能的。如果我要删除它们,我必须转到包含重要PDF文档的每个文件夹,并让缩略图缓存重新生成。

我希望能够自动化这个过程。有什么方法可以告诉nautilus给pre-cache一组给定目录的大拇指吗?

注意:我确实发现a set of bash scripts似乎对图片和视频执行此操作,但对于任何其他文档都没有。也许对脚本更有经验的人可能能够针对PDF文档调整这些内容,或者至少指出我正在修改的内容,以便与PDF文档一起使用。


编辑:

对这个问题的回答非常热烈。首先,我要感谢参与解决这个问题的所有人。问题,答案以及围绕它的所有讨论都是一个很好的例子,说明了许多方面的协作努力如何能够带来最佳解决方案。这正是Linux和开源这么棒的原因。

所有提供的答案都值得我最初提出的这个问题的赏金。不过,奖励只有一个奖励。我应该为所有未来的读者选择能够以最有效的方式解决问题的答案。为了确定哪个解决方案,我做了最后的测试运行,比较了三个脚本的兼容性,速度和输出质量。结果如下:


Thumbnailer 1,作者:rosch:

兼容性:✔文件名中的空格; ✔目录名称中的空格; ✘符合freedesktop标准

速度:95秒PDF,12,6秒

质量:库存 nautilus 质量

额外的额外津贴:1。)自动跳过具有预先存在的拇指的文件; 2.)不需要额外的包裹

Thumbnailer 2,Martin Orda:

兼容性:✔文件名中的空格; ✔目录名称中的空格; ✘符合freedesktop标准

速度:95个PDF,70,0秒

质量:比库存图像明显更好的缩放。

额外的额外津贴:1。)自动跳过具有预先存在的拇指的文件2.)兼容除PDF 3之外的各种图像格式。)platform-independent,不依赖于GNOME-components

Thumbnailer 3,James Henstridge:

兼容性:✔文件名中的空格; ✔目录名称中的空格; ✔符合freedesktop标准

速度:95秒PDF,10,8秒

质量:库存 nautilus 质量

额外补贴:1。)自动跳过具有预先存在的拇指的文件2.)与预装的缩略图识别的所有文件格式兼容


这三个脚本都很棒。每个都有其独特的优点和缺点。 Rosch的解决方案开箱即用,可能是安装最少的用户的正确选择。

Martin Orda创建了一个非常通用的脚本,可以使用各种文件格式,并且是DE-independent。它擅长缩略图质量,但却以牺牲速度为代价。

最终,James解决方案最适合我的用例。它速度快,功能多样,并提供了跳过具有预先存在的缩略图的文件的选项。


总冠军:James Henstridge


附加信息:所有三个脚本都与nautilus-scripts完全兼容。您可以轻松安装它们following this tutorial


编辑2:使用rosch改进的脚本更新了评论。

最佳解决方案

Nautilus的缩略图程序实际上来自libgnome-desktop库,因此可以在文件管理器之外运行相同的缩略图。

API有点复杂,但以下Python脚本应该有所帮助:

#!/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))

将其保存到文件并将其标记为可执行文件。如果尚未安装gir1.2-gnomedesktop-3.0软件包,您可能还需要安装它。

之后,只需使用您想要缩略图作为参数的文件或文件夹调用脚本。缩略图将保存到~/.thumbnails,Nautilus等应用程序希望找到它们。

次佳解决方案

下面的脚本应该完成这项工作。它使用evince-thumbnailer – 据我所知 – 每个gnome安装都附带,是默认的缩略图。保存为pdfthumbnailer.sh并使其可执行。用法: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

限制:

  • 没有像James Henstridge所指出的那样将Thumb :: URI和Thumb :: MTime属性添加到缩略图中。到目前为止,我没有看到证据表明默认的evince-thumbnailer正在这样做。换句话说……只要nautilus不重新生成缩略图,脚本就可以用于作业。

笔记:

  • 生成新缩略图时打印文件的名称,如果存在则跳过生成

  • 速度:使用evince-thumbnailerconvert(来自imagemagick)测试的37个pdf文件:evince-thumbnailer为3秒,convert为14秒。

  • 生成由nautilus识别的缩略图

  • perl URL:文件模块处理的路径名(空格和其他字符被正确翻译成文件uri)

  • 需要perl,存在于默认安装中

  • evince-thumbnailer未处理的文件只会输出错误 – 使用2>/dev/null静音

  • 查看/usr/share/thumbnailers/evince.thumbnailer中的MimeType行以查看已处理文件类型的列表

  • 更新:从12.04开始,缩略图文件夹似乎是~/.cache/thumbnails。使用readlink的更强大的路径。

灵感:http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394

第三种解决方案

分心了一会儿,rosch打败了我:)不知道evince-thumbnailer是否存在(我不是Gnome用户)但是无论如何,因为我已经写过了,所以就这样了。它需要安装imagemagick,检查并安装,如果没有:

which convert || sudo apt-get install imagemagick

保存为mkthumb.sh(例如),chmod +x mkthumb.sh并以绝对路径作为参数执行它(您可以使用-s作为其第一个参数来跳过生成已存在的缩略图),即:

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

脚本(我稍微修改了它以支持大多数图像,如果需要,可以添加更多扩展名):

#!/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}"

它处理名称中带空格的文件没有问题。

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.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2368.html,未经允许,请勿转载。