]> mj.ucw.cz Git - gallery.git/blob - gal2/bin/gal-mj-upgrade
Gallery2: gal-mj-upgrade writes thumbnail data
[gallery.git] / gal2 / bin / gal-mj-upgrade
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use UCW::Gallery;
7 use File::Spec;
8 use Image::Magick;
9
10 my $photos_root = $ENV{HOME} . '/photos';
11
12 my $album = $ARGV[0] // die "Usage: gal mj-upgrade <album>\n";
13 print "### $album ###\n";
14
15 ### Scan photos.map ###
16
17 my $year = $album;
18 $year =~ s{/.*}{};
19 if ($album eq '2009/Fireworks') { $year = 2008; }
20 print "Loading map for $year\n";
21 open M, "$photos_root/photos.map" or die "No map file found\n";
22 my %map = ();
23 while (<M>) {
24         chomp;
25         m{^$year} or next;
26         my ($path, $hash) = split /\t/;
27         my $name = $path;
28         $name =~ s{.*/}{};
29         if (defined $map{$name}) {
30                 my $prev = $map{$name};
31                 if ($prev->{hash} ne $hash) {
32                         print STDERR "Collision for $name: ", $prev->{path}, " vs. ", $path, "\n";
33                 } else {
34                         # print STDERR "Harmless collision for $name: ", $prev->{path}, " vs. ", $path, "\n";
35                 }
36         } else {
37                 $map{$name} = { path => $path, hash => $hash };
38         }
39 }
40 close M;
41
42 ### Scan static list (if any) ###
43
44 my @src = ();
45 if (open S, "../static/photos/$album/x") {
46         print "Found static list\n";
47         while (<S>) {
48                 chomp;
49                 my @fields = split /\t/;
50                 if (@fields == 4) {
51                         push @src, { name => $fields[0], rotate => $fields[2], xform => $fields[3] };
52                 } elsif (@fields == 2) {
53                         push @src, { name => $fields[0], rotate => $fields[1], xform => '.' };
54                 } else {
55                         die "Error parsing gallery list: $_\n";
56                 }
57         }
58         close S;
59 }
60
61 ### Parse index.cgi and produce gallery.new ###
62
63 open I, "$album/index.cgi" or die "Cannot find $album/index.cgi\n";
64 open W, ">$album/gallery.new" or die "Cannot create $album/gallery.new\n";
65 open T, ">$album/gallery.thumb" or die "Cannot create $album/gallery.thumb\n";
66 my %opt = ();
67 my %found_dirs = ();
68 my @items = ();
69 while (<I>) {
70         chomp;
71         if (/^\s+"(\w+)" => "(.*)",?$/) {
72                 $opt{$1} = $2;
73                 print "Option: $1 = $2\n";
74         } elsif (/^img\("([^"]+)(\.jpe?g)", "([^"]*)"\);\s*# (\S+)/) {
75                 my $nr = $1;
76                 my $ext = $2;
77                 my $title = $3;
78                 my $file = $4;
79                 $file =~ s{^.*/}{}g;
80
81                 my $map = $map{$file};
82                 if (!$map) {
83                         print STDERR "$album: No match for $file\n";
84                         next;
85                 }
86                 my $path = $map->{path};
87                 my ($vv, $dd, $ff) = File::Spec->splitpath($path);
88                 $found_dirs{$dd} = 1;
89
90                 print "Image: $nr $path [$title]\n";
91                 my $src;
92                 if (@src) {
93                         if ($nr =~ m{^\d+$} && $nr <= @src) {
94                                 $src = $src[$nr-1];
95                         } else {
96                                 print STDERR "$album: Crooked refs ($nr)\n";
97                         }
98                 }
99
100                 print W join("\t",
101                         "$photos_root/$path",
102                         $map->{hash},
103                         ($src ? $src->{rotate} : '-'),
104                         ($src ? $src->{xform} : '.'),
105                         ($title ne "" ? $title : '-'),
106                         ), "\n";
107
108
109                 my $thumb = "../static/photos/$album/$nr-thumb.jpg";
110                 if (!-f $thumb) {
111                         print STDERR "$album: Cannot find thumbnail for photo $nr ($thumb)\n";
112                         print T "1 1\n";
113                 } else {
114                         my $im = new Image::Magick;
115                         my ($thumb_w, $thumb_h, $thumb_size, $thumb_format) = $im->PingImage($thumb) or die "Error reading $thumb\n";
116                         print T "$thumb $thumb_w $thumb_h\n";
117                 }
118         } elsif (/^($|#|require|SetOptions|\)|Start|Finish)/) {
119                 # Nothing important
120         } else {
121                 print STDERR "$album/index.cgi: Parse error at line $.: $_\n";
122         }
123 }
124 close T;
125 close W;
126 close I;
127
128 if (scalar keys %found_dirs != 1) {
129         print STDERR "$album: Photos in multiple directories\n";
130 }
131
132 ### Create gallery.cf ###
133
134 open CF, ">$album/gallery.cf" or die "Cannot create $album/gallery.cf";
135 print CF <<'AMEN' ;
136 use strict;
137 use warnings;
138 use utf8;
139
140 my $gal = require '../../default.cf';
141 $gal->set(
142 AMEN
143
144 for my $cf (reverse sort keys %opt) {
145         print CF "\t$cf => \"", $opt{$cf}, "\",\n";
146 }
147
148 print CF <<'AMEN' ;
149 );
150
151 return $gal;
152 AMEN
153
154 close CF;