Skip to main content

Python bindings for the Media over QUIC Rust crates: real-time pub/sub with built-in caching, fan-out, and prioritization.

Project description

moq-rs

Python bindings for the Media over QUIC Rust crates: real-time pub/sub with built-in caching, fan-out, and prioritization, on top of QUIC.

moq-rs wraps the auto-generated moq-ffi UniFFI bindings with a Pythonic API: no Moq prefixes, async iterators, context managers, and simplified connection setup. At session setup it negotiates either the moq-lite or moq-transport wire protocol.

Installation

pip install moq-rs

The distribution is moq-rs; the import name is moq.

Quick Start

Subscribe to a stream

import asyncio
import moq

async def main():
    async with moq.Client("https://relay.quic.video") as client:
        async for announcement in client.announced():
            catalog = await announcement.broadcast.catalog()

            for name in catalog.audio:
                async for frame in announcement.broadcast.subscribe_media(name):
                    print(f"Got frame: {len(frame.payload)} bytes, ts={frame.timestamp_us}")

asyncio.run(main())

Publish a stream

import asyncio
import moq

async def main():
    async with moq.Client("https://relay.quic.video") as client:
        broadcast = moq.BroadcastProducer()

        # Publish an Opus audio track (init bytes from your encoder)
        audio = broadcast.publish_media("opus", opus_init_bytes)
        client.publish("my-stream", broadcast)

        # Write frames
        audio.write_frame(payload, timestamp_us=0)
        audio.write_frame(payload, timestamp_us=20000)

        # Clean up
        audio.finish()
        broadcast.finish()

asyncio.run(main())

Host a server

import asyncio
import moq_lite as moq

async def main():
    async with moq.Server("127.0.0.1:4443", tls_generate=["localhost"]) as server:
        broadcast = moq.BroadcastProducer()
        track = broadcast.publish_track("events")
        server.publish("hello", broadcast)
        print(f"listening on https://{server.local_addr}")

        sessions = []
        async for request in server:
            print(f"  + {request.transport} from {request.url}")
            sessions.append(await request.ok())

asyncio.run(main())

Reject a request instead of accepting it with await request.close(403).

Advanced: Manual origin wiring

For full control over the origin topology:

import moq

origin = moq.OriginProducer()
client = moq.Client(
    "https://relay.quic.video",
    publish=origin,
    subscribe=origin,
)

API

Connection

  • Client(url, *, tls_verify=True, bind=None, publish=None, subscribe=None). Async context manager for connecting to a relay.
  • Server(bind="[::]:443", *, tls_cert=(), tls_key=(), tls_generate=(), publish=None, subscribe=None). Async context manager + async iterator of incoming Requests.
    • .local_addr. The bound address (useful when binding to port 0).
    • .cert_fingerprints(). SHA-256 fingerprints of the configured TLS certificates, for serverCertificateHashes browser cert pinning.
    • .publish(path, broadcast). Publish a broadcast to be served.
  • Request. An incoming session, yielded by async for request in server.
    • .url, .transport. Properties.
    • .set_publish(origin), .set_consume(origin). Per-request overrides.
    • await .ok(). Complete the handshake, returns a session (hold it to keep the connection alive).
    • await .close(code). Reject with an HTTP status code.
    • .cancel(). Cancel an in-flight ok()/close() call.

Publishing

  • BroadcastProducer(). Create a broadcast to publish tracks into.
    • .publish_media(format, init) → MediaProducer
    • .finish()
  • MediaProducer. Write frames to a track.
    • .write_frame(payload, timestamp_us)
    • .finish()

Subscribing

  • BroadcastConsumer. Subscribe to tracks within a broadcast.
    • .subscribe_catalog() → CatalogConsumer
    • .subscribe_media(name, max_latency_ms=10000) → MediaConsumer
    • await .catalog() → Catalog (convenience)
  • CatalogConsumer. Async iterator of Catalog.
  • MediaConsumer. Async iterator of Frame.

Origin (advanced)

  • OriginProducer(). Manage broadcast announcements.
    • .consume() → OriginConsumer
    • .publish(path, broadcast)
  • OriginConsumer. Discover broadcasts.
    • .announced(prefix) → Announced (async iterator)
    • .announced_broadcast(path) → AnnouncedBroadcast (awaitable)

Types

  • Catalog. .audio: dict[str, Audio], .video: dict[str, Video], .display, .rotation, .flip.
  • Frame. .payload: bytes, .timestamp_us: int, .keyframe: bool.
  • Audio. .codec, .sample_rate, .channel_count, .bitrate, .description.
  • Video. .codec, .coded: Dimensions, .display_ratio, .bitrate, .framerate, .description.
  • Dimensions. .width: int, .height: int.

See Also

  • moq-ffi. The Rust crate that produces the UniFFI bindings vendored as moq._uniffi.
  • MoQ project. Full monorepo with Rust server, TypeScript browser lib, and more.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

moq_rs-0.2.17.tar.gz (408.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

moq_rs-0.2.17-py3-none-win_amd64.whl (5.4 MB view details)

Uploaded Python 3Windows x86-64

moq_rs-0.2.17-py3-none-manylinux_2_28_aarch64.whl (7.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

moq_rs-0.2.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

moq_rs-0.2.17-py3-none-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

moq_rs-0.2.17-py3-none-macosx_10_12_x86_64.whl (6.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file moq_rs-0.2.17.tar.gz.

File metadata

  • Download URL: moq_rs-0.2.17.tar.gz
  • Upload date:
  • Size: 408.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for moq_rs-0.2.17.tar.gz
Algorithm Hash digest
SHA256 5505c7c2615c61c7ab5bcb1d08683d4f6aa19de1eb902d2a86445c1c246a504e
MD5 307de418319c5eb72ef8a95ca014fa0f
BLAKE2b-256 93619a994613169f4f63e0d72cf65c724ad4e65068197c27013ca1d3833a08b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.17.tar.gz:

Publisher: release-py.yml on moq-dev/moq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file moq_rs-0.2.17-py3-none-win_amd64.whl.

File metadata

  • Download URL: moq_rs-0.2.17-py3-none-win_amd64.whl
  • Upload date:
  • Size: 5.4 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for moq_rs-0.2.17-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 87be8ab7c1b77a1d7fb4809cc28bf6b4a6d02a6412164a0e2922dc7c8a65c4a7
MD5 9174ebfca64ea93e6e340dd54eb4c6c7
BLAKE2b-256 fe1b6e88e12e31bdb8e0a5907aae82557e090f609c583e16d7bd4c25e06f35f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.17-py3-none-win_amd64.whl:

Publisher: release-py.yml on moq-dev/moq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file moq_rs-0.2.17-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.17-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c86cc4e8e4d224ec535cf0c54781866b28ed6a118092104beeb550f5e6855d94
MD5 6a13632ba45a312dcde40daffdf03110
BLAKE2b-256 caf86fb9dd21cb0fd0f36cc01f0d85c2e3b18a6b1a98c9093790183cf7e2b2ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.17-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release-py.yml on moq-dev/moq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file moq_rs-0.2.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 171b0f3ba264791a65da9fb14f0ed33ee4df8807b786d0a62b93b9e32559957e
MD5 b93a54e2534946b77b6977b00e3b53df
BLAKE2b-256 3b8526f588598ba40e51e425487eb200c3eb7f5cfc3f34a1ee901d41897b52c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-py.yml on moq-dev/moq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file moq_rs-0.2.17-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.17-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64e952aca6d18bdfa86203558bb11a3c12e2f6435fe6b7f2607a560575f9aa21
MD5 d57546ac73019bbe8ccaca8514389e6e
BLAKE2b-256 da10e51774446297c937350173a9064979d2e26f7d27fd6f7b276e6dec16f5f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.17-py3-none-macosx_11_0_arm64.whl:

Publisher: release-py.yml on moq-dev/moq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file moq_rs-0.2.17-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.17-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 29b57a369f2b0a6d0dc64db7ac6f81885bf22314635ce56243dccaf3253c568e
MD5 beaf3778c92319a50ae82faae58edb80
BLAKE2b-256 8980cb2a583c3d3952ac066d0704dcfaec7cb518e73b15df4df2482a8363cb8a

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.17-py3-none-macosx_10_12_x86_64.whl:

Publisher: release-py.yml on moq-dev/moq

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page