####################################################################### # thumbnailing sub is_ungainly { my $fn = shift; return $fn =~ /tif$/ || $fn =~ /bmp/; } sub thumbnail_filename { my ($filename) = @_; if (is_ungainly($filename)) { $filename =~ s/\..*$/.jpg/; } return lc $filename; } sub make_image_thumb { my ($args) = @_; my $file = $args->{file}; my $key = $args->{key} || "t."; my $maxwidth = $args->{maxwidth} || 450; my $maxheight = $args->{maxheight} || 450; my $filename = $file->{filename}; my $lcfilename = thumbnail_filename($filename); use integer; $key = "t." if (!defined($key)); print $file->{filename} if ($DEBUG); my ($xold, $yold) = imgsize(qq!$data_path/$file->{thread}/$filename!); my $x = $xold; my $y = $yold; my @convert_args = (); push @convert_args, "$data_path/$file->{thread}/$filename"; if ($filename =~ /.gif$/) { push @convert_args, "-coalesce"; } push @convert_args, "-geometry"; if ($maxheight < 1 && $maxwidth < 1) { push @convert_args, "450x450"; } elsif ($maxwidth < 1 || $key eq "b.") { push @convert_args, "450x".$maxheight; } elsif ($maxheight < 1) { push @convert_args, $maxwidth; } else { push @convert_args, $maxwidth."x".$maxheight; } print "\n$filename -> .thumb/$key$lcfilename\n" if ($DEBUG); print "old size: $xold x $yold\n" if ($DEBUG); if ($filename =~ /.gif$/) { push @convert_args, "+map"; } push @convert_args, "$data_path/$file->{thread}/.thumb/$key$lcfilename"; if ($DEBUG) { print join " ", @convert_args; print "\n"; } system($CONVERT_PATH, @convert_args); system($CHMOD_PATH, 755, "$data_path/$file->{thread}/.thumb/$key$lcfilename"); } # make a square thumbnail: # crop bottom if portrait, crop sides if landscape sub make_square_thumb { my ($file, $maxwidth, $key) = @_; my $filename = $file->{filename}; my $lcfilename = lc($file->{filename}); my $_temp_thumb = $filename; use integer; $key = "t." if (!defined($key)); # x = width, y = height my ($xold, $yold) = imgsize(qq!$data_path/$file->{thread}/$file->{filename}!); my $x = $xold; my $y = $yold; my $ydiff = 0; my $xdiff = 0; my @convert_args; if ($x != $y) # we must crop { if ($x < $y) { push @convert_args, "-crop", $x."x".$x; $y = $x; } elsif ($y < $x) { $xdiff = ($x - $y) / 2; push @convert_args, "-crop", $y."x".$y.'+'.$xdiff; $x = $y; } $_temp_thumb = ".thumb/temporary.jpg"; push @convert_args, "$data_path/$file->{thread}/$filename"; push @convert_args, "$data_path/$file->{thread}/$_temp_thumb"; print "\n$filename -> .thumb/$key$lcfilename\n" if ($DEBUG); print "old size: $xold x $yold\n" if ($DEBUG); print "new size: $x x $y\n" if ($DEBUG); if ($DEBUG) { print join " ", @convert_args; print "\n"; } system($CONVERT_PATH, @convert_args); for ($i = 0; $i < 4; $i++) { my $_temp_thumb_cropped = $_temp_thumb; $_temp_thumb_cropped =~ s/.jpg$/-$i.jpg/; ($xold, $yold) = imgsize(qq!$data_path/$file->{thread}/$_temp_thumb_cropped!); if ($xold == $x) { $_temp_thumb = $_temp_thumb_cropped; last; } } } @convert_args = (); push @convert_args, "-geometry"; push @convert_args, $maxwidth."x".$maxwidth; push @convert_args, "$data_path/$file->{thread}/$_temp_thumb"; push @convert_args, "$data_path/$file->{thread}/.thumb/$key$lcfilename"; if ($DEBUG) { print join " ", @convert_args; print "\n"; } system($CONVERT_PATH, @convert_args); system($CHMOD_PATH, 755, "$data_path/$file->{thread}/.thumb/$key$lcfilename"); system($RM_PATH, "$data_path/$file->{parent_id}/.thumb/temporary.jpg"); system($RM_PATH, "$data_path/$file->{parent_id}/.thumb/temporary-0.jpg"); system($RM_PATH, "$data_path/$file->{parent_id}/.thumb/temporary-1.jpg"); system($RM_PATH, "$data_path/$file->{parent_id}/.thumb/temporary-2.jpg"); } sub print_image_thumb { my ($file, $thumb_token, $string) = @_; my $lcfilename = thumbnail_filename($file->{filename}); $thumb_token = "t." if (!defined($thumb_token)); print qq!!; my $keyword = $file->{keyword} || "details"; if ( $keyword == -1 ) { $keyword = "details"; } if ($string == -1) { print qq!!; } else { print qq!!; } print qq!!; print qq(); if ($string != -1) { print qq(
); if (length($file->{title})) { print $file->{title}; } else { print clean_image_filename($file->{filename}); } print qq! (! . profile_link($file->{username}) . qq!, ! . get_age($file->{date}) . qq!)!; print qq(); } print qq!!; print qq!!; } sub clean_image_filename { my ($filename) = @_; return if ($filename =~ /IMG|DSC/); $filename =~ s/[-_]/ /g; $filename =~ s/\....$//; return $filename; } sub curt_filename { my ($fn) = @_; if (length($fn->{filename}) > 27 && $fn->{filename} !~ / /) { my $filen = substr $fn->{filename}, 0, 24; my $filext = substr $fn->{filename}, -4, 4; return "$filen..$filext"; } else { return $fn->{filename}; } } sub print_flagged_jpeg { my ($f) = @_; my $lcfilename = thumbnail_filename($f->{filename}); make_image_thumb( { file => $f, maxwidth => 390, # maxheight => 305, key => "s." } ) if (! -e qq!$data_path/$f->{thread}/.thumb/s.$lcfilename!); print qq!!; } ####################################################################################### # image gallery building sub get_profile_image { my ($username, $prefix) = @_; if (defined($prefix)) { if (-e $data_path."/profile/.thumb/$prefix$username.jpg") { qq($live_path/profile/.thumb/$prefix$username.jpg) } else { qq($live_path/profile/.thumb/$prefix)."default".qq(.jpg) } } elsif (-e $data_path."/profile/$username.jpg") { qq($live_path/profile/$username.jpg) } else { -1 } } sub image_gallery { my ($files, $flagged, $many_jpgs) = @_; my $i = 0; my $j = 0; print ""; foreach my $f (sort { $a->{date} <=> $b->{date} } @$files) { next if ($f->{filename} !~ /(jpe?g|gif|png|bmp|tif)$/i); next if (($f->{id} == $flagged->{id}) && ($many_jpgs % 3) == 1); my $lcfilename = thumbnail_filename($f->{filename}); make_image_thumb( { file => $f, maxwidth => 145, maxheight => 120, key => "t." }) if (! -e qq($data_path/$f->{thread}/.thumb/t.).$lcfilename); make_image_thumb( { file => $f, maxwidth => 210, maxheight => 110, key => "b." }) if (! -e qq($data_path/$f->{thread}/.thumb/b.).$lcfilename); print "\n" if ($j == 0); print_image_thumb($f, "t."); print "\n" if ($j == 2); $j = $j == 2 ? 0 : $j+1; $i++; } print qq!
\n!; return $i; } sub image_column { my ($files, $flagged, $many_jpgs) = @_; my $i = 0; my $j = 0; if ($many_jpgs > 5) { $thumb_token = "t."; } else { $thumb_token = "b."; } print qq(); foreach my $f (sort { $a->{date} <=> $b->{date} } @$files) { next if ($f->{filename} !~ /(jpe?g|gif|png|bmp|tif)$/i); next if ($f->{id} == $flagged->{id}); my $lcfilename = thumbnail_filename($f->{filename}); make_image_thumb( { file => $f, maxwidth => 145, maxheight => 120, key => "t." }) if (! -e qq($data_path/$f->{thread}/.thumb/t.).$lcfilename); make_image_thumb( { file => $f, maxwidth => 210, maxheight => 110, key => "b." }) if (! -e qq($data_path/$f->{thread}/.thumb/b.).$lcfilename); if ($many_jpgs-1 == 4) # tile in a square { if ($i % 2 == 0) { print qq(\n); print_image_thumb($f, $thumb_token); } else { print_image_thumb($f, $thumb_token); print qq(\n); } } else { print qq(\n); print_image_thumb($f, $thumb_token); print qq(\n); } $i++; } print qq!
\n!; return $i; } sub index_photostream { my ($keyword,$tag) = @_; if (2 != 1) { photostream({ recent => 1, vertical => 0, count => $INDEX_GALLERY_IMAGE_COUNT }); return; } else { print ""; $i = 4; print <<__CROWS__; __CROWS__ print "
\n"; return; } if (check_key($USER->{boxes}, "photostream") || ($USER == -1) ) { if ( $keyword ne "all" ) { photostream({ keyword => $keyword, vertical => 0, count => 4 }); } elsif ( $tag ) { photostream({ tag => $tag, vertical => 0, count => 4 }); } else { photostream({ user => 1, vertical => 0, count => 4 }); } } } sub photostream { my ($args) = @_; my $vertical = $args->{vertical}; my $count = $args->{count}; my $user = $args->{user}; my $recent = $args->{recent}; my $keyword = $args->{keyword}; my $tag = $args->{tag}; if ( $recent ) { $args->{files} = get_recent_files(); recent_image_gallery( $args ); } elsif ( $keyword ) { # TODO: privacy check $args->{files} = get_keyword_files( $keyword ); if ($args->{files} != -1) { user_image_gallery( $args ); } } elsif ( $tag ) { $args->{files} = get_tag_files( $tag ); if ($args->{files} != -1) { user_image_gallery( $args ); } } else { for (my $i = 0; $i < 3; $i++) { my $username = get_random_user(); $username = $BUCKY_ADMINISTRATOR if ($i == 2); my ($count, $size) = count_user_files($username); next unless ($count > 3); $args->{files} = get_user_files( $username ); if ($args->{files} != -1) { user_image_gallery( $args ); return; } } } } sub recent_image_gallery { my ($args) = @_; my $files = $args->{files}; my $count = $args->{count} || 4; my %seen; print qq(); print ""; my $i = 0; for my $f (@$files) { if (lc($f->{filename}) =~ /(jpe?g|gif|png)$/) { if (! -e qq($data_path/$f->{thread}/.thumb/t.).lc($f->{filename})) { make_image_thumb( { file => $f, maxwidth => 145, maxheight => 120, key => "t." }) } print_image_thumb($f, "t.", -1); $i++; last if ($i == $count); } } print "" if (!$vertical); print qq!
\n!; } sub user_image_gallery { my ($args) = @_; my $files = $args->{files}; my $vertical = $args->{vertical} ? 1 : 0; my $count = $args->{count} || 4; my %seen; print qq(); print "" if (!$vertical); for (my $i = 0; $i < $count; $i++) { my $f = get_random_image($files, \%seen, $i); last if ($f == -1); make_image_thumb( { file => $f, maxwidth => 145, maxheight => 120, key => "t." }) if (! -e qq($data_path/$f->{thread}/.thumb/t.).lc($f->{filename})); print "" if ($vertical); print_image_thumb($f, "t.", -1); print "" if ($vertical); print "\n"; } print "" if (!$vertical); print qq!
\n!; } sub get_random_image { my ($files, $seen, $i) = @_; my $f; $c = 0; while ($f = $files->[(int rand @$files)]) { return -1 if ((++$c) == 69); print "$i/$c: $f->{id} -- $f->{private} -- $seen->{$f->{id}}
" if ($DEBUG); next if (exists($seen->{$f->{id}})); $seen->{$f->{id}} = 1; next if ($f->{filename} !~ /(jpe?g|gif|png|bmp|tif)$/i); last if ( ( $USER == -1 && $f->{private} > 0 ) || ( ref($USER) && $f->{private} > 1 ) ); last; } return $f; } sub find_jpeg { my ($files, $flagged_id) = @_; my $flagged = -1; my $fagid = -1; my $i = 0; my $j = 0; foreach my $f (@$files) { if ($$f{filename} =~ /(jpe?g|gif|png|bmp|tif)$/i) { if ($$f{id} == $flagged_id || $flagged == -1) { $fagid = $$f{id}; $flagged = $i; } $j++; } $i++; } if ($flagged > -1) { print_flagged_jpeg($files->[$flagged]) } return ($j, $fagid); } sub find_jpeg_v2 { my ($files, $flagged_id) = @_; my $flagged = -1; my $fagid = -1; my $i = 0; my $j = 0; foreach my $f (@$files) { if ($$f{filename} =~ /(jpe?g|gif|png|bmp|tif)$/i) { if ($$f{id} == $flagged_id || $flagged == -1) { $fagid = $$f{id}; $flagged = $i; } $j++; } $i++; } if ($flagged > -1) { return ($j, $files->[$flagged]); } else { return ($j, -1); } } 1;