web-dev-qa-db-ja.com

Nautilusにサムネイルを事前生成するように指示するにはどうすればよいですか?

PDFドキュメント(論文、講義、配布資料)の大きなライブラリがあり、すぐにナビゲートできるようにしたい。そのためにサムネイルが必要です。

しかし、同時に、~/.thumbnailsフォルダーは、本当に必要のない親指で積み重なっていることがわかります。重要なサムを削除せずにサムネイルジャンクを削除することはできません。それらを削除する場合は、重要なPDFドキュメントがあるすべてのフォルダーに移動し、サムネイルキャッシュを再生成する必要があります。

このプロセスを自動化できるようになりたいです。 所定のディレクトリセットのサムを事前キャッシュするようにnautilusに指示できる方法はありますか?

:私は bashスクリプトのセット を見つけましたドキュメント。スクリプティングの経験が豊富な人がPDF文書用にこれらを調整するか、少なくともPDFで動作するために修正しなければならないことについて正しい方向に向けられるかもしれません文書も。


編集

この質問に対する回答は非常に圧倒的です。これを解決するために参加したすべての人に感謝します。質問、その回答、およびそれに関するすべての議論は、多くの関係者の共同の努力がどのように最適なソリューションにつながるかを示す素晴らしい例です。これがまさにLinuxとオープンソースをとても素晴らしいものにしている理由です。

提供された答えはすべて、私がこの質問に対して最初に立てた報奨に値するでしょう。それでも、授与される賞金は1つだけです。今後のすべての読者には、問題を最も効率的な方法で解決する答えを選択する義務があります。どのソリューションであるかを判断するため、互換性、速度、出力品質の3つのスクリプトを比較して、最終テストを実行しました。結果は次のとおりです。


Thumbnailer 1、ロッシュ:

互換性:✔ファイル名にスペース; ✔ディレクトリ名のスペース。 ✘freedesktop準拠

速度:12,6秒で95 PDF

品質:ノーチラスの品質

追加特典:1.)既存の親指を持つファイルを自動的にスキップします。 2.)追加のパッケージは不要

Thumbnailer 2、Martin Orda:

互換性:✔ファイル名にスペース; ✔ディレクトリ名のスペース。 ✘freedesktop準拠

速度:70,0秒で95 PDF

Quality:ストック画像よりも大幅に優れたスケーリング。

追加特典:1.)親指が既に存在するファイルを自動的にスキップ2.)PDF以外の幅広い画像形式と互換性がある3.)プラットフォームに依存しない、 GNOMEコンポーネントに依存しない

Thumbnailer 3、James Henstridgeによる:

互換性:✔ファイル名にスペース; ✔ディレクトリ名のスペース。 ✔freedesktopに準拠

速度:10,8秒で95 PDF

品質:ノーチラスの品質

追加特典:1.)親指が既に存在するファイルを自動的にスキップします2.)プレインストールされたサムネラーによって識別されるすべてのファイル形式と互換性があります


3つのスクリプトはすべて優れています。それぞれに長所と短所があります。 Roschのソリューションはそのまま使用できるため、最小限のインストールでユーザーに適した選択肢になる可能性があります。

Martin Ordaは、さまざまなファイル形式で動作し、DEに依存しない非常に用途の広いスクリプトを作成しました。サムネイルの品質は優れていますが、速度は犠牲になります。

結局、私のユースケースに最も適したのはJamesのソリューションでした。高速で汎用性があり、既存のサムネイルでファイルをスキップするオプションを提供します。


総合優勝:ジェームズ・ヘンストリッジ


追加情報:3つのスクリプトはすべてnautilus-scriptsと完全に互換性があります。簡単にインストールできます このチュートリアルに従って


Edit 2:roschによる改善されたスクリプトでレビューを更新しました。

33
Glutanimate

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 __== '__main__':
    sys.exit(main(sys.argv))

これをファイルに保存し、実行可能としてマークします。 gir1.2-gnomedesktop-3.0パッケージがまだインストールされていない場合は、インストールする必要がある場合もあります。

その後、サムネイルとしてファイルまたはフォルダーを引数として使用してスクリプトを呼び出すだけです。サムネイルは~/.thumbnailsに保存され、Nautilusのようなアプリケーションがサムネイルを見つけるのを待ちます。

35

以下のスクリプトが仕事をするはずです。それは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の両方でテストされた37 pdfファイル(imagemagickから):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

18
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.
10
Marcin Kaminski

サムネイルの仕様には、共有サムネイルリポジトリが含まれます。これにより、すべてのユーザーが独自のサムネイルを生成するのではなく、事前に生成されたサムネイルを関連ファイルとともに配布できます。したがって、理論的には、サムネイルを生成し、共有リポジトリに追加することができます。したがって、サムネイルディレクトリをクリアしたり、すべてを別のマシンなどに移動した場合、サムネイルを将来生成する必要がなくなります。

http://specifications.freedesktop.org/thumbnail-spec/thumbnail-spec-latest.html#DIRECTORY

このAsk Ubuntuページは、共有サムネイルリポジトリをサポートするアプリケーションがあるかどうかを調べようとしたときに検索結果に表示されます。悲しいことに、それらをサポートするアプリケーションはないようです。

1
Bob