use v6.d.PREVIEW;
need Ultramarine::Model::DirScanner;
class Ultramarine::Model::Collection {
has $.db is required handles <all-songs>;
has $.dirscan is required;
has $.file-class is required;
method new(|c) {
my $self = self.bless(|c);
start $self.update();
return $self;
}
has Promise $.is-ready .= new;
has $!mark-ready = $!is-ready.vow;
method update() {
react whenever $.dirscan.scan -> $path {
when $path ~~ Ultramarine::Model::DirScanner::EndOfScan {
$!mark-ready.keep(True);
}
when $path ~~ IO::Path & :f {
my $mtime = $path.modified.floor;
unless $.db.is-up-to-date(:$path,:$mtime) {
my %metadata = $.file-class.new(:$path).metadata;
$.db.set-song(:$path,:$mtime,:%metadata) if %metadata.keys;
}
}
}
}
}