From 66d2cb92ace89db51c36b525656a0141432be956 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 17 Apr 2022 09:47:01 +0100 Subject: can read camera from exif --- katana.raku | 62 ++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file 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}"; ⁉ [|, $thumb-geometry, $!source, $thumb]; - my $blur = "$!dist-dir/blur/{$.filename}"; + my $blur = "$!dist-dir/blur/{$.basename}"; ⁉ [|, $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 ?? %exif !! ''; + 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) { - "" + "" } } @@ -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; } -- cgit v1.2.3