Wie kann ich Nautilus anweisen, Thumbnails vorab zu generieren?

33

Ich habe eine große Bibliothek an PDF-Dokumenten (Papieren, Vorlesungen, Handouts), durch die ich schnell navigieren möchte. Dafür brauche ich Thumbnails.

Gleichzeitig sehe ich jedoch, dass der ~/.thumbnailsOrdner mit Daumen voll ist , die ich nicht wirklich brauche. Das Löschen von Thumbnails ohne Entfernen der wichtigen Thumbnails ist nicht möglich. Wenn ich sie löschen würde, müsste ich zu jedem Ordner mit wichtigen PDF-Dokumenten gehen und den Thumbnail-Cache neu generieren lassen.

Ich würde gerne in der Lage sein, diesen Prozess zu automatisieren. Kann ich nautilus auf irgendeine Weise anweisen, die Thumbs für eine Reihe bestimmter Verzeichnisse vorab im Cache zu speichern?

Hinweis : Ich habe eine Reihe von Bash-Skripten gefunden , die dies für Bilder und Videos zu tun scheinen, aber nicht für andere Dokumente. Vielleicht kann jemand, der Erfahrung mit Skripten hat, diese für PDF-Dokumente anpassen oder mich zumindest in die richtige Richtung weisen, was ich ändern muss, damit dies auch mit PDF-Dokumenten funktioniert.


Bearbeiten :

Die Antwort auf diese Frage war überwältigend. Lassen Sie mich zunächst allen danken, die an der Lösung dieses Problems mitgewirkt haben. Die Frage, ihre Antworten und die damit verbundene Diskussion sind ein gutes Beispiel dafür, wie die Zusammenarbeit vieler Parteien zu einer optimalen Lösung führen kann. Genau das macht Linux und Open Source so großartig.

Alle Antworten, die ich gegeben habe, hätten das Kopfgeld verdient, das ich ursprünglich für diese Frage ausgesprochen habe. Dennoch gibt es nur eine Prämie zu vergeben. Ich bin es allen zukünftigen Lesern schuldig, die Antwort zu wählen, die das Problem am effizientesten löst. Um herauszufinden, um welche Lösung es sich handelt, habe ich einen letzten Testlauf durchgeführt und die drei Skripte in Bezug auf Kompatibilität, Geschwindigkeit und Ausgabequalität verglichen. Hier sind die Ergebnisse:


Thumbnailer 1 , von rosch:

Kompatibilität : ✔ Leerzeichen in Dateinamen; ✔ Leerzeichen im Verzeichnisnamen; ✘ Freedesktop-konform

Geschwindigkeit : 95 PDFs in 12,6 Sek

Qualität : stock nautilus qualität

Zusätzliche Vorteile : 1.) überspringt automatisch Dateien mit bereits vorhandenen Thumbs; 2.) Keine zusätzlichen Pakete erforderlich

Thumbnailer 2 von Martin Orda:

Kompatibilität : ✔ Leerzeichen in Dateinamen; ✔ Leerzeichen im Verzeichnisnamen; ✘ Freedesktop-konform

Geschwindigkeit : 95 PDFs in 70,0 Sek

Qualität : Deutlich bessere Skalierung als die Bilder auf Lager.

Zusätzliche Vorteile : 1.) Überspringt automatisch Dateien mit bereits vorhandenen Thumbnails. 2.) Kompatibel mit einer Vielzahl von Bildformaten neben PDF. 3.) Plattformunabhängig, setzt nicht auf GNOME-Komponenten

Thumbnailer 3 von James Henstridge:

Kompatibilität : ✔ Leerzeichen in Dateinamen; ✔ Leerzeichen im Verzeichnisnamen; ✔ Freedesktop-konform

Geschwindigkeit : 95 PDFs in 10,8 Sek

Qualität : stock nautilus qualität

Zusätzliche Vorteile : 1.) Überspringt automatisch Dateien mit bereits vorhandenen Miniaturansichten. 2.) Kompatibel mit allen Dateiformaten, die von den vorinstallierten Miniaturansichten identifiziert werden


Alle drei Skripte sind ausgezeichnet. Jedes hat seine eigenen Vor- und Nachteile. Die Lösung von Rosch funktioniert sofort und ist möglicherweise die richtige Wahl für Benutzer mit einer minimalen Installation.

Martin Orda hat ein sehr vielseitiges Skript erstellt, das mit einer Vielzahl von Dateiformaten arbeitet und DE-unabhängig ist. Es zeichnet sich durch Miniaturbildqualität aus, geht jedoch zu Lasten der Geschwindigkeit.

Am Ende war es die James-Lösung, die am besten zu meinem Anwendungsfall passte. Es ist schnell, vielseitig und bietet die Möglichkeit, Dateien mit bereits vorhandenen Miniaturansichten zu überspringen.


Gesamtsieger: James Henstridge


Zusätzliche Informationen : Alle drei Skripte sind voll kompatibel mit Nautilus-Skripten . Sie können sie einfach nach diesem Tutorial installieren .


Edit 2 : Review mit verbessertem Script von rosch aktualisiert.

Glutanimate
quelle
Weil viele kleine Dateien immer schlecht enden. Kennen Sie die Größe Ihres Ordners ~ / .thumbnails?
Antoine Rodriguez
Du meinst die Größe, die es gerade ist? ca. 85 MB nach ca. 1 Monat Gebrauch.
Glutanimate
Und wie viele Dateien hat Ihre Bibliothek? (das ist aus technischen Gründen / Einschränkungen)
Antoine Rodriguez
ach warte, ich habe mich verrechnet; Das beinhaltet einige Datendateien. Dokumente sind nur ungefähr 2000.
Glutanimate
Nur um Sie auf den neuesten Stand zu bringen: Ich habe eine Lösung für Sie. Es dauert lange, bis ich redigiert bin, also gib mir ein paar Tage Zeit. Grüße;)
Antoine Rodriguez

Antworten:

35

Die Miniaturansichtsroutinen von Nautilus stammen tatsächlich aus der libgnome-desktopBibliothek, sodass es möglich ist, dieselben Miniaturansichten auch außerhalb des Dateimanagers auszuführen.

Die API ist ein wenig komplex, aber das folgende Python-Skript sollte helfen:

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

Speichern Sie diese in eine Datei und markieren Sie sie als ausführbar. Möglicherweise müssen Sie das gir1.2-gnomedesktop-3.0Paket auch installieren , wenn es noch nicht installiert ist.

Rufen Sie anschließend einfach das Skript mit den Dateien oder Ordnern auf, für die Sie eine Miniaturansicht als Argument erstellen möchten. Thumbnails werden dort gespeichert, ~/.thumbnailswo Anwendungen wie Nautilus sie erwarten.

James Henstridge
quelle
1
Vielen Dank, James, dass du dir die Zeit genommen hast, dieses Drehbuch zu schreiben. Es funktioniert genauso wie für einzelne Dateien geworben. Von den bereitgestellten Lösungen ist dies die einzige, deren Ausgabe vom System erkannt wird (es wird der richtige Dateiname 48eebea785a185cdfc9d8f1a2ed34400.pngverwendet). Zu diesem Zeitpunkt scheint es jedoch keine Verzeichnisse zu unterstützen. Gibt es eine Möglichkeit, Verzeichnisse rekursiv zu durchlaufen?
Glutanimate
Getan. Ich habe auch die Ausgabe ein wenig vereinfacht.
James Henstridge
Ihr Skript funktioniert absolut großartig. Es ist genau das, wonach ich gesucht habe, also habe ich dich mit dem Kopfgeld belohnt. Bei meinem letzten Testlauf sind zwar einige Fehlermeldungen aufgetreten , die jedoch die Generierung der Miniaturansichten nicht behinderten. Die Fehler können mit der Tatsache zusammenhängen, dass einige der Dateinamen deutsche Umlaute ("ä, ü, ö") enthielten. Nochmals vielen Dank für diese hervorragende Lösung. Es wird mein Leben von nun an viel einfacher machen.
Glutanimate
1
Diese Fehler stammen von einem XML-Parser, der von einem der Miniaturbilder verwendet wird. Sie hängen also eher mit dem Inhalt einer Datei als mit ihrem Namen zusammen. Das obige Thumbnailer-Skript verarbeitet alle Dateien im Verzeichnis, sodass es sich möglicherweise nicht um ein PDF handelt, mit dem es Probleme gibt.
James Henstridge
Ich kann keine Miniaturansichten für Nur-Text-Dateien erstellen. Muss ich etwas konfigurieren, damit dies funktioniert?
Krasnaya
18

Das folgende Skript sollte den Job erledigen. Es verwendet evince-thumbnailerdie - soweit ich weiß - mit jeder Gnome-Installation und ist die Standard-Miniaturansicht.
Speichern unter pdfthumbnailer.sh und ausführbar machen.
Verwendung :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

Einschränkung :

  • fügt den Miniaturansichten keine Thumb :: URI- und Thumb :: MTime-Attribute hinzu, wie von James Henstridge hervorgehoben. Bisher habe ich keine Beweise dafür gesehen, dass der Standard dies evince-thumbnailertut. Mit anderen Worten, solange Nautilus die Thumbnails nicht neu generiert, kann das Skript für den Job verwendet werden.

Anmerkungen :

  • Druckt den Namen der Datei, wenn eine neue Miniaturansicht erstellt wird. Überspringt die Erstellung, falls vorhanden
  • geschwindigkeit: 37 pdf dateien getestet mit beiden evince-thumbnailerund convert(von imagemagick): 3 sekunden für evince-thumbnailerund 14 sekunden für convert.
  • Erzeugt Thumbnails, die von Nautilus erkannt werden
  • Pfadnamen, die von der Perl-URL behandelt werden: Dateimodul (Leerzeichen und andere Zeichen werden korrekt in eine Datei-URI übersetzt)
  • muss perlin einer Standardinstallation vorhanden sein
  • Dateien, die nicht von behandelt wurden, evince-thumbnailergeben einfach einen Fehler aus, der mit stummgeschaltet wurde2>/dev/null
  • Sehen Sie sich die MimeType-Zeile an /usr/share/thumbnailers/evince.thumbnailer, um eine Liste der behandelten Dateitypen anzuzeigen
  • updates: ab 12.04 scheint der thumbnail ordner zu sein ~/.cache/thumbnails.
    Robuster Pfade mit readlink.

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

rosch
quelle
Zunächst einmal danke ich Ihnen für Ihre Antwort und die Mühe, die Sie darauf verwendet haben. Ich habe einige Testläufe durchgeführt und hier sind meine Ergebnisse: 1.) Die Erstellung von Thumbnails funktioniert nicht für Verzeichnisse mit Leerzeichen im Namen; 2.) Thumbnails, die sowohl mit Ihrem Skript als auch mit @Martin Orda's erstellt wurden, werden vom System nicht erkannt. Dateien, die mit Ihrem Skript verarbeitet wurden, werden so behandelt, als ob kein Miniaturbild vorhanden wäre -> das Ergebnis: Doppelte Miniaturbilder im Miniaturbildverzeichnis
Glutanimate
Hm, meine Tests waren bisher positiv: Nautilus hat die Thumbnails erkannt und nicht regeneriert. Puh, Leerzeichen in Ordnernamen finde ich schlecht. Aber ich werde das Skript modifizieren. Doppelte Thumbnails? Wie heißt das neue Miniaturbild für eine Give-Datei?
Rosch
Ok, habe es nochmal ausprobiert und ich fürchte, es ist das gleiche Ergebnis wie beim letzten Mal. Hier ist der Dateiname ein Thumbnail - Skript generiert: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Dies ist , wie die gleiche Thumbnail wird von nautilus genannt: 48eebea785a185cdfc9d8f1a2ed34400.png. Mir ist auch aufgefallen, dass mit Ihrem Skript erstellte Thumbnails 128x171px groß sind, während der eingebaute Thumbnailer nur Thumbnails mit 96x128px erstellt.
Glutanimate
Hier ist ein Vergleich .
Glutanimate
Zu Ihrem Kommentar evince-thumbnailer, die PNG-Tags nicht hinzuzufügen, ist das richtig: Der Code, der die externen Miniaturansichten aufruft, schreibt die Bilder tatsächlich so um, dass sie die Tags enthalten. Sie sollten dies überprüfen können, indem Sie strings -aeine der von Nautilus generierten Miniaturansichten ausführen.
James Henstridge
10

War eine Weile abgelenkt und rosch hat mich geschlagen :) Wusste nicht, dass es evince-thumbnailer gibt (ich bin kein Gnome-Benutzer), aber trotzdem, da ich es bereits geschrieben habe, geht es los. Es setzt voraus, dass imagemagick installiert, überprüft und installiert ist, falls nicht vorhanden mit:

which convert || sudo apt-get install imagemagick

Speichern Sie es als mkthumb.sh(zum Beispiel) chmod +x mkthumb.shund führen Sie es mit absoluten Pfaden als Argumente aus (Sie können -s als ersten Parameter verwenden, um die Erzeugung bereits vorhandener Miniaturansichten zu überspringen).

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

Das Skript (Ich habe es leicht modifiziert, um die meisten Bilder zu unterstützen. Sie können weitere Erweiterungen hinzufügen, wenn Sie sie benötigen.):

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

Es behandelt Dateien mit Leerzeichen im Namen ohne Probleme.

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
quelle
Vielen Dank auch für die Bereitstellung eines ausgezeichneten Skripts. Ich habe einige Testläufe durchgeführt und hier sind meine Ergebnisse: 1.) Die Erstellung von Thumbnails funktioniert gut und ist schneller als evince-thumbnailer; 2.) Thumbnails, die sowohl mit Ihrem Skript als auch mit @ rosch erstellt wurden, werden vom System nicht erkannt. Dateien, die mit Ihrem Skript verarbeitet wurden, werden so behandelt, als ob kein Miniaturbild vorhanden wäre. Beim manuellen Zugriff auf die Verzeichnisse werden neue Thumbs erstellt -> Ergebnis: Thumbs im Thumbnails-Verzeichnis
duplizieren
Sie haben Recht - ich habe dies erneut überprüft und festgestellt, dass Nautilus sie erneut generiert (ich glaube, das war nicht der Fall, als ich es letzte Nacht getestet habe, aber ich könnte mich irren, es war bereits spät). Wenn es tatsächlich schneller ist, als Sie geschrieben haben (ich habe noch keine anderen Methoden verwendet), werde ich in ein paar Stunden daran arbeiten. Das einzige Problem dabei ist, dass beide von meinem Skript generierten Dateien und Nautilus dieselben Eigenschaften aufweisen: "PNG 97x128 97x128 + 0 + 0 8-Bit DirectClass 20.4KB 0.000u 0: 00.000", wenn ich <thumbnail> verwende.
Marcin Kaminski
Nein, wir haben uns beide geirrt :) Es stellte sich heraus, dass ich vergessen habe, dass der Dateiname des Thumbnails ein MD5-Hash von 'file: //' + absolute_path ist, und mein Skript fälschlicherweise als ./mkthumb.sh -s Downloads / pdf / test statt. /mkthumb.sh -s / home / user / Downloads / pdf / test. Versuchen Sie es noch einmal.
Marcin Kaminski
In Ordnung, ich habe einen weiteren Testlauf durchgeführt und das Besondere ist, dass Ihre beiden Skript-Rosch anscheinend dasselbe Problem haben: Dateiname mit Ihrem Skript ist, 2a43dc2774e3dfe45a4337e0304e5b0a.pngwährend Nautilus es als benennt 48eebea785a185cdfc9d8f1a2ed34400.png. Die Dimensionen stimmen jedoch mit Ihrem Skript überein. Hier ist ein Vergleich
Glutanimate
Ich möchte hinzufügen, dass Ihr Skript immer noch das schnellste von den hier geposteten ist. imagemagickscheint auch viel besser mit Skalierung umzugehen als evince-thumbnailer(siehe Vergleich oben als Referenz).
Glutanimate
1

Die Miniaturbildspezifikation enthält freigegebene Miniaturbild-Repositorys, mit denen vorab generierte Miniaturbilder zusammen mit den zugehörigen Dateien verteilt werden können, anstatt dass jeder Benutzer sein eigenes Miniaturbild generiert. Theoretisch könnten Sie Thumbnails generieren und dann zu einem gemeinsam genutzten Repository hinzufügen, sodass Sie sie künftig nicht mehr generieren müssen, wenn Sie Ihr Thumbnails-Verzeichnis geleert oder alle auf einen anderen Computer oder was auch immer verschoben haben.

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

Diese Ask Ubuntu-Seite wurde in den Suchergebnissen angezeigt, als ich herausfinden wollte, ob eine Anwendung freigegebene Miniaturansichten-Repositorys unterstützt. Leider scheint sie keine Anwendung zu unterstützen.

Bob
quelle
1

Ich habe ein Paket geschrieben, das James 'Skript so modifiziert hat, dass es Multiprocessing und die Option zum rekursiven Generieren von Thumbnails enthält. Das Paket ist pip-installierbar. Prüfen Sie hier für Installationsanweisungen.

Ein Anwendungsbeispiel ist:

thumbgen -w 4 -r -d your_directory
  • -r: Generiere rekursiv Thumbnails

  • -w: Anzahl der zu verwendenden Kerne

mudassirkhan19
quelle