aboutsummaryrefslogtreecommitdiff
path: root/lib/App
diff options
context:
space:
mode:
Diffstat (limited to 'lib/App')
-rw-r--r--lib/App/MediaControl.rakumod25
-rw-r--r--lib/App/MediaControl/DB.rakumod41
2 files changed, 62 insertions, 4 deletions
diff --git a/lib/App/MediaControl.rakumod b/lib/App/MediaControl.rakumod
index 77fda99..cf635d4 100644
--- a/lib/App/MediaControl.rakumod
+++ b/lib/App/MediaControl.rakumod
@@ -1,5 +1,6 @@
use v6.d;
use DB::SQLite;
+use ScanDir;
use Vlc::Client;
use Lirc::Client;
use Lirc::Commands;
@@ -35,8 +36,32 @@ class App::MediaControl {
);
}
+ method !start-scan() {
+ my $root = $.config<media><root>;
+ $!db.clear-seen();
+ start react {
+ whenever scan-dir($root) -> $item {
+ when $item ~~ $root {}
+ when $item ~~ ScanDir::End { $!db.remove-unseen() }
+
+ 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;
+ $!db.add-entry(:$path,:$name,:$is-dir);
+ }
+ }
+ }
+ }
+
method start() {
$!db.ensure-schema();
+ self!start-scan();
$!web.start();
}
diff --git a/lib/App/MediaControl/DB.rakumod b/lib/App/MediaControl/DB.rakumod
index 7ce562e..da86d24 100644
--- a/lib/App/MediaControl/DB.rakumod
+++ b/lib/App/MediaControl/DB.rakumod
@@ -26,17 +26,36 @@ class App::MediaControl::DB {
.query(q:to/END/);
CREATE TABLE files (
id INTEGER PRIMARY KEY,
- parent_id INTEGER NULL REFERENCES files(id),
+ parent_id INTEGER NULL REFERENCES files(id)
+ ON DELETE CASCADE,
matpath TEXT NOT NULL,
name TEXT NOT NULL,
is_dir BOOLEAN NOT NULL,
watched_time INTEGER NULL,
+ seen BOOLEAN NOT NULL DEFAULT false,
UNIQUE (matpath, name)
)
END
}
}
+ method clear-seen() {
+ self!db: {
+ .query(q:to/END/)
+ UPDATE files SET seen=false
+ END
+ }
+ }
+
+ method remove-unseen() {
+ self!db: {
+ .query(q:to/END/)
+ DELETE FROM files
+ WHERE seen=false
+ END
+ }
+ }
+
method add-entry(Str :$path! is copy, Str :$name!, Bool :$is-dir!) {
$path ~~ s{<!after '/'>$} = '/';
$path ~~ s{<!before '/'>^} = '/';
@@ -50,12 +69,26 @@ class App::MediaControl::DB {
newrow(path,name,is_dir) AS (
VALUES($path, $name, $is_dir)
)
- INSERT INTO files(parent_id,matpath,name,is_dir)
- SELECT id, newrow.path, name, is_dir
+ INSERT INTO files(parent_id,matpath,name,is_dir,seen)
+ SELECT id, newrow.path, name, is_dir, true
FROM newrow
LEFT JOIN parent ON parent.path=newrow.path
WHERE true
- ON CONFLICT (matpath,name) DO NOTHING
+ ON CONFLICT (matpath,name) DO UPDATE SET seen=true
+ END
+ }
+ }
+
+ method remove-entry(Str :$path! is copy, Str :$name!) {
+ $path ~~ s{<!after '/'>$} = '/';
+ $path ~~ s{<!before '/'>^} = '/';
+
+ note "remove-entry($path,$name)";
+ self!db: {
+ .query(q:to/END/, :$path, :$name);
+ DELETE FROM files
+ WHERE name=$name
+ AND matpath=$path
END
}
}