Як я можу доручити Nautilus попередньо генерувати ескізи?


33

У мене є велика бібліотека документів PDF (документи, лекції, роздатковий матеріал), до яких я хочу швидко переходити. Для цього мені потрібні ескізи.

Однак в той же час я бачу, що ~/.thumbnailsпапка накопичується великими пальцями, які мені дуже не потрібні. Видалити непотрібні ескізи без видалення важливих великих пальців неможливо. Якби я їх видалив, я повинен був би перейти до кожної папки з важливими документами PDF і дозволити відновленню кешу мініатюр.

Я хотів би мати можливість автоматизувати цей процес. Чи я можу сказати nautilus попередньо кешувати великі пальці для набору заданих каталогів?

Примітка . Я знайшов набір скриптів bash, які, як видається, роблять це для зображень та відео, але не для будь-яких інших документів. Можливо, хтось із досвідчених сценаріїв, можливо, зможе налаштувати їх для документів PDF або принаймні вказати мені в правильному напрямку на те, що я мав би змінити для роботи з документами PDF.


Редагувати :

Відповідь на це запитання була досить приголомшливою. Дозвольте спочатку подякувати всім, хто брав участь у вирішенні цього. Питання, його відповіді та вся дискусія навколо нього - чудовий приклад того, як зусилля багатьох сторін можуть привести до оптимального рішення. Саме це робить Linux та Open Source настільки великими.

Усі надані відповіді заслуговували б на користь, яку я спочатку висунув за це питання. Тим не менш, є лише одна винагорода для нагородження. Я зобов’язаний усім майбутнім читачам обрати відповідь, яка вирішує проблему найефективнішим чином. Щоб визначити, яке рішення це, я зробив остаточний тестовий пробіг, порівнявши три сценарії по сумісності, швидкості та якості виводу. Ось результати:


Ескіз 1 , автор:

Сумісність : ✔ пробіли у назві файлу; ✔ пробіли в імені каталогу; Сумісність freeesktop

Швидкість : 95 PDF-файлів за 12,6 сек

Якість : якість запасу nautilus

Додаткові перки : 1.) автоматично пропускає файли з попередніми пальцями; 2.) Не потрібні додаткові пакети

Ескіз 2 , автор Мартін Орда:

Сумісність : ✔ пробіли у назві файлу; ✔ пробіли в імені каталогу; Сумісність freeesktop

Швидкість : 95 PDF-файлів за 70,0 сек

Якість : значно краще масштабування, ніж фотографії.

Додаткові перки : 1.) автоматично пропускає файли з наявними великими пальцями 2.) сумісні з широким спектром форматів зображень, крім PDF 3.) незалежно від платформи, не покладається на GNOME-компоненти

Ескіз 3 , автор Джеймса Генстриджа:

Сумісність : ✔ пробіли у назві файлу; ✔ пробіли в імені каталогу; Сумісність freeesktop

Швидкість : 95 PDF-файлів за 10,8 сек

Якість : якість запасу nautilus

Додаткові перки : 1.) автоматично пропускає файли з попередньо встановленими пальцями 2.) сумісні з усіма форматами файлів, які ідентифіковані заздалегідь встановленими ескізами


Усі три сценарії відмінні. Кожен має свій виразний набір переваг і недоліків. Рішення Rosch працює нестандартно і може бути правильним вибором для користувачів з мінімальною установкою.

Мартін Орда створив дуже універсальний сценарій, який працює з різними форматами файлів і не залежить від DE. Він відрізняється високою якістю ескізів, але робить це за рахунок швидкості.

Зрештою, саме Джеймс вирішив найкраще відповідати моєму використанню. Це швидко, універсально і пропонує варіанти пропускати файли з попередніми мініатюрами.


Загальний переможець: Джеймс Генстридж


Додаткова інформація : Усі три сценарії повністю сумісні з Natilus-скриптами . Ви можете легко встановити їх, виконуючи цей посібник .


Редагувати 2 : Оновлений огляд із покращеним сценарієм від rosch.


Тому що багато маленьких файлів завжди погано закінчуються. Чи знаєте ви розмір папки ~ / .thumbnails?
Антуан Родрігес

Ви маєте на увазі розмір, який він зараз є? приблизно 85 Мб після ~ 1 місяця використання.
Glutanimate

А скільки файлів у вашій бібліотеці? (це з технічних причин / обмежень)
Антуан Родрігес

ах зачекайте, я прорахувався; це включає деякі файли даних. Документи лише близько 2000 р.
Глютанімат

Просто для оновлення: у мене є рішення для вас. Довго редагувати, тому дозвольте мені пару днів. З повагою;)
Антуан Родрігес

Відповіді:


35

Підручні програми Nautilus для мініатюр фактично надходять з 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

Зроблено. Я також трохи спростив вихід.
Джеймс Генстрідж

Ваш сценарій працює абсолютно чудово. Це саме те, що я шукав, тому я нагородив вас щедротою. Під час останнього тестового запуску я зіткнувся з деякими повідомленнями про помилки , але, схоже, вони не перешкоджали створенню мініатюр. Помилки можуть бути пов’язані з тим, що деякі імена файлів включали німецькі Umlauts ("ä, ü, ö"). Ще раз дякую, що ви забезпечили це чудове рішення. Це полегшить моє життя відтепер.
Глютанімат

1
Ці помилки походять від аналізатора XML, який використовується одним із ескізів, тому вони будуть пов'язані зі змістом якогось файлу, а не з його ім'ям. Наведений вище сценарій ескізів обробляє всі файли в каталозі, тому це може бути не PDF-файл, з яким виникають проблеми.
Джеймс Генстрідж

Я не в змозі створити ескізи для простих текстових файлів. Чи потрібно щось настроїти, щоб зробити цю роботу?
красна

18

Сценарій нижче повинен зробити цю роботу. Він використовує, evince-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.
  • створює мініатюри, розпізнані nautilus
  • назви шляхів, які обробляються 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


Перш за все дякую за вашу відповідь та зусилля, які ви доклали до неї. Я зробив кілька тестових прогонів, і ось мої результати: 1.) генерація мініатюр не працює для каталогів з пробілами в їх назвах; 2.) ескізи, створені як із вашим сценарієм, так і з @Martin Orda, системою не розпізнаються; Файли, оброблені вашим сценарієм, обробляються так, ніби немає ескізів -> результат: копіювати великі пальці в каталозі мініатюр
Glutanimate

Гм, добре, що мої тести на сьогодні були позитивними: nautilus розпізнав ескізи і не відновив їх. Фу, пробіли у назвах папок - це те, що я вважаю поганою практикою. Але я зміню сценарій. Дублюючі ескізи? Як називається новий мініатюра файлу give?
rosch

Гаразд, спробував це ще раз, і я боюся, що це такий же результат, як і минулого разу. Ось ім'я файлу ескізу вашого сценарію генерується: 2a43dc2774e3dfe45a4337e0304e5b0a.png. Це як же зменшене названий Наутілус: 48eebea785a185cdfc9d8f1a2ed34400.png. Я також помітив, що великі пальці, створені за вашим сценарієм, мають розмір 128x171px, тоді як вбудований мініатюр створює лише ескізи 96x128px.
Glutanimate


Щодо Вашого коментаря щодо evince-thumbnailerне додавання тегів PNG, це правильно: код, який викликає зовнішні ескізи, насправді переписує зображення, щоб включити теги. Ви можете переконатись у цьому, натиснувши strings -aодну з ескізів, створених Наутілусом.
Джеймс Генстридж

10

Я на деякий час відволіклась, і рош бив мене до цього :) Не знав, що існує ескіз-ескіз (я не користувач 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", коли я використовую ідентифікатор <мініатюру>.
Марцін Камінський

Ні, ми обидва помилялися :) Виявляється, я забув, що ім'я файлу мініатюри - хеш md5 'file: //' + absolut_path і помилково запустив мій сценарій як ./mkthumb.sh -s Завантаження / pdf / test замість. /mkthumb.sh -s / home / user / Завантаження / pdf / test. Спробуйте дати йому ще раз.
Marcin Kaminski

Гаразд, я зробив ще один тестовий пробіг, і особливістю є те, що, здається, у обох ваших скриптів rosch однакова проблема: ім'я файлу з вашим сценарієм, 2a43dc2774e3dfe45a4337e0304e5b0a.pngа nautilus називає його як 48eebea785a185cdfc9d8f1a2ed34400.png. Однак розміри є правильними для вашого сценарію. Ось порівняння
Glutanimate

Я хотів би додати, що ваш сценарій як і раніше є найшвидшим із розміщених тут. imagemagickтакож здається, що впоратися зі масштабуванням набагато краще, ніж evince-thumbnailer(див. порівняння вище для посилання).
Глютанімат

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: кількість ядер для використання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.