summaryrefslogtreecommitdiff
path: root/katana.raku
diff options
context:
space:
mode:
Diffstat (limited to 'katana.raku')
-rwxr-xr-xkatana.raku62
1 files changed, 47 insertions, 15 deletions
diff --git a/katana.raku b/katana.raku
index 2930333..b714b65 100755
--- a/katana.raku
+++ b/katana.raku
@@ -3,36 +3,57 @@
sub prefix:<❱>(*@args) {
say "❱ {@args}";
my \proc = run @args, :out, :err;
-
- .say if .chars > 0 for proc.out.slurp(:close), proc.err.slurp(:close);
+ .say if .chars > 0
+ for proc.out.slurp(:close), proc.err.slurp(:close);
}
sub prefix:<⁉>(*@args) { ❱ @args unless @args[*-1].IO.f }
+sub read-exif-info(Str $file) {
+ my %exif;
+ my \proc = run 'exiftool', $file, :out;
+ for proc.out.slurp(:close).split("\n") -> $line {
+ my ($key, $val) = $line.split(':')[0,1];
+ next unless defined $val;
+ %exif{$key.trim} = $val.trim;
+ }
+ return %exif;
+}
+
class Image {
- has Str $.filename;
+ has Str $.basename;
has Str $!source;
has Str $!dist-dir;
+ has Str $.camera;
submethod BUILD(IO::Path :$source, Str :$dist-dir) {
- $!filename = $source.basename;
+ $!basename = $source.basename;
$!source = $source.path;
$!dist-dir = $dist-dir;
}
method generate(Int :$thumb-geometry, Str :$bg-blur) {
- my $thumb = "$!dist-dir/thumb/{$.filename}";
+ my $thumb = "$!dist-dir/thumb/{$.basename}";
⁉ [|<convert -auto-orient -geometry>, $thumb-geometry, $!source, $thumb];
- my $blur = "$!dist-dir/blur/{$.filename}";
+ my $blur = "$!dist-dir/blur/{$.basename}";
⁉ [|<convert -flip -geometry>, $thumb-geometry/4, '-blur', $bg-blur, $thumb, $blur];
- my $large = "$!dist-dir/large/{$.filename}";
+ my $large = "$!dist-dir/large/{$.basename}";
⁉ ['cp', $!source, $large];
}
+ method get-camera-model {
+ my %exif = read-exif-info "$!dist-dir/large/{$.basename}";
+ my $make = %exif<Make> ?? %exif<Make> !! '';
+ my $model = %exif{'Camera Model Name'} ?? %exif{'Camera Model Name'} !! '';
+ $model ~~ s/$make //; # Don't stotter
+ $model = 'Unknown camera' if $model eq '';
+ $!camera = "$make $model".trim;
+ }
+
method tag(Str $class) {
- "<img class='{$class}' src='./{$class}/{$.filename}' />"
+ "<img class='{$class}' src='./{$class}/{$.basename}' />"
}
}
@@ -45,20 +66,20 @@ sub ensure-directories(Str \dist-dir) {
sub walk-dir(Str \dir, :&onFile, :&onDir = sub (\dir) {} ) {
return unless dir.IO.d;
- for dir(dir) -> $file {
- given $file {
- when .d { walk-dir $file.path, :&onFile, :&onDir }
- when .f { &onFile($file.path) }
+ for dir(dir) -> $fh {
+ given $fh {
+ when .d { walk-dir $fh.path, :&onFile, :&onDir }
+ default { &onFile($fh.path) }
}
}
&onDir(dir);
}
sub cleanup-nonexistent (Str \dist-dir, @images) {
- my $images = set @images.map:{ $_.filename };
+ my $basenames = set @images.map:{ $_.basename };
walk-dir dist-dir,
onFile => sub (\file) {
- unlink file if file.IO.basename ∉ $images
+ unlink file if file.IO.basename ∉ $basenames
};
}
@@ -68,6 +89,12 @@ sub make-mr-proper(Str \dist-dir) {
onDir => sub (\dir) { rmdir dir };
}
+sub camera-stats(@images) {
+ my %cameras;
+ %cameras{.camera}++ for @images;
+ return %cameras.sort(*.value).reverse;
+}
+
multi MAIN(
Bool :$mr-proper, #= Clean output dir
Str :$in-dir = './in', #= Input dir
@@ -89,6 +116,11 @@ multi MAIN(
make-mr-proper $dist-dir if $mr-proper;
ensure-directories $dist-dir;
- @images.hyper(:$degree).map:{ .generate: :$thumb-geometry, :$bg-blur };
+ @images.hyper(:$degree).map:{
+ .get-camera-model;
+ .generate: :$thumb-geometry, :$bg-blur;
+ };
+
+ .say for camera-stats @images;
}