From fc12d7ce1e642c41147a02a7723c179ad5b9e394 Mon Sep 17 00:00:00 2001 From: Alex 'AdUser' Z Date: Sun, 10 May 2015 18:57:14 +1000 Subject: [PATCH] + LDV::Imgbin --- lib/LDV/Imgbin.pm | 127 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 lib/LDV/Imgbin.pm diff --git a/lib/LDV/Imgbin.pm b/lib/LDV/Imgbin.pm new file mode 100644 index 0000000..7715b61 --- /dev/null +++ b/lib/LDV/Imgbin.pm @@ -0,0 +1,127 @@ +package LDV::Imgbin; + +use strict; +use warnings; +use utf8; + +use Mojo::Base 'Mojolicious::Controller'; +use Mojo::JSON; +use Mojo::Asset::File; +use Imager; + +sub _data_path { + my ($self, $time) = @_; + my $root = $self->app->config->{imgbin}->{root}; + + return $self->app->home->rel_file("$root/$time.json"); +} + +sub _image_path { + my ($self, $time, $ext, $full) = @_; + + return "/images/full/$time.$ext" unless $full; + return $self->app->home->rel_file("public/images/full/$time.$ext"); +} + +sub _thumb_path { + my ($self, $time, $full) = @_; + my $ext = $self->app->config->{imgbin}->{thumbs_ext}; + + return "/images/small/$time.$ext" unless $full; + return $self->app->home->rel_file("public/images/small/$time.$ext"); +} + +sub create { + my ($self) = @_; + + $self->stash(maxsize => $self->config->{imgbin}->{maxsize}); + $self->render(); +} + +sub view { + my ($self) = @_; + my $time = $self->stash('time'); + + eval { + my $path = $self->_data_path($time); + my $data = Mojo::Asset::File->new(path => $path); + $data->cleanup(0); + my $json = Mojo::JSON->new->decode($data->slurp); + $json->{path} = $self->_image_path($time, $json->{format}); + + $self->stash(image => $json); 1; + $self->render(); 1; + } or do { + $self->flash(error => $@); + $self->redirect_to('/imgbin'); + }; + + $self->rendered(); +} + +sub save { + my ($self) = @_; + + eval { + die ("request too large\n") if $self->req->is_limit_exceeded; + + my $time = time(); + my $conf = $self->app->config->{imgbin}; + my $upload = $self->req->upload('file'); + my $expire = $self->req->param('expire') || 7; # days + die("no file uploaded\n") unless ($upload and $upload->size > 0); + die("file too large\n") if ($upload->size > $conf->{maxsize}); + + # hack: don't use memory backend + { + my $path = POSIX::tmpnam; + $upload->move_to($path); + $upload->asset(Mojo::Asset::File->new(path => $path)); + $upload->asset->cleanup(1); # rearm self-destruction + } + + my ($im_w, $im_h) = ($conf->{maxres} =~ m/(\d+)x(\d+)/oi); + Imager->set_file_limits( + width => $im_w, height => $im_h, + bytes => $conf->{maxsize}, + ); + + my $image = Imager->new(file => $upload->asset->path) + or die Imager->errstr(); + + my $json = { + comment => $image->tags(name => 'i_comment') // '', + format => $image->tags(name => 'i_format'), + expire => $time + $expire * 86400, # expired *after* this time + width => $image->getwidth, + height => $image->getheight, + name => $upload->filename, + size => $upload->size, + }; + + my ($th_w, $th_h) = ($conf->{thumbs_size} =~ m/(\d+)x(\d+)/oi); + my $thumb = $image->scale(xpixels => $th_w, ypixels => $th_h, type => 'min'); + $thumb->write(file => $self->_thumb_path($time, 'fullpath')) + or die $thumb->errstr; + $upload->move_to($self->_image_path($time, $json->{format}, 'fullpath')); + + my $data = Mojo::Asset::File->new(path => $self->_data_path($time)); + $data->add_chunk(Mojo::JSON->new->encode($json)); + $data->move_to($self->_data_path($time)); + + $self->redirect_to("/imgbin/$time"); + } or do { + $self->flash(error => $@); + $self->redirect_to('/imgbin'); + }; + + $self->rendered(); +} + +sub prune { + my ($self) = @_; + + die("unimplemented\n"); +} + +1;