From 00dca8a6703bbb3031227339e96b6aa2c7e71853 Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 30 Dec 2021 10:27:36 +0000 Subject: some api for media files --- lib/App/MediaControl.rakumod | 2 +- lib/App/MediaControl/DB.rakumod | 37 +++++++++++++++++++++++++++++++------ lib/App/MediaControl/Web.rakumod | 14 +++++++++++++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/lib/App/MediaControl.rakumod b/lib/App/MediaControl.rakumod index cf635d4..b03e31b 100644 --- a/lib/App/MediaControl.rakumod +++ b/lib/App/MediaControl.rakumod @@ -32,7 +32,7 @@ class App::MediaControl { $!web .= new( port => $!config, - :$!vlc, :$!lirc, + :$!vlc, :$!lirc, :$!db, ); } diff --git a/lib/App/MediaControl/DB.rakumod b/lib/App/MediaControl/DB.rakumod index da86d24..cfa2dc3 100644 --- a/lib/App/MediaControl/DB.rakumod +++ b/lib/App/MediaControl/DB.rakumod @@ -4,16 +4,15 @@ use DB::SQLite; class App::MediaControl::DB { has DB::SQLite $.pool is required; - method !db(Callable $code) { + method !db(Callable:D $code) { my $conn = self.pool.db; # we need an explicit LEAVE block because on 2021.10, `will # leave { .finish }` kills precomp LEAVE { .finish with $conn }; $conn.begin; $conn.execute('PRAGMA foreign_keys=true'); - my $result = $code($conn) with $conn; - $conn.commit; - return $result; + KEEP { .commit with $conn }; + return $code($conn) with $conn; } method ensure-schema() { @@ -56,7 +55,7 @@ class App::MediaControl::DB { } } - method add-entry(Str :$path! is copy, Str :$name!, Bool :$is-dir!) { + method add-entry(Str:D() :$path! is copy, Str:D() :$name!, Bool:D() :$is-dir!) { $path ~~ s{$} = '/'; $path ~~ s{^} = '/'; @@ -79,7 +78,7 @@ class App::MediaControl::DB { } } - method remove-entry(Str :$path! is copy, Str :$name!) { + method remove-entry(Str:D() :$path! is copy, Str:D() :$name!) { $path ~~ s{$} = '/'; $path ~~ s{^} = '/'; @@ -92,4 +91,30 @@ class App::MediaControl::DB { END } } + + multi method get-children-of(Any:U $id) { + self!get-children('IS NULL'); + } + multi method get-children-of(Int:D() $id) { + self!get-children('=$id',$id); + } + method !get-children(Str $clause, *@binds) { + self!db: { + .query(qq:to/END/,|@binds).hashes; + SELECT id, name, is_dir + FROM files + WHERE parent_id $clause + END + } + } + + method get-entry(Int:D() $id) { + self!db: { + .query(q:to/END/,$id).hash; + SELECT id, matpath, name, is_dir + FROM files + WHERE id=$id + END + } + } } diff --git a/lib/App/MediaControl/Web.rakumod b/lib/App/MediaControl/Web.rakumod index b2ac36e..c577d90 100644 --- a/lib/App/MediaControl/Web.rakumod +++ b/lib/App/MediaControl/Web.rakumod @@ -3,10 +3,12 @@ use Cro::HTTP::Server; use Cro::HTTP::Router; use Vlc::Client; use Lirc::Commands; +use App::MediaControl::DB; class App::MediaControl::Web { has Vlc::Client $.vlc is required; has Lirc::Commands $.lirc is required; + has App::MediaControl::DB $.db is required; has Int $.port = 8080; has Cro::Service $!service handles ; @@ -28,6 +30,16 @@ class App::MediaControl::Web { } } + my $media = route { + get -> $id=Nil { + my %reply = children => @(self.db.get-children-of($id)); + with $id { + %reply = self.db.get-entry($id); + }; + content 'application/json', %reply; + } + }; + my $application = route { resources-from %?RESOURCES; @@ -35,7 +47,7 @@ class App::MediaControl::Web { get -> 'ir.png' { resource 'ir.png' } get -> 'ir.webmanifest' { resource 'ir.webmanifest' } - include :$vlc, :$ir; + include :$vlc, :$ir, :$media; around -> &handler { handler(); -- cgit v1.2.3