노틸러스에 미리보기 이미지를 미리 생성하도록 지시하려면 어떻게해야합니까?


33

빠르게 탐색 할 수있는 많은 PDF 문서 라이브러리 (서류, 강의, 유인물)가 있습니다. 이를 위해 미리보기 이미지가 필요합니다.

그러나 동시에 ~/.thumbnails폴더가 실제로 필요하지 않은 엄지 손가락으로 쌓여 있음을 알았습니다. 중요한 엄지 손가락을 제거하지 않고 섬네일 정크를 삭제하는 것은 불가능합니다. 그것들을 삭제하려면 중요한 PDF 문서가있는 각 폴더로 이동하여 축소판 캐시를 재생성해야합니다.

이 프로세스를 자동화 할 수 있기를 바랍니다. 주어진 디렉토리 세트에 대해 썸네일을 미리 캐시하도록 노틸러스에 지시 할 수있는 방법이 있습니까?

참고 : 사진 및 비디오에는이 작업을 수행하는 것처럼 보이는 bash 스크립트 세트가 있지만 다른 문서에는 없습니다. 스크립팅에 대해 더 많은 경험이있는 사람은 PDF 문서에 대해 이러한 내용을 조정할 수 있거나 PDF 문서로 작업하기 위해 수정해야 할 사항에 대해 올바른 방향으로 안내 할 수 있습니다.


편집 :

이 질문에 대한 답변은 상당히 압도적입니다. 우선이 문제를 해결하는 데 참여한 모든 사람에게 감사드립니다. 질문, 답변 및 그에 대한 모든 토론은 많은 당사자의 협력 노력이 어떻게 최적의 솔루션으로 이어질 수 있는지에 대한 훌륭한 예입니다. 이것이 바로 리눅스와 오픈 소스를 그렇게 훌륭하게 만드는 이유입니다.

제공된 모든 답변은 원래이 질문에 대해 바운티 바운티를받을 가치가 있습니다. 그럼에도 불구하고 보상 할 현상금은 하나뿐입니다. 나는 미래의 모든 독자들에게 가장 효율적인 방법으로 문제를 해결하는 답변을 선택해야합니다. 어떤 솔루션인지 확인하기 위해 호환성, 속도 및 출력 품질의 세 가지 스크립트를 비교하여 최종 테스트 실행을 수행했습니다. 결과는 다음과 같습니다.


rosch의 Thumbnailer 1

호환성 : ✔ 파일 이름의 공백; ✔ 디렉토리 이름의 공백; ✘ 프리 데스크톱 준수

속도 : 12,6 초 안에 95 개의 PDF

품질 : 재고 노틸러스 품질

추가 특전 : 1.) 기존 엄지 손가락이있는 파일을 자동으로 건너 뜁니다. 2.) 추가 패키지가 필요하지 않습니다

Martin Orda의 Thumbnailer 2

호환성 : ✔ 파일 이름의 공백; ✔ 디렉토리 이름의 공백; ✘ 프리 데스크톱 준수

속도 : 70,0 초 안에 95 개의 PDF

품질 : 스톡 이미지보다 훨씬 나은 스케일링.

추가 특전 : 1.) 기존 엄지 손가락이있는 파일을 자동으로 건너 뜁니다. 2.) PDF 이외의 다양한 이미지 형식과 호환됩니다. 3) 플랫폼 독립적, 그놈 구성 요소에 의존하지

James Henstridge의 Thumbnailer 3

호환성 : ✔ 파일 이름의 공백; ✔ 디렉토리 이름의 공백; ✔ Freedesktop 호환

속도 : 10,8 초 안에 95 개의 PDF

품질 : 재고 노틸러스 품질

추가 특전 : 1.) 기존 엄지 손가락이있는 파일을 자동으로 건너 뜁니다. 2.) 사전 설치된 썸네일 러로 식별되는 모든 파일 형식과 호환


세 가지 스크립트 모두 훌륭합니다. 각각 고유 한 장단점이 있습니다. Rosch의 솔루션은 기본적으로 작동하며 최소한의 설치로 사용자에게 적합한 선택 일 수 있습니다.

Martin Orda는 다양한 파일 형식으로 작동하며 DE에 독립적 인 매우 다양한 스크립트를 작성했습니다. 썸네일 품질은 뛰어나지 만 속도를 희생합니다.

결국 내 유스 케이스에 가장 적합한 것은 James 솔루션이었습니다. 빠르고 다재다능하며 기존 썸네일이있는 파일을 건너 뛸 수있는 옵션을 제공합니다.


총 우승자 : James Henstridge


추가 정보 : 세 스크립트는 모두 노틸러스 스크립트 와 완벽하게 호환됩니다 . 이 튜토리얼에 따라 쉽게 설치할 수 있습니다 .


편집 2 : rosch의 개선 된 스크립트로 리뷰를 업데이트했습니다.


많은 작은 파일이 항상 잘못 종료되기 때문입니다. ~ / .thumbnails 폴더의 크기를 알고 있습니까?
Antoine Rodriguez

지금 크기가 되었습니까? ~ 1 개월 사용 후 약 85MB
Glutanimate

그리고 라이브러리에 얼마나 많은 파일이 있습니까? (기술적 인 이유로 / 제한적입니다)
Antoine Rodriguez

아 잠깐, 나는 잘못 계산했다; 일부 데이터 파일이 포함되어 있습니다. 약 2000
년만 기록

그냥 당신을 업데이트 : 나는 당신을위한 솔루션이 있습니다. 너무 오래 걸리므로 며칠이 걸릴 수 있습니다. 감사합니다;)
앙투안 로드리게스

답변:


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노틸러스와 같은 응용 프로그램에서 찾을 수있는 곳에 저장됩니다 .


1
이 스크립트를 작성하는 데 시간을내어 주셔서 감사합니다. 단일 파일에 대해 알려진 것처럼 작동합니다. 게시 된 솔루션 중에서 시스템에서 출력을 인식하는 유일한 솔루션입니다 (올바른 파일 이름 48eebea785a185cdfc9d8f1a2ed34400.png이 사용됨). 그러나 현재 디렉토리를 지원하지 않는 것 같습니다. 디렉토리를 재귀 적으로 살펴볼 수있는 방법이 있습니까?
Glutanimate

끝난. 또한 출력도 약간 단순화했습니다.
James Henstridge

당신의 스크립트는 절대적으로 훌륭하게 작동합니다. 바로 내가 찾던 것이므로 현상금을 수여했습니다. 최종 테스트 실행 중에 오류 메시지 가 발생 했지만 축소판 생성을 방해하지 않는 것 같습니다. 오류는 일부 파일 이름에 German Umlauts ( "ä, ü, ö")가 포함되어 있다는 사실과 관련이있을 수 있습니다. 이 우수한 솔루션을 제공해 주셔서 다시 한 번 감사드립니다. 이제부터는 내 인생이 훨씬 쉬워 질 것입니다.
Glutanimate

1
이러한 오류는 축소판 중 하나가 사용하는 XML 파서에서 발생하므로 이름이 아닌 일부 파일의 내용과 관련이 있습니다. 위의 썸네일 스크립트는 디렉토리의 모든 파일을 처리하므로 문제가있는 PDF가 아닐 수 있습니다.
James Henstridge

일반 텍스트 파일의 축소판을 만들 수 없습니다. 이 작업을 수행하기 위해 구성해야 할 것이 있습니까?
krasnaya

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

제한 사항 :

  • James Henstridge가 지적한 Thumb :: URI 및 Thumb :: MTime 속성을 축소판에 추가하지 않습니다. 지금까지 나는 기본값 evince-thumbnailer이 그렇게하고 있다는 증거를 보지 못했습니다 . 즉, 노틸러스가 축소판을 재생성하지 않는 한 스크립트를 작업에 사용할 수 있습니다.

참고 사항 :

  • 새 썸네일을 생성 할 때 파일 이름을 인쇄하고, 존재하는 경우 생성을 건너 뜁니다.
  • 속도 : 37 개 PDF 파일은 모두 테스트 evince-thumbnailer하고 convert(ImageMagick과에서)에 대한 삼초 evince-thumbnailer와 대한 14초 convert.
  • 노틸러스가 인식하는 썸네일 생성
  • perl URL : file 모듈이 처리하는 경로 이름 (공백 및 기타 문자는 파일 URI로 올바르게 변환 됨)
  • perl기본 설치에 존재하는 필요
  • 처리되지 않은 파일 evince-thumbnailer은 단순히 오류를 출력합니다.2>/dev/null
  • /usr/share/thumbnailers/evince.thumbnailer처리 된 파일 형식 목록을 보려면 MimeType 줄 을 확인하십시오.
  • 업데이트 : 12.04부터 썸네일 폴더는 ~/.cache/thumbnails입니다.
    를 사용하는보다 강력한 경로 readlink.

영감 :
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=683394


우선 답변과 노력에 감사드립니다. 몇 가지 테스트 실행을 수행했으며 결과는 다음과 같습니다. 1.) 축소판 생성은 이름에 공백이있는 디렉토리에서는 작동하지 않습니다. 2.) 스크립트와 @Martin Orda로 만든 축소판은 시스템에서 인식되지 않습니다. 스크립트로 처리 된 파일은 썸네일이없는 것처럼 처리됩니다-> 결과 : 썸네일 디렉토리에 중복 된 썸네일
Glutanimate

흠, 내 테스트는 지금까지 긍정적이었습니다. 노틸러스는 썸네일을 인식하고 재생산하지 않았습니다. 어쨌든 폴더 이름의 공백은 나쁜 습관입니다 ..하지만 스크립트를 수정합니다. 미리보기 이미지가 중복됩니까? give 파일에 대한 새 tumbnail의 이름은 무엇입니까?
rosch

좋아, 다시 시도하고 그것이 지난 번과 같은 결과가 될까봐 두려워합니다. 스크립트가 생성 한 썸네일의 파일 이름은 다음과 같습니다 2a43dc2774e3dfe45a4337e0304e5b0a.png.. 이것이 동일한 썸네일의 이름이 nautilus : 48eebea785a185cdfc9d8f1a2ed34400.png입니다. 또한 스크립트로 생성 된 엄지 손가락은 128x171px이며 내장 썸네일 러는 96x128px 썸네일 만 생성합니다.
Glutanimate


evince-thumbnailerPNG 태그를 추가하지 않는 것에 대한 귀하의 의견 은 맞습니다. 외부 섬네일 러를 호출하는 코드는 실제로 태그를 포함하도록 이미지를 다시 작성합니다. strings -a노틸러스에서 생성 한 썸네일 중 하나를 실행 하여 이를 확인할 수 있어야합니다 .
James Henstridge

10

잠시 산만 해졌고 rosch가 나를 이겼습니다. 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

네 말이 맞아-나는 이것을 다시 확인하고 노틸러스가 다시 생성한다는 것을 알았습니다 (어제 밤에 테스트했을 때 그렇지 않았지만 이미 잘못되었을 수 있습니다. 작성했을 때 실제로 더 빠르면 (아직 다른 방법을 사용하지 않은 경우) 몇 시간 안에 작업 할 것입니다. 내가 찾은 유일한 문제는 스크립트에서 생성 한 파일과 노틸러스가 <thumbnail>을 식별 할 때 "PNG 97x128 97x128 + 0 + 0 8 비트 DirectClass 20.4KB 0.000u 0 : 00.000"과 동일한 속성을 나타냅니다.
Marcin Kaminski

아니, 우리 둘 다 틀렸다 :) 썸네일의 파일 이름이 'file : //'+ absolute_path의 md5 해시이며 실수로 스크립트를 ./mkthumb.sh -s Downloads / pdf / test 대신 실행했다는 것을 잊었습니다. /mkthumb.sh -s / home / user / Downloads / pdf / test. 다시 시도하십시오.
Marcin Kaminski

좋아, 나는 또 다른 테스트를 수행했으며 특이한 점은 두 스크립트 rosch 모두 같은 문제가있는 것 같습니다. 스크립트가 2a43dc2774e3dfe45a4337e0304e5b0a.png있는 파일 이름은 노틸러스가로 이름을 지정하는 동안 48eebea785a185cdfc9d8f1a2ed34400.png입니다. 그러나 치수는 스크립트에 따라 다릅니다. 비교는 다음과 같습니다
Glutanimate

귀하의 스크립트가 여전히 여기에 게시 된 것 중 가장 빠르다는 것을 추가하고 싶습니다. imagemagick또한 스케일링을보다 훨씬 잘 처리하는 것으로 보입니다 evince-thumbnailer(참조는 위의 비교 참조).
Glutanimate

1

썸네일 사양에는 공유 썸네일 리포지토리가 포함되어있어 모든 사용자가 자신의 썸네일을 생성하지 않고 미리 생성 된 썸네일을 관련 파일과 함께 배포 할 수 있습니다. 따라서 이론적으로 썸네일을 생성 한 다음 공유 리포지토리에 추가 할 수 있으므로 썸네일 디렉토리를 지우거나 다른 시스템이나 다른 시스템으로 옮길 경우 나중에 생성 할 필요가 없습니다.

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

이 응용 프로그램은 공유 축소판 저장소를 지원하는 응용 프로그램이 있는지 확인하려고 할 때 검색 결과에 우분투 요청 페이지가 나타납니다. 슬프게도 응용 프로그램이 지원하지 않는 것으로 보입니다.


1

멀티 프로세싱과 재귀 적으로 썸네일 생성 옵션을 포함하도록 James의 스크립트를 수정 한 패키지를 작성했습니다. 패키지는 pip-installable입니다. 설치 지침은 여기 를 확인 하십시오 .

사용 예는 다음과 같습니다.

thumbgen -w 4 -r -d your_directory
  • -r: 재귀 적으로 썸네일 생성

  • -w: 사용할 코어 수

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.