Bagaimana saya bisa menginstruksikan Nautilus untuk membuat thumbnail sebelumnya?

33

Saya memiliki perpustakaan besar dokumen PDF (makalah, ceramah, handout) yang saya ingin dapat dengan cepat menavigasi. Untuk itu saya butuh thumbnail.

Namun pada saat yang sama, saya melihat bahwa ~/.thumbnailsfolder tersebut menumpuk dengan jempol yang tidak saya butuhkan. Menghapus junk thumbnail tanpa menghapus jempol penting adalah mustahil. Jika saya menghapusnya, saya harus pergi ke setiap folder dengan dokumen PDF yang penting dan membiarkan cache thumbnail dibuat kembali.

Saya ingin sekali dapat mengotomatiskan proses ini. Apakah ada cara saya dapat memberitahu nautilus untuk melakukan pra-cache jempol untuk satu set direktori yang diberikan?

Catatan : Saya memang menemukan serangkaian skrip bash yang tampaknya melakukan ini untuk gambar dan video, tetapi tidak untuk dokumen lainnya. Mungkin seseorang yang lebih berpengalaman dengan skrip mungkin dapat menyesuaikan ini untuk dokumen PDF atau setidaknya mengarahkan saya ke arah yang benar tentang apa yang harus saya modifikasi agar dapat bekerja dengan dokumen PDF juga.


Edit :

Tanggapan atas pertanyaan ini sangat luar biasa. Pertama-tama saya ucapkan terima kasih kepada semua yang berpartisipasi dalam memecahkan masalah ini. Pertanyaan, jawabannya, dan semua diskusi di sekitarnya adalah contoh yang bagus tentang bagaimana upaya kolaboratif banyak pihak dapat menghasilkan solusi optimal. Inilah yang membuat Linux dan Open Source begitu hebat.

Semua jawaban yang diberikan pantas mendapatkan hadiah yang semula saya ajukan untuk pertanyaan ini. Meski begitu, hanya ada satu hadiah untuk penghargaan. Saya berutang kepada semua pembaca masa depan untuk memilih jawaban yang memecahkan masalah dengan cara yang paling efisien. Untuk menentukan solusi yang mana, saya melakukan uji coba terakhir, membandingkan tiga skrip dalam kompatibilitas, kecepatan dan kualitas output. Inilah hasilnya:


Thumbnailer 1 , oleh rosch:

Kompatibilitas : ✔ spasi dalam nama file; ✔ spasi dalam nama direktori; ✘ compliant freedesktop

Kecepatan : 95 PDF dalam 12,6 detik

Kualitas : kualitas stok nautilus

Perks Tambahan : 1.) secara otomatis melewatkan file dengan ibu jari yang sudah ada; 2.) Tidak perlu paket tambahan

Thumbnailer 2 , oleh Martin Orda:

Kompatibilitas : ✔ spasi dalam nama file; ✔ spasi dalam nama direktori; ✘ compliant freedesktop

Kecepatan : 95 PDF dalam 70,0 dtk

Kualitas : penskalaan secara signifikan lebih baik daripada gambar stok.

Perks Tambahan : 1.) secara otomatis melompati file dengan ibu jari yang sudah ada sebelumnya 2.) kompatibel dengan berbagai format gambar selain PDF 3.) platform-independen, tidak bergantung pada komponen-komponen GNOME

Thumbnailer 3 , oleh James Henstridge:

Kompatibilitas : ✔ spasi dalam nama file; ✔ spasi dalam nama direktori; ✔ memenuhi persyaratan freedesktop

Kecepatan : 95 PDF dalam 10,8 detik

Kualitas : kualitas stok nautilus

Perks Tambahan : 1.) secara otomatis melompati file dengan ibu jari yang sudah ada 2.) kompatibel dengan semua format file yang diidentifikasi oleh thumbnail yang sudah diinstal sebelumnya


Ketiga skrip sangat bagus. Masing-masing memiliki serangkaian kelebihan dan kekurangan. Solusi Rosch bekerja di luar kotak dan mungkin menjadi pilihan yang tepat untuk pengguna dengan instalasi minimal.

Martin Orda membuat skrip yang sangat serbaguna yang berfungsi dengan berbagai format file dan DE-independen. Ini unggul pada kualitas gambar kecil tetapi melakukannya dengan mengorbankan kecepatan.

Pada akhirnya itu adalah solusi James yang paling cocok untuk saya gunakan. Ini cepat, serbaguna dan menawarkan opsi untuk melompati file dengan thumbnail yang sudah ada sebelumnya.


Pemenang keseluruhan: James Henstridge


Informasi tambahan : Ketiga skrip sepenuhnya kompatibel dengan skrip nautilus . Anda dapat menginstalnya dengan mudah mengikuti tutorial ini .


Sunting 2 : Ulasan terbaru dengan skrip ditingkatkan oleh rosch.

Glutanimate
sumber
Karena banyak file kecil selalu berakhir buruk. Apakah Anda tahu ukuran folder ~ / .thumbnails Anda?
Antoine Rodriguez
Maksudmu ukurannya sekarang? sekitar 85MB setelah ~ 1 bulan penggunaan.
Glutanimate
Dan berapa banyak file yang dimiliki perpustakaan Anda? (itu karena alasan / batasan teknis)
Antoine Rodriguez
ah tunggu, saya salah hitung; itu termasuk beberapa file data. Dokumen hanya sekitar 2000.
Glutanimate
Hanya untuk memperbarui Anda: Saya punya solusi untuk Anda. Ini lama untuk disunting jadi izinkan saya beberapa hari. Salam;)
Antoine Rodriguez

Jawaban:

35

Rutin thumbnail thumbnail Nautilus sebenarnya berasal dari libgnome-desktopperpustakaan, jadi dimungkinkan untuk menjalankan thumbnailer yang sama di luar manajer file.

APInya sedikit rumit, tetapi skrip Python berikut akan membantu:

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

Simpan ini ke file dan tandai itu dapat dieksekusi. Anda mungkin juga perlu menginstal gir1.2-gnomedesktop-3.0paket jika belum diinstal.

Setelah itu, aktifkan skrip dengan file atau folder yang ingin Anda thumbnail sebagai argumen. Thumbnail akan disimpan ke ~/.thumbnailstempat aplikasi seperti Nautilus berharap menemukannya.

James Henstridge
sumber
1
Terima kasih, James, telah meluangkan waktu untuk menulis naskah ini. Ini berfungsi seperti yang diiklankan untuk file tunggal. Dari solusi yang diposting itu adalah satu-satunya yang outputnya diakui oleh sistem (nama file yang benar 48eebea785a185cdfc9d8f1a2ed34400.pngdigunakan). Pada titik ini, bagaimanapun, sepertinya tidak mendukung direktori. Apakah ada cara Anda bisa membuatnya melalui direktori secara rekursif?
Glutanimate
Selesai Saya juga menyederhanakan hasilnya sedikit.
James Henstridge
Script Anda bekerja sangat bagus. Persis seperti yang saya cari, jadi saya memberi Anda hadiah. Saya memang menemukan beberapa pesan kesalahan saat melakukan uji coba terakhir saya, tetapi tampaknya tidak menghambat pembuatan thumbnail. Kesalahan mungkin terkait dengan fakta bahwa beberapa nama file termasuk Umlaut Jerman ("ä, ü, ö"). Sekali lagi terima kasih telah memberikan solusi luar biasa ini. Itu akan membuat hidup saya lebih mudah mulai sekarang.
Glutanimate
1
Kesalahan tersebut berasal dari parser XML yang digunakan oleh salah satu thumbnailer, sehingga akan terkait dengan konten beberapa file daripada namanya. Skrip thumbnailer di atas akan memproses semua file dalam direktori, jadi mungkin bukan PDF yang bermasalah.
James Henstridge
Saya tidak dapat membuat thumbnail untuk file teks biasa. Apakah ada sesuatu yang perlu saya konfigurasi untuk membuat ini berfungsi?
krasnaya
18

Script di bawah ini harus melakukan pekerjaan. Menggunakan evince-thumbnaileryang - sejauh yang saya tahu - datang dengan setiap instalasi gnome dan merupakan thumbnailer default.
Simpan sebagai pdfthumbnailer.sh dan buat itu bisa dieksekusi.
Penggunaan :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

Pembatasan :

  • tidak menambahkan atribut Thumb :: URI dan Thumb :: MTime ke thumbnail seperti yang ditunjukkan oleh James Henstridge. Sejauh ini saya belum melihat bukti bahwa default evince-thumbnailermelakukannya. Dengan kata lain..selama nautilus tidak membuat ulang thumbnail, skrip dapat digunakan untuk pekerjaan itu.

Catatan :

  • mencetak nama file saat membuat thumbnail baru, melompati pembuatan jika ada
  • kecepatan: 37 file pdf diuji dengan evince-thumbnailerdan convert(dari imagemagick): 3seconds for evince-thumbnailerdan 14seconds for convert.
  • menghasilkan thumbnail yang dikenali oleh nautilus
  • nama jalur yang ditangani oleh URL perl: modul file (spasi dan karakter lain diterjemahkan dengan benar ke file uri)
  • kebutuhan perl, hadir dalam instalasi default
  • file yang tidak ditangani oleh evince-thumbnailerhanya akan menghasilkan kesalahan - dimatikan dengan2>/dev/null
  • lihat baris MimeType /usr/share/thumbnailers/evince.thumbnaileruntuk melihat daftar jenis file yang ditangani
  • pembaruan: mulai dari 12,04 folder thumbnail tampaknya ~/.cache/thumbnails.
    Jalur yang lebih kuat menggunakan readlink.

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

Rosch
sumber
Pertama-tama terima kasih atas jawaban Anda dan upaya yang Anda berikan. Saya melakukan beberapa uji coba dan inilah hasil saya: 1.) pembuatan thumbnail tidak berfungsi untuk direktori dengan spasi di namanya; 2.) thumbnail yang dibuat dengan skrip dan @Martin Orda Anda tidak dikenali oleh sistem; file yang diproses dengan skrip Anda ditangani seolah-olah tidak ada thumbnail yang ada -> hasilnya: duplikat jempol di direktori thumbnail
Glutanimate
Hm, sejauh ini tes saya positif: nautilus mengenali thumbnail dan tidak membuat ulang. Ugh, spasi dalam nama folder adalah sesuatu yang saya anggap praktik buruk..tapi saya akan memodifikasi skrip. Thumbnail duplikat? Apa nama tumbnail baru untuk file yang diberikan?
rosch
Ok, coba lagi dan saya khawatir hasilnya sama seperti terakhir kali. Berikut nama file dari thumbnail script yang dihasilkan: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Ini adalah bagaimana thumbnail yang sama bernama oleh nautilus: 48eebea785a185cdfc9d8f1a2ed34400.png. Saya juga memperhatikan bahwa ibu jari yang dibuat dengan skrip Anda adalah 128x171px sedangkan thumbnailer bawaan hanya membuat thumbnail 96x128px.
Glutanimate
Ini perbandingannya .
Glutanimate
Tentang komentar Anda tentang evince-thumbnailertidak menambahkan tag PNG, itu benar: kode yang memanggil thumbnail eksternal sebenarnya menulis ulang gambar untuk menyertakan tag. Anda harus dapat memverifikasi ini dengan menjalankan strings -apada salah satu thumbnail yang dihasilkan oleh Nautilus.
James Henstridge
10

Mengalihkan perhatian untuk beberapa saat dan Rosch mengalahkan saya untuk itu :) Tidak tahu kalau ada thumbnailer (saya bukan pengguna Gnome) tapi, karena saya sudah menulisnya, ini dia. Membutuhkan imagemagick diinstal, periksa dan instal jika tidak ada dengan:

which convert || sudo apt-get install imagemagick

Simpan sebagai mkthumb.sh(misalnya), chmod +x mkthumb.shdan jalankan dengan jalur absolut sebagai argumen (Anda dapat menggunakan -s sebagai parameter pertama untuk melewati pembuatan thumbnail yang sudah ada) yaitu:

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

Script (Saya telah sedikit memodifikasinya untuk mendukung sebagian besar gambar, Anda dapat menambahkan lebih banyak ekstensi jika Anda membutuhkannya):

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

Ini menangani file dengan spasi di namanya tanpa masalah.

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.
Marcin Kaminski
sumber
Terima kasih juga, untuk menyediakan skrip yang bagus. Saya melakukan beberapa uji coba dan inilah hasil saya: 1.) generasi thumbnail berfungsi dengan baik dan lebih cepat daripada evince-thumbnailer; 2.) thumbnail yang dibuat dengan skrip Anda dan @ rosch tidak dikenali oleh sistem; file yang diproses dengan skrip Anda ditangani seolah-olah tidak ada thumbnail. Jempol baru dibuat ketika secara manual mengakses direktori -> hasilnya: duplikat jempol dalam direktori thumbnail
Glutanimate
Anda benar - saya sudah memeriksa ini lagi dan menemukan bahwa nautilus menghasilkan mereka lagi (saya pikir itu tidak terjadi ketika saya mengujinya tadi malam tapi saya bisa saja salah, sudah terlambat). Jika memang lebih cepat dari yang Anda tulis (saya belum menggunakan metode lain), saya akan mengatasinya dalam beberapa jam. Satu-satunya masalah yang saya temukan dengan ini adalah kedua file yang dihasilkan oleh skrip saya dan nautilus menunjukkan properti yang sama: "PNG 97x128 97x128 + 0 + 0 8-bit DirectClass 20,4KB 0,000u 0: 00.000" ketika saya menggunakan identifikasikan <thumbnail>.
Marcin Kaminski
Tidak, kami berdua salah :) Ternyata saya lupa bahwa nama file thumbnail adalah hash md5 dari 'file: //' + absolute_path dan keliru menjalankan skrip saya sebagai ./mkthumb.sh -s Downloads / pdf / test bukan. /mkthumb.sh -s / home / user / Downloads / pdf / test. Cobalah untuk mencobanya lagi.
Marcin Kaminski
Baiklah, saya melakukan uji coba lagi dan yang aneh adalah bahwa kedua script rosch Anda tampaknya memiliki masalah yang sama: nama file dengan skrip Anda adalah 2a43dc2774e3dfe45a4337e0304e5b0a.pngsementara nautilus menamakannya sebagai 48eebea785a185cdfc9d8f1a2ed34400.png. Dimensi, bagaimanapun, benar dengan skrip Anda. Berikut ini perbandingannya
Glutanimate
Saya ingin menambahkan bahwa skrip Anda masih yang tercepat dari yang diposting di sini. imagemagickjuga tampaknya menangani penskalaan jauh lebih baik daripada evince-thumbnailer(lihat perbandingan di atas untuk referensi).
Glutanimate
1

Spesifikasi thumbnail termasuk repositori thumbnail bersama, yang memungkinkan thumbnail pre-generate untuk didistribusikan bersama dengan file terkait daripada setiap pengguna membuat thumbnail mereka sendiri. Jadi secara teori Anda bisa membuat thumbnail dan kemudian menambahkannya ke repositori bersama sehingga menghilangkan kebutuhan untuk membuatnya di masa depan jika Anda menghapus direktori thumbnail Anda, atau memindahkan semuanya ke mesin yang berbeda atau apa pun.

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

Halaman Tanya Ubuntu ini muncul dalam hasil pencarian ketika saya mencoba mencari tahu apakah ada aplikasi yang mendukung penyimpanan thumbnail bersama. Sayangnya tampaknya tidak ada aplikasi yang mendukung mereka.

Bob
sumber
1

Saya menulis sebuah paket yang memodifikasi skrip James untuk memasukkan multiprocessing dan opsi untuk menghasilkan thumbnail secara rekursif. Paket ini pip-Instalable. Periksa di sini untuk petunjuk pemasangan.

Contoh penggunaannya adalah:

thumbgen -w 4 -r -d your_directory
  • -r: menghasilkan thumbnail secara rekursif

  • -w: jumlah core yang akan digunakan

mudassirkhan19
sumber