use v6.d; use DB::SQLite; use ScanDir; use Vlc::Client; use Lirc::Client; use Lirc::Commands; use App::MediaControl::DB; use App::MediaControl::Web; class App::MediaControl { has $.config is required; has Vlc::Client $!vlc; has Lirc::Client $!lirc-client; has Lirc::Commands $!lirc; has App::MediaControl::DB $!db; has App::MediaControl::Web $!web; submethod TWEAK { $!vlc .= new( password => $!config, base-uri => $!config, mrl-root => $!config, ); $!lirc-client .= new(); $!lirc .= new(client=>$!lirc-client); $!db .= new( pool => DB::SQLite.new( filename => $!config, busy-timeout => 20_000, ), ); $!web .= new( port => $!config, host => $!config, :$!vlc, :$!lirc, :$!db, ); } method !start-scan() { my $root = $.config; my $extensions = any($.config.Slip); $!db.clear-seen(); start react { whenever scan-dir($root) -> $item { when $item ~~ $root {} when $item ~~ ScanDir::End { $!db.remove-unseen(); say "scan done" } my $path = $item.parent.relative($root); $path = '' if $path eq '.'; my $name = $item.basename; if !$item.e { $!db.remove-entry(:$path,:$name); } else { my $is-dir = $item.d; if $is-dir || $item.extension ~~ $extensions { $!db.add-entry(:$path,:$name,:$is-dir); } } } } } method start() { $!db.ensure-schema(); self!start-scan(); $!web.start(); } method stop() { $!web.stop(); } }