#!/usr/bin/env raku sub prefix:<❱>(*@args) { say "❱ {@args}"; my $proc = run @args, :out, :err; .say if .chars > 0 for $proc.out.slurp(:close), $proc.err.slurp(:close); } sub prefix:<⁉>(*@args) { ❱ @args unless @args[*-1].IO.f } class Image { has Str $.filename; has Str $!source; has Str $!dist-dir; submethod BUILD(IO::Path :$source, Str :$dist-dir) { $!filename = $source.basename; $!source = $source.path; $!dist-dir = $dist-dir; } method generate(Int :$thumb-geometry, Str :$bg-blur) { my $thumb = "$!dist-dir/thumb/{$.filename}"; ⁉ [|, $thumb-geometry, $!source, $thumb]; my $blur = "$!dist-dir/blur/{$.filename}"; ⁉ [|, $thumb-geometry/4, '-blur', $bg-blur, $thumb, $blur]; my $large = "$!dist-dir/large/{$.filename}"; ⁉ ['cp', $!source, $large]; } method thumb_tag { "" } method large_tag { "" } } sub dist-dirs(Str $dist-dir --> List) { $dist-dir <<~>> } sub make-mr-proper(Str $dist-dir) { ❱ ['rm', '-rf', $dist-dir] if $dist-dir.IO.d } sub ensure-directories(Str $dist-dir) { mkdir $dist-dir unless $dist-dir.IO.d; mkdir $_ unless .IO.d for dist-dirs $dist-dir; } sub cleanup-nonexistent (Str $dist-dir, @images) { my $images = set @images.map:{ $_.filename }; for dist-dirs $dist-dir -> $dir { unlink $_ if .IO.basename ∉ $images for dir($dir, test => { "$dir/$_".IO.f }); } } multi MAIN( Bool :$mr-proper, #= Clean output dir Str :$in-dir = './in', #= Input dir Str :$dist-dir = './dist', #= Output dir Int :$thumb-geometry = 800, #= Thumbnail geometry Str :$bg-blur = '0x8', #= Background blur factor Bool :$randomize = True, #= Randomize order of images Str :$title = 'Yay', #= Album title ) { my @images = dir($in-dir, test => { "$in-dir/$_".IO.f }) .map: { new Image: source => $_, :$dist-dir }; @images = @images.pick: * if $randomize; say "Found {@images.elems} images"; cleanup-nonexistent $dist-dir, @images; make-mr-proper $dist-dir if $mr-proper; ensure-directories $dist-dir; @images.hyper.map: { .generate: :$thumb-geometry, :$bg-blur }; }