X-Git-Url: https://git.defcon.no/?p=plsgen;a=blobdiff_plain;f=plsgen;h=323e5c34682be7be5217f6700206cebe6be9e5e7;hp=0f04fb11f9847cf69c04a7f8e9e7c2147672f3d0;hb=16f2646e3b6851d6187eccb0b2c595ccc9fff873;hpb=f4f2b8f68d207d3189de1e07b662aaaf4ed5aa8f diff --git a/plsgen b/plsgen index 0f04fb1..323e5c3 100755 --- a/plsgen +++ b/plsgen @@ -3,32 +3,44 @@ use Image::ExifTool; use POSIX; use AppConfig; use Getopt::Long; +use threads; +use threads::shared; use strict; -# TODO: filename.txt for file comments +# DONE: Config option for size of view/thumbnail +# DONE: Config option to disable arrow-up navigation +# DONE: Config option to disable image rescaling ? +# DONE: Consider multithreading +# TODO: Stripping of image suffix for HTML file w/config option? # TODO: Templating of EXIF -# TODO: Priority/sorting of EXFI tags +# TODO: Priority/sorting of EXIF tags # TODO: Possibility for hide/show EXIF -# TODO: RSS support? Delegate that to frontend? -# TODO: Save reference to main-index thumbnail. # TODO: Clear old generated files and meta on regen # TODO: Use perlmagick et. al instead of convert/jhead.. +# BUG: The naive handling of filenames breaks on special characters + +my $version = "0.3"; # Runtime data my $title = undef; my $htmlonly = 0; my $configfile = undef; my $halp = undef; +my $album_comment = undef; +my $doexif = 1; +my $threadcounter = 0; +share ( $threadcounter ); GetOptions ( "title=s" => \$title, "htmlonly!" => \$htmlonly, + "exif!" => \$doexif, "config=s" => \$configfile, "help" => \$halp ); if ( $halp ) { - print "\nplsgen version 0.1\n"; + print "\nplsgen version " . $version . "\n"; print "Copyright Jon Langseth, BSD lisence\n\n"; print " --title='Your album title'\n"; print " Sets the album title. Title will be stored in .title\n"; @@ -36,6 +48,8 @@ if ( $halp ) print " --htmlonly\n"; print " Add this option to only generate HTML files\n"; print " No image operations will be performed with this option\n"; + print " --noexif\n"; + print " Forces EXIF data block not to be written to HTML output\n"; print " --config=/path/to/config\n"; print " Overrides default config file location.\n"; print " Default is to look for ./plsgen.cfg, then ../plsgen.cfg\n"; @@ -50,14 +64,23 @@ my $full_tpl_file = $config->full_tpl_file; my $index_tpl_file = $config->index_tpl_file; my $css_file = $config->css_file; my $navigation_script = $config->navigation_script; +my $up_arrow_navigate = $config->up_arrow_navigate; +my $disable_rescale = $config->disable_rescale; my $columns = $config->columns; my $rows = $config->rows; my $thumb_pre = $config->thumb_pre; my $thumb_post = $config->thumb_post; +my $thumb_maxwidth = $config->thumb_maxwidth; +my $thumb_maxheight = $config->thumb_maxheight; +my $view_maxwidth = $config->view_maxwidth; +my $view_maxheight = $config->view_maxheight; +my $comment_pre = $config->comment_pre; +my $comment_post = $config->comment_post; my $idx_prev_text = $config->idx_prev_text; my $idx_next_text = $config->idx_next_text; my $idx_ret_text = $config->idx_ret_text; my $footer_tag = $config->footer_tag; +my $concurrent = $config->concurrent_threads; # Get or save the title, depending.. if ( (not $title) && ( -f ".title" ) ) @@ -74,13 +97,21 @@ elsif ( $title ) close TF; } +# Get the album comment, if available +if ( -f "comment.txt" ) +{ + open CF, ") { $album_comment .= $_; } + close CF; +} + mkdir "thumb"; mkdir "view"; # Glob file names to an array my @images = glob("*png *.jpg *.JPG *.gif *.GIF"); # Keep count of total number of images -my $imagecount = $#images; +my $imagecount = $#images+1; my ($current, $previous, $next); my $indexcount = 1; @@ -114,7 +145,21 @@ for ( my $i = 1; $i <= $imagecount; $i++) my $prev_text = ""; my $next_text = ""; my $cur_index_text = "" . $idx_ret_text . ""; - my $current_display = "view/" . $current; + my $current_display = $current; + $current_display = "view/" . $current unless $disable_rescale; + + # Check for, and load comment from FILENAME.txt here.. + my $comment = undef; + if ( -f $current . ".txt" ) + { + open CF, "<" . $current . ".txt"; + while () { $comment .= $_; } + close CF; + } + if ( $comment ) + { + $comment = $comment_pre . $comment . $comment_post; + } printf ("Processing image %s: %s\n", $position, $current); @@ -124,13 +169,29 @@ for ( my $i = 1; $i <= $imagecount; $i++) { system("jhead -autorot " . $current . ">/dev/null") unless $htmlonly; } - my $exif_text = get_exifblock($exif); + my $exif_text = get_exifblock($exif) if $doexif; -# - - Create thumbnail image (resize to new image) - system("convert " . $current . " -geometry '160x120>' thumb/" . $current) unless $htmlonly; -# - - Create normal display image (resize to new image) - system("convert " . $current . " -geometry '800x600>' view/" . $current) unless $htmlonly; +## - - Create thumbnail and normal view images, support threading + if ( not $htmlonly ) + { + $threadcounter++; + my $thread = threads->create ( + \&scale_image_t, + $current, $thumb_maxwidth, $thumb_maxheight, + $view_maxwidth, $view_maxheight, $disable_rescale); + if ( $threadcounter >= $concurrent ) + { + foreach my $thr ( threads->list() ) { $thr->join(); } + } + } +# - - Save a reference to the "primary image" + if ( not -f ".indeximage" ) + { + open IM, ">.indeximage"; + print IM $current; + close IM; + } # - - Create full view HTML file my $cur_html; open TEMPLATE, "<" . $full_tpl_file or die "UNABLE TO LOAD TEMPLATE $full_tpl_file\n"; @@ -138,10 +199,8 @@ for ( my $i = 1; $i <= $imagecount; $i++) { if ( $previous ) { $_ =~ s/%\{previous\}/$prev_text/; } else { $_ =~ s/%\{previous\}//; } - if ( $next ) { $_ =~ s/%\{next\}/$next_text/; } else { $_ =~ s/%\{next\}//; } - $_ =~ s/%\{index\}/$cur_index_text/; $_ =~ s/%\{title\}/$title/; $_ =~ s/%\{main_meta\}/$main_meta/; @@ -149,6 +208,7 @@ for ( my $i = 1; $i <= $imagecount; $i++) $_ =~ s/%\{position\}/$position/; $_ =~ s/%\{current\}/$current/; $_ =~ s/%\{current_display\}/$current_display/; + $_ =~ s/%\{comment\}/$comment/; $_ =~ s/%\{exif\}/$exif_text/; $_ =~ s/%\{gallery_timestamp\}/$gentime/; $_ =~ s/%\{navscript\}/$navscript/; @@ -166,7 +226,7 @@ for ( my $i = 1; $i <= $imagecount; $i++) { $thumbs .= ""; # - - On each Y, terminate index file/group: - make_index( $index_tpl_file, $indexcount, $indexes, $thumbs); + make_index( $index_tpl_file, $indexcount, $indexes, $thumbs, $album_comment ); $thumbs = "
"; $indexcount++; } @@ -177,7 +237,10 @@ for ( my $i = 1; $i <= $imagecount; $i++) } } $thumbs .= "
"; -make_index( $index_tpl_file, $indexcount, $indexes, $thumbs); +make_index( $index_tpl_file, $indexcount, $indexes, $thumbs, $album_comment ); + +printf ("Waiting for %d threads to finish\n", $threadcounter) if $threadcounter; +foreach my $thr ( threads->list() ) { $thr->join(); } # Done. @@ -188,6 +251,7 @@ sub make_index my $idxcount = shift; my $lastidx = shift; my $thumbs = shift; + my $comment = shift; my $gentime = localtime; my $html; @@ -216,6 +280,11 @@ sub make_index $next_text = "" . $idx_next_text . ""; } + if ( $comment ) + { + $comment = $comment_pre . $comment . $comment_post; + } + my $position = $indexcount . " of " . $lastidx; my $navscript = gen_navscript( $prev_file, $next_file ); @@ -225,6 +294,7 @@ sub make_index $_ =~ s/%\{previous\}/$prev_text/; $_ =~ s/%\{next\}/$next_text/; $_ =~ s/%\{title\}/$title/; + $_ =~ s/%\{comment\}/$comment/; $_ =~ s/%\{position\}/$position/; $_ =~ s/%\{main_meta\}/$main_meta/; $_ =~ s/%\{navigation_script\}/$navigation_header/; @@ -251,7 +321,7 @@ sub get_exifdata ($) my $info = $exifTool->ImageInfo($image); $exif->{'Make'} = $info->{'Make'}; $exif->{'Model'} = $info->{'Model'}; - #$exif->{'Orientation'} = $info->{'Orientation'}; + $exif->{'Orientation'} = $info->{'Orientation'}; $exif->{'ExposureTime'} = $info->{'ExposureTime'}; $exif->{'FNumber'} = $info->{'FNumber'}; $exif->{'ISO'} = $info->{'ISO'}; @@ -259,8 +329,6 @@ sub get_exifdata ($) $exif->{'ExposureCompensation'} = $info->{'ExposureCompensation'}; $exif->{'Flash'} = $info->{'Flash'}; $exif->{'FocalLength'} = $info->{'FocalLength'}; - #$exif->{'ColorSpace'} = $info->{'ColorSpace'}; - #$exif->{'FileSource'} = $info->{'FileSource'}; $exif->{'ExposureMode'} = $info->{'ExposureMode'}; $exif->{'Macro'} = $info->{'Macro'}; $exif->{'LensType'} = $info->{'LensType'}; @@ -277,6 +345,7 @@ sub get_exifblock my $flipflop = 0; foreach my $tag ( keys %$exif ) { + next if $tag =~ m/Orientation/; my $val = $exif->{$tag}; next unless $val; $block .= "" if $flipflop; @@ -308,12 +377,34 @@ sub gen_navscript my $scriptbuffer = "\n"; return $scriptbuffer; } +sub scale_image_t +{ + my $current = shift; + my $thumb_maxwidth = shift; + my $thumb_maxheight = shift; + my $view_maxwidth = shift; + my $view_maxheight = shift; + my $disable_rescale = shift; + + my $tgeom = $thumb_maxwidth . "x" . $thumb_maxheight; + my $vgeom = $view_maxwidth . "x" . $view_maxheight; + # - - Create thumbnail image (resize to new image) + system("convert " . $current . " -geometry '" . $tgeom . ">' thumb/" . $current); + # - - Create normal display image (resize to new image) + system("convert " . $current . " -geometry '" . $vgeom . ">' view/" . $current) unless $disable_rescale; + $threadcounter--; + +} + sub get_config { # My standard way of implementing AppConfig use ... @@ -342,26 +433,53 @@ sub get_config $cfg->full_tpl_file("/usr/local/share/plsgen/full.tpl"); $cfg->define('index_tpl_file'); $cfg->index_tpl_file("/usr/local/share/plsgen/index.tpl"); + $cfg->define('css_file'); $cfg->css_file("../style.css"); $cfg->define('navigation_script'); $cfg->navigation_script("../nav.js"); + + $cfg->define('up_arrow_navigate'); + $cfg->up_arrow_navigate(1); + $cfg->define('columns'); $cfg->columns(4); $cfg->define('rows'); $cfg->rows(3); + + $cfg->define('concurrent_threads'); + $cfg->concurrent_threads(1); + + $cfg->define('thumb_maxwidth'); + $cfg->thumb_maxwidth(160); + $cfg->define('thumb_maxheight'); + $cfg->thumb_maxheight(120); + $cfg->define('view_maxwidth'); + $cfg->view_maxwidth(800); + $cfg->define('view_maxheight'); + $cfg->view_maxwidth(600); + $cfg->define('disable_rescale'); + $cfg->disable_rescale(0); + $cfg->define('thumb_pre'); $cfg->thumb_pre("
"); $cfg->define('thumb_post'); $cfg->thumb_post("
"); + + $cfg->define('comment_pre'); + $cfg->comment_pre("
"); + $cfg->define('comment_post'); + $cfg->thumb_post("
"); + $cfg->define('idx_prev_text'); $cfg->idx_prev_text("← Back"); $cfg->define('idx_next_text'); $cfg->idx_next_text("Next →"); $cfg->define('idx_ret_text'); $cfg->idx_ret_text("To index"); + $cfg->define('footer_tag'); - $cfg->footer_tag('plsgen : Perl Simple Gallery Generator 0.1'); + $cfg->footer_tag('plsgen : Perl Simple Gallery Generator ' . $version); $cfg->file($filename) if -f $filename; return $cfg;