Foorum
view release on metacpan or search on metacpan
lib/Foorum/TheSchwartz/Worker/ResizeProfilePhoto.pm view on Meta::CPAN
package Foorum::TheSchwartz::Worker::ResizeProfilePhoto;
use strict;
use warnings;
our $VERSION = '1.001000';
use base qw( TheSchwartz::Moosified::Worker );
use Foorum::SUtils qw/schema/;
use Foorum::XUtils qw/base_path/;
use Image::Magick;
use File::Copy ();
use File::Spec;
sub work {
my $class = shift;
my $job = shift;
my @args = $job->arg;
my $schema = schema();
my $base_path = base_path();
# get upload from db
my $upload_id = shift @args;
if ( $upload_id !~ /^\d+$/ ) {
return $job->failed("Wrong upload_id: $upload_id");
}
my $upload
= $schema->resultset('Upload')->find( { upload_id => $upload_id } );
unless ($upload) {
return $job->failed("No upload for $upload_id");
}
# get file dir
my $directory_1 = int( $upload_id / 3200 / 3200 );
my $directory_2 = int( $upload_id / 3200 );
my $file = abs_path(
File::Spec->catfile(
$base_path, 'root',
'upload', $directory_1,
$directory_2, $upload->filename
)
);
# resize photo
my $p = new Image::Magick;
$p->Read($file);
$p->Scale( geometry => '120x120' );
$p->Sharpen( geometry => '0.0x1.0' );
$p->Set( quality => '75' );
my ( $width, $height, $size ) = $p->Get( 'width', 'height', 'filesize' );
my $tmp_file = $file . '.tmp';
$p->Write($tmp_file);
File::Copy::move( $tmp_file, $file );
# update db
$schema->resultset('UserProfilePhoto')->search(
{ type => 'upload',
value => $upload_id,
}
)->update(
{ width => int($width),
height => int($height),
}
);
$size /= 1024; # I want K
($size) = ( $size =~ /^(\d+\.?\d{0,1})/ ); # float(6,1)
$upload->update( { filesize => $size } );
$job->completed();
}
sub max_retries {3}
1;
__END__
=pod
=head1 NAME
Foorum::TheSchwartz::Worker::ResizeProfilePhoto - resize profile photo in cron job
=head1 SYNOPSIS
# check bin/cron/TheSchwartz_client.pl and bin/cron/TheSchwartz_worker.pl for usage
=head1 DESCRIPTION
Since L<Image::Magick> is a bit heavy to load into httpd, we move use Image::Magick; in this cron job.
=head1 SEE ALSO
L<TheSchwartz>
=head1 AUTHOR
Fayland Lam <fayland at gmail.com>
=cut
( run in 1.472 second using v1.01-cache-2.11-cpan-5735350b133 )