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.16.tar.gz (407.7 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.16-py3-none-win_amd64.whl (5.4 MB view details)

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

moq_rs-0.2.16-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.16-py3-none-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

moq_rs-0.2.16-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.16.tar.gz.

File metadata

  • Download URL: moq_rs-0.2.16.tar.gz
  • Upload date:
  • Size: 407.7 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.16.tar.gz
Algorithm Hash digest
SHA256 5cdce263619a22fca02d9864d341b1e33aab5c0918f981ce2e4d98d8e42cc396
MD5 33bc3f6fc5f0fd2a98f717efa7491041
BLAKE2b-256 00bc73e822faef8af0fc9cd7488659b58ae4d6d88224a14a03880e41bfbe6cd5

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.16.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.16-py3-none-win_amd64.whl.

File metadata

  • Download URL: moq_rs-0.2.16-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.16-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 42ea6366ce6ad93dffdccf9469f297d8a855263b9c07bfcbb2ea351995250d2e
MD5 71fd5a84ee027857a6c8b3f3c6ff5d39
BLAKE2b-256 5cd3209d37d7a51a58af80f25d0029ed04a7a3feb8d7db6e1ddbd75f0c8a25c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.16-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.16-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.16-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 551778eaa33489818a15ff59aa736936f82e8e34925939c04d29c94b4e1d4508
MD5 26aca3ab7c82d1e04117a36aa294a93e
BLAKE2b-256 0a24d0b317a34d2a557f3783465ce93fd74d10ed019532f5872534638b9ac59f

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.16-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.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1f1d68f561fc88004739e5532cd7c9d4d629ab13a6b8a30a1328999725c505b1
MD5 f0cfcd821d4fd6a7efd4bb3de29d8810
BLAKE2b-256 28c5d385e144e2622113a6416ac7c51754f9a1828f29a08bdd6e25f289d735a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.16-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.16-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.16-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b9bdfb253b4823d26883ea32f230d8205470a4bd53db06e34e489f1f67a968d7
MD5 6397e97f8b0a209cb22e7db16a1ff374
BLAKE2b-256 93944f5948cd226a36f4116584cc4f8f6382f66bfa7bd71e68eed58cbc6c8a14

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.16-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.16-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for moq_rs-0.2.16-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 965c2a9fea9c4bebdbb2cbd90968c4659e3c803247a7691e5ef5b1ef0d132c1a
MD5 21b743708123786d222cf5dfa3ea2228
BLAKE2b-256 dc8e16a44b50c8b9791c7618575fc60be27acf5b866da1fbcc50b3f279d0210e

See more details on using hashes here.

Provenance

The following attestation bundles were made for moq_rs-0.2.16-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