File Coverage

blib/lib/Apache/Album.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


}
line stmt bran cond sub pod time code
1             package Apache::Album;
2              
3             # For detailed information on this module, please see
4             # the pod data at the bottom of this file
5             #
6             # Copyright 1998-2004 James D Woodgate. All rights reserved.
7             # It may be used and modified freely, but I do request that this copyright
8             # notice remain attached to the file. You may modify this module as you
9             # wish, but if you redistribute a modified version, please attach a note
10             # listing the modifications you have made.
11              
12 1     1   2434 use Image::Magick;
  0            
  0            
13             use vars qw($VERSION);
14              
15             use Apache2::RequestRec ();
16             use Apache2::RequestIO ();
17             use Apache2::SubRequest ();
18             use APR::Pool ();
19             use APR::URI ();
20             use Apache2::URI ();
21              
22             use Apache2::Const -compile => qw(OK SERVER_ERROR REDIRECT);
23            
24             $VERSION = '1.00';
25              
26             sub handler {
27             my $r;
28             $r = shift if $ENV{MOD_PERL};
29            
30             # All the configurable values will be stored in %settings
31              
32             my %settings;
33            
34             $settings{'AlbumTitle'} =
35             $r->dir_config('AlbumTitle') || "Available Albums";
36             $settings{'AlbumDir'} =
37             $r->dir_config->get('AlbumDir') || "/albums_loc";
38             $settings{'ThumbNailUse'} =
39             lc($r->dir_config('ThumbNailUse')) || "width";
40             $settings{'ThumbNailWidth'} =
41             $r->dir_config('ThumbNailWidth') || 100;
42             $settings{'ThumbNailAspect'} =
43             $r->dir_config('ThumbNailAspect') || "1/5";
44             $settings{'ThumbDir'} =
45             $r->dir_config('ThumbDir') || '/thumbs';
46             $settings{'DefaultBrowserWidth'} =
47             $r->dir_config('DefaultBrowserWidth') || 640;
48             $settings{'NumberOfColumns'} =
49             $r->dir_config('NumberOfColumns') || 0;
50             $settings{'BodyArgs'} =
51             $r->dir_config('BodyArgs');
52             $settings{'OutsideTableBorder'} =
53             $r->dir_config('OutsideTableBorder') || 0;
54             $settings{'InsideTablesBorder'} =
55             $r->dir_config('InsideTablesBorder') || 0;
56             $settings{'SlideShowDelay'} =
57             $r->dir_config('SlideShowDelay') || 60;
58             $settings{'Footer'} =
59             $r->dir_config('Footer') || '
Slide Show: '
60             . 'small | '
61             . 'medium | '
62             . 'large | '
63             . 'xlarge | '
64             . 'full sized
'
65             . '
All Images: '
66             . 'small | '
67             . 'medium | '
68             . 'large | '
69             . 'xlarge | '
70             . 'full sized'
71             . '
Apache::Album
';
72             $settings{'EditMode'} =
73             $r->dir_config('EditMode') || 0;
74             $settings{'AllowFinalResize'} =
75             $r->dir_config('AllowFinalResize') || 0;
76             $settings{'ReverseDirs'} =
77             $r->dir_config('ReverseDirs') || 0;
78             $settings{'ReversePics'} =
79             $r->dir_config('ReversePics') || 0;
80            
81             # Set up $album_uri and $album_dir, _uri for web access, _dir
82             # for physical access to the files...
83             my $album_uri = $settings{'AlbumDir'};
84             $album_uri .= "/" unless substr($album_uri,-1,1) eq '/';
85             my $album_dir = $r->lookup_uri($album_uri)->filename;
86             chop $album_uri; # Won't need that '/' any more
87              
88             # Set up $thumb_uri and $thumb_dir, _uri for web access, _dir
89             # for physical access to the files...
90             my $thumb_uri = $settings{'ThumbDir'};
91             $thumb_uri .= "/" unless substr($thumb_uri,-1,1) eq '/';
92             my $thumb_dir = $r->lookup_uri($thumb_uri)->filename;
93             chop $thumb_uri; # Won't need that '/' any more
94              
95             # Check and see if there was a post
96             my %params = ();
97             %params = parseArgs($r, $r->method eq 'POST' ? $r->content : $r->args);
98              
99             # foreach (keys %params) {
100             # $r->server->warn("$_ -> $params{$_}");
101             # }
102             if ($settings{'EditMode'}) {
103              
104             if (defined $params{'AlbumName'}) {
105             my $directory = $params{AlbumName};
106             $directory =~ s,[^\w\d()],,g;
107              
108             # Since the only things that can get through are letters,
109             # numbers or parenthesis $directory should be safe
110             if ($directory =~ /([\w\d()]+)/) {
111             $directory = $1;
112             }
113              
114             my $local_path_info = $r->path_info;
115             if ($directory eq "") {
116             $r->log_error("Directory empty (or only consists of bad characters)");
117             }
118             else {
119             my $new_dir = "$album_dir$local_path_info$directory";
120             $new_dir =~ s!/{2,},!/!g;
121             $r->server->warn("Creating New Album: $new_dir");
122             mkdir($new_dir, 0755);
123             }
124             }
125             else {
126             unless ($params{'New Album'}) {
127             if (my $handle = $r->upload('filename')) {
128             my $filename = $handle->filename;
129             my ($type,$ext) = split(/\//,$handle->info("Content-type"));
130              
131             if ($type eq 'image') {
132             # on NT $filename has \'s which we don't want!
133             $filename =~ s,.*\\,,;
134              
135             $r->server->warn("Uploading: $filename");
136             my $local_path_info = $r->path_info;
137             my $fh = $handle->fh;
138              
139             if(open(OUT,">$album_dir$local_path_info$filename")) {
140             while(<$fh>) {
141             print OUT;
142             }
143            
144             close OUT;
145             }
146             else {
147             $r->log_error("Problem opening $album_dir$local_path_info$filename for write: $!");
148             }
149             }
150             else {
151             $r->log_error("Will not allow upload of: $filename $type/$ext");
152             }
153             }
154             }
155             }
156             }
157              
158             my $path_info = $r->path_info;
159             $path_info =~ s!^/+!!;
160             $path_info =~ s!/+$!!;
161              
162             update_settings($r, \%settings, $album_dir, $path_info);
163              
164             # path_info will be the sub directory/possible file_name
165             # get rid of any slashes so we can make sure that paths
166             # look like paths
167             $path_info || return &show_albums($r, $album_dir, $path_info, \%settings);
168              
169             # do we have a directory or a filename, if it's a filename
170             # simply load it up
171             if ( -f "$album_dir/$path_info" ) {
172             return &show_picture($r, $album_uri, $thumb_uri, $path_info, \%settings);
173             }
174              
175             # if AllowFinalResize is set, it is possible that the filename
176             # exists, only with a size prefixing it. So pull out that information
177             # and see if the file still exists
178             if ($settings{'AllowFinalResize'}) {
179             my $check_path = $path_info;
180             my ($check_dir, $check_filename) = $check_path =~ m,(.*)/(.*),;
181             if ($check_filename =~ s,^(\d+)x(\d+)_,,) {
182             my ($max_width, $max_height) = ($1, $2);
183              
184             if (-f "$album_dir/$check_dir/$check_filename") {
185             # $r->log_error("\$album_uri: $album_uri \$thumb_uri: $thumb_uri");
186             return &show_picture($r, $album_uri, $thumb_uri,
187             "$check_dir/$check_filename",
188             \%settings, $max_width, $max_height);
189             }
190             }
191             }
192            
193             # We have a directory, but does $path_info end in a
194             # / like all good directories should? If not, add
195             # it and do a redirect, makes the pictures show up
196             # easier later.
197             unless ( $r->path_info =~ m!/$!) {
198             $r->server->warn("Redirecting -> " . $r->uri . "/");
199             $r->headers_out->{'Location'} = $r->uri . "/";
200             return Apache2::Const::REDIRECT;
201             }
202              
203             # Try to open the directory, and read all the image file
204             # that aren't thumbnails
205             unless(opendir(IN,"$album_dir/$path_info")) {
206             $r->log_error("Couldn't open $album_dir/$path_info: $!");
207             return Apache2::Const::SERVER_ERROR;
208             }
209              
210             my @files = grep { !/\.htaccess/ && !/^tn__/
211             && $r->lookup_uri("$album_uri/$_")->content_type =~
212             m!^image/!} readdir(IN);
213             closedir(IN);
214              
215             # If we have a directory, but slide_show is set, we need to grab the
216             # first file and redirect
217             if (defined $params{'slide_show'}) {
218             @files = sort(@files);
219             $r->server->warn("Redirecting -> " . $r->uri . $files[0] . "?slide_show="
220             . $params{'slide_show'});
221             $r->headers_out->{'Location'} = $r->uri . $files[0] . "?slide_show="
222             . $params{'slide_show'};
223             return Apache2::Const::REDIRECT;
224             }
225              
226             # if @files is empty, need to call show_albums
227             return &show_albums($r, "$album_dir/$path_info", $path_info, \%settings)
228             unless @files;
229              
230             @files = sort @files;
231             @files = reverse @files
232             if $settings{'ReversePics'};
233              
234             my @cleanup_subs = ();
235              
236             # Load up thumbnails
237             # Unless the thumbnail file exists, and
238             # is newer than the file it's a thumbnail for, generate the
239             # thumbnail
240             foreach (@files) {
241             unless ( -e "$thumb_dir/$path_info/tn__$_" &&
242             (stat(_))[9] > (stat("$album_dir/$path_info/$_"))[9] ) {
243              
244             # Make sure the thumbnail directory exists
245             &mymkdir("$thumb_dir/$path_info", 0755)
246             unless -d "$thumb_dir/$path_info";
247              
248             # Create a new thumbnail
249             my $q = new Image::Magick;
250             unless ($q) {
251             $r->log_error("Couldn't create a new Image::Magick object");
252             return Apache2::Const::SERVER_ERROR;
253             }
254            
255             # Setting the size before reading the image is dramatically
256             # faster. The trade-off is that the quality of the resized
257             # image will be lower, which is OK for thumbnails.
258             # The actual resize (below) could be done with ->Sample() for
259             # similar reasons, but some limited testing revealed that the
260             # cumulative benefit of setting the size and using Sample was
261             # almost non-existant. Using ->Scale() instead might have a
262             # small quality benefit.
263              
264             # Load up the current images width and height
265             my ($o_width, $o_height) = $q->Ping("$album_dir/$path_info/$_");
266             my ($ratio, $t_width, $t_height, $t_aspect);
267              
268             # If we're using aspect, then multiply width and
269             # height by the aspect ratio
270             if ( $settings{'ThumbNailUse'} eq "aspect") {
271             $t_aspect = $settings{'ThumbNailAspect'};
272             # get the *real* aspect
273             $t_aspect =~ tr[^0-9/.][];
274             $t_aspect = eval($t_aspect);
275             $t_width = $o_width * $t_aspect;
276             $t_height = $o_height * $t_aspect;
277             }
278             else {
279             # Otherwise just make the width a constant and
280             # keep the same aspect ratio for the height
281             $t_width = $settings{'ThumbNailWidth'};
282             $ratio = $o_width / $o_height if $o_height;
283             $t_height = $t_width / $ratio if $ratio;
284             }
285              
286             $q->Set( size => "${t_width}x${t_height}" );
287              
288             $q->Read("$album_dir/$path_info/$_");
289              
290             # Scale it down, and save the file
291             $q->Scale( width => $t_width, height => $t_height );
292             $q->Write("$thumb_dir/$path_info/tn__$_");
293              
294             undef $q;
295              
296             # Create smaller versions of the full size image if requested
297             if ($settings{'AllowFinalResize'}) {
298             my $q = new Image::Magick;
299             unless ($q) {
300             $r->log_error("Couldn't create a new Image::Magick object");
301             return Apache2::Const::SERVER_ERROR;
302             }
303              
304             my $filename = $_;
305             push (@cleanup_subs, sub {&create_final_resize($r, \%settings, $album_dir, $thumb_dir, $path_info, $filename, $o_width, $o_height);});
306              
307             }
308            
309             }
310             }
311              
312             $r->pool->cleanup_register(sub {foreach (@cleanup_subs) {&$_;}})
313             if @cleanup_subs;
314              
315             # The title will be a hacked up path_info, only the
316             # last directory, transform -_ to space
317             my $title = $path_info;
318             $title =~ s|.*/||;
319             $title =~ tr|-_| |;
320              
321             # Send the actual web page...
322             $r->content_type('text/html');
323             #$r->send_http_header();
324             return Apache2::Const::OK if $r->header_only;
325              
326             $r->print(<
327            
328            
$title
329            
330             EOF
331              
332             # If there is a caption.txt file, include it here
333             # The caption file is copied directly to the page up
334             # to the __END__ line. At which point, the remaing
335             # text in the file is considered to be captions for
336             # individual files in the form:
337             #
338             # file.ext: Caption Here
339             #
340             # HTML tags are welcome in the entire file
341             my $caption_file = "$album_dir/$path_info/caption.txt";
342             # Account for varieties of using Alias
343             $caption_file =~ s!/{2,}!/!g;
344              
345             my %picture_captions;
346             my $state = "Caption";
347             if ( -r $caption_file ) {
348             unless (open (IN,$caption_file)) {
349             $r->log_error("Weird, $caption_file is readable, but I can't read it: $!");
350             return Apache2::Const::SERVER_ERROR;
351             }
352             while () {
353             $state eq "Caption" && ! /^__END__$/ and $r->print($_);
354             if ($state eq "Picture Captions") {
355             my ($key,@rest) = split (/:/,$_);
356             $picture_captions{$key} = (join(':',@rest));
357             }
358             /^__END__$/ and $state = "Picture Captions";
359             }
360             close IN;
361             $r->print("
\n");
362             }
363              
364             # Use 'ThumbNailWidth' even though the pictures can be of a
365             # different width. Technically we could use ImageMagick to get
366             # exact sizes for each row but that would slow us down, and we
367             # really don't need to be all the picky, do we? :)
368              
369             # If NumberOfColumns is > 0 then use that, otherwise
370             # use $settings{'DefaultBrowserWidth'} and
371             # $settings{'ThumbNailWidth'}to determine how many thumbnails per row
372             $r->print(qq!
!); \n!); !);
373             my $pixels_so_far = $settings{'ThumbNailWidth'};
374             my $columns_so_far = 0;
375              
376             foreach (@files) {
377             my $message = $_;
378             if ($picture_captions{$message}) {
379             $message = $picture_captions{$message};
380             }
381             else {
382             $message =~ tr/_-/ /;
383             $message =~ s/\.[^.]*$//g;
384             }
385              
386             my $resize_urls = "";
387              
388             if ($settings{'AllowFinalResize'}) {
389             my $resize_strings = "";
390             if (-f "$thumb_dir/$path_info/640x480_$_") {
391             $resize_strings .= qq!Sm!;
392             }
393              
394             if (-f "$thumb_dir/$path_info/800x600_$_") {
395             $resize_strings .= qq! Med!;
396             }
397              
398             if (-f "$thumb_dir/$path_info/1024x768_$_") {
399             $resize_strings .= qq! Lg!;
400             }
401              
402             if (-f "$thumb_dir/$path_info/1600x1200_$_") {
403             $resize_strings .= qq! Xlg!;
404             }
405              
406             $resize_urls = qq!
$resize_strings!
407             if $resize_strings;
408             }
409              
410             if (exists $params{'all_full_images'}) {
411             my $picture = $_;
412             for ($params{'all_full_images'}) {
413             /full/ || !$settings{'AllowFinalResize'} and do {
414             $r->print(qq!
$picture
!);
415             last; };
416             /sm/ and do {
417             $r->print(qq!
418
            . (-f "$thumb_dir/$path_info/640x480_$picture"
419             ? "$thumb_uri/$path_info/640x480_$picture"
420             : "$album_uri/$path_info/$picture")
421             . qq!" ALT="$picture">!);
422             last; };
423             /med/ and do {
424             $r->print(qq!
425
            . (-f "$thumb_dir/$path_info/800x600_$picture"
426             ? "$thumb_uri/$path_info/800x600_$picture"
427             : "$album_uri/$path_info/$picture")
428             . qq!" ALT="$picture">!);
429             last; };
430             /lg/ and do {
431             $r->print(qq!
432
            . (-f "$thumb_dir/$path_info/1024x768_$picture"
433             ? "$thumb_uri/$path_info/1024x768_$picture"
434             : "$album_uri/$path_info/$picture")
435             . qq!" ALT="$picture">!);
436             last; };
437             /xlg/ and do {
438             $r->print(qq!
439
            . (-f "$thumb_dir/$path_info/1600x1200_$picture"
440             ? "$thumb_uri/$path_info/1600x1200_$picture"
441             : "$album_uri/$path_info/$picture")
442             . qq!" ALT="$picture">!);
443             last; };
444             $r->print(qq!
$picture
!);
445             }
446             $r->print(qq!
$message

!);
447             }
448             else {
449             $r->print(qq!!,
! .
450             qq!$_$resize_urls
451             qq!
$message
452             $pixels_so_far += $settings{'ThumbNailWidth'};
453             $columns_so_far++;
454            
455             if ($settings{'NumberOfColumns'} > 0
456             ? ($columns_so_far >= $settings{'NumberOfColumns'} )
457             : ($pixels_so_far > $settings{'DefaultBrowserWidth'})) {
458             $r->print(qq!
459             $pixels_so_far = $settings{'ThumbNailWidth'};
460             $columns_so_far = 0;
461             }
462             }
463             }
464              
465             $r->print("
\n");
466             if ($settings{'EditMode'}) {
467             $r->print(&file_upload());
468             }
469             $r->print("
\n$settings{'Footer'}\n
") if $settings{'Footer'};
470             $r->print(<
471            
472            
473             EOF
474              
475             return Apache2::Const::OK;
476             }
477              
478             # show_albums simply shows the albums under the directory
479             # it should probably not be called, a "real" web page with
480             # links to the albums would probably be better, but this
481             # helps when debugging, or if someone decides to go to this
482             # directory directly
483             sub show_albums {
484             my ($r, $album_dir, $path_info, $settings) = @_;
485              
486             unless ($r->uri =~ m|/$|) {
487             $r->log_error("Redirecting -> " . $r->uri . "/");
488             $r->headers_out->{Location} = $r->uri . "/";
489             return Apache2::Const::REDIRECT;
490             }
491              
492             unless (opendir(IN,$album_dir)) {
493             $r->log_error("Could not open $album_dir: $!");
494             return Apache2::Const::SERVER_ERROR;
495             }
496            
497             my @dirs = grep { -d "$album_dir/$_" && ! /^\./ } readdir(IN);
498             closedir(IN);
499              
500             $r->content_type('text/html');
501             #$r->send_http_header();
502             return Apache2::Const::OK if $r->header_only;
503              
504             $r->print(<
505            
$$settings{AlbumTitle}
506            
507            

$$settings{AlbumTitle}

508             EOF
509              
510             $r->print($path_info)
511             if $path_info;
512              
513             @dirs = sort @dirs;
514             @dirs = reverse @dirs
515             if $settings->{'ReverseDirs'};
516            
517             foreach (@dirs) {
518             $r->print("\n
\n");
519             &list_dirs($r, $album_dir, $_, "", $settings );
520             $r->print("\n\n");
521             }
522              
523             if ($settings->{'EditMode'}) {
524             $r->print(qq!
New Album:
!);
525              
526             unless (@dirs) {
527             $r->print(&file_upload());
528             }
529             }
530              
531              
532             $r->print(<
533            
534            
Apache::Album
535            
536            
537             EOF
538             return Apache2::Const::OK;
539             }
540              
541             # parseArgs is used to turn the array of arguments
542             # into a nice hash. This is fairly lame as I'm not
543             # expecting to get any duplicate values
544             sub parseArgs {
545             my $r = shift;
546             my @args = @_;
547             my %params = ();
548              
549             foreach (@args) {
550             /(.*)=(.*)/;
551             my ($key,$val) = ($1, $2);
552             $params{$key} = $val;
553             }
554              
555             return %params;
556             }
557              
558             # Show picture shows the actual full sized picture,
559             # I might add some cool things like filters and
560             # such since we use ImageMagick for the thumbnails
561             # For now, just show the picture and a caption
562             sub show_picture {
563             my ($r, $album_uri, $thumb_uri, $path_info, $settings) = @_[0..4];
564             my $album_dir = $r->lookup_uri($album_uri)->filename;
565             my $thumb_dir = $r->lookup_uri($thumb_uri)->filename;
566            
567             my $caption = $path_info;
568              
569             my $modified_path_info = "$album_uri/$path_info";
570             my $start_link = "";
571             my $end_link = "";
572             my @slideShow;
573             my($prevSeven, $nextSeven);
574              
575             $caption =~ s!.*/!!;
576             $caption =~ s!\.[^.]*$!!;
577             $caption =~ tr[-_][ ];
578              
579             my $title = $caption;
580              
581             $caption = qq!

$caption

!;
582              
583             my ($path_dir,$path_file) = $path_info =~ m!(.*)/(.*)!;
584              
585             if ($settings->{'AllowFinalResize'}) {
586             my ($max_width, $max_height) = @_[5,6];
587             my %params = split /=+/, $r->args;
588             my $uri = $r->parsed_uri();
589             (my $rpath = $uri->path()) =~ s,/\Q$path_dir\E/[^/]*$,,;
590              
591             for ($params{slide_show}) {
592             /sm/ and do {$max_width=640; $max_height=480; last;};
593             /med/ and do {$max_width=800; $max_height=600; last;};
594             /lg/ and do {$max_width=1024; $max_height=768; last;};
595             /xlg/ and do {$max_width=1600; $max_height=1200; last;};
596             }
597              
598             my $imageSize = "${max_width}x${max_height}_" if $max_width;
599              
600             unless(opendir(IN,"$album_dir/$path_dir")) {
601             $r->log_error("Couldn't open $album_dir/$path_dir: $!");
602             return Apache2::Const::SERVER_ERROR;
603             }
604             my @files = sort grep { !/\.htaccess/ && !/^tn__/
605             && $r->lookup_uri("$album_uri/$_")->content_type =~
606             m!^image/!} readdir(IN);
607             closedir(IN);
608              
609             my $fileIndex;
610             for (my $i=0; $i<@files; $i++) {
611             $fileIndex = $i if $files[$i] eq $path_file;
612             my $thumbLinkFile = $params{slide_show} ?
613             "$files[$i]?slide_show=$params{slide_show}" :
614             "$imageSize$files[$i]";
615             push @slideShow, (
616             qq{
617             . (defined $fileIndex && $fileIndex == $i ?
618             qq{ bgcolor="blue">} : ">")
619             . qq{}
620             # . (defined $fileIndex && $fileIndex == $i ?
621             # qq{
} : "")
622             . qq{
623             . qq{ height=60 alt="$files[$i]">}
624             # . (defined $fileIndex && $fileIndex == $i ?
625             # qq{
} : "")
626             . qq{}
627             . qq{
628             )
629             if ! defined $fileIndex || $fileIndex > $i - 4 || @slideShow < 7;
630             shift @slideShow if @slideShow > 7;
631              
632             }
633              
634             if ( @files > 7 ) {
635             if ( $fileIndex > 3 ) {
636             my $less = $fileIndex - 3 > 7 ? 7 : $fileIndex - 3;
637             my $move = $fileIndex > $#files - 3 ? $#files - $fileIndex : 0;
638             $prevSeven = qq{ 639             ($params{slide_show} ?
640             qq{$files[$fileIndex-$less-$move]?slide_show=$params{slide_show}} :
641             qq{$imageSize$files[$fileIndex-$less-$move]}) .
642             qq{"><Prev $less<};
643             }
644              
645             if ( $fileIndex < $#files - 3 ) {
646             my $more = $#files - 3 - $fileIndex > 7 ? 7 : $#files - 3 - $fileIndex;
647             my $move = $fileIndex < 3 ? 3 - $fileIndex : 0;
648             $nextSeven = qq{ 649             ($params{slide_show} ?
650             qq{$files[$fileIndex+$more+$move]?slide_show=$params{slide_show}} :
651             qq{$imageSize$files[$fileIndex+$more+$move]}) .
652             qq{">>Next $more>};
653             }
654             }
655              
656             if ( $params{slide_show} && $fileIndex < $#files ) {
657             (my $next_file = $files[$fileIndex+1]) =~ s/ /%20/g;
658             $r->headers_out->{Refresh} = $settings->{'SlideShowDelay'}
659             . "; URL=$rpath/$path_dir/$next_file?slide_show=$params{slide_show}";
660             }
661              
662             if ($max_width > 0) {
663             $modified_path_info = "$thumb_uri/$path_dir/"
664             . "/$imageSize$path_file";
665              
666             $settings->{Footer} =~ s/\?slide_show/$path_file?slide_show/g;
667             $settings->{Footer} =~ s/\?all_full_images/.\/?all_full_images/g;
668             $start_link = qq!!;
669             $end_link = qq!!;
670             }
671             }
672              
673             # check for a content.txt file, if I find one
674             # parse it in case there is a caption for this
675             # picture.
676             if ( -f "$album_dir/$path_dir/caption.txt" ) {
677             unless (open (IN,"$album_dir/$path_dir/caption.txt")) {
678             $r->log_error("Could not open $album_dir/$path_dir/caption.txt: $!");
679             return Apache2::Const::SERVER_ERROR;
680             }
681            
682             my $found_end = 0;
683             while () {
684             if (/^__END__/) {
685             $found_end = 1;
686             last;
687             }
688             }
689            
690             if ($found_end) { # Finish parsing file
691             while () {
692             my ($key,@rest) = split(/:/, $_);
693             next if $key ne $path_file;
694             $caption = join(':',@rest);
695             }
696             }
697            
698             close (IN);
699             }
700              
701             my $additionalLinks = "";
702             if (@slideShow) {
703             $additionalLinks = qq{
704            
} } : "") } : "")
705            
706             . ($prevSeven ? qq{ $prevSeven
707             . "@slideShow"
708             . ($nextSeven ? qq{ $nextSeven
709             . qq{
710            
711            
712            
713            
714             }
715             ;
716             }
717              
718             $r->content_type('text/html');
719             #$r->send_http_header();
720             $r->print(<
721            
$title
722            
723             $additionalLinks
724            
$start_link$path_info$end_link
725            
726             $caption
727            
728             $$settings{'Footer'}
729            
730            
Return to Album
731            
732            
733             EOF
734             ;
735              
736             return Apache2::Const::OK;
737             }
738              
739             # list_dirs takes the passed directory list
740             # and recursively prints out lists of directories
741             # below the passed directory
742             sub list_dirs {
743             my ($r, $album_dir, $directory, $old_directory, $settings) = @_;
744              
745             my $text = $directory;
746             $text =~ tr[-_][ ];
747             $text =~ s,\d+\((.*)\),$1,;
748             $r->print(qq!\t
$text
\n!);
749              
750             my @dirs = ();
751              
752             if (opendir(IN, "$album_dir/$directory")) {
753             @dirs = grep { -d "$album_dir/$directory/$_"
754             && ! /^\./
755             } readdir(IN);
756             closedir(IN);
757             }
758             else {
759             $r->log_error("Could not open $album_dir/$directory: $!");
760             }
761              
762             @dirs = sort @dirs;
763              
764             if (-f "$album_dir/$directory/.htaccess") {
765             my $override = 0;
766              
767             # check if ReverseDirs is specified in here
768             if (open (IN, "$album_dir/$directory/.htaccess")) {
769             while () {
770             if (/ReverseDirs\s+(.*)$/) {
771             @dirs = reverse @dirs
772             if $1;
773             $override = 1;
774             }
775             }
776             close IN;
777              
778             unless ($override) {
779             @dirs = reverse @dirs
780             if $settings->{'ReverseDirs'};
781             }
782            
783             }
784             else {
785             @dirs = reverse @dirs
786             if $settings->{'ReverseDirs'};
787             }
788             }
789             else {
790             @dirs = reverse @dirs
791             if $settings->{'ReverseDirs'};
792             }
793            
794             if (@dirs) {
795             $r->print("\t
\n");
796             foreach (@dirs) {
797             &list_dirs($r, "$album_dir/$directory", $_, "$old_directory$directory/", $settings);
798             }
799             $r->print("\t\n");
800             }
801             }
802              
803             # file_upload is just the html for the file upload
804             # it's in a sub since it will be called from multiple
805             # places
806             sub file_upload {
807              
808             my $ret = <
809            
810            
811            
812            
813             EOF
814             ;
815              
816             return $ret;
817             }
818              
819             sub create_final_resize {
820             my ($r, $settings, $album_dir, $thumb_dir, $path_info, $filename, $o_width, $o_height) = @_;
821              
822             my $q = new Image::Magick;
823             $q->Read("$album_dir/$path_info/$filename");
824              
825             my $ratio = $o_width / $o_height if $o_height;
826              
827             # X-Large is 1600x1200
828             if ($o_width > 1600) {
829             my $f_height = 0;
830             $f_height = 1600 / $ratio if $ratio;
831            
832             my $q = $q->Clone();
833             unless ($q) {
834             $r->log_error("Couldn't create a new Image::Magick object");
835             return Apache2::Const::SERVER_ERROR;
836             }
837            
838             $q->Scale( width => 1600, height => $f_height );
839             $q->Write("$thumb_dir/$path_info/"
840             . "/1600x1200_$filename");
841             }
842            
843             # Large is 1024x768
844             if ($o_width > 1024) {
845             my $f_height = 0;
846             $f_height = 1024 / $ratio if $ratio;
847            
848             my $q = $q->Clone();
849             unless ($q) {
850             $r->log_error("Couldn't create a new Image::Magick object");
851             return Apache2::Const::SERVER_ERROR;
852             }
853            
854             $q->Scale( width => 1024, height => $f_height );
855             $q->Write("$thumb_dir/$path_info/"
856             . "/1024x768_$filename");
857             }
858            
859             # Med is 800x600
860             if ($o_width > 800) {
861             my $f_height = 0;
862             $f_height = 800 / $ratio if $ratio;
863            
864             my $q = $q->Clone();
865             unless ($q) {
866             $r->log_error("Couldn't create a new Image::Magick object");
867             return Apache2::Const::SERVER_ERROR;
868             }
869            
870             $q->Scale( width => 800, height => $f_height );
871             $q->Write("$thumb_dir/$path_info/"
872             . "/800x600_$filename");
873             }
874            
875             # Sm is 640x480
876             if ($o_width > 640) {
877             my $f_height = 0;
878             $f_height = 640 / $ratio if $ratio;
879            
880             my $q = $q->Clone();
881             unless ($q) {
882             $r->log_error("Couldn't create a new Image::Magick object");
883             return Apache2::Const::SERVER_ERROR;
884             }
885            
886             $q->Scale( width => 640, height => $f_height );
887             $q->Write("$thumb_dir/$path_info/"
888             . "/640x480_$filename");
889             }
890            
891             }
892              
893             sub update_settings {
894             my ($r, $settings, $album_dir, $path_info) = @_;
895             my $current_path = "$album_dir/";
896             foreach my $next_dir (split(m|/|, $path_info)) {
897             $current_path .= "$next_dir/";
898              
899             # check to see if there is an .htaccess file there, if so
900             # parse it looking for PerlSetVar's that override the defaults/
901             # httpd.conf files
902             if ( -f "$current_path/.htaccess") {
903             if (open (IN,"$current_path/.htaccess")) {
904             while () {
905             next if /^\s*$/;
906             next if /^\#/;
907             if (/^PerlSetVar\s+(\w+)\s+(.*)$/) {
908             my ($key,$value) = ($1,$2);
909             $settings->{$key} = $value;
910             }
911             }
912             close IN;
913             }
914             else {
915             $r->log_error("Couldn't open $current_path/.htaccess: $!");
916             }
917             }
918             }
919             }
920              
921             sub mymkdir {
922             my ($dir, $mode) = @_;
923             my @dir = split('/', $dir);
924             my $curDir = "";
925              
926             foreach (@dir) {
927             next unless $_;
928             $curDir .= "/$_";
929              
930             mkdir($curDir, $mode)
931             unless (-d $curDir);
932             }
933             }
934            
935              
936              
937             1;
938             __END__