Como posso instruir o Nautilus a pré-gerar miniaturas?

33

Eu tenho uma grande biblioteca de documentos PDF (documentos, palestras, folhetos) que eu quero poder navegar rapidamente. Para isso eu preciso de miniaturas.

Ao mesmo tempo, no entanto, vejo que a pasta ~/.thumbnails está se acumulando com os polegares que eu realmente não preciso. Excluir o lixo de miniaturas sem remover os polegares importantes é impossível. Se eu fosse apagá-los, eu teria que ir para cada pasta com documentos PDF importantes e deixar o cache de miniaturas se regenerar.

Eu adoraria poder automatizar esse processo. Existe alguma maneira que eu possa dizer ao nautilus para pré-armazenar os polegares em um conjunto de diretórios?

Nota : Eu encontrei um conjunto de scripts bash que parecem fazer isso para fotos e vídeos, mas não para outros documentos. Talvez alguém mais experiente com scripts possa ajustá-los para documentos PDF ou pelo menos me indicar na direção certa sobre o que eu teria que modificar para que isso funcionasse também com documentos PDF.

Editar :

A resposta a esta pergunta foi bastante impressionante. Deixe-me primeiro agradecer a todos que participaram da solução. A questão, suas respostas e toda a discussão em torno dela são um ótimo exemplo de como o esforço colaborativo de muitas partes pode levar a uma solução ideal. Isso é exatamente o que torna o Linux e o Open Source tão bons.

Todas as respostas fornecidas mereceriam a generosidade que eu originalmente coloquei para essa pergunta. Ainda assim, há apenas uma recompensa para premiar. Devo a todos os futuros leitores escolher a resposta que resolve o problema da maneira mais eficiente. Para determinar qual solução, eu fiz um teste final, comparando os três scripts em compatibilidade, velocidade e qualidade de saída. Aqui estão os resultados:

Thumbnailer 1 , por rosch:

Compatibilidade : ✔ espaços no nome do arquivo; ✔ espaços no nome do diretório; ✘ compatível com o freedesktop

Velocidade : 95 PDFs em 12,6 seg

Qualidade : qualidade do nautilus em estoque

Perks adicionais : 1.) ignora automaticamente arquivos com polegares preexistentes; 2.) Nenhum pacote adicional necessário

Thumbnailer 2 , de Martin Orda:

Compatibilidade : ✔ espaços no nome do arquivo; ✔ espaços no nome do diretório; ✘ compatível com o freedesktop

Velocidade : 95 PDFs em 70,0 segundos

Qualidade : dimensionamento significativamente melhor do que as imagens em estoque.

Vantagens Adicionais : 1.) salta automaticamente arquivos com polegares preexistentes 2.) compatível com uma ampla gama de formatos de imagem além do PDF 3.) independente de plataforma, não depende dos componentes do GNOME / p>

Thumbnailer 3 , de James Henstridge:

Compatibilidade : ✔ espaços no nome do arquivo; ✔ espaços no nome do diretório; ✔ compatível com o freedesktop

Velocidade : 95 PDFs em 10,8 seg

Qualidade : qualidade do nautilus em estoque

Perks adicionais : 1.) ignora automaticamente os arquivos com polegares preexistentes 2.) compatível com todos os formatos de arquivo identificados pelos thumbnailers pré-instalados

Todos os três scripts são excelentes. Cada um tem seu conjunto distinto de vantagens e desvantagens. A solução da Rosch funciona imediatamente e pode ser a escolha certa para usuários com uma instalação mínima.

Martin Orda criou um script muito versátil que trabalha com uma variedade de formatos de arquivos e é independente de DE. Ele se destaca na qualidade de miniaturas, mas faz isso à custa da velocidade.

No final, foi a solução do James que melhor se adaptou ao meu caso de uso. É rápido, versátil e oferece as opções para pular arquivos com miniaturas preexistentes.

Vencedor geral: James Henstridge

Informações adicionais : Todos os três scripts são totalmente compatíveis com nautilus-scripts . Você pode facilmente instalá-los seguindo este tutorial .

Editar 2 : revisão atualizada com script aprimorado por rosch.

    
por Glutanimate 13.04.2017 / 14:23

4 respostas

35

Na verdade, as rotinas de miniaturas do Nautilus vêm da biblioteca libgnome-desktop , portanto, é possível executar os mesmos miniaturizadores fora do gerenciador de arquivos.

A API é um pouco complexa, mas o seguinte script Python deve ajudar:

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

Salve isso em um arquivo e marque-o como executável. Você também pode precisar instalar o pacote gir1.2-gnomedesktop-3.0 se ainda não estiver instalado.

Depois disso, basta invocar o script com os arquivos ou pastas que você deseja usar como argumentos. As miniaturas serão salvas em ~/.thumbnails , onde aplicativos como o Nautilus esperam encontrá-los.

    
por James Henstridge 17.10.2012 / 10:36
18

O script abaixo deve fazer o trabalho. Ele usa evince-thumbnailer que - até onde eu sei - vem com toda instalação do gnome e é o thumbnailer padrão.
Salve como pdfthumbnailer.sh e torne-o executável.
Uso : 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 "[email protected]" ; do
    find "$folder" -type f -exec bash -c evincethumb {} \;
done

Restrição :

  • não adiciona os atributos Thumb :: URI e Thumb :: MTime às miniaturas como apontado por James Henstridge. Até agora não vi nenhuma evidência de que o padrão evince-thumbnailer esteja fazendo isso. Em outras palavras, desde que o nautilus não regenere as miniaturas, o script pode ser usado para o trabalho.

Notas :

  • imprime o nome do arquivo ao gerar uma nova miniatura, pula a geração se existir
  • velocidade: arquivos PDF 37 testados com evince-thumbnailer e convert (de imagemagick): 3 segundos para evince-thumbnailer e 14 segundos para convert .
  • gera miniaturas reconhecidas pelo nautilus
  • nomes de caminhos manipulados pelo URL perl: file module (espaços e outros caracteres são traduzidos corretamente em um arquivo uri)
  • precisa de perl , presente em uma instalação padrão
  • arquivos não manipulados por evince-thumbnailer simplesmente gerarão um erro - silenciado com 2>/dev/null
  • observe a linha MimeType em /usr/share/thumbnailers/evince.thumbnailer para ver uma lista de tipos de arquivos manipulados
  • atualizações: a partir de 12.04, a pasta de miniaturas parece ser ~/.cache/thumbnails .
    Caminhos mais robustos usando readlink .

Inspiração :
link

    
por rosch 16.10.2012 / 23:33
10

Me distraio por um tempo e o rosch me bateu nisso :) Não sabia que o evince-thumbnailer existia (eu não sou um usuário do Gnome) mas de qualquer forma, já que eu já escrevi, aqui vai. Requer que o imagemagick esteja instalado, verifique e instale se não estiver lá com:

which convert || sudo apt-get install imagemagick

Salvar como mkthumb.sh (por exemplo), chmod +x mkthumb.sh e executá-lo com caminhos absolutos como argumentos (você pode usar -s como primeiro paramterer para ignorar a geração de miniaturas que já existem), por exemplo:

[email protected] $ ./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
....

O script (eu modifiquei um pouco para suportar a maioria das imagens, você pode adicionar mais extensões se você precisar delas):

#!/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 [email protected]; 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}"

Ele lida com arquivos com espaços em seus nomes sem problemas.

A bit of testing here:

[email protected] $ find .thumbnails/
.thumbnails/
.thumbnails/fail
.thumbnails/fail/gnome-thumbnail-factory
.thumbnails/normal

# ok - no thumbnails present.

[email protected] $ ./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

[email protected] $ touch tstamp

[email protected] $ ./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:

[email protected] $ find .thumbnails/ -newer tstamp

# None.
    
por Marcin Kaminski 17.10.2012 / 00:09
1

A especificação de miniatura inclui repositórios de miniaturas compartilhados, que permitem que miniaturas pré-geradas sejam distribuídas junto com os arquivos associados, em vez de cada usuário gerar sua própria miniatura. Então, em teoria, você poderia gerar miniaturas e, em seguida, adicioná-las a um repositório compartilhado, removendo assim a necessidade de gerá-las no futuro, se você limpasse o diretório de miniaturas ou movesse todas para uma máquina diferente ou qualquer outra coisa.

link

Esta página Ask Ubuntu aparece nos resultados de uma pesquisa quando eu estava tentando descobrir se algum aplicativo suporta repositórios de thumbnail compartilhados. Infelizmente, parece que nenhum aplicativo os suporta.

    
por Bob 11.08.2014 / 12:47