Как я могу поручить Наутилусу предварительно генерировать миниатюры?
У меня есть большая библиотека документов в формате 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 появилась в результатах поиска, когда я пытался выяснить, поддерживает ли какое-либо приложение общие репозитории миниатюр. К сожалению, кажется, что ни одно приложение не поддерживает их.