aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Matrix/Client.pm620
-rw-r--r--lib/Matrix/Client/Exception.pm66
-rw-r--r--lib/Matrix/Client/MediaStore.rakumod70
-rw-r--r--lib/Matrix/Client/Requester.pm62
-rw-r--r--t/10-use.t2
5 files changed, 89 insertions, 11 deletions
diff --git a/lib/Matrix/Client.pm6 b/lib/Matrix/Client.pm6
index 9022c65..2e26ee7 100644
--- a/lib/Matrix/Client.pm6
+++ b/lib/Matrix/Client.pm6
@@ -5,6 +5,7 @@ use Matrix::Response;
use Matrix::Client::Common;
use Matrix::Client::Room;
use Matrix::Client::Requester;
+use Matrix::Client::MediaStore;
unit class Matrix::Client does Matrix::Client::Requester;
@@ -331,16 +332,15 @@ method remove-room-alias($room-alias) {
# Media
-#| POST - /_matrix/media/r0/upload
-method upload(IO::Path $path, Str $filename?) {
- my $buf = slurp $path, :bin;
- my $fn = $filename ?? $filename !! $path.basename;
- my $res = $.post-bin("/upload", $buf,
- content-type => "image/png",
- filename => $fn,
- );
- my $data = from-json($res.content);
- $data<content_uri> // "";
+method media(--> Matrix::Client::MediaStore) {
+ return Matrix::Client::MediaStore.new(
+ home-server => $!home-server,
+ access-token => $!access-token
+ )
+}
+
+method upload(IO::Path $path, Str $filename?) is DEPRECATED('media.upload') {
+ self.media.upload($path, $filename)
}
# Misc
diff --git a/lib/Matrix/Client/Exception.pm6 b/lib/Matrix/Client/Exception.pm6
index 924eece..e02f572 100644
--- a/lib/Matrix/Client/Exception.pm6
+++ b/lib/Matrix/Client/Exception.pm6
@@ -7,4 +7,10 @@ package X::Matrix {
"$!code: $!error"
}
}
+
+ class MXCParse is Exception {
+ has $.uri;
+
+ method message { "Cannot parse '$!uri'" }
+ }
}
diff --git a/lib/Matrix/Client/MediaStore.rakumod b/lib/Matrix/Client/MediaStore.rakumod
new file mode 100644
index 0000000..34fbda3
--- /dev/null
+++ b/lib/Matrix/Client/MediaStore.rakumod
@@ -0,0 +1,70 @@
+use JSON::Fast;
+use Matrix::Client::Requester;
+use Matrix::Client::Exception;
+use URI::Escape;
+
+unit class Matrix::Client::MediaStore does Matrix::Client::Requester;
+
+class Matrix::Client::MediaStore::File {
+ has Str $.content-type;
+ has Str $.content-disposition;
+ has Buf $.content;
+}
+
+submethod TWEAK {
+ # Different client endpoint for media
+ $!client-endpoint = "/_matrix/media/r0";
+}
+
+# https://matrix.deprecated.org/_matrix/media/r0/thumbnail/matrix.org/TKTUVTAazFocrTjezhiXZiIe?width=25&height=25&method=crop
+method parse-mxc(Str $uri) {
+ if $uri ~~ m/"mxc://" $<server-name> = [.*] "/" $<media-id> = [ .* ]/ {
+ return {
+ server-name => $<server-name>,
+ media-id => $<media-id>
+ }
+ }
+
+ X::Matrix::MXCParse.new(:$uri).throw;
+}
+
+#| POST - /_matrix/media/r0/upload
+method upload(IO::Path $path, Str $filename?, Str :$content-type is copy = "image/png" --> Str) {
+ my $buf = slurp $path, :bin;
+ my $fn = $filename ?? $filename !! $path.basename;
+
+ # The filename is passed on a query param.
+ my $endpoint = "/upload?filename=" ~ uri-escape($fn);
+
+
+ my $res = $.post-bin(
+ $endpoint, $buf,
+ :$content-type,
+ );
+
+ my $data = from-json($res.content);
+ $data<content_uri> // "";
+}
+
+# GET - /_matrix/media/r0/download/{serverName}/{mediaId}
+multi method download(Str $mxc-uri, :$allow-remote = True) {
+ my $mxc = self.parse-mxc($mxc-uri);
+
+ samewith($mxc<server-name>, $mxc<media-id>, :$allow-remote)
+}
+
+# GET - /_matrix/media/r0/download/{serverName}/{mediaId}
+multi method download(Str $server-name, Str $media-id, Bool :$allow-remote = True) {
+ my $response = $.get(
+ "/download/{$server-name}/{$media-id}",
+ allow_remote => $allow-remote.Str.lc
+ );
+
+ my %headers = $response.header.hash();
+
+ Matrix::Client::MediaStore::File.new(
+ content-type => %headers<Content-Type>.head,
+ content-disposition => %headers<Content-Disposition>.head,
+ content => $response.content
+ )
+}
diff --git a/lib/Matrix/Client/Requester.pm6 b/lib/Matrix/Client/Requester.pm6
index ff543c9..36a9f69 100644
--- a/lib/Matrix/Client/Requester.pm6
+++ b/lib/Matrix/Client/Requester.pm6
@@ -73,7 +73,7 @@ multi method post(Str $path, :$media = False, *%params) {
method post-bin(Str $path, Buf $buf, :$content-type) {
my $encoded-path = $path.subst('#', '%23');
my $req = POST(
- $.base-url(:media) ~ $encoded-path,
+ $.base-url() ~ $encoded-path,
content => $buf,
Content-Type => $content-type
);
diff --git a/t/10-use.t b/t/10-use.t
index df4130b..1c6f97e 100644
--- a/t/10-use.t
+++ b/t/10-use.t
@@ -6,4 +6,6 @@ use-ok 'Matrix::Client::Room';
use-ok 'Matrix::Client::Requester';
use-ok 'Matrix::Response';
use-ok 'Matrix::Client::Exception';
+use-ok 'Matrix::Client::MediaStore';
+
done-testing;