diff options
Diffstat (limited to 'lib/Vlc/Client.rakumod')
-rw-r--r-- | lib/Vlc/Client.rakumod | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/Vlc/Client.rakumod b/lib/Vlc/Client.rakumod new file mode 100644 index 0000000..3620d47 --- /dev/null +++ b/lib/Vlc/Client.rakumod @@ -0,0 +1,46 @@ +use v6.d; +use Cro::HTTP::Client; +use Cro::Uri::HTTP; +use Cro::BodyParser::VlcXML; +use XML; + +multi sub maybe-bool('true') { True } +multi sub maybe-bool('false') { False } +multi sub maybe-bool($x) { $x } + +sub xml-to-hash(XML::Element $elem) { + if $elem.elements() -> @children { + return %( @children.map: { .name => xml-to-hash($_) } ) + } + + return maybe-bool($elem.contents().join('').trim) +} + +class Vlc::Client { + has Cro::HTTP::Client $!vlc; + has Str $.password is required; + has Str $.base-uri = 'http://127.0.0.1:8080/requests/'; + + method !call-vlc(Str $path, *%args) { + $!vlc ||= Cro::HTTP::Client.new( + auth => { :username(), :password(self.password) }, + add-body-parsers => [ Cro::BodyParser::VlcXML ], + ); + + state Cro::Uri::HTTP $base-uri .= parse(self.base-uri); + + return $!vlc.get( + $base-uri.add($path).add-query(|%args), + ); + } + + method command(Str $command, *%args) { + return self!call-vlc('status.xml', :$command, |%args); + } + + method status() { + my $res = await self!call-vlc('status.xml'); + my XML::Document $status = await $res.body; + return Promise.kept({:status(xml-to-hash($status.root))}) + } +} |