ol.trixnity.media
Generic media upload and download helpers built on top of Trixnity’s media service.
Uploads happen in two steps:
-
prepare-uploadstages local bytes in Trixnity’s media store and returns a prepared upload map containing anupload://…cache URI -
uploaduploads either a prepared upload map or a local path-like source and returns a handle exposing upload progress plus the final uploaded media -
get-media,get-encrypted-media, andget-thumbnaildownload media as normalized handle maps carrying a JVMInputStream
Download selection follows the normalized event data:
-
use
get-mediafor plain::mx/urlattachment references -
use
get-encrypted-mediafor::mx/encrypted-fileor::mx/thumbnail-encrypted-file -
use
get-mediaorget-encrypted-mediafor event-provided thumbnail references already present on the event -
use
get-thumbnailonly when asking the homeserver to generate a new thumbnail for an MXC URI at explicit dimensions -
use
temporary-fileonly when a filesystem path is required for an existing media handle
The public shapes here stay normalized as namespaced keyword maps so callers do not need to work with Kotlin media APIs directly.
Resolved download handles all share the same shape:
{::mx/input-stream <java.io.InputStream>
::mx/raw <opaque upstream platform media>}
::mx/input-stream is the supported happy path. ::mx/raw exists only so
temporary-file can compose on top of an already fetched handle.
prepare-upload
(prepare-upload client source)
(prepare-upload client source opts)
Stages a local media source in Trixnity’s media store and returns a Missionary task of a prepared upload map.
source may be a string path, java.io.File, or java.nio.file.Path.
Supported opts:
| key | description |
|---|---|
|
Optional logical file name stored in the returned metadata |
|
Optional MIME type forwarded to upstream media upload preparation |
upload
(upload client source)
(upload client source opts)
Uploads a prepared upload map or local media source and returns a handle map.
When source is path-like, this first stages the file through
prepare-upload and then uploads the resulting cache URI.
Return value:
-
::mx/resultis a Missionary task that resolves to the uploaded media map -
::mx/progressis a Missionary flow of normalized progress snapshots with::mx/transferredand optional::mx/total
This intentionally replaces the previous task-only return contract so one
upload call can drive both progress observation and the final upload result
from the same underlying operation.
Supported opts:
| key | description
|-----|-------------
| ::mx/file-name | Optional logical file name when source is path-like |
| ::mx/mime-type | Optional MIME type when source is path-like |
| ::mx/keep-in-cache | Keep the staged media in the local cache after upload, defaults to true |
get-media
(get-media client uri)
Downloads plain media identified by uri.
Returns a Missionary task of a normalized media handle:
-
::mx/input-stream, the primary public readable stream -
::mx/raw, an opaque upstream media value used only for composition withtemporary-file
uri should be an MXC URI such as mxc://example.org/abc.
Use this for event fields that already carry a plain media reference, such as
::mx/url or ::mx/thumbnail-url.
Example:
(m/sp
(let [handle (m/? (get-media client (::mx/url ev)))]
(slurp (::mx/input-stream handle))))
get-encrypted-media
(get-encrypted-media client encrypted-file)
Downloads encrypted media from normalized encrypted-file metadata.
encrypted-file must be the normalized encrypted-file map exposed on events
under ::mx/encrypted-file or ::mx/thumbnail-encrypted-file.
Returns the same normalized media-handle shape as get-media, with
::mx/input-stream as the public happy path and ::mx/raw kept opaque for
temporary-file composition.
Example:
(m/sp
(let [handle (m/? (get-encrypted-media client
(::mx/encrypted-file ev)))]
(slurp (::mx/input-stream handle))))
get-thumbnail
(get-thumbnail client uri width height)
(get-thumbnail client uri width height opts)
Downloads a homeserver-generated thumbnail for uri.
This mirrors upstream Trixnity getThumbnail: it asks the homeserver to
generate a thumbnail for an MXC URI using explicit dimensions. It does not
read event-provided thumbnail references already present on an event. For
those, use get-media or get-encrypted-media with
::mx/thumbnail-url or ::mx/thumbnail-encrypted-file.
Returns the same normalized media-handle shape as get-media.
Supported opts:
| key | description
|-----|-------------
| ::mx/method | Thumbnail resize method, either :crop or :scale |
| ::mx/animated | Request animated thumbnails when upstream supports them |
Example:
(m/sp
(let [handle (m/? (get-thumbnail client
(::mx/url ev)
320
200
{::mx/method :scale }))]
(slurp (::mx/input-stream handle))))
temporary-file
(temporary-file media)
Creates a temporary file from media.
media may be either a resolved media handle or a media-handle task returned
by get-media, get-encrypted-media, or get-thumbnail.
Returns a Missionary task of a closeable TemporaryMediaFile record. The
record exposes :path directly as a slurpable string path and should usually
be used with with-open.
Treat ::mx/raw on media handles as opaque; it exists only so this helper
can compose with already-fetched media.
This is an opt-in JVM convenience for integrations that need a filesystem path. If the underlying media handle cannot produce a temporary file, the task fails with an exception from the bridge layer.
Example:
(m/sp
(with-open [tmp (m/? (temporary-file
(get-media client (::mx/url ev))))]
(slurp (:path tmp))))