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

33

У меня есть большая библиотека документов в формате 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.

глутанимат
источник
Потому что много маленьких файлов всегда плохо заканчивается. Вы знаете размер вашей папки ~ / .thumbnails?
Антуан Родригес
Вы имеете в виду размер это прямо сейчас? около 85 МБ после ~ 1 месяца использования.
Glutanimate
А сколько файлов в вашей библиотеке? (это по техническим причинам / ограничениям)
Антуан Родригес
подожди, я просчитался; это включает в себя некоторые файлы данных. Документы только его около 2000 года.
Glutanimate
Просто чтобы обновить вас: у меня есть решение для вас. Это долго, чтобы отредактировать, поэтому позвольте мне пару дней. С уважением;)
Антуан Родригес

Ответы:

35

Процедуры миниатюры Наутилуса на самом деле происходят из 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, ожидают их найти.

Джеймс Хенстридж
источник
1
Спасибо, Джеймс, что нашли время написать этот сценарий. Он работает так же, как рекламируется для отдельных файлов. Из опубликованных решений это единственный, чей вывод распознается системой (используется правильное имя файла 48eebea785a185cdfc9d8f1a2ed34400.png). На данный момент, однако, кажется, что он не поддерживает каталоги. Есть ли какой-нибудь способ сделать так, чтобы он проходил через каталоги рекурсивно?
Glutanimate
Выполнено. Я также немного упростил вывод.
Джеймс Хенстридж
Ваш сценарий работает абсолютно отлично. Это именно то, что я искал, поэтому я наградил вас за вознаграждение. Я сталкивался с некоторыми сообщениями об ошибках во время последнего запуска теста, но они, похоже, не мешали созданию эскизов. Ошибки могут быть связаны с тем, что некоторые имена файлов включают в себя немецкие умлауты ("ä, ü, ö"). Еще раз спасибо за предоставление этого отличного решения. Теперь это сделает мою жизнь намного проще.
Glutanimate
1
Эти ошибки происходят из-за синтаксического анализатора XML, используемого одним из пиктограмм, поэтому он будет связан с содержимым некоторого файла, а не с его именем. Приведенный выше скрипт thumbnailer будет обрабатывать все файлы в каталоге, поэтому это может быть не PDF-файл, с которым возникли проблемы.
Джеймс Хенстридж
Я не могу создать эскизы для простых текстовых файлов. Что-то мне нужно настроить, чтобы это работало?
Красная
18

Сценарий ниже должен сделать эту работу. Он использует 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

Rosch
источник
Прежде всего, спасибо за ваш ответ и приложенные усилия. Я сделал несколько тестовых прогонов, и вот мои результаты: 1.) создание миниатюр не работает для каталогов с пробелами в их именах; 2.) миниатюры, созданные с помощью вашего сценария и @Martin Orda, не распознаются системой; файлы, обработанные вашим сценарием, обрабатываются так, как будто нет миниатюр -> результат: дубликаты в каталоге миниатюр
Glutanimate
Хм, ну, мои тесты пока были положительными: nautilus распознал миниатюры и не восстанавливал их. Тьфу, пробелы в именах папок - это то, что я считаю плохой практикой ... но я изменю сценарий. Дубликаты миниатюр? Как называется новый эскиз для данного файла?
Рощ
Хорошо, попробовал еще раз, и я боюсь, что это тот же результат, что и в прошлый раз. Вот имя файла эскиза вашего сценария генерируется: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Это как же уменьшенное назван Наутилус: 48eebea785a185cdfc9d8f1a2ed34400.png. Я также заметил, что большие пальцы, созданные с помощью вашего скрипта, имеют размер 128x171px, в то время как встроенный миниатюра создает только миниатюры 96x128px.
Glutanimate
Что касается вашего комментария об отказе от evince-thumbnailerдобавления тегов PNG, то это правильно: код, который вызывает внешние миниатюры, на самом деле переписывает изображения для включения тегов. Вы сможете убедиться в этом, запустив strings -aодну из миниатюр, созданных Nautilus.
Джеймс Хенстридж
10

На какое-то время отвлекся и Рош победил меня :) Я не знал, что 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.
Марчин Камински
источник
Спасибо также за предоставление отличного сценария. Я сделал несколько тестовых прогонов, и вот мои результаты: 1.) генерация миниатюр работает хорошо и быстрее, чем evince-thumbnailer; 2.) миниатюры, созданные с помощью вашего скрипта и @ rosch, не распознаются системой; файлы, обработанные вашим скриптом, обрабатываются так, как будто нет миниатюр. Новые превью создаются при ручном доступе к каталогам -> результат: дубликаты в каталоге миниатюр
Glutanimate
Вы правы - я снова проверил это и обнаружил, что nautilus генерирует их снова (я думаю, что это было не так, когда я проверял это вчера вечером, но я мог ошибаться, было уже поздно). Если это действительно быстрее, чем вы написали (я еще не использовал другие методы), я поработаю над этим через несколько часов. Единственная проблема, с которой я сталкиваюсь, это то, что оба файла, сгенерированные моим сценарием, и nautilus имеют одинаковые свойства: «PNG 97x128 97x128 + 0 + 0 8-битный DirectClass 20.4KB 0.000u 0: 00.000» при использовании идентификатора <thumbnail>.
Марцин Камински
Нет, мы оба были неправы :) Оказывается, я забыл, что имя файла миниатюры - это хэш md5 'file: //' + absolute_path, и по ошибке запустил мой скрипт как ./mkthumb.sh -s Downloads / pdf / test вместо. /mkthumb.sh -s / home / user / Downloads / pdf / test. Попробуйте снова попробовать.
Марцин Камински
Хорошо, я сделал еще один тестовый запуск, и особенность в том, что оба ваших скрипта rosch, похоже, имеют одну и ту же проблему: имя файла с вашим скриптом - в 2a43dc2774e3dfe45a4337e0304e5b0a.pngто время как nautilus называет его так 48eebea785a185cdfc9d8f1a2ed34400.png. Размеры, однако, соответствуют вашему сценарию. Вот сравнение
Glutanimate
Я хотел бы добавить, что ваш сценарий по-прежнему самый быстрый из тех, что размещены здесь. imagemagickтакже, кажется, справляется с масштабированием намного лучше чем evince-thumbnailer(см. сравнение выше для справки).
Glutanimate
1

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

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

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

боб
источник
1

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

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

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

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

mudassirkhan19
источник