From: Steinar H. Gunderson Date: Sat, 28 Nov 2015 15:37:54 +0000 (+0100) Subject: Split infobox generation out into its own function. X-Git-Url: https://git.sesse.net/?p=pr0n;a=commitdiff_plain;h=45ee05e19e1039e74e2b7ca4955b007d2cd3ed69 Split infobox generation out into its own function. --- diff --git a/perl/Sesse/pr0n/Common.pm b/perl/Sesse/pr0n/Common.pm index 6685008..c706bb7 100644 --- a/perl/Sesse/pr0n/Common.pm +++ b/perl/Sesse/pr0n/Common.pm @@ -569,15 +569,13 @@ sub read_original_image { } sub ensure_cached { - my ($r, $filename, $id, $dbwidth, $dbheight, $infobox, $dpr, $xres, $yres, @otherres) = @_; + my ($r, $filename, $id, $dbwidth, $dbheight, $dpr, $xres, $yres, @otherres) = @_; my ($new_dbwidth, $new_dbheight); my $fname = get_disk_location($r, $id); - if (!$infobox) { - unless (defined($xres) && (!defined($dbwidth) || !defined($dbheight) || $xres < $dbwidth || $yres < $dbheight || $xres == -1)) { - return ($fname, undef); - } + unless (defined($xres) && (!defined($dbwidth) || !defined($dbheight) || $xres < $dbwidth || $yres < $dbheight || $xres == -1)) { + return ($fname, undef); } my $cachename = get_cache_location($r, $id, $xres, $yres, $infobox, $dpr); @@ -590,56 +588,6 @@ sub ensure_cached { error($r, 'System is in overload mode, not doing any scaling'); } - # If we're being asked for the box, make a new image with it. - # We don't care about @otherres since each of these images are - # already pretty cheap to generate, but we need the exact width so we can make - # one in the right size. - if ($infobox) { - my ($img, $width, $height); - - # This is slow, but should fortunately almost never happen, so don't bother - # special-casing it. - if (!defined($dbwidth) || !defined($dbheight)) { - $img = read_original_image($r, $filename, $id, $dbwidth, $dbheight, 0); - $new_dbwidth = $width = $img->Get('columns'); - $new_dbheight = $height = $img->Get('rows'); - } else { - $img = Image::Magick->new; - $width = $dbwidth; - $height = $dbheight; - } - - if (defined($xres) && defined($yres)) { - ($width, $height) = scale_aspect($width, $height, $xres, $yres); - } - $height = 24 * $dpr; - $img->Set(size=>($width . "x" . $height)); - $img->Read('xc:white'); - - my $info = Image::ExifTool::ImageInfo($fname); - if (make_infobox($img, $info, $r, $dpr)) { - $img->Quantize(colors=>16, dither=>'False'); - - # Since the image is grayscale, ImageMagick overrides us and writes this - # as grayscale anyway, but at least we get rid of the alpha channel this - # way. - $img->Set(type=>'Palette'); - } else { - # Not enough room for the text, make a tiny dummy transparent infobox - @$img = (); - $img->Set(size=>"1x1"); - $img->Read('null:'); - - $width = 1; - $height = 1; - } - - $err = $img->write(filename => $cachename, quality => 90, depth => 8); - log_info($r, "New infobox cache: $width x $height for $id.jpg"); - - return ($cachename, 'image/png'); - } - my $img; ($img, $new_dbwidth, $new_dbheight) = make_mipmap($r, $filename, $id, $dbwidth, $dbheight, $xres, $yres, @otherres); @@ -713,6 +661,70 @@ sub ensure_cached { return ($cachename, 'image/jpeg'); } +sub ensure_infobox_cached { + my ($r, $filename, $id, $dbwidth, $dbheight, $infobox, $dpr, $xres, $yres) = @_; + + my ($new_dbwidth, $new_dbheight); + + my $fname = get_disk_location($r, $id); + my $cachename = get_cache_location($r, $id, $xres, $yres, 1, $dpr); + my $err; + if (! -r $cachename or (-M $cachename > -M $fname)) { + # If we are in overload mode (aka Slashdot mode), refuse to generate + # new thumbnails. + if (Sesse::pr0n::Overload::is_in_overload($r)) { + log_warn($r, "In overload mode, not scaling $id to $xres x $yres"); + error($r, 'System is in overload mode, not doing any scaling'); + } + + # We need the exact width so we can make one in the right size. + my ($width, $height); + + # This is slow, but should fortunately almost never happen, so don't bother + # special-casing it. + if (!defined($dbwidth) || !defined($dbheight)) { + my $img = read_original_image($r, $filename, $id, $dbwidth, $dbheight, 0); + $new_dbwidth = $width = $img->Get('columns'); + $new_dbheight = $height = $img->Get('rows'); + } else { + $width = $dbwidth; + $height = $dbheight; + } + my $img = Image::Magick->new; + + if (defined($xres) && defined($yres)) { + ($width, $height) = scale_aspect($width, $height, $xres, $yres); + } + $height = 24 * $dpr; + $img->Set(size=>($width . "x" . $height)); + $img->Read('xc:white'); + + my $info = Image::ExifTool::ImageInfo($fname); + if (make_infobox($img, $info, $r, $dpr)) { + $img->Quantize(colors=>16, dither=>'False'); + + # Since the image is grayscale, ImageMagick overrides us and writes this + # as grayscale anyway, but at least we get rid of the alpha channel this + # way. + $img->Set(type=>'Palette'); + } else { + # Not enough room for the text, make a tiny dummy transparent infobox + @$img = (); + $img->Set(size=>"1x1"); + $img->Read('null:'); + + $width = 1; + $height = 1; + } + + $err = $img->write(filename => $cachename, quality => 90, depth => 8); + log_info($r, "New infobox cache: $width x $height for $id.jpg"); + + return ($cachename, 'image/png'); + } +} + + sub get_mimetype_from_filename { my $filename = shift; my MIME::Type $type = $mimetypes->mimeTypeOf($filename); diff --git a/perl/Sesse/pr0n/Image.pm b/perl/Sesse/pr0n/Image.pm index 6a4f7a8..4e272fa 100644 --- a/perl/Sesse/pr0n/Image.pm +++ b/perl/Sesse/pr0n/Image.pm @@ -51,7 +51,12 @@ sub handler { $dbheight = $ref->{'height'}; # Scale if we need to do so - my ($fname, $mime_type) = Sesse::pr0n::Common::ensure_cached($r, $filename, $id, $dbwidth, $dbheight, $infobox, $dpr, $xres, $yres); + my ($fname, $mime_type); + if ($infobox) { + ($fname, $mime_type) = Sesse::pr0n::Common::ensure_infobox_cached($r, $filename, $id, $dbwidth, $dbheight, $dpr, $xres, $yres); + } else { + ($fname, $mime_type) = Sesse::pr0n::Common::ensure_cached($r, $filename, $id, $dbwidth, $dbheight, $dpr, $xres, $yres); + } # Output the image to the user my $res = Plack::Response->new(200); diff --git a/perl/Sesse/pr0n/WebDAV.pm b/perl/Sesse/pr0n/WebDAV.pm index fb365e7..678db98 100644 --- a/perl/Sesse/pr0n/WebDAV.pm +++ b/perl/Sesse/pr0n/WebDAV.pm @@ -493,7 +493,7 @@ EOF if ($filename !~ /^\.(_|DS_Store)/) { # FIXME: Ideally we'd want to ensure cache of -1x-1 here as well (for NEFs), but that would # preclude mipmapping in its current form. - Sesse::pr0n::Common::ensure_cached($r, $filename, $newid, undef, undef, 0, 1, 80, 64, 320, 256); + Sesse::pr0n::Common::ensure_cached($r, $filename, $newid, undef, undef, 1, 80, 64, 320, 256); } # OK, we got this far, commit diff --git a/perl/update-image-cache.pl b/perl/update-image-cache.pl index 8a19841..213a7a0 100755 --- a/perl/update-image-cache.pl +++ b/perl/update-image-cache.pl @@ -101,7 +101,6 @@ while (my $ref = $q->fetchrow_hashref) { if (!$regen_mipmaps) { @files = grep { !/mipmap/ } @files; } - my @bothres = (); my @boxres = (); my @noboxres = (); my $any_old = 0; @@ -110,9 +109,7 @@ while (my $ref = $q->fetchrow_hashref) { if ($mtime < $threshold) { $any_old = 1; } - if ($c =~ /$id-(\d+)-(\d+)\.jpg/ || $c =~ /$id-(-1)-(-1)\.jpg/) { - push @bothres, [$1, $2]; - } elsif ($c =~ /$id-(\d+)-(\d+)-nobox\.jpg/ || $c =~ /$id-(-1)-(-1)-nobox\.jpg/) { + if ($c =~ /$id-(\d+)-(\d+)-nobox\.jpg/ || $c =~ /$id-(-1)-(-1)-nobox\.jpg/) { push @noboxres, [$1, $2]; } elsif ($c =~ /$id-(\d+)-(\d+)-box\.png/ || $c =~ /$id-(-1)-(-1)-box\.png/) { push @boxres, [$1, $2]; @@ -120,14 +117,11 @@ while (my $ref = $q->fetchrow_hashref) { } next unless $any_old; unlink (@files); - if (scalar @bothres > 0) { - Sesse::pr0n::Common::ensure_cached($r, $ref->{'filename'}, $id, $ref->{'width'}, $ref->{'height'}, 'both', 1, sort_res(@bothres)); - } if (scalar @noboxres > 0) { - Sesse::pr0n::Common::ensure_cached($r, $ref->{'filename'}, $id, $ref->{'width'}, $ref->{'height'}, 'nobox', 1, sort_res(@noboxres)); + Sesse::pr0n::Common::ensure_cached($r, $ref->{'filename'}, $id, $ref->{'width'}, $ref->{'height'}, 1, sort_res(@noboxres)); } if (scalar @boxres > 0) { - Sesse::pr0n::Common::ensure_cached($r, $ref->{'filename'}, $id, $ref->{'width'}, $ref->{'height'}, 'box', 1, sort_res(@boxres)); + Sesse::pr0n::Common::ensure_infobox_cached($r, $ref->{'filename'}, $id, $ref->{'width'}, $ref->{'height'}, 1, sort_res(@boxres)); } my @newfiles = glob("../cache/$dir/$id-*.jpg");