Как я могу поручить Наутилусу предварительно генерировать миниатюры?

У меня есть большая библиотека документов в формате PDF (документы, лекции, раздаточные материалы), по которым я хочу быстро перемещаться. Для этого мне нужны миниатюры.

В то же время, однако, я вижу, что ~/.thumbnails папка накапливается большими пальцами, которые мне не нужны. Удаление ненужных миниатюр без удаления важных пальцев невозможно. Если бы я удалил их, мне пришлось бы перейти в каждую папку с важными документами PDF и позволить восстановиться кешу миниатюр.

Я хотел бы иметь возможность автоматизировать этот процесс. Можно ли как-то сказать nautilus предварительно кэшировать большие пальцы для набора заданных каталогов?

Примечание: я нашел набор сценариев bash, которые, кажется, делают это для изображений и видео, но не для каких-либо других документов. Может быть, кто-то более опытный в написании сценариев сможет настроить их для PDF-документов или, по крайней мере, указать мне правильное направление на то, что мне придется изменить для работы с PDF-документами.


Редактировать:

Ответ на этот вопрос был довольно ошеломляющим. Позвольте мне сначала поблагодарить всех, кто участвовал в решении этого. Вопрос, его ответы и все дискуссии вокруг него являются отличным примером того, как совместные усилия многих сторон могут привести к оптимальному решению. Это именно то, что делает Linux и Open Source такими замечательными.

Все предоставленные ответы заслуживают награды, которую я изначально выставил за этот вопрос. Тем не менее, есть только одна награда за вознаграждение. Всем будущим читателям я обязан выбрать ответ, который решит проблему наиболее эффективным способом. Чтобы определить, какое это решение, я выполнил последний тестовый тест, сравнивая три сценария на совместимость, скорость и качество вывода. Вот результаты:


Thumbnailer 1, от rosch:

Совместимость: ✔ пробелы в имени файла; ✔ пробелы в имени каталога; ✘ Freedesktop совместимый

Скорость: 95 PDF за 12,6 сек.

Качество: сток наутилус качество

Дополнительные привилегии: 1.) автоматически пропускает файлы с существующими большими пальцами; 2.) Никаких дополнительных пакетов не требуется

Thumbnailer 2, автор Martin Orda:

Совместимость: ✔ пробелы в имени файла; ✔ пробелы в имени каталога; ✘ Freedesktop совместимый

Скорость: 95 PDF за 70,0 сек.

Качество: значительно лучшее масштабирование, чем стоковые изображения.

Дополнительные привилегии: 1.) автоматически пропускает файлы с существующими большими пальцами 2.) совместима с широким спектром графических форматов, кроме PDF 3.) не зависит от платформы, не зависит от GNOME-компонентов

Thumbnailer 3, Джеймсом Хенстриджем:

Совместимость: ✔ пробелы в имени файла; ✔ пробелы в имени каталога; ✔ Freedesktop совместимый

Скорость: 95 PDF за 10,8 сек.

Качество: сток наутилус качество

Дополнительные привилегии: 1.) автоматически пропускает файлы с существующими превью 2.) совместим со всеми форматами файлов, которые определены предустановленными миниатюрами


Все три сценария превосходны. Каждый из них имеет свой набор преимуществ и недостатков. Решение Rosch работает "из коробки" и может быть правильным выбором для пользователей с минимальной установкой.

Мартин Орда создал очень универсальный скрипт, который работает с различными форматами файлов и не зависит от DE. Превосходно по качеству миниатюр, но делает это за счет скорости.

В конце концов, именно решение от James лучше всего подходит для моего варианта использования. Это быстрый, универсальный и предлагает варианты пропустить файлы с существующими миниатюрами.


Абсолютный победитель: Джеймс Хенстридж


Дополнительная информация: Все три скрипта полностью совместимы с nautilus-скриптами. Вы можете легко установить их, следуя этому руководству.


Редактировать 2: Обновлен обзор с улучшенным скриптом от rosch.

4 ответа

Решение

Наутилус миниатюрные рутины на самом деле приходят из libgnome-desktop библиотека, так что можно запускать те же миниатюры вне файлового менеджера.

API немного сложен, но следующий скрипт Python должен помочь:

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

Сохраните это в файл и отметьте его как исполняемый. Вам также может понадобиться установить gir1.2-gnomedesktop-3.0 пакет, если он еще не установлен.

После этого просто вызовите скрипт с файлами или папками, которые вы хотите использовать в качестве аргументов. Миниатюры будут сохранены в ~/.thumbnails где такие приложения, как Nautilus, ожидают их найти.

Сценарий ниже должен сделать эту работу. Оно использует evince-thumbnailer который - насколько я знаю - поставляется с каждой установкой gnome и является стандартным thumbnailer.
Сохранить как pdfthumbnailer.sh и сделать его исполняемым.
Использование: 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

Ограничение:

  • не добавляет атрибуты Thumb::URI и Thumb::MTime к миниатюрам, на что указал Джеймс Хенстридж. До сих пор я не видел доказательств того, что дефолт evince-thumbnailer делает так. Другими словами... до тех пор, пока nautilus не регенерирует миниатюры, сценарий можно использовать для работы.

Примечания:

  • печатает имя файла при генерации нового эскиза, пропускает генерацию, если существует
  • скорость: 37 файлов pdf протестированы с обоими evince-thumbnailer а также convert (из imagemagick): 3 секунды для evince-thumbnailer и 14 секунд для convert,
  • генерирует миниатюры, распознаваемые наутилусом
  • имена путей, обрабатываемые URL-адресом perl: файловый модуль (пробелы и другие символы правильно переводятся в файл uri)
  • потребности perlприсутствует в установке по умолчанию
  • файлы не обрабатываются evince-thumbnailer просто выведет ошибку - приглушено 2>/dev/null
  • посмотрите на строку MimeType в /usr/share/thumbnailers/evince.thumbnailer чтобы увидеть список обработанных типов файлов
  • обновления: начиная с 12.04, похоже, папка с миниатюрами ~/.cache/thumbnails,
    Более надежные пути, используя readlink,

Вдохновение:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394

На какое-то время отвлекся и Рош победил меня:) Я не знал, что evince-thumbnailer существует (я не пользователь Gnome), но в любом случае, так как я уже написал это, вот оно. Требуется установленный imagemagick, проверьте и установите, если его там нет:

which convert || sudo apt-get install imagemagick

Сохранить как mkthumb.sh (например), chmod +x mkthumb.sh и выполнить его с абсолютными путями в качестве аргументов (вы можете использовать -s в качестве первого параметра для пропуска создания уже существующих миниатюр), то есть:

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

Скрипт (я немного изменил его для поддержки большинства изображений, вы можете добавить больше расширений, если они вам нужны):

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

Он обрабатывает файлы с пробелами в их именах без проблем.

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.

Я написал пакет, который модифицировал сценарий Джеймса, включив в него многопроцессорность и возможность рекурсивного создания эскизов. Пакет pip-устанавливаемый. Проверьте здесь для получения инструкций по установке.

Пример использования:

thumbgen -w 4 -r -d your_directory
  • -r: рекурсивно генерировать эскизы

  • -w: количество ядер для использования

Спецификация миниатюр включает в себя общие репозитории миниатюр, которые позволяют предварительно генерировать миниатюры, которые будут распространяться вместе со связанными файлами, а не позволять каждому пользователю создавать свои собственные миниатюры. Таким образом, теоретически вы можете сгенерировать миниатюры, а затем добавить их в общий репозиторий, что избавит вас от необходимости генерировать их в будущем, если вы очистите свой каталог с миниатюрами или перенесете их все на другой компьютер или что-то еще.

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

Эта страница Ask Ubuntu появилась в результатах поиска, когда я пытался выяснить, поддерживает ли какое-либо приложение общие репозитории миниатюр. К сожалению, кажется, что ни одно приложение не поддерживает их.

Другие вопросы по тегам