#!/bin/bash

# sh-a-gal (shell picture gallery maker)
# 
# wersja nie do rozpowszechniania
# najnowsza wersja bedzie dostepna na stronie http://odya.net/proj/shagal/
#
# TODO:
# - dodac wszedzie sprawdzanie bledow
# - dodac obsluge podkatalogow
# + dodac wybieranie lokalizacji pliku CSS (wzgledna i bezwzgledna)
# - dopracowac wykorzystanie wielowatkowosci
# - dodac sprawdzenie czy przy zmianie nazw nie ma duplikatow/cos sie nie nadpisuje
# - dorobic obsluge plikow video
# - dorobic tryb interaktywny (pytanie o rozdzielczosci, tworzenie miniatur itp.)
# - dorobic polska/angielska wersje plus polskie znaki na wygenerowanych stronach www
#
# BUGS:
# - srednio toleruje spacje w nazwach plikow, zazwyczaj sobie radzi ale poki co nie ma pewnosci
# - gubi sie jak nie ma pliku $cam_logo niezaleznie od tego czy przetwarza filmy czy nie
#


fname="index.html"
opisfile="opis.txt"
res="800x600"        # WIDTHxHEIGHT
resthumb="200x150"   # WIDTHxHEIGHT
cssurl="http://odya.net/ico/album.css" # full URL, absolute or relative, i.e. http://some/place.css, /some/place.css or some/place.css
time1=`date +%s`
cpus=`grep processor /proc/cpuinfo | wc -l`
#naglowek=`echo -e "<html><body><head>\n<style type=\"text/css\">\nIMG { font-style: normal; text-decoration: none; color: #000000; font-weight: bold; margin: 3px;}\n</style>\n</head>"`
nagloweklista=`echo -e "<html><head>\n<link rel=stylesheet href=\"$cssurl\">\n</head><body id=\"poczatek\">"`
naglowekpikczer=`echo -e "<html><head>\n<link rel=stylesheet href=\"$cssurl\">\n</head><body id=\"poczatek\">"`


echo $cssurl | grep -q ^/ || echo $cssurl | grep -q "tp://" || naglowekpikczer=`echo -e "<html><head>\n<link rel=stylesheet href=\"../$cssurl\">\n</head><body id=\"poczatek\">"`

data=`date +"%Y/%m/%d %T"`
resx=`echo $res|awk -Fx '{print $1}'`
resy=`echo $res|awk -Fx '{print $2}'`
resthumbx=`echo $resthumb|awk -Fx '{print $1}'`
resthumby=`echo $resthumb|awk -Fx '{print $2}'`

info_o_archiwum=1    # dodaje informacje i link o archiwum ze wszystkimi plikami
tworz_archiwum=0     # tworzy archiwum ze wszystkimi zdjeciami
tworz_miniatury=1    # tworzy miniatury (w katalogu /thumbs)
cam_logo="cam.png"   # nazwa pliku z miniatura pokazywana na filmach
tworz_pomniejszone=1 # tworzy pomniejszone zdjecia (w katalogu /medium)
kumaj_filmy=1        # obsluga filmow (pokazuja sie na liscie)
kumaj_opis=1         # obsluga plikow z opisami galerii
clear
# -------------------------- lepiej nie zmieniaj nic pod ta linia -----------

netver=`wget -O- -q http://odya.net/proj/shagal/VERSION`
prodname="shagal"
prodver="0.2"
prod="$prodname $prodver"
produrl="http://odya.net/proj/shagal/"

echo "INFO: $prod"
[[ `echo $netver|awk -F: '{print $1}'|tr -d \.` -gt `echo $prodver|tr -d \.` ]] && echo "INFO: Dostepna jest nowsza wersja skryptu. Mozesz ja pobrac, ze strony $produrl" || echo "INFO: Posiadasz najnowsza wersje skryptu."

which jhead 1> /dev/null \
  && jhead=`which jhead` 1> /dev/null \
  || { echo "ERR: Nie znaleziono programu JHEAD wykorzystywanego do pozyskiwania danych EXIF. Mozna go pobrac ze strony http://www.sentex.net/~mwandel/jhead/"; exit 1; }
[ -d thumbs ] || mkdir thumbs
[ -d medium ] || mkdir medium

rename .JPG .jpg *.JPG &> /dev/null || rename 's/JPG/jpg/' *.JPG &> /dev/null 
rename .JPG .jpg *.JPG &> /dev/null || rename 's/JPG/jpg/' *.JPG &> /dev/null 
#rename .JPEG .jpg *.JPEG &> /dev/null || rename 's/JPEG/jpg/' *.JPEG &> /dev/null 
#rename .jpeg .jpg *.jpeg &> /dev/null || rename 's/jpeg/jpg/' *.jpeg &> /dev/null 

echo $nagloweklista > $fname

[ $kumaj_filmy -ne 0 ] && { rename .AVI .avi *.AVI &> /dev/null || rename 's/AVI/avi/' *.AVI &> /dev/null; \
}

echo -n "INFO: Wykryto procesorow: $cpus"; [ $cpus -gt 1 ] || echo " (przetwarzanie bez pracy w tle)" && echo " (przetwarzanie z praca w tle)"
[ $info_o_archiwum -ne 0 ] && echo "OPCJE: Z informacja (linkiem) o archiwum" || echo "OPCJE: Bez informacji (linku) o archiwum" 
[ $tworz_archiwum  -ne 0 ] && echo "OPCJE: Tworzenie archiwum" || echo "OPCJE: Archiwum nie zostanie utworzone" 
[ $tworz_miniatury -ne 0 ] && echo "OPCJE: Tworzenie miniatur" || echo "OPCJE: Miniatury nie zostana utworzone" 
[ $tworz_pomniejszone -ne 0 ] && echo "OPCJE: Tworzenie pomniejszonych zdjec" || echo "OPCJE: Zdjecia pomniejszone nie zostana utworzone" 

# ------------------------------------------------------

pwd=`pwd`; nazwatar="`basename $pwd`.tar";

echo "-----------------------------------------------------------------------"


cnt=0;
for a in `find . -maxdepth 1 -name "*.jpg" -o -name "*.avi" -type f|sort` ; do pliki[$cnt]=$a; cnt=$(($cnt+1)); done

echo "<a href=\"..\"><img src=\"/icons/back.png\" border=0></a>" >> $fname
echo -e "<font size=\"+2\">| Liczba zdjec w tym albumie: ${#pliki[@]}, laczna objetosc `du -hc *.jpg | tail -n 1 | awk '{print $1}'`B</font>" >> $fname
# TODO: dorobic laczna objetosc pic+avi

[[ $info_o_archiwum -eq 1 ]] && { echo -e "<a href="$nazwatar">pobierz wszystkie jako archiwum</a>" >> $fname ; }


echo -e "<hr size=1 noshade>"  >> $fname

[ $kumaj_opis -ne 0 ] && [ -s $opisfile ] && { echo "<p>">>$fname; cat $opisfile >> $fname; echo "</p>">>$fname; }

echo "<div class=\"kontener\">" >> $fname

cnt=0;

while [ $cnt -lt ${#pliki[@]} ] ; do
 nazwa=`echo ${pliki[$cnt]}|cut -c 3-`
 
 echo Przetwarzam plik $(($cnt+1)) z ${#pliki[@]}: $nazwa
 
# dla zdjec:
echo $nazwa|grep jpg$ && {
[[ $tworz_miniatury -eq 1 ]] && { echo -ne "\tTworze miniature - thumbnail (res $resthumb)... ";
				  [[ $cpus -gt 1 ]] && ( echo "(w tle)"; convert "$nazwa" -resize $resthumb -size $resthumb xc:black +swap -gravity center -composite -quality 80% "thumbs/$nazwa" & ) \
				  	            || ( convert "$nazwa" -resize $resthumb -size $resthumb xc:black +swap -gravity center -composite -quality 80% "thumbs/$nazwa" && echo DONE || echo ERROR ; )
	                        }
[[ $tworz_miniatury -eq 1 ]] && {  echo -ne "\tTworze pomniejszony obraz (res $res)... "; convert "$nazwa" -resize $res -quality 85% "medium/$nazwa"  && echo DONE || echo ERROR ; }
 producentaparatu=`$jhead "$nazwa" | grep "Camera make" | awk -F\: '{print $2}' | cut -c 2-  | tr [:upper:] [:lower:]| sed 's/eastman kodak company//'`
 modelaparatu=`$jhead "$nazwa" | grep "Camera model" | awk -F\: '{print $2}' | cut -c 2- | sed 's/DIGITAL CAMERA//'| sed 's/DIGITAL CAM//' | tr [:upper:] [:lower:]`
 wykonano=`$jhead "$nazwa" | grep "Date/Time" | cut -c 16-`
 resmed=`$jhead "medium/$nazwa" | grep "Resolution" | cut -c 16- | tr -d \ `
 resmedx=`echo $resmed|awk -Fx '{print $1}'`
 resmedy=`echo $resmed|awk -Fx '{print $2}'`
 nazwapliku=`echo $nazwa | tr + \  | sed 's/.jpg//' | cut -c -40`
 picfilename="medium/`echo $nazwa|sed 's/.jpg/.html/'`"

# echo -e "<div style=\"display: block; float: left; font-family: arial; font-size: 9px; text-align: center;\">" >> $fname
# echo -e "\t<a href=\"medium/$nazwa\"><img src=\"thumbs/$nazwa\" width=$resthumbx height=$resthumby border=1></a><br>\n\t$nazwapliku&nbsp;&nbsp;<br>" >> $fname
 echo -e "\t<div class=\"fota\" id=\"fota_$cnt\"><a href=\"$picfilename\"><img src=\"thumbs/$nazwa\" width=$resthumbx height=$resthumby border=1></a><br>\n\t$nazwapliku&nbsp;" >> $fname
 echo -e "\t<div><span class=\"opisthumbnrzdjecia\">$(($cnt+1))</span><span class=\"opisthumb\">$producentaparatu&nbsp;$modelaparatu</span></div></div>" >> $fname
 # <span class=\"fullres\"><a href=$nazwa target=_NEW>fullres</a></span>
 
 echo -e "\n\r\n\r" >> "$picfilename"

# echo -e "</div>" >> $fname

 echo "$naglowekpikczer<center>" > "$picfilename"
 
 cntP=$(($cnt-1))
 cntN=$(($cnt+1))
 [[ $cntP -lt 0 ]]            && { poprz="<span class=\"buttonL poprzedniBW\">poprzedni</span>"; } || { poprzedniplik=`echo ${pliki[$cntP]}|sed 's/.jpg/.html/' |sed 's/.avi/.html/'`; poprz="<a href=\"$poprzedniplik\" class=\"buttonL poprzedni\">poprzedni</a>"; }
 [[ $cntN -ge ${#pliki[@]} ]] && { nast="<span class=\"buttonP nastepnyBW\">nastepny</span>"; }   || { nastepnyplik=`echo ${pliki[$cntN]}|sed 's/.jpg/.html/' |sed 's/.avi/.html/'`; nast="<a href=\"$nastepnyplik\" class=\"buttonP nastepny\">nastepny</a>"; }
# echo "<a href=\"$poprzedniplik\" class=\"button powrot\">poprzedni</a> | <a href=\"..\">powrot</a> | <a href=\"../$nazwa\">full res</a> | <a href=\"$nastepnyplik\">nastepny</a><br>$(($cnt+1))/${#pliki[@]} :: $producentaparatu&nbsp;$modelaparatu :: $wykonano :: $nazwa<br><img src=\"$nazwa\" width=$resmedx height=$resmedy>" >> "$picfilename"
 echo "<div class=\"guziki\">$poprz | <a href=\"../$fname#fota_$cnt\" class=\"buttonL powrot\">powrot</a> | <a href=\"../$nazwa\" class=\"buttonL full\">full res</a> | $nast</div>" >> "$picfilename"
 echo "<div class=\"opis\">$(($cnt+1))/${#pliki[@]} :: $producentaparatu&nbsp;$modelaparatu :: $wykonano :: $nazwa<br><img src=\"$nazwa\" width=$resmedx height=$resmedy class=\"fotamedium\"></div>" >> "$picfilename"
 echo -e "\n\r" >> "$picfilename"
 echo "</center></body></html>" >> "$picfilename"
}
# koniec dla zdjec

# dla wideo:
echo $nazwa|grep avi$ && {
 nazwapliku=`echo $nazwa | tr + \  | sed 's/.avi//' | cut -c -42`
 picfilename="medium/`echo $nazwa|sed 's/.avi/.html/'`"
 flvfilename="medium/`echo $nazwa|sed 's/.avi/.flv/'`"
 flvlowfilename="medium/`echo $nazwa|sed 's/.avi/_low.flv/'`"

 mplayer -really-quiet $nazwa  -ss 1 -frames 1 -vo jpeg
 vidresx=`mplayer -identify -nosound -endpos 0:0:0 -really-quiet $nazwa 2> /dev/null|grep ^ID_VIDEO_WIDTH|cut -d \= -f2`
 vidresy=`mplayer -identify -nosound -endpos 0:0:0 -really-quiet $nazwa  2> /dev/null|grep ^ID_VIDEO_HEIGHT|cut -d \= -f2`
 vidlength=`mplayer -identify  -nosound -endpos 0:0:0 -really-quiet $nazwa  2> /dev/null|grep ^ID_LENGTH|cut -d \= -f2|cut -d \. -f1`
 
 convert 00000001.jpg -resize $resthumb -size $resthumb xc:black +swap -gravity center -composite -quality 80% "thumbs/$nazwa.jpg.jpg"
 composite  -gravity southeast $cam_logo "thumbs/$nazwa.jpg.jpg" "thumbs/$nazwa.jpg"
 rm -f 00000001.jpg "thumbs/$nazwa.jpg.jpg"
# mencoder $nazwa -o $flvfilename -of lavf -oac mp3lame -ovc lavc -srate 22050 -lameopts br=32 -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
# mencoder $nazwa -o $flvlowfilename -of lavf -oac mp3lame -ovc lavc -srate 22050 -vf scale=320:240 -lameopts br=32 -lavcopts acodec=twolame:abitrate=48:vcodec=flv:vbitrate=40:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050




 echo -e "\t<div class=\"fota\" id=\"fota_$cnt\"><a href=\"$picfilename\"><img src=\"thumbs/$nazwa.jpg\" width=$resthumbx height=$resthumby border=1></a><br>\
n\t$nazwapliku&nbsp;" >> $fname
 echo -e "\t<div><span class=\"opisthumbnrzdjecia\">$(($cnt+1))</span><span class=\"opisthumb\">KLIP WIDEO</span></div></div>" >> $fname

 echo "$naglowekpikczer<center>" > "$picfilename"
 echo "<script type=\"text/javascript\" src=\"/proj/shagal/mediaplayer/swfobject.js\"></script>" >> "$picfilename"
# echo -n "<div class=\"guziki\"><a href=\"../$fname#fota_$cnt\" class=\"buttonL powrot\">powrot</a><br><br>" >> "$picfilename"
 cntP=$(($cnt-1))
 cntN=$(($cnt+1))
 [[ $cntP -lt 0 ]]            && { poprz="<span class=\"buttonL poprzedniBW\">poprzedni</span>"; } || { poprzedniplik=`echo ${pliki[$cntP]}|sed 's/.jpg/.html/' |sed 's/.avi/.html/'`; poprz="<a href=\"$poprzedniplik\" class=\"buttonL poprzedni\">poprzedni</a>"; }
 [[ $cntN -ge ${#pliki[@]} ]] && { nast="<span class=\"buttonP nastepnyBW\">nastepny</span>"; }   || { nastepnyplik=`echo ${pliki[$cntN]}|sed 's/.jpg/.html/' |sed 's/.avi/.html/'`; nast="<a href=\"$nastepnyplik\" class=\"buttonP nastepny\">nastepny</a>"; }
 echo -n "<div class=\"guziki\">$poprz | <a href=\"../$fname#fota_$cnt\" class=\"buttonL powrot\">powrot</a> | <a href=\"../$nazwa\" class=\"buttonL full\">full res</a> | $nast</div><br><br>" >> "$picfilename"


 echo "Czas trwania: $vidlength s, rozdzielczosc pliku zrodlowego: $vidresx" >> "$picfilename"
 echo "x$vidresy<br><br>" >> $picfilename

 echo "Klip w niskiej rozdzielczosci<br><p id=\"player_lores\"><a href=\"http://www.macromedia.com/go/getflashplayer\">Get the Flash Player</a> to see this pl
ayer.</p>
<script type=\"text/javascript\">
        var s2 = new SWFObject(\"../mediaplayer/mediaplayer.swf\",\"mpl\",\"320\",\"260\",\"9\");
        s2.addParam(\"allowfullscreen\",\"true\");
        s2.addParam(\"quality\",\"high\");
        s2.addParam(\"wmode\",\"opaque\");
        s2.addParam(\"flashvars\",\"&file=../$flvlowfilename&image=../thumbs/$nazwa.jpg\");
        s2.write(\"player_lores\");
</script></p>" >> "$picfilename"

echo "Klip w wysokiej rozdzielczosci<br><p id=\"player_hires\"><a href=\"http://www.macromedia.com/go/getflashplayer\">Get the Flash Player</a> to see this pl
ayer.</p>
<script type=\"text/javascript\">
        var s2 = new SWFObject(\"../mediaplayer/mediaplayer.swf\",\"mpl\",\"640\",\"500\",\"9\");
        s2.addParam(\"allowfullscreen\",\"true\");
        s2.addParam(\"quality\",\"high\");
        s2.addParam(\"wmode\",\"opaque\");
        s2.addParam(\"flashvars\",\"&file=../$flvfilename&image=../thumbs/$nazwa.jpg\");
        s2.write(\"player_hires\");
</script></p>" >> "$picfilename"


 echo -e "\n\r" >> "$picfilename"
 wielkoscoryginalu=`du -h $nazwa|awk '{print $1}'`
 echo -n "<a href=\"../$nazwa\">Pobierz klip w formacie AVI  (prawy guzik, zapisz jako...)</a><br>Informacje o pliku: czas trwania: $vidlength s, rozdzielczos
c: $vidresx">> "$picfilename"
 echo "x$vidresy, objetosc: $wielkoscoryginalu<br></center></body></html>" >> "$picfilename"

}
# koniec dla wideo

 cnt=$(($cnt+1));

 done


# zamkniecie kontenera
echo "</div>" >> $fname

time2=`date +%s`
time=$(($time2 - $time1))
echo -e "<div style=\"clear: both; font-family: verdana; font-size: 9px;\"><br><hr size=1 noshade><a href=\"#poczatek\">Powrot na poczatek strony</a><br><font size=1>Generated <b>$data</b> in <b>$time seconds</b> by <a href=\"$produrl\"><b>$prod</b></a></font></div>" >> $fname
echo "</body></html>" >> $fname


[[ $tworz_archiwum -eq 1 ]] && { tar -c ${pliki[@]} > "$nazwatar" ; }

# ------------------------------------------
