diff --git a/fotostore.pl b/fotostore.pl index 3599998..647480f 100644 --- a/fotostore.pl +++ b/fotostore.pl @@ -6,43 +6,110 @@ use Mojolicious::Lite; # app, get, post is exported. use File::Basename 'basename'; use File::Path 'mkpath'; -use Image::Magick; +use File::Spec 'catfile'; +use Cwd; +use Getopt::Long; + +use Imager; + +my $predefined_user = 'alpha6'; +my $predefined_password = ""; +GetOptions('password=s', \$predefined_password); + +die "No user password defined!" unless($predefined_password); # Image base URL -my $IMAGE_BASE = '/image-bbs/image'; -my $ORIG_DIR = '/orig'; -my $width = 640; -my $height = 480; +my $IMAGE_BASE = 'images'; +my $ORIG_DIR = 'orig'; + +my $thumbs_size = 200; + +my @scale_width = ($thumbs_size, 640, 800, 1024); # Directory to save image files # (app is Mojolicious object. static is MojoX::Dispatcher::Static object) -my $IMAGE_DIR = app->static->root . $IMAGE_BASE; +my $IMAGE_DIR = File::Spec->catfile(getcwd(), 'public', $IMAGE_BASE); # Create directory if not exists unless (-d $IMAGE_DIR) { mkpath $IMAGE_DIR or die "Cannot create directory: $IMAGE_DIR"; } -unless (-d $IMAGE_DIR.$ORIG_DIR) { - mkpath $IMAGE_DIR.$ORIG_DIR or die "Cannot create directory: $IMAGE_DIR$ORIG_DIR"; + +my $ORIG_PATH = File::Spec->catfile($IMAGE_DIR, $ORIG_DIR); +unless (-d $ORIG_PATH) { + mkpath $ORIG_PATH or die "Cannot create directory: $ORIG_PATH"; } +for my $dir (@scale_width) { + my $scaled_dir_path = File::Spec->catfile($IMAGE_DIR, $dir); + unless (-d $scaled_dir_path) { + mkpath $scaled_dir_path or die "Cannot create directory: $scaled_dir_path"; + } +} + +plugin 'authentication', { + autoload_user => 1, + load_user => sub { + my $self = shift; + my $uid = shift; + + return { + 'username' => $predefined_user, + 'password' => $predefined_password, + 'name' => 'User Name' + } if ($uid eq 'userid' || $uid eq 'useridwithextradata'); + return undef; + }, + validate_user => sub { + my $self = shift; + my $username = shift || ''; + my $password = shift || ''; + my $extradata = shift || {}; + + # return 'useridwithextradata' if($username eq 'alpha6' && $password eq 'qwerty' && ( $extradata->{'ohnoes'} || '' ) eq 'itsameme'); + return 'userid' if($username eq $predefined_user && $password eq $predefined_password); + return undef; + }, +}; + +post '/login' => sub { + my $self = shift; + my $u = $self->req->param('username'); + my $p = $self->req->param('password'); + + if ($self->authenticate($u, $p)) { + $self->redirect_to('/'); + } else { + $self->render(text => 'Login failed :('); + } + +}; + +get '/logout' => sub { + my $self = shift; + + $self->logout(); + $self->render(text => 'bye'); +}; + # Display top page get '/' => sub { my $self = shift; + my $thumbs_dir = File::Spec->catfile($IMAGE_DIR, $thumbs_size); # Get file names(Only base name) - my @images = map {basename($_)} glob("$IMAGE_DIR/*.jpg $IMAGE_DIR/*.gif $IMAGE_DIR/*.png"); + my @images = map {basename($_)} glob("$thumbs_dir/*.jpg $thumbs_dir/*.gif $thumbs_dir/*.png"); # Sort by new order @images = sort {$b cmp $a} @images; # Render - return $self->render(images => \@images, image_base => $IMAGE_BASE, orig => $ORIG_DIR); + return $self->render(images => \@images, image_base => $IMAGE_BASE, orig => $ORIG_DIR, thumbs_size => $thumbs_size, scales => \@scale_width); } => 'index'; # Upload image file -post '/upload' => sub { +post '/upload' => (authenticated => 1)=> sub { my $self = shift; # Uploaded image(Mojo::Upload object) @@ -85,27 +152,26 @@ post '/upload' => sub { my $ext = $exts->{$image_type}; # Image file - my $filename = create_filename(); - my $image_file = "$IMAGE_DIR$ORIG_DIR/" . $filename. ".$ext"; + my $filename = create_filename($ext); + my $image_file = File::Spec->catfile($ORIG_PATH, $filename); # If file is exists, Retry creating filename while(-f $image_file){ $filename = create_filename(); - $image_file = "$IMAGE_DIR$ORIG_DIR/" . $filename . ".$ext"; + $image_file = File::Spec->catfile($ORIG_PATH, $filename); } # Save to file $image->move_to($image_file); - $image = Image::Magick->new(); - $image->read($image_file); - my ($ox, $oy) = $image->Get('base-columns', 'base-rows'); - if ($ox > $width ) { - my $ny = (($oy/$ox)*$width); - $image->Resize(geometry =>'geometry', width=>$width, height=>$ny); - } - $image->Write("$IMAGE_DIR/$filename.$ext"); + my $imager = Imager->new(); + $imager->read(file => $image_file) or die $imager->errstr; + for my $scale (@scale_width) { + my $scaled = $imager->scale(xpixels => $scale); + $scaled->write(file => File::Spec->catfile($IMAGE_DIR, $scale, $filename)) or die $scaled->errstr; + } + # Redirect to top page $self->redirect_to('index'); @@ -113,19 +179,20 @@ post '/upload' => sub { } => 'upload'; sub create_filename { + my $ext = shift || 'jpg'; # Date and time my ($sec, $min, $hour, $mday, $month, $year) = localtime; $month = $month + 1; $year = $year + 1900; - # Random number(0 ~ 99999) - my $rand_num = int(rand 100000); + # Random number(0 ~ 999999) + my $rand_num = int(rand 1000000); # Create file name form datatime and random number # (like image-20091014051023-78973) - my $name = sprintf("image-%04s%02s%02s%02s%02s%02s-%05s", - $year, $month, $mday, $hour, $min, $sec, $rand_num); + my $name = sprintf('image-%04s%02s%02s%02s%02s%02s-%06s.%s', + $year, $month, $mday, $hour, $min, $sec, $rand_num, $ext); return $name; } @@ -149,10 +216,13 @@ __DATA__ - Image BBS + Rough, Slow, Stupid, Contrary Photohosting -

Image BBS

+

Rough, Slow, Stupid, Contrary Photohosting

+ <% if (is_user_authenticated()) { %> +
Logout
+
File name @@ -160,13 +230,27 @@ __DATA__
+ <% } else { %> +
+
+ + + +
+
+ <% } %>
<% foreach my $image (@$images) { %>

-
Image original
- "> + Image original + <% for my $scale (@$scales) { %> + <%= $scale %> + <% } %> +
+
+ ">
<% } %>