Come posso incaricare Nautilus di pre-generare miniature?


33

Ho una vasta libreria di documenti PDF (documenti, lezioni, dispense) che voglio poter navigare rapidamente. Per questo ho bisogno di miniature.

Allo stesso tempo, tuttavia, vedo che la ~/.thumbnailscartella si sta accumulando con i pollici di cui non ho davvero bisogno. Eliminare la spazzatura delle miniature senza rimuovere i pollici importanti è impossibile. Se dovessi eliminarli, dovrei andare in ogni cartella con importanti documenti PDF e lasciare rigenerare la cache delle miniature.

Mi piacerebbe poter automatizzare questo processo. C'è un modo in cui posso dire a nautilus di pre-cache i pollici per un set di determinate directory?

Nota : ho trovato una serie di script bash che sembrano fare questo per immagini e video, ma non per altri documenti. Forse qualcuno più esperto di scripting potrebbe essere in grado di adattarli per i documenti PDF o almeno indirizzarmi nella giusta direzione su cosa dovrei modificare affinché funzioni anche con i documenti PDF.


Edit :

La risposta a questa domanda è stata abbastanza travolgente. Vorrei innanzitutto ringraziare tutti coloro che hanno partecipato alla soluzione di questo. La domanda, le sue risposte e tutte le discussioni intorno ad essa sono un ottimo esempio di come lo sforzo collaborativo di molte parti possa portare a una soluzione ottimale. Questo è esattamente ciò che rende Linux e Open Source così fantastici.

Tutte le risposte fornite meriterebbero la generosità che avevo originariamente posto per questa domanda. Tuttavia, c'è solo un premio da assegnare. Devo a tutti i futuri lettori scegliere la risposta che risolve il problema nel modo più efficiente. Per determinare quale sia la soluzione, ho eseguito un test finale, confrontando i tre script in compatibilità, velocità e qualità dell'output. Ecco i risultati:


Thumbnailer 1 , di rosch:

Compatibilità : ✔ spazi nel nome del file; ✔ spazi nel nome della directory; ✘ conforme a freedesktop

Velocità : 95 PDF in 12,6 sec

Qualità : qualità nautilus di serie

Vantaggi aggiuntivi : 1.) salta automaticamente i file con i pollici preesistenti; 2.) Non sono necessari pacchetti aggiuntivi

Thumbnailer 2 , di Martin Orda:

Compatibilità : ✔ spazi nel nome del file; ✔ spazi nel nome della directory; ✘ conforme a freedesktop

Velocità : 95 PDF in 70,0 sec

Qualità : ridimensionamento significativamente migliore rispetto alle immagini di stock.

Vantaggi aggiuntivi : 1.) salta automaticamente i file con i pollici preesistenti 2.) compatibile con una vasta gamma di formati di immagine oltre a PDF 3.) indipendente dalla piattaforma, non si basa su componenti GNOME

Thumbnailer 3 , di James Henstridge:

Compatibilità : ✔ spazi nel nome del file; ✔ spazi nel nome della directory; ✔ conforme a freedesktop

Velocità : 95 PDF in 10,8 sec

Qualità : qualità nautilus di serie

Vantaggi aggiuntivi : 1.) salta automaticamente i file con i pollici preesistenti 2.) compatibile con tutti i formati di file identificati dai thumbnailer preinstallati


Tutti e tre gli script sono eccellenti. Ognuno ha i suoi distinti vantaggi e svantaggi. La soluzione di Rosch è pronta all'uso e potrebbe essere la scelta giusta per gli utenti con un'installazione minima.

Martin Orda ha creato uno script molto versatile che funziona con una varietà di formati di file ed è indipendente dalla DE. Eccelle per la qualità delle miniature ma lo fa a scapito della velocità.

Alla fine era la soluzione di James che si adattava meglio al mio caso d'uso. È veloce, versatile e offre le opzioni per saltare i file con miniature preesistenti.


Vincitore assoluto : James Henstridge


Informazioni aggiuntive : tutti e tre gli script sono completamente compatibili con gli script nautilus . Puoi installarli facilmente seguendo questo tutorial .


Modifica 2 : revisione aggiornata con script migliorato di rosch.


Perché molti piccoli file finiscono sempre male. Conosci le dimensioni della tua cartella ~ / .thumbnails?
Antoine Rodriguez,

Intendi la taglia che è adesso? circa 85 MB dopo ~ 1 mese di utilizzo.
Glutanimate,

E quanti file ha la tua libreria? (Questo è per motivi tecnici / limitazioni)
Antoine Rodriguez,

ah aspetta, ho calcolato male; questo include alcuni file di dati. Documenta solo il 2000 circa.
Glutanimate,

Solo per aggiornarti: ho una soluzione per te. È lungo per essere redatto, quindi concedimi un paio di giorni. Saluti;)
Antoine Rodriguez,

Risposte:


35

Le routine di anteprima di Nautilus provengono effettivamente dalla libgnome-desktoplibreria, quindi è possibile eseguire gli stessi thumbnailer al di fuori del file manager.

L'API è un po 'complessa, ma il seguente script Python dovrebbe aiutare:

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

Salvalo in un file e contrassegnalo come eseguibile. Potrebbe anche essere necessario installare il gir1.2-gnomedesktop-3.0pacchetto se non è già installato.

Successivamente, è sufficiente richiamare lo script con i file o le cartelle che si desidera visualizzare in anteprima come argomenti. Le miniature verranno salvate ~/.thumbnailsdove applicazioni come Nautilus si aspettano di trovarle.


1
Grazie, James, per aver dedicato del tempo a scrivere questa sceneggiatura. Funziona proprio come pubblicizzato per singoli file. Tra le soluzioni pubblicate è l'unica il cui output è riconosciuto dal sistema ( 48eebea785a185cdfc9d8f1a2ed34400.pngviene utilizzato il nome file corretto ). A questo punto, tuttavia, non sembra supportare le directory. C'è un modo per farlo passare ricorsivamente nelle directory?
Glutanimate,

Fatto. Ho anche semplificato un po 'anche l'output.
James Henstridge,

La tua sceneggiatura funziona alla grande. È esattamente quello che stavo cercando, quindi ti ho assegnato la generosità. Durante l'esecuzione del test finale ho riscontrato alcuni messaggi di errore , ma non sembravano ostacolare la generazione di miniature. Gli errori potrebbero essere correlati al fatto che alcuni dei nomi dei file includevano German Umlauts ("ä, ü, ö"). Grazie ancora per aver fornito questa eccellente soluzione. Mi renderà la mia vita molto più semplice d'ora in poi.
Glutanimate,

1
Tali errori provengono da un parser XML utilizzato da uno dei thumbnailer, quindi sarebbero correlati al contenuto di alcuni file piuttosto che al suo nome. Lo script di thumbnailer sopra elaborerà tutti i file nella directory, quindi potrebbe non essere un PDF con cui ha problemi.
James Henstridge,

Non riesco a creare miniature per file di testo semplice. C'è qualcosa che devo configurare per farlo funzionare?
Krasnaya,

18

Lo script seguente dovrebbe fare il lavoro. Usa ciò evince-thumbnailerche - per quanto ne so - viene fornito con ogni installazione di gnome ed è il thumbnailer predefinito.
Salva come pdfthumbnailer.sh e rendilo eseguibile.
Utilizzo :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

Restrizione :

  • non aggiunge gli attributi Thumb :: URI e Thumb :: MTime alle miniature, come sottolineato da James Henstridge. Finora non ho visto prove che il default lo evince-thumbnailerstia facendo. In altre parole ... fintanto che nautilus non rigenera le anteprime lo script può essere utilizzato per il lavoro.

Note :

  • stampa il nome del file quando si genera una nuova anteprima, salta la generazione se esistente
  • velocità: 37 file pdf testati con entrambi evince-thumbnailere convert(da imagemagick): 3 secondi per evince-thumbnailere 14 secondi per convert.
  • genera miniature riconosciute da nautilus
  • i nomi dei percorsi gestiti dall'URL perl: modulo file (spazi e altri caratteri sono tradotti correttamente in un file uri)
  • necessità perl, presente in un'installazione predefinita
  • i file non gestiti da genereranno evince-thumbnailersemplicemente un errore - disattivato2>/dev/null
  • guarda la riga MimeType /usr/share/thumbnailers/evince.thumbnailerper vedere un elenco di tipi di file gestiti
  • aggiornamenti: a partire dalla 12.04 la cartella delle miniature sembra essere ~/.cache/thumbnails.
    Percorsi più robusti utilizzando readlink.

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


Prima di tutto grazie per la tua risposta e per l'impegno profuso. Ho fatto alcune prove ed ecco i miei risultati: 1.) la generazione delle miniature non funziona per le directory con spazi nei loro nomi; 2.) le miniature create sia con il tuo script che con quelle di @Martin Orda non sono riconosciute dal sistema; i file elaborati con lo script vengono gestiti come se non fosse presente alcuna anteprima -> il risultato: pollici duplicati nella directory delle miniature
Glutanimate,

Bene, finora i miei test sono stati positivi: nautilus ha riconosciuto le miniature e non le ha rigenerate. Ugh, gli spazi nei nomi delle cartelle sono qualcosa che trovo cattiva pratica ... ma modificherò lo script. Anteprime duplicate? Qual è il nome del nuovo bicchiere per un file dare allora?
Rosch

Ok, l'ho provato di nuovo e temo che sia lo stesso risultato dell'ultima volta. Ecco il nome del file di una miniatura vostro script generato: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Questo è come la stessa anteprima viene chiamato da nautilus: 48eebea785a185cdfc9d8f1a2ed34400.png. Ho anche notato che i pollici creati con il tuo script sono 128x171px mentre il thumbnailer integrato crea solo anteprime 96x128px.
Glutanimate,


A proposito del tuo commento sul evince-thumbnailernon aggiungere i tag PNG, è corretto: il codice che chiama i thumbnailer esterni riscrive effettivamente le immagini per includere i tag. Dovresti essere in grado di verificarlo eseguendo strings -auna delle miniature generate da Nautilus.
James Henstridge,

10

Mi sono distratto per un po 'e Rosch mi ha battuto :) Non sapevo che esistesse-thumbnailer (non sono un utente Gnome) ma comunque, dato che l'ho già scritto, eccolo. Richiede imagemagick installato, controlla e installa se non presente con:

which convert || sudo apt-get install imagemagick

Salva come mkthumb.sh(ad esempio), chmod +x mkthumb.shed eseguilo con percorsi assoluti come argomenti (puoi usare -s come primo parametro per saltare la generazione di miniature già esistenti) cioè:

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

Lo script (l'ho leggermente modificato per supportare la maggior parte delle immagini, puoi aggiungere più estensioni se ne hai bisogno):

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

Gestisce i file con spazi nei loro nomi senza problemi.

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.

Grazie anche per aver fornito una sceneggiatura eccellente. Ho fatto alcune prove ed ecco i miei risultati: 1.) la generazione delle miniature funziona bene ed è più veloce di evince-thumbnailer; 2.) le miniature create sia con lo script che con @ rosch's non sono riconosciute dal sistema; i file elaborati con lo script vengono gestiti come se non fosse presente alcuna miniatura. Nuovi pollici vengono creati quando si accede manualmente alle directory -> il risultato: pollici duplicati nella directory delle miniature
Glutanimate,

Hai ragione - l'ho verificato di nuovo e ho scoperto che nautilus li genera di nuovo (penso che non fosse il caso quando l'ho provato ieri sera ma potrei sbagliarmi, era già tardi). Se è davvero più veloce come hai scritto (non ho ancora usato altri metodi), ci lavorerò tra poche ore. L'unico problema che riscontro con questo è che entrambi i file generati dal mio script e nautilus presentano le stesse proprietà: "PNG 97x128 97x128 + 0 + 0 DirectClass 8-bit 20.4KB 0.000u 0: 00.000" quando utilizzo identifica <thumbnail>.
Marcin Kaminski,

No, ci sbagliavamo entrambi :) Risulta che ho dimenticato che il nome del file della miniatura è un hash md5 di 'file: //' + absolute_path e ha erroneamente eseguito il mio script come ./mkthumb.sh -s Download / pdf / test invece di. /mkthumb.sh -s / home / utente / Download / pdf / test. Prova a provarlo di nuovo.
Marcin Kaminski,

Va bene, ho fatto un altro test e la cosa peculiare è che entrambi i tuoi script Rosch sembrano avere lo stesso problema: il nome del file con lo script è 2a43dc2774e3dfe45a4337e0304e5b0a.pngmentre nautilus lo chiama come 48eebea785a185cdfc9d8f1a2ed34400.png. Le dimensioni, tuttavia, sono corrette con la tua sceneggiatura. Ecco un confronto
Glutanimate,

Vorrei aggiungere che il tuo script è ancora il più veloce tra quelli pubblicati qui. imagemagicksembra anche gestire il ridimensionamento molto meglio di evince-thumbnailer(vedi il confronto sopra per riferimento).
Glutanimate,

1

Le specifiche delle miniature includono repository di miniature condivise, che consentono di distribuire anteprime pre-generate insieme ai file associati anziché far sì che ogni utente generi la propria anteprima. Quindi, in teoria, potresti generare miniature e quindi aggiungerle a un repository condiviso eliminando così la necessità di generarle in futuro se hai cancellato la directory delle miniature o spostate tutte su una macchina diversa o altro.

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

Questa pagina Ask Ubuntu appare nei risultati di una ricerca quando stavo cercando di scoprire se qualche applicazione supporta repository di miniature condivise. Purtroppo sembra che nessuna applicazione li supporti.


1

Ho scritto un pacchetto che ha modificato la sceneggiatura di James per includere multiprocessing e l'opzione per generare ricorsivamente miniature. Il pacchetto è pipinstallabile. Controlla qui per le istruzioni di installazione.

Un esempio di utilizzo è:

thumbgen -w 4 -r -d your_directory
  • -r: genera in modo ricorsivo miniature

  • -w: numero di core da utilizzare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.