Gnome Nautilus i miniaturki (Cz. 3 z 3)

Dzisiaj będzie trochę heavy codingu :-) Najpierw pokażę efekt, który będziemy się starali osiągnąć.

Minia­turka usta­wiona w gconf-editor na 256 px (tutaj obrazki prze­ska­lo­wane do 300 px szerokości):

Miniaturka wygenerowana przez Nautilus

a teraz takie samo 256 wyge­ne­ro­wane skryp­tem (zwróć­cie uwagę na drzewa):

Miniaturka wygenerowana skryptem

Skoro wiemy już do czego dążymy, możemy zabie­rać się do rzeczy. Dla utrud­nie­nia, minia­tury obra­zów i PDFów będziemy gene­ro­wać za pomocą programu Image­Ma­gick (a zatem konieczne jest zain­sta­lo­wa­nie pakietu image­ma­gick: sudo apt-get install image­ma­gick). Podobno to wydaj­niej­szy generator.

Skrypt będziemy pisać w Bashu. Gdyby nie kurs w Drago­nia Maga­zine nic bym nie dał rady zrobić :-) Skrypt zdecy­do­wa­łem się doku­men­to­wać w języku angiel­skim z tego względu, iż o ile wiem, nikt do tej pory nie zabie­rał się za coś podob­nego. Dzięki temu może się przy­dać więk­szej licz­bie osób.

Od razu ostrze­gam. Skrypt wpraw­dzie działa, ale po jakimś czasie wyge­ne­ro­wane prze­zeń minia­turki Nauti­lus zamie­nia i tak na swoje. Nie wiem dlaczego tak się dzieje :-(

Poni­żej będę omawiał poszcze­gólne części pliku customthumbnailer.sh (progra­mik nazwa­łem Nauti­lus Custom Thumb­na­iler). Plik możemy podzie­lić na 3 części: infor­ma­cje wstępne o auto­rze i skryp­cie, spraw­dze­nie para­me­trów i plików, część główna.

1. Infor­ma­cje wstępne o auto­rze i skrypcie.

#!/bin/bash
#
# Nautilus Custom Thumbnailer
# script ver. 0.2
#
# Dawid "Spiechu" Spiechowicz
# spiechu(at)gmail.com
# http://spiechu.all.pl
#
# Usage: ./customthumbnailer.sh files_extension desired_size
#
# Supported extensions:
# - movie files: avi, mov, wmv
# - image files: jpg, png
# - PDF
#
# Tested thumbnail sizes:
# 160, 192, 256, 512
#
# Usage example:
# 1. copy script to directory which already contains standard thumbnails
# 2. run in terminal ./customthumbnailer.sh jpg 256
# 3. script will change all files in current directory with chosen file extension
# 4. open directory in Nautilus and watch the results :-)

2. Spraw­dze­nie para­me­trów i plików.

Spraw­dzamy czy podczas wywo­ła­nia wpro­wa­dzono 2 paramety.

# Checking if 2 parameters were entered
if [ $# -ne 2 ]; then
echo "No parameters! Enter files_extension and desired_size"
exit 1
fi

Następ­nie spraw­dzamy czy podano obsłu­gi­wane typy plików.

# Checking extension type
if [ $1 = "jpg" ] || [ $1 = "jpeg" ] || [ $1 = "png" ] || [ $1 = "pdf" ]; then
filetype="image"
extension=$1
elif [ $1 = "avi" ] || [ $1 = "mov" ] || [ $1 = "flv" ] || [ $1 = "wmv" ]; then
filetype="movie"
extension=$1
else
echo "wrong extension type, look at documentation in script"
exit 1
fi

Zanim wyge­ne­ru­jemy cokol­wiek, musimy spraw­dzić czy w kata­logu, w którym mamy plik customthumbnailer.sh znaj­dują się jakieś pliki z wybra­nym rozszerzeniem.

# Checking directory if it contains files with entered extension
file_count=$( ls *.$extension|wc -l )
if [ $file_count = 0 ]; then
echo "No files with "$extension" extension"
exit 1
else
echo "Found "$file_count" file(s) with "$extension" extension"
fi

3. Część główna.

Zmienna save­dir prze­cho­wuje ciąg ze ścieżką dostępu do kata­logu, w którym Nauti­lus trzyma miniaturki.

# Thumbnail save dir, standard directory in Gnome Nautilus
savedir=~/.thumbnails/normal/

Pętla for wyko­nu­jąca powtó­rze­nia dla każdego pliku zada­nego typu.

# Iterating all files with entered extension
for file_to_thumb in *.$extension; do

Zmienna filename_with_path prze­cho­wu­jąca tzw. abso­lutne URI do pliku.

# Creating full path to file
filename_with_path="file://"$( pwd )"/"$file_to_thumb

Próba zamiany każdej spacji w nazwie pliku na znak %20 (tylko wtedy suma kontro­lna jest liczona prawi­dłowo i Nauti­lus daje się „nabrać”). Niestety działa tylko wtedy, gdy odstęp wynosi 1 spację. Tutaj przy­da­łaby się pomoc osoby z więk­szym „stażem” w Bashu.

# Replacing every space with %20 (work with single space gap only :-( help needed here)
truncated=$( echo $filename_with_path | awk '{gsub(" ","%20")}; 1' )

Licze­nie sumy kontro­l­nej md5 z abso­lut­nego URI

# Creating md5 file hash from full path
md5hash=$( echo -n $truncated | md5sum | cut -f1 -d ' ' )

Zmienna md5hash_with_savedir zawie­ra­jąca ciąg ze ścieżką dostępu do ~/.thumbnails/normal + nazwę pliku + png.

# Merging md5 with savedir, adding png extension to name
md5hash_with_savedir=$savedir""$md5hash".png"

Jeżeli wybra­nym typem plików jest obraz to użyj Image­Ma­gick. [0] jest potrzebne po to aby PDFy były tworzone z pierw­szej strony.

if [ $filetype = "image" ]; then
echo "Creating thumbnail for $file_to_thumb"
# Using ImageMagick convert to deal with image and PDF files
thumbnail=$( convert -resize $2 "$filename_with_path[0]" $md5hash_with_savedir )

Jeżeli typem plików są filmy to użyj stan­dar­do­wego gnome-video-thumbnailer

elif [ $filetype = "movie" ]; then
echo "Creating thumbnail for $file_to_thumb"
# Using gnome-video-thumbnailer to deal with various movie files
thumbnail=$( gnome-video-thumbnailer -s $2 "$filename_with_path" $md5hash_with_savedir )

Zakoń­cze­nie pętli.

else
# Small possibility to end up here, but who knows ;-)
echo "Something just went wrong :-("
fi
done

Skrypt jest na tyle prosty, że nie ma potrzeby robie­nia jakiś proce­dur, prze­łącz­ni­ków itd. Jeżeli coś idzie nie tak, to wyświe­tlany jest komu­ni­kat błędu, a exit 1 powo­duje natych­mia­stowe zakoń­cze­nie dzia­ła­nia skryptu.

Na pewno znala­złoby się parę rzeczy do dodania/poprawienia, np. wyła­py­wa­nie czy ktoś podał liczbę w drugim para­me­trze albo dzia­ła­nie nieza­leż­nie od wiel­ko­ści liter rozsze­rze­nia (Jpg, JPG, jpG itd.) Nie mam ochoty nara­zie z tym się aż tak bawić. Ważne, że działa :-)

Zapra­szam do testów (zobacz­cie sobie jak wyglą­dają „minia­tury” 512 pikse­lowe :-P Tutaj macie link do pliku w całości.

Linki do pozo­sta­łych części cyklu: Część 1, część 2.

Podobne wpisy:

  1. Gnome Nauti­lus i minia­turki (Cz. 1 z 3)
  2. Gnome Nauti­lus i minia­turki (Cz. 2 z 3)
  3. Minia­turki plików wideo w GNOME
  4. Mój plasmo­idowy pulpit na KDE4

5 Comments

  • Pingback: Gnome Nautilus i miniaturki (Cz. 2 z 3) at /home/Śpiechu->Blog

  • Pingback: Gnome Nautilus i miniaturki (Cz. 1 z 3) at /home/Śpiechu->Blog

  • 14 kwietnia 2008 - 05:01 | Permalink

    Śpie­chu zaska­ku­jesz mnie.. PRO :) Prze­siądź się na Debiana :) Przy­nie­siesz ludkom trochę korzyści ;)

  • 17 lutego 2009 - 00:40 | Permalink

    Trochę się wspar­łem twoim skryp­tem i zrobi­łem to

    http://wklej.org/id/53686/

    idzie przez mplay­era ;). Wystar­czy w gconf edyto­rze zmie­niać program tworzący podglądy na ten :D

  • 18 września 2009 - 11:48 | Permalink

    zamiana spacji na %20:
    sed ‚s/ /%20/g’

  • Dodaj komentarz

    Twój adres e-mail nie zostanie opublikowany.

    Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong>