Skip to main content

Janus WebRTC gateway Python async client.

Project description

Python Janus Client

Janus WebRTC gateway Python async client.

PyPI - License PyPI - Status PyPI - Downloads Code Coverage


Install

pip install janus-client

Requires Python >=3.8 <3.14


Description

Easily send and share WebRTC media through Janus WebRTC server.

This client is using aiortc for WebRTC communication and subsequently PyAV for media stack.

✅ Features ✅

  • Connect to Janus server using:
    • Websocket
    • HTTP
  • Authentication with shared static secret (API key) and/or stored token
  • Support Admin/Monitor API:
    • Generic requests
    • Configuration related requests
    • Token related requests
  • Support Janus plugins:
  • Simple interface
  • Minimum dependency
  • Extendable Janus transport

Examples

Simple Connect And Disconnect

import asyncio
from janus_client import JanusSession, JanusEchoTestPlugin, JanusVideoRoomPlugin

# Protocol will be derived from base_url
base_url = "wss://janusmy.josephgetmyip.com/janusbasews/janus"
# OR
base_url = "https://janusmy.josephgetmyip.com/janusbase/janus"

session = JanusSession(base_url=base_url)

plugin_handle = JanusEchoTestPlugin()

# Attach to Janus session
await plugin_handle.attach(session=session)

# Destroy plugin handle
await plugin_handle.destroy()

This will create a plugin handle and then destroy it.

Notice that we don't need to call connect or disconnect explicitly. It's managed internally.

Make Video Calls

import asyncio
from janus_client import JanusSession, JanusVideoCallPlugin
from aiortc.contrib.media import MediaPlayer, MediaRecorder

async def main():
    # Create session
    session = JanusSession(
        base_url="wss://janusmy.josephgetmyip.com/janusbasews/janus",
    )

    # Create plugin
    plugin_handle = JanusVideoCallPlugin()

    # Attach to Janus session
    await plugin_handle.attach(session=session)

    # Prepare username and media stream
    username = "testusernamein"
    username_out = "testusernameout"

    player = MediaPlayer(
        "desktop",
        format="gdigrab",
        options={
            "video_size": "640x480",
            "framerate": "30",
            "offset_x": "20",
            "offset_y": "30",
        },
    )
    recorder = MediaRecorder("./videocall_record_out.mp4")

    # Register myself as testusernameout
    result = await plugin_handle.register(username=username_out)

    # Call testusernamein
    result = await plugin_handle.call(
        username=username, player=player, recorder=recorder
    )

    # Wait awhile then hangup
    await asyncio.sleep(30)

    result = await plugin_handle.hangup()

    # Destroy plugin
    await plugin_handle.destroy()

    # Destroy session
    await session.destroy()


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        pass

This example will register to the VideoCall plugin using username testusernameout. It will then call the user registered using the username testusernamein.

A portion of the screen will be captured and sent in the call media stream. The incoming media stream will be saved into videocall_record_out.mp4 file.

Documentation

The project documentation is built with Material for MkDocs and deployed to GitHub Pages.

Documentation Development

Setup

Install development dependencies:

poetry install --with dev

Local Development

To serve the documentation locally with live reload:

poetry run mkdocs serve

The documentation will be available at http://127.0.0.1:8000/

Building Documentation

To build the documentation for production:

poetry run python -W ignore::DeprecationWarning:mkdocs_autorefs -m mkdocs build --clean --strict

The built documentation will be in the site/ directory.

Important: Always use the --strict flag when building documentation to catch warnings as errors. This ensures documentation quality and prevents deployment of documentation with issues.

For local development without strict mode:

poetry run mkdocs build

Documentation Structure

  • docs/index.md - Main documentation page
  • docs/session.md - Session API documentation
  • docs/plugins.md - Plugin API documentation
  • docs/transport.md - Transport API documentation
  • mkdocs.yml - MkDocs configuration file

Experiments

FFmpeg support for VideoRoom plugin has now been moved to experiments folder, together with GStreamer support.

TODO 2. Run UT in all supported python versions. 3. Implement text room plugin 4. At documentations, move session, plugin, and transport to be linked pages at the left side. Then move class references to another "References" page. 4. Make websocket connection able to clean up properly when encounter exception. Test using .\tests\test_admin.py::TestTransportWebsocket::test_add_and_remove_token

Use following command to run unit tests and see all logs:

hatch test .\tests\test_plugin.py::TestTransportHttp::test_plugin_echotest_create -- -s --log-cli-level=INFO --full-trace
hatch test -- -s --log-cli-level=INFO --full-trace -- tests

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

janus_client-0.7.3.tar.gz (66.8 kB view details)

Uploaded Source

Built Distribution

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

janus_client-0.7.3-py3-none-any.whl (42.5 kB view details)

Uploaded Python 3

File details

Details for the file janus_client-0.7.3.tar.gz.

File metadata

  • Download URL: janus_client-0.7.3.tar.gz
  • Upload date:
  • Size: 66.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for janus_client-0.7.3.tar.gz
Algorithm Hash digest
SHA256 56cf8d4347b26295ea48f7647ece6356127f8586db29e14ae68abd94fdfb60cc
MD5 cc61a330c91fff5211dfdca0aeaf318f
BLAKE2b-256 60c3e1fccfc35f01d47d0e2d3fb7db76cd7b4d137c3778f57885aaf3cb92e5ed

See more details on using hashes here.

File details

Details for the file janus_client-0.7.3-py3-none-any.whl.

File metadata

  • Download URL: janus_client-0.7.3-py3-none-any.whl
  • Upload date:
  • Size: 42.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.28.1

File hashes

Hashes for janus_client-0.7.3-py3-none-any.whl
Algorithm Hash digest
SHA256 65779ab12380a8bda0778092c15e2ffb08ee656032612f3aed7e33f8542dac1f
MD5 28ce456f20c08c43b46f2eb5e83aa84b
BLAKE2b-256 a9d601be0b1a1f7c3fcfdb33001a0c268e58e68e0bd0851caa872deac59431a8

See more details on using hashes here.

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