#!/usr/bin/perl use strict; use warnings; use UCW::Gallery; use File::Spec; my $photos_root = $ENV{HOME} . '/photos'; my $album = $ARGV[0] // die "Usage: gal mj-upgrade \n"; print "### $album ###\n"; ### Scan photos.map ### my $year = $album; $year =~ s{/.*}{}; if ($album eq '2009/Fireworks') { $year = 2008; } print "Loading map for $year\n"; open M, "$photos_root/photos.map" or die "No map file found\n"; my %map = (); while () { chomp; m{^$year} or next; my ($path, $hash) = split /\t/; my $name = $path; $name =~ s{.*/}{}; if (defined $map{$name}) { my $prev = $map{$name}; if ($prev->{hash} ne $hash) { print STDERR "Collision for $name: ", $prev->{path}, " vs. ", $path, "\n"; } else { # print STDERR "Harmless collision for $name: ", $prev->{path}, " vs. ", $path, "\n"; } } else { $map{$name} = { path => $path, hash => $hash }; } } close M; ### Scan static list (if any) ### my @src = (); if (open S, "../static/photos/$album/x") { print "Found static list\n"; while () { chomp; my @fields = split /\t/; if (@fields == 4) { push @src, { name => $fields[0], rotate => $fields[2], xform => $fields[3] }; } elsif (@fields == 2) { push @src, { name => $fields[0], rotate => $fields[1], xform => '.' }; } else { die "Error parsing gallery list: $_\n"; } } close S; } ### Parse index.cgi and produce gallery.new ### open I, "$album/index.cgi" or die "Cannot find $album/index.cgi\n"; open W, ">$album/gallery.new" or die "Cannot create $album/gallery.new\n"; my %opt = (); my %found_dirs = (); my @items = (); while () { chomp; if (/^\s+"(\w+)" => "(.*)",?$/) { $opt{$1} = $2; print "Option: $1 = $2\n"; } elsif (/^img\("([^"]+)\.jpe?g", "([^"]*)"\);\s*# (\S+)/) { my $nr = $1; my $title = $2; my $file = $3; $file =~ s{^.*/}{}g; my $map = $map{$file}; if (!$map) { print STDERR "$album: No match for $file\n"; next; } my $path = $map->{path}; my ($vv, $dd, $ff) = File::Spec->splitpath($path); $found_dirs{$dd} = 1; print "Image: $nr $path [$title]\n"; my $src; if (@src) { if ($nr =~ m{^\d+$} && $nr <= @src) { $src = $src[$nr-1]; } else { print STDERR "$album: Crooked refs ($nr)\n"; } } print W join("\t", "$photos_root/$path", $map->{hash}, ($src ? $src->{rotate} : '-'), ($src ? $src->{xform} : '.'), ($title ne "" ? $title : '-'), ), "\n"; } elsif (/^($|#|require|SetOptions|\)|Start|Finish)/) { # Nothing important } else { print STDERR "$album/index.cgi: Parse error at line $.: $_\n"; } } close W; close I; if (scalar keys %found_dirs != 1) { print STDERR "$album: Photos in multiple directories\n"; } ### Create gallery.cf ### open CF, ">$album/gallery.cf" or die "Cannot create $album/gallery.cf"; print CF <<'AMEN' ; use strict; use warnings; use utf8; my $gal = require '../../default.cf'; $gal->set( AMEN for my $cf (reverse sort keys %opt) { print CF "\t$cf => \"", $opt{$cf}, "\",\n"; } print CF <<'AMEN' ; ); return $gal; AMEN close CF;