Nautilus'a küçük resimleri önceden oluşturmaları için nasıl talimat verebilirim?


33

Hızlı bir şekilde gezinmek istediğim çok sayıda PDF belgesi (bildiri, konferans, çalışma kağıdı) var. Bunun için küçük resimlere ihtiyacım var.

Ancak aynı zamanda, ~/.thumbnailsklasörün gerçekten ihtiyacım olmayan başparmaklarla yığıldığını görüyorum. Önemli başparmakları kaldırmadan küçük önemsiz çöpleri silmek mümkün değildir. Onları silmek isteseydim, önemli PDF belgeleri olan her klasöre gidip küçük resim önbelleğinin yenilenmesine izin vermem gerekirdi.

Bu süreci otomatik hale getirmeyi çok isterim. Nautilus'a verilen dizinler için başparmakları önbelleğe almasını söyleyebileceğim bir yol var mı?

Not : Bunu fotoğraflar ve videolar için görünen, ancak diğer belgeler için olmayan bir bash betiği buldum . Belki de komut dosyasıyla daha deneyimli birileri bunları PDF belgeleri için ayarlayabilir veya en azından PDF belgeleriyle çalışmak için neleri değiştirmek zorunda olduğum konusunda doğru yöne işaret edebilir.


Düzenle :

Bu sorunun cevabı oldukça zor oldu. Önce bunu çözmeye katılan herkese teşekkür edeyim. Soru, cevapları ve etrafındaki tüm tartışma, birçok tarafın işbirlikçi çabalarının en uygun çözüme nasıl yol açabileceğinin harika bir örneği. Bu tam olarak Linux ve Açık Kaynak'ı bu kadar güzel yapan şeydir.

Sunulan cevapların hepsi, asıl bu soru için koyduğum ödülü hak ediyor. Yine de, ödüllendirilecek tek bir ödül var. Sorunu en verimli şekilde çözen cevabı seçmeyi tüm gelecek okuyuculara borçluyum. Hangi çözümün olduğunu belirlemek için, üç senaryoyu uyumluluk, hız ve çıktı kalitesi açısından karşılaştırarak son bir test yaptım. Sonuçlar burada:


Thumbnailer 1 , rosch tarafından:

Uyumluluk : file dosya adındaki boşluklar; Dizin adındaki boşluklar; Edes freedesktop uyumlu

Hız : 12,6 saniyede 95 PDF

Kalite : stok nautilus kalite

Ek Perks : 1.) önceden var olan baş parmakları olan dosyaları otomatik olarak atlar; 2.) Ek paket gerekmez

Martin Orda'dan Thumbnailer 2 :

Uyumluluk : file dosya adındaki boşluklar; Dizin adındaki boşluklar; Edes freedesktop uyumlu

Hız : 70,0 saniyede 95 PDF

Kalite : stok görüntülerinden önemli ölçüde daha iyi ölçeklendirme.

Ek Perks : 1.) önceden var olan baş parmakları olan dosyaları otomatik olarak atlar 2.) PDF'nin yanı sıra çok çeşitli görüntü biçimleriyle de uyumludur 3.) platformdan bağımsız, GNOME bileşenlerine dayanmaz

James Henstridge'den Thumbnailer 3 :

Uyumluluk : file dosya adındaki boşluklar; Dizin adındaki boşluklar; Edes freedesktop uyumlu

Hız : 10,8 saniyede 95 PDF

Kalite : stok nautilus kalite

Ek Perks : 1.) önceden var olan küçük resimlerin bulunduğu dosyaları otomatik olarak atlar 2.) önceden kurulmuş küçük resimler tarafından tanımlanan tüm dosya biçimleriyle uyumlu


Her üç komut dosyası da mükemmel. Her birinin kendine özgü avantaj ve dezavantajları vardır. Rosch'in çözümü kutunun dışında çalışıyor ve en az düzeyde kurulum yapan kullanıcılar için doğru seçim olabilir.

Martin Orda, çeşitli dosya formatları ile çalışan ve DE'den bağımsız çok yönlü bir senaryo oluşturdu. Küçük resim kalitesinde üstündür, ancak hız pahasına yapar.

Sonunda kullanım durumuma en uygun olan James çözümü vardı. Hızlı, çok yönlüdür ve önceden mevcut küçük resimlere sahip dosyaları atlamanın seçeneklerini sunar.


Genel kazanan: James Henstridge


Ek bilgi : Her üç komut dosyası da nautilus komut dosyaları ile tam uyumludur . Bu öğreticiyi izleyerek bunları kolayca yükleyebilirsiniz .


Düzenleme 2 : İnceleme rosch tarafından geliştirilmiş komut dosyası ile güncellendi.


Çünkü çok sayıda küçük dosya her zaman kötü sonuçlanıyor. ~ / .Thumbnails klasörünün boyutunu biliyor musunuz?
Antoine Rodriguez,

Şu anki büyüklüğünü mü kastediyorsun? ~ 1 aylık kullanımdan sonra yaklaşık 85 MB.
Glutanimate

Kütüphanenizde ne kadar dosya var? (bu teknik sebep / sınırlamalar için)
Antoine Rodriguez

ah bekleyin, yanlış hesapladım; Bu bazı veri dosyalarını içerir. Sadece
2000’lik bir

Sadece seni güncellemek için: Senin için bir çözümüm var. Ayrılmak çok uzun, o yüzden birkaç gün izin verin. Saygılarımızla;)
Antoine Rodriguez,

Yanıtlar:


35

Nautilus'un küçük resim yordamları aslında libgnome-desktopkütüphaneden gelir, bu nedenle aynı küçük resimleri dosya yöneticisinin dışında çalıştırmak mümkündür.

API biraz karmaşıktır, ancak aşağıdaki Python betiği yardımcı olmalıdır:

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

Bunu bir dosyaya kaydedin ve çalıştırılabilir olarak işaretleyin. Daha gir1.2-gnomedesktop-3.0önceden kurulmamışsa paketi de kurmanız gerekebilir .

Ondan sonra, sadece betiği argüman olarak kullanmak istediğiniz dosya veya klasörlerle çağırın. Küçük resimler, ~/.thumbnailsNautilus gibi uygulamaların onları bulmayı beklediği yerlere kaydedilecektir .


1
James, bu senaryoyu yazmaya zaman ayırdığınız için teşekkürler. Tek dosyalar için reklamı yapıldığı gibi çalışır. Yayınlanan çözümlerden çıktısı sistem tarafından tanınan tek çözümdür (doğru dosya adı 48eebea785a185cdfc9d8f1a2ed34400.pngkullanılır). Ancak bu noktada, dizinleri desteklemediği görülmektedir. Dizinleri yinelemeli olarak geçmesini sağlayabilmenin bir yolu var mı?
Glutanimate

Bitti. Ayrıca çıktıyı da biraz basitleştirdim.
James Henstridge

Komut dosyanız kesinlikle harika çalışıyor. Tam olarak aradığım şey buydu, ben de sana ödül verdim. Son test çalışmamı yaparken bazı hata mesajlarıyla karşılaştım , ancak küçük resim oluşturmayı engellemediler. Hatalar, bazı dosya adlarının Alman Umümerlerini ("ä, ü, ö") içermesi ile ilgili olabilir. Bu mükemmel çözümü sağladığınız için tekrar teşekkür ederiz. Bundan sonra hayatımı çok daha kolaylaştıracak.
Glutanimate

1
Bu hatalar, küçük resimlerden biri tarafından kullanılan bir XML ayrıştırıcısından kaynaklanıyor, bu nedenle adı yerine bir dosyanın içeriğiyle ilgili olabilir. Yukarıdaki küçük resim komut dosyası dizindeki tüm dosyaları işleyecektir, bu nedenle sorun yaşadığı bir PDF olmayabilir.
James Henstridge

Düz metin dosyaları için küçük resimler oluşturamıyorum. Bu işi yapmak için yapılandırmam gereken bir şey var mı?
krasnaya

18

Aşağıdaki komut dosyası işi yapmalı. Bildiğim evince-thumbnailerkadarıyla her gnome kurulumunda geliyor ve varsayılan küçük resim kullanıyor.
Farklı kaydet pdfthumbnailer.sh ve çalıştırılabilir yap.
Kullanım :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

Kısıtlama :

  • James Henstridge tarafından belirtildiği gibi Thumb :: URI ve Thumb :: MTime niteliklerini küçük resimlere eklemiyor. Şimdiye dek temerrüde düştüğünü gösteren hiçbir kanıt görmedim evince-thumbnailer. Başka bir deyişle, Nautilus küçük resimleri yeniden oluşturmadığı sürece, script iş için kullanılabilir.

Notlar :

  • Yeni bir küçük resim oluştururken dosyanın adını yazdırır, varsa oluşturma işlemini atlar
  • Hız: 37 pdf dosyaları hem test evince-thumbnailerve convert(imagemagic'den): için 3seconds evince-thumbnailerve için 14seconds convert.
  • nautilus tarafından tanınan küçük resimler oluşturur
  • perl URL tarafından işlenen yol adları: dosya modülü (boşluklar ve diğer karakterler doğru bir dosya uri'ye çevrilir)
  • perlvarsayılan bir kurulumda mevcut olan ihtiyaçlar
  • işlenmeyen dosyalar evince-thumbnailerbasitçe bir hata çıkarır2>/dev/null
  • /usr/share/thumbnailers/evince.thumbnailerişlenen dosya türlerinin listesini görmek için MimeType satırına bakın
  • güncellemeler: 12.04'ten itibaren küçük resim klasörü görünmektedir ~/.cache/thumbnails.
    Kullanarak daha sağlam yollar readlink.

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


Öncelikle cevabınız ve gösterdiğiniz çaba için teşekkür ederiz. Bazı deneme sürüşleri yaptım ve işte sonuçlarım: 1.) Küçük resim oluşturma, adlarında boşluk bulunan dizinlerde çalışmaz; 2.) Hem betiğiniz hem de @Martin Orda ile oluşturulan minik resimler sistem tarafından tanınmıyor; Komut dosyanızla işlenen dosyalar sanki minik resim yokmuş gibi ele alınır -> sonuç: minik resim dizininde yinelenen başparmaklar
Glutanimate

Hm, testlerim şu ana kadar olumluydu: nautilus küçük resimleri tanıdı ve yenilememişti. Ugh, klasör adlarındaki boşluklar kötü bir uygulama bulduğum bir şey .. ama betiği değiştireceğim. Yinelenen küçük resimler? O zaman bir verme dosyası için yeni tumbnail adı nedir?
rosch

Tamam, tekrar dene ve korkarım geçen seferki sonuç aynı. İşte oluşturulan Senaryonuzun küçük bir dosya adı var: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Bu, aynı küçük resim Nautilus tarafından adlandırılmıştır nasıl: 48eebea785a185cdfc9d8f1a2ed34400.png. Ayrıca, betiğinizle oluşturulan başparmakların 128x171 piksel olduğunu, dahili küçük resmin yalnızca 96x128 piksel küçük resimler oluşturduğunu da fark ettim.
Glutanimate


evince-thumbnailerPNG etiketlerinin eklenmemesi konusundaki yorumunuz hakkında , doğru: dış minik resimleri çağıran kod aslında resimleri etiketlere eklemek için yeniden yazar. Bunu, strings -aNautilus tarafından oluşturulan küçük resimlerden birinde çalıştırarak doğrulamanız gerekir .
James Henstridge

10

Bir süre dikkatim dağıldı ve rosch beni dövdü :) Evince-thumbnailer'in var olduğunu bilmiyordum (Gnome kullanıcısı değilim) ama yine de, zaten yazdığımdan beri, işte gidiyor. Imaemagick yüklü olmasını gerektirir, orada yoksa şunları kontrol edin ve kurun:

which convert || sudo apt-get install imagemagick

Farklı kaydet mkthumb.sh(örneğin), chmod +x mkthumb.shonu argüman olarak mutlak yollarla yürütün (zaten mevcut olan küçük resimleri atlamak için -s'yi ilk parametre olarak kullanabilirsiniz);

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

Komut (çoğu görüntüyü desteklemek için hafifçe değiştirdim, gerekirse daha fazla uzantı ekleyebilirsiniz):

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

Adlarında boşluk olan dosyaları sorunsuzca işler.

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.

Mükemmel bir senaryo hazırladığınız için teşekkürler. Bazı deneme sürüşleri yaptım ve işte sonuçlarım: 1.) Küçük resim oluşturma işlemi iyi çalışıyor ve evince-thumbnailer'den daha hızlı; 2.) Hem betiğinizle hem de @ rosch'larla oluşturulan küçük resimler sistem tarafından tanınmıyor; Komut dosyanızla işlenen dosyalar, küçük resim yokmuş gibi işlenir.
Rehberlere

Haklısın - Bunu tekrar kontrol ettim ve nautilus'un onları tekrar ürettiğini öğrendim (dün gece test ettiğimde durum böyle değildi ama yanılıyor olabilirdim, çoktan gecikti). Yazdığınız gibi gerçekten daha hızlıysa (henüz başka yöntemler kullanmamıştım), birkaç saat içinde üzerinde çalışacağım. Bununla ilgili bulduğum tek sorun hem betiğim tarafından oluşturulan dosyalarım hem de nautilus aynı özellikleri gösteriyor: "PNG 97x128 97x128 + 0 + 0 8-bit DirectClass 20.4KB 0.000u 0: 00.000", <thumbnail> tanımını kullandığımda.
Marcin Kaminski

Hayır, ikimiz de hatalıydık :) Küçük resmin dosya adının 'file: //' + absolute_path dosyasının bir md5 karması olduğunu ve yanlışlıkla betiğimi ./mkthumb.sh -s Downloads / pdf / test yerine koştuğumu unuttum. /mkthumb.sh -s / ana sayfa / kullanıcı / Yüklemeler / pdf / test. Tekrar denemeye çalış.
Marcin Kaminski

Tamam, başka bir deneme çalıştırması yaptım ve tuhaf olan, her iki senaryo rosch'un da aynı soruna sahip olduğu görünüyor: betiğinizle dosya adı 2a43dc2774e3dfe45a4337e0304e5b0a.pngnautilus olarak adlandırılır 48eebea785a185cdfc9d8f1a2ed34400.png. Ancak, boyutlar komut dosyanızla doğru. İşte bir karşılaştırma
Glutanimate

Senaryonuzun hala burada yayınlananların en hızlısı olduğunu eklemek isterim. imagemagickayrıca ölçeklendirmeyi çok daha iyi ele alıyor gibi görünüyor evince-thumbnailer(referans için yukarıdaki karşılaştırmaya bakın).
Glutanimate

1

Küçük resim özelliği, her kullanıcının kendi küçük resmini oluşturmasını sağlamak yerine önceden oluşturulmuş küçük resimlerin, ilişkili dosyalar ile birlikte dağıtılmasını sağlayan paylaşılan küçük resim havuzlarını içerir. Dolayısıyla teoride küçük resimler oluşturabilir ve bunları paylaşılan bir depoya ekleyebilir, böylece küçük resimler dizininizi temizlediyseniz veya hepsini farklı bir makineye veya başka bir şeye taşıdıysanız gelecekte bunları oluşturma gereksinimini ortadan kaldırabilirsiniz.

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

Herhangi bir uygulamanın paylaşılan küçük resim depolarını destekleyip desteklemediğini bulmaya çalışırken bu Ubuntu'ya sor sayfası, bir arama sonucunda gelir. Ne yazık ki, hiçbir uygulamanın onları desteklemediği anlaşılıyor.


1

James'in betiğini çok işlemeli ve tekrarlı olarak küçük resimler oluşturma seçeneği içeren bir paket yazdım. Paket pipyüklenebilir. Kurulum talimatları için burayı kontrol edin .

Kullanım örneği:

thumbgen -w 4 -r -d your_directory
  • -r: tekrarlı olarak küçük resimler oluşturur

  • -w: kullanılacak çekirdek sayısı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.