aboutsummaryrefslogtreecommitdiff
path: root/lib/Vlc/Client.rakumod
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Vlc/Client.rakumod')
-rw-r--r--lib/Vlc/Client.rakumod46
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))})
+ }
+}