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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

moq_rs-0.2.13-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.13.tar.gz.

File metadata

  • Download URL: moq_rs-0.2.13.tar.gz
  • Upload date:
  • Size: 397.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.13.tar.gz
Algorithm Hash digest
SHA256 7971a2f373c63919e65cb5d25c4e72ff54b30fa3ebbdeedfc77678838ac3dac8
MD5 0f3384210825a8c34cc2f513b14b65fa
BLAKE2b-256 3c1eff2547ec6a82ad253fb3c0e71331f84f8e06a3c62e802a90d307e6419c48

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: moq_rs-0.2.13-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.13-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 f194d78aafe9291c40ab466760f98ebba6cf12fdef7bfd18cc14f10240c39848
MD5 7d7cc02f30de4876d81516a90ac8892b
BLAKE2b-256 e9767a97894de5f824cdf86495fa28c6539d568c3ff58767084b7267e22a6257

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for moq_rs-0.2.13-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e909c964368c1fd4cce05964dc5801c45d8372b4067051868d3d4be23048fe35
MD5 597b27b941f9a3ee561a36b143d8c0a6
BLAKE2b-256 ba8705d854a9ee291728b5bed036f0559fe7e553fcbe0a5201812ae970193e82

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for moq_rs-0.2.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 128e96071d3b96efa8b714e0357e87b44fe4f6ef2566c18c93bf286f06871597
MD5 b55b83370562268a1a7ef760f828ffea
BLAKE2b-256 e44e56aba06bb367c539cb05a60cacdceeea6327dca81dc7fb3ca29b603c7e03

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for moq_rs-0.2.13-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db5dadab133e4065c8f957054bb8765a0dbb399a42fdd3be89f3d8c65aa800bb
MD5 d7d8055fe51cbd8187458e0b1c7c74b1
BLAKE2b-256 6c89f05044a2767efc02b8ccdf2f04cbc6ab14efc44d32d4d1eb99ff2d0e6ddb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for moq_rs-0.2.13-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6191de0b2967ceaee45a929c55c8fd4f59d4198c0e3a0d6f18c72708f238eb1d
MD5 c211cd4797f663f4681a63430fe3f4f1
BLAKE2b-256 691b30da67d4d7c0d72b6d36e2e9a87820b952bd92c4e5a922ef60d0944a8c75

See more details on using hashes here.

Provenance

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