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


33

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

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

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

:写真やビデオに対してこれを行うように見えるbashスクリプトのセットを見つけましが、他のドキュメントに対してはそうではありません。スクリプティングの経験が豊富な人なら、PDF文書用にこれらを調整できるかもしれませんし、少なくともPDF文書でも動作するように修正しなければならないことについて、少なくとも正しい方向を教えてくれるかもしれません。


編集

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

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


Thumbnailer 1、rosch:

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

速度:12,6秒で95 PDF

品質:ノーチラスの品質

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

Thumbnailer 2、Martin Ordaによる:

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

速度:70,0秒で95 PDF

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

追加特典: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と完全に互換性があります。このチュートリアルに従って簡単にインストールできます


編集2:roschによる改善されたスクリプトを使用してレビューを更新しました。


なぜなら、多くの小さなファイルは常にひどく終わるからです。〜/ .thumbnailsフォルダーのサイズを知っていますか?
アントワーヌロドリゲス

今の大きさですか?約1か月使用すると約85MB。
グルタニメート

また、ライブラリにはどのくらいのファイルがありますか?(それは技術的な理由/制限のためです)
アントワーヌロドリゲス

ああ、私は計算を間違えました。これには、いくつかのデータファイルが含まれます。文書化されたのは約2000年のみです
。-グルタニメート

ただあなたを更新するために:私はあなたのための解決策を持っています。編集に時間がかかるので、数日お待ちください。よろしく;)
アントワーヌロドリゲス

回答:


35

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などのアプリケーションが見つけると予想される場所に保存されます。


1
このスクリプトを作成してくれてありがとう、ジェームス。単一のファイルで宣伝されているように機能します。投稿されたソリューションのうち、システムによって出力が認識されるのはそれだけです(正しいファイル名48eebea785a185cdfc9d8f1a2ed34400.pngが使用されます)。ただし、この時点では、ディレクトリをサポートしていないようです。ディレクトリを再帰的に通過させる方法はありますか?
グルタニメート

できた また、出力も少し単純化しました。
ジェームズヘンストリッジ

あなたのスクリプトは絶対に素晴らしい作品です。それはまさに私が探していたものですので、私はあなたに賞金を授与しました。最終テストの実行中にいくつかのエラーメッセージが表示されましたが、サムネイルの生成を妨げることはありませんでした。エラーは、ファイル名の一部にドイツ語のウムラウト( "ä、ü、ö")が含まれていたという事実に関連している可能性があります。この優れたソリューションをご提供いただき、ありがとうございます。これは私の人生をこれからずっと楽にしてくれるでしょう。
グルタニメート

1
これらのエラーは、サムネールの1つが使用しているXMLパーサーから発生しているため、ファイル名ではなくファイルのコンテンツに関連しています。上記のサムネールスクリプトは、ディレクトリ内のすべてのファイルを処理するため、問題のあるPDFではない可能性があります。
ジェームズヘンストリッジ

プレーンテキストファイルのサムネイルを作成できません。これを機能させるために設定する必要があるものはありますか?
クラスナヤ

18

以下のスクリプトが仕事をするはずです。この用途evince-thumbnailerとして私の知る限り- -すべてのGNOMEのインストールが付属し、デフォルトのthumbnailerのです。
名前を付けて保存し 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がサムネイルを再生成しない限り、スクリプトをジョブに使用できます。

  • 新しいサムネイルを生成するときにファイルの名前を出力し、存在する場合は生成をスキップします
  • スピード:37個のPDFファイルの両方でテストevince-thumbnailerし、convert(ImageMagickのから):について3seconds evince-thumbnailerとについて14seconds convert
  • nautilusが認識するサムネイルを生成します
  • perl URL:fileモジュールで処理されるパス名(スペースやその他の文字はファイルURIに正しく変換されます)
  • needs perl、デフォルトのインストールに存在
  • によって処理されないファイルevince-thumbnailerは、単にエラーを出力します-ミュート2>/dev/null
  • MimeType行/usr/share/thumbnailers/evince.thumbnailerを見て、処理されたファイルタイプのリストを確認します。
  • 更新:12.04以降、サムネイルフォルダはのようになりました~/.cache/thumbnails
    を使用したより堅牢なパスreadlink

インスピレーションhttp :
//bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394


まず第一に、あなたの答えとあなたがそれに費やした努力に感謝します。私はいくつかのテストを実行しました。ここに私の結果があります。2.)スクリプトと@Martin Ordaの両方で作成されたサムネイルは、システムで認識されません。スクリプトで処理されたファイルは、サムネイルが存在しないかのように処理されます->結果:サムネイルディレクトリに重複する親指
-Glutanimate

うーん、まあ私のテストは今のところポジティブでした:nautilusはサムネイルを認識し、それらを再生成しませんでした。ええと、フォルダ名にスペースを入れるのは悪い習慣です。しかし、スクリプトを修正します。サムネイルを複製しますか?その場合、giveファイルの新しいサムネイルの名前は何ですか?
ロッシュ

OK、もう一度試してみましたが、前回と同じ結果だと思います。スクリプトが生成したサムネイルのファイル名は次のとおり2a43dc2774e3dfe45a4337e0304e5b0a.pngです。これは、同じサムネイルがnautilus:によって命名される方法です48eebea785a185cdfc9d8f1a2ed34400.png。また、スクリプトで作成されたサムは128x171pxですが、組み込みのサムネールでは96x128pxのサムネイルしか作成されないことにも気付きました。
グルタニメート


evince-thumbnailerPNGタグを追加しないというコメントについては、正しいです。外部サムネイルを呼び出すコードは、実際にはタグを含むように画像を書き換えます。strings -aNautilusによって生成されたサムネイルの1つで実行することにより、これを確認できるはずです。
ジェームズヘンストリッジ

10

しばらく気を取られて、ロッシュは私にそれを打ちました:) 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.

同様に、優れたスクリプトを提供してくれてありがとう。私はいくつかのテストを実行しました。ここに私の結果があります:1.)サムネイル生成はうまく機能し、evince-thumbnailerよりも高速です。2.)スクリプトと@roschの両方で作成されたサムネイルは、システムで認識されません。スクリプトで処理されたファイルは、サムネイルが存在しないかのように処理されます。ディレクトリに手動でアクセスすると、新しいサムが作成されます->結果:サムネイルディレクトリでサムが重複している
-Glutanimate

あなたは正しいです-私はこれをもう一度確認し、nautilusがそれらを再び生成することを発見しました(昨夜テストしたときはそうではなかったと思いますが、間違っている可能性があります、すでに遅れていました)。あなたが書いたようにそれが本当に速い場合(私はまだ他の方法を使用していません)、私は数時間でそれに取り組みます。これで見つかった唯一の問題は、スクリプトとnautilusで生成されたファイルの両方が同じプロパティを示していることです。
マルシンカミンスキー

いいえ、私たちは両方とも間違っていました:)サムネイルのファイル名が 'file://' + absolute_pathのmd5ハッシュであることを忘れ、誤って./mkthumb.sh -s Downloads / pdf / testとしてスクリプトを実行しました。 /mkthumb.sh -s / home / user / Downloads / pdf / test。もう一度試してみてください。
マルシンカミンスキー

さて、私は別のテストを実行しましたが、奇妙なことは、スクリプトroschの両方に同じ問題があるようだ2a43dc2774e3dfe45a4337e0304e5b0a.pngということ48eebea785a185cdfc9d8f1a2ed34400.pngです。ただし、スクリプトの寸法は正しいです。比較は
次のとおりです。グルタニメート

あなたのスクリプトは、ここに投稿されたものの中で最も速いものであることを付け加えたいと思います。imagemagickまた、スケーリングよりもはるかに優れたスケーリングを処理しているようですevince-thumbnailer(上記の比較を参照してください)。
グルタニメート

1

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

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

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


1

Jamesのスクリプトを変更して、マルチプロセッシングとサムネイルを再帰的に生成するオプションを含めるパッケージを作成しました。パッケージはpip-installableです。チェックここではインストール手順について。

使用例は次のとおりです。

thumbgen -w 4 -r -d your_directory
  • -r:サムネイルを再帰的に生成

  • -w:使用するコアの数

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.