Como instruir o Nautilus a gerar previamente miniaturas?

33

Eu tenho uma grande biblioteca de documentos PDF (papéis, palestras, folhetos) pelos quais desejo poder navegar rapidamente. Para isso eu preciso de miniaturas.

Ao mesmo tempo, porém, vejo que a ~/.thumbnailspasta está se acumulando com os polegares que realmente não preciso. É impossível excluir o lixo eletrônico de miniaturas sem remover os polegares importantes. Se eu os excluísse, teria que ir a todas as pastas com documentos PDF importantes e deixar o cache de miniaturas se regenerar.

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

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


Editar :

A resposta a esta pergunta foi bastante esmagadora. Quero agradecer a todos que participaram da solução. A pergunta, 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. É exatamente isso que torna o Linux e o Open Source tão bons.

Todas as respostas fornecidas mereceriam a recompensa que originalmente ofereci para esta pergunta. Ainda assim, há apenas uma recompensa a ser concedida. 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 freedesktop

Velocidade : 95 PDFs em 12,6 seg

Qualidade : qualidade do estoque nautilus

Benefícios adicionais : 1.) pula automaticamente os arquivos com os polegares preexistentes; 2.) Não são necessários pacotes adicionais

Thumbnailer 2 , de Martin Orda:

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

Velocidade : 95 PDFs em 70,0 seg

Qualidade : escala significativamente melhor do que as imagens de estoque.

Benefícios adicionais : 1.) pula arquivos automaticamente com polegares preexistentes 2.) compatível com uma ampla variedade de formatos de imagem além do PDF 3.) independente da plataforma, não depende dos componentes do GNOME

Thumbnailer 3 , de James Henstridge:

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

Velocidade : 95 PDFs em 10,8 seg

Qualidade : qualidade do estoque nautilus

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


Todos os três scripts são excelentes. Cada um tem seu conjunto distinto de vantagens e desvantagens. A solução de 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 funciona com uma variedade de formatos de arquivo e é independente de DE. É excelente na qualidade das miniaturas, mas o faz à custa da velocidade.

No final, foi a solução de James que melhor se encaixou no meu caso de uso. É rápido, versátil e oferece as opções para pular arquivos com miniaturas pré-existentes.


Vencedor geral: James Henstridge


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


Edit 2 : Revisão atualizada com script aprimorado por rosch.

Glutanimado
fonte
Porque muitos pequenos arquivos sempre terminam mal. Você sabe o tamanho da sua pasta ~ / .thumbnails?
Antoine Rodriguez
Você quer dizer o tamanho que está agora? cerca de 85 MB após ~ 1 mês de uso.
Glutanimate
E quantos arquivos sua biblioteca possui? (isso é razão técnica / limitações)
Antoine Rodriguez
ah espera, eu calculei mal; isso inclui alguns arquivos de dados. Os documentos só sua sobre 2000.
Glutanimate
Só para atualizar você: Eu tenho uma solução para você. Está demorando para ser redigido, então permita-me alguns dias. Saudações;)
Antoine Rodriguez

Respostas:

35

As rotinas de miniaturas do Nautilus realmente vêm da libgnome-desktopbiblioteca, 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 gir1.2-gnomedesktop-3.0pacote se ele ainda não estiver instalado.

Depois disso, basta chamar o script com os arquivos ou pastas que você deseja miniatura como argumentos. As miniaturas serão salvas em locais ~/.thumbnailsonde aplicativos como o Nautilus esperam encontrá-las.

James Henstridge
fonte
1
Obrigado, James, por reservar um tempo para escrever esse script. Funciona exatamente como anunciado para arquivos únicos. Das soluções postadas, é a única cuja saída é reconhecida pelo sistema (o nome correto do arquivo 48eebea785a185cdfc9d8f1a2ed34400.pngé usado). Neste ponto, no entanto, ele não parece suportar diretórios. Existe alguma maneira de fazê-lo passar por diretórios recursivamente?
Glutanimate
Feito. Também simplifiquei um pouco a saída.
James Henstridge
Seu script funciona absolutamente bem. É exatamente o que eu estava procurando, então eu lhe concedi a recompensa. Eu encontrei algumas mensagens de erro durante a execução final do teste, mas elas não pareciam prejudicar a geração de miniaturas. Os erros podem estar relacionados ao fato de que alguns dos nomes de arquivos incluíam alemão Umlauts ("ä, ü, ö"). Obrigado novamente por fornecer esta excelente solução. Isso tornará minha vida muito mais fácil a partir de agora.
Glutanimate
1
Esses erros são provenientes de um analisador XML que está sendo usado por um dos miniaturizadores, portanto, seriam relacionados ao conteúdo de algum arquivo e não ao nome. O script de miniatura acima processará todos os arquivos no diretório, portanto, pode não ser um PDF com problemas.
James Henstridge
Não consigo criar miniaturas para arquivos de texto sem formatação. Preciso configurar algo para fazer isso funcionar?
krasnaya
18

O script abaixo deve fazer o trabalho. Ele usa o evince-thumbnailerque - tanto quanto eu sei - vem com todas as instalações do gnome e é o thumbnailer padrão.
Salvar como pdfthumbnailer.sh e torná-lo 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 "$@" ; do
    find "$folder" -type f -exec bash -c evincethumb {} \;
done

Restrição :

  • não adiciona os atributos Thumb :: URI e Thumb :: MTime às miniaturas, conforme apontado por James Henstridge. Até agora, não vi nenhuma evidência de que o padrão evince-thumbnaileresteja sendo feito. 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 existente
  • velocidade: 37 arquivos pdf testados com evince-thumbnailere convert(da imagemagick): 3segundos evince-thumbnailere 14segundos convert.
  • gera miniaturas reconhecidas pelo nautilus
  • nomes de caminho tratados pelo URL perl: módulo de arquivo (espaços e outros caracteres são traduzidos corretamente em uma uri de arquivo)
  • necessidades perl, presentes em uma instalação padrão
  • arquivos não manipulados evince-thumbnailersimplesmente produzirão um erro - silenciado com2>/dev/null
  • veja a linha MimeType /usr/share/thumbnailers/evince.thumbnailerpara ver uma lista dos tipos de arquivos manipulados
  • atualizações: a partir de 12.04, a pasta de miniaturas parece estar ~/.cache/thumbnails.
    Caminhos mais robustos usando readlink.

Inspiração :
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394

rosch
fonte
Antes de tudo, obrigado por sua resposta e pelo esforço que você colocou nela. Eu fiz alguns testes e aqui estão meus resultados: 1.) a geração de miniaturas não funciona para diretórios com espaços em seus nomes; 2.) as miniaturas criadas com o seu script e o de @Martin Orda não são reconhecidas pelo sistema; arquivos processados com seu script são tratados como se não há nenhuma miniatura de presente -> o resultado: polegares duplicados no diretório de miniaturas
Glutanimate
Bem, meus testes foram positivos até agora: o nautilus reconheceu as miniaturas e não as regenerou. Ugh, espaços nos nomes das pastas é algo que eu acho péssima prática ... mas vou modificar o script. Miniaturas duplicadas? Qual é o nome da nova miniatura para um arquivo give então?
rosch
Ok, tentei novamente e temo que seja o mesmo resultado da última vez. Aqui está o nome do arquivo de uma miniatura seu script gerado: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Esta é a forma como a mesma miniatura é nomeado pelo Nautilus: 48eebea785a185cdfc9d8f1a2ed34400.png. Também notei que os polegares criados com seu script têm 128x171px, enquanto o miniaturizador incorporado cria apenas miniaturas de 96x128px.
Glutanimate
Sobre o seu comentário sobre evince-thumbnailernão adicionar as tags PNG, está correto: o código que chama os miniaturizadores externos na verdade reescreve as imagens para incluir as tags. Você deve poder verificar isso executando strings -auma das miniaturas geradas pelo Nautilus.
James Henstridge
10

Me distraí por um tempo e rosch me venceu :) Não sabia que evince-thumbnailer existia (eu não sou usuário do Gnome), mas de qualquer maneira, desde que eu já escrevi, aqui vai. Requer o imagemagick instalado, verifique e instale, se não houver, com:

which convert || sudo apt-get install imagemagick

Salve como mkthumb.sh(por exemplo), chmod +x mkthumb.she execute-o com caminhos absolutos como argumentos (você pode usar -s como seu primeiro paramterer para pular a geração de miniaturas que já existem), ou seja:

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

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

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

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

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
fonte
Obrigado também por fornecer um excelente roteiro. Eu fiz alguns testes e aqui estão meus resultados: 1.) a geração de miniaturas funciona bem e é mais rápida que o evince-thumbnailer; 2.) as miniaturas criadas com o seu script e @ rosch não são reconhecidas pelo sistema; os arquivos processados ​​com seu script são tratados como se não houvesse miniatura presente. Novas polegares são criados ao acessar manualmente os diretórios -> o resultado: polegares duplicados no diretório de miniaturas
Glutanimate
Você está certo - verifiquei isso novamente e descobri que o nautilus os gera novamente (acho que não foi o caso quando o testei ontem à noite, mas posso estar errado, já era tarde). Se for realmente mais rápido como você escreveu (ainda não usei outros métodos), trabalharei em algumas horas. O único problema encontrado com isso é que os arquivos gerados pelo meu script e o nautilus exibem as mesmas propriedades: "PNG 97x128 97x128 + 0 + 0 DirectClass de 8 bits 20,4 KB 0,000u 0: 00.000" quando eu uso o identificador <thumbnail>.
Marcin Kaminski
Não, nós dois estávamos errados :) Acontece que eu esqueci que o nome do arquivo da miniatura é um hash md5 de 'file: //' + absolute_path e, por engano, executei meu script como ./mkthumb.sh -s Downloads / pdf / test em vez de. /mkthumb.sh -s / home / user / Downloads / pdf / test. Tente tentar novamente.
Marcin Kaminski
Tudo bem, eu fiz outro teste e o mais peculiar é que os dois scripts do rosch parecem ter o mesmo problema: o nome do arquivo com o script é 2a43dc2774e3dfe45a4337e0304e5b0a.pngenquanto o nautilus o nomeia 48eebea785a185cdfc9d8f1a2ed34400.png. As dimensões, no entanto, estão corretas com o seu script. Aqui está uma comparação
Glutanimado 17/10/12
Gostaria de acrescentar que seu script ainda é o mais rápido dentre os publicados aqui. imagemagicktambém parece lidar com o dimensionamento muito melhor do que evince-thumbnailer(veja a comparação acima para referência).
Glutanimate
1

A especificação de miniaturas 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. Portanto, em teoria, você pode gerar miniaturas e adicioná-las a um repositório compartilhado, eliminando a necessidade de gerá-las no futuro se você limpar o diretório de miniaturas ou mover todas elas para uma máquina diferente ou o que for.

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

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

Prumo
fonte
1

Escrevi um pacote que modificava o script de James para incluir o multiprocessamento e a opção de gerar recursivamente miniaturas. O pacote é pipinstalável. Confira aqui as instruções de instalação.

Um exemplo de uso é:

thumbgen -w 4 -r -d your_directory
  • -r: gerar recursivamente miniaturas

  • -w: número de núcleos a serem usados

mudassirkhan19
fonte