#!/usr/bin/perl # # Utility for creating HTML gallery # # Author: Yanik Gleyzer use File::Basename; use Cwd; use URI::Escape; $ALBUM_PROPERTIES_FILE = 'meta.properties'; $START_DIR = '.'; $RECURSIVE = 0; $CREATE_THUMBS = 0; sub usage{ print <<"EOF"; Pre-conditions: Each album directory *MUST* contains meta.properties file. Usage: $0 -r Run with recursive entering into sub-albums -t Create thumbnails -h Print this message EOF exit; } while(@ARGV){ my $arg = shift @ARGV; if($arg eq '-r'){ $RECURSIVE = 1; } elsif($arg eq '-t'){ $CREATE_THUMBS = 1; } elsif($arg eq '-help'){ usage; } elsif(-d $arg){ $START_DIR = $arg; print "Using directory: $arg\n"; } else{ print "Directory doesn't exists: $arg\n"; usage; } } sub trim { my($s) = @_; $s =~ s/^\s+|\s+$/$1/g; return $s; } sub identify{ my($file) = @_; my $str = `/usr/bin/identify -format "%w,%h,%b" "$file"` || return 0; my($width,$height,$size) = split(',',trim($str)); return {'width'=>$width, 'height'=>$height, 'size'=>$size}; } sub urle{ my($s) = @_; return join('/', map { uri_escape($_) } split('/',$s)); } sub read_properties{ my($dir) = @_; my $file = $dir.'/'.$ALBUM_PROPERTIES_FILE; my %ret = (); open(F,"< $file") || return \%ret; my @lines = ; close(F); foreach my $l (@lines){ my($k,$v) = split('=',$l); $ret{trim($k)} = trim($v); } opendir(DIR,$dir) || die "can't opendir '$dir': $!"; my @dir_content = readdir(DIR); closedir(DIR); my @thumbs = grep { /^thumb_/ && -f "$dir/$_" } @dir_content; my @fotos = grep { !/^thumb_/ && !/.html?$/i && -f "$dir/$_" && -f "$dir/thumb_$_" && $_ ne $ALBUM_PROPERTIES_FILE} @dir_content; @fotos = sort @fotos; $ret{'thumbs'} = \@thumbs; $ret{'thumbs-num'} = $#thumbs+1; if(defined($ret{'thumb'})){ my($fname,$fpath) = fileparse($ret{'thumb'}); if($fpath eq './'){ $fpath = ''; } if(-f $dir.'/'.$fpath.'thumb_'.$fname){ $ret{'thumb'} = $fpath.'thumb_'.$fname; } elsif(-f "$dir/".$ret{'thumb'}){ ; } else{ undef($ret{'thumb'}); } } if(!defined($ret{'thumb'}) && $ret{'thumbs-num'} > 0){ $ret{'thumb'} = $thumbs[0]; } $ret{'fotos'} = \@fotos; $ret{'fotos-num'} = $#fotos+1; if(-f "$dir/.htaccess"){ $ret{'secure'} = 1; } return \%ret; } sub get_albums{ my($dir) = @_; opendir(DIR,$dir) || die "can't opendir '$dir': $!"; my @dir_content = sort(readdir(DIR)); closedir(DIR); my @ret = (); foreach my $d (grep { $_ ne '.' && $_ ne '..' && -d "$dir/$_" } @dir_content){ my $fd = $dir.'/'.$d; if(-f $fd.'/'.$ALBUM_PROPERTIES_FILE){ print $fd,"\n"; my $nested = get_albums("$dir/$d"); my %data = ('dir'=>$d, 'properties'=>read_properties($fd), 'albums'=>$nested, 'albums-num'=>$#{$nested}+1); push(@ret,\%data); } } return \@ret; } sub create_thumbs{ my($dir) = @_; my $cwd = getcwd; chdir($dir); print "Create thumbnails "; `/bin/rm -f thumb_*`; for my $img (<*.[jJ][pP][gG]>,<*.[gG][iI][fF]>,<*.[pP][nN][gG]>){ `convert -size 120x120 "$img" -resize 120x120 +profile "*" "thumb_$img"`; print '.'; } print "\n"; chdir($cwd); } sub make_index{ my($albums) = @_; return if !$albums; my $properties = read_properties('.'); my $title = $$properties{'title'}; print "[$title]\n"; if($CREATE_THUMBS){ create_thumbs('.'); } open(F,"> index.html"); print F <<"EOF"; $title

$title

EOF if($#{$albums}>=0){ print F '',"\n"; if(!$$properties{'fotos-num'}){ if($$properties{'description'}){ print F ''; } if($$properties{'date'}){ print F ''; } } my $ind = 0; foreach my $a (sort {$$a{'dir'} cmp $$b{'dir'}} @{$albums}){ $ind++; my $prop = $$a{'properties'}; print F '',"\n"; } print F '
'.$$properties{'description'}.'
'.$$properties{'date'}.'
'; if($$prop{'secure'}){ print F '

secure

'; } elsif(defined($$prop{'thumb'})){ print F ''; } else{ print F '

view album

'; } print F '
'.$$prop{'title'}.'
'; print F ' '; if($$a{'albums-num'} > 0){ print F ' '.$$a{'albums-num'}.' album'.($$a{'albums-num'}>1?'s':'').''; } if($$prop{'fotos-num'} > 0){ print F ' '.$$prop{'fotos-num'}.' photo'.($$prop{'fotos-num'}>1?'s':''); } print F ''; if($$prop{'description'}){ print F '
'.$$prop{'description'}; } if($$prop{'date'}){ print F '
'.$$prop{'date'}.''; } print F '
'; } if($$properties{'fotos-num'} > 0){ print F <<"EOF"; EOF if($$properties{'description'}){ print F ''; } if($$properties{'date'}){ print F ''; } my $ind = 0; foreach my $f (@{$$properties{'fotos'}}){ my $info = identify($f) || next; print F ''; $ind++; if($ind && $ind%4 == 0) { print F '';} } if($ind%4 != 0){ print F ''; } print F ''; print F '
'.$$properties{'description'}.'
'.$$properties{'date'}.'
', '', '', '', '
'; } print F '« back
'; close(F); if($RECURSIVE){ my $cwd = getcwd; foreach my $a (@{$albums}){ my $prop = $$a{'properties'}; chdir($$a{'dir'}); make_index($$a{'albums'},$$prop{'title'}); chdir($cwd); } } } chdir($START_DIR); make_index(get_albums($START_DIR));