Tag Archives: gnome

linux

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.

linux

Gnome Nautilus i miniaturki (Cz. 1 z 3)

Ostat­nimi czasy trochę siedzia­łem nad rozpra­co­wy­wa­niem w jaki sposób Nauti­lus tworzy minia­turki różnych rodza­jów plików. Zatem z przy­jem­no­ścią podzielę się z Wami swoimi obser­wa­cjami. Wpraw­dzie kiedyś już pisa­łem co nieco o minia­tur­kach, ale trochę pod innym kątem (głów­nie dlaczego nie są gene­ro­wane). Dzisiaj będzie część 1 z 3 częścio­wego cyklu. Prawdę mówiąc, to nie wiem ile tych części osta­tecz­nie będzie :-)

Może zacznę od zrzutu ekranu kilku przy­kła­do­wych miniaturek.

Minia­turki (thumb­na­ils) domyśl­nie tworzone są za pomocą dwóch programów:

Evince Thumn­ba­iler — moduł prze­glą­darki doku­men­tów Evince, gene­ruje minia­turki wszel­kich plików graficz­nych począw­szy od jpg, przez png aż do PDF (pierw­szą stronę).

Totem Video Thumb­na­iler (nazy­wany również Gnome Video Thumb­na­iler) — odpo­wiada za minia­turki plików filmo­wych. Dodat­kowo dodaje „od siebie” na bocz­nych krawę­dziach obrazka otwory imitu­jące taśmę filmową. Co do miej­sca, z którego pobie­rana jest klatka filmu, to jest to bardzo dziwna sprawa. Z moich obser­wa­cji wynika, że jest to około 1/3 czasu trwa­nia filmu. Czasem zdarza się, że pobrana jest pierw­sza klatka (jest to bug, nie feature :-P ). W więk­szo­ści przy­pad­ków pierw­sza klatka filmu jest czarna, więc taką też otrzy­mu­jemy brzydką minia­turkę. Jeżeli Totem nie potrafi otwo­rzyć jakie­goś pliku, to oczy­wi­ście nie będzie w stanie wyge­ne­ro­wać miniaturki.

Teraz kilka słów na temat samych plików. Wszyst­kie minia­turki zapi­sy­wane są jako pliki graficzne png o wymia­rze więk­szego boku 128 pikseli. Przy­naj­mniej w teorii, bo aby utrzy­mać propor­cje wymia­rów (aspect ratio), pliki często mają nieco inne wymiary. Wszyst­kie pliki minia­tu­rek prze­cho­wy­wane są w ukry­tym kata­logu (kropka przed nazwą) /home/nazwa/.thumbnails/normal. Jeżeli z jakiś powo­dów nie uda się wyge­ne­ro­wać Nauti­lu­sowi minia­tu­rek, to tworzy plik png o rozmia­rach 1×1 px i wrzuca go do /home/nazwa./thumbnails/fail/gnome-thumbnail-factory.

Chcąc wymu­sić gene­ro­wa­nie minia­tu­rek na nowo, po prostu kasu­jemy pliki z normal bądź fail. Jeżeli skasu­jemy plik, dla którego istnieje minia­turka, to jest ona auto­ma­tycz­nie usuwana. Niestety czasami zdarzają się „sierotki” zajmu­jące nam tylko miej­sce na dysku. Dlatego najle­piej od czasu do czasu wyrzu­cić wszystko z poda­nych powy­żej katalogów.

Zapewne zain­te­re­sują Was dziwne nazwy plików w ./thumbnails, np. 5f740c7c7935b911e744104f8922d96f.png. Odpo­wiedź na to pyta­nie znala­złem na stro­nie ze specy­fi­ka­cjami (dostęp tylko przez Web Archive). Nazwę tworzy 32 znakowa, 128 bitowa suma kontro­lna MD5URI do pliku. Wytłu­ma­czę jaśniej: jeżeli np. plik blogasek.jpg znaj­duje się w kata­logu /home/spiechu/, to URI do niego jest file:///home/spiechu/blogasek.jpg. Następ­nie liczona jest suma kontro­lna z tego URI (a nie z pliku!) Dzięki temu Nauti­lus licząc MD5URI do plików i porów­nu­jąc je z tymi z kata­logu ./thumbnails wie, które pliki posia­dają minia­turki i wyświe­tla je. Niedo­róbką tego wszyst­kiego jest to, że prze­no­sząc bądź kopiu­jąc jakiś plik, Nauti­lus zamiast zmie­niać nazwy minia­tur­kom, tworzy od początku nowe (co w przy­padku plików filmo­wych zajmuje dosyć sporo czasu).

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