Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/README.md → examples/room_manager/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ All available options are defined in [arguments.py](room_manager/arguments.py).

```console
uv sync --all-packages
uv run room_manager # Room Manager has to be started in the project root directory
uv run main.py # Room Manager has to be started in the project root directory
```

## How does it work?
Expand Down
7 changes: 3 additions & 4 deletions examples/room_manager/main.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import logging

from arguments import parse_arguments
from flask import Flask
from flask_cors import CORS

from .arguments import parse_arguments
from .room_service import RoomService
from .routes import setup_routes
from room_service import RoomService
from routes import setup_routes

app = Flask(__name__)
CORS(app)
Expand Down
3 changes: 1 addition & 2 deletions examples/room_manager/routes.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
from dataclasses import asdict

from flask import Flask, abort, jsonify, request
from room_service import RoomService

from fishjam import receive_binary
from fishjam.room import RoomConfigRoomType

from .room_service import RoomService


def setup_routes(app: Flask, room_service: RoomService):
@app.route("/health", methods=["GET"])
Expand Down
2 changes: 1 addition & 1 deletion examples/transcription/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,6 @@ GEMINI_API_KEY=<your-api-token> \
uv run fastapi dev
```

Now, you can create peer tokens by going to <http://localhost:3000>.
Now, you can create peer tokens by going to <http://localhost:8000>.
You can then use the [minimal-react](https://github.com/fishjam-cloud/web-client-sdk/tree/main/examples/react-client)
demo app to connect as these peers and see your transcriptions live in the console!
2 changes: 1 addition & 1 deletion examples/transcription/transcription/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from google.genai.types import AudioTranscriptionConfig, LiveConnectConfig, Modality

FISHJAM_ID = os.environ["FISHJAM_ID"]
FISHJAM_ID = os.getenv("FISHJAM_ID", "")
FISHJAM_TOKEN = os.environ["FISHJAM_MANAGEMENT_TOKEN"]
FISHJAM_URL = os.getenv("FISHJAM_URL")
TRANSCRIPTION_MODEL = "gemini-live-2.5-flash-preview"
Expand Down
2 changes: 2 additions & 0 deletions fishjam/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

# Exceptions and Server Messages
from fishjam import agent, errors, events, peer, room
from fishjam._openapi_client.models import PeerMetadata

# API
from fishjam._webhook_notifier import receive_binary
Expand All @@ -28,6 +29,7 @@
"FishjamClient",
"FishjamNotifier",
"receive_binary",
"PeerMetadata",
"PeerOptions",
"SubscribeOptions",
"RoomOptions",
Expand Down
6 changes: 5 additions & 1 deletion fishjam/_openapi_client/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
"""Contains all the data models used in inputs/outputs"""
""" Contains all the data models used in inputs/outputs """

from .add_peer_body import AddPeerBody
from .error import Error
from .peer import Peer
from .peer_details_response import PeerDetailsResponse
from .peer_details_response_data import PeerDetailsResponseData
from .peer_metadata import PeerMetadata
from .peer_options_agent import PeerOptionsAgent
from .peer_options_web_rtc import PeerOptionsWebRTC
from .peer_options_web_rtc_metadata import PeerOptionsWebRTCMetadata
Expand Down Expand Up @@ -32,6 +33,7 @@
from .subscribe_options_audio_format import SubscribeOptionsAudioFormat
from .subscribe_options_audio_sample_rate import SubscribeOptionsAudioSampleRate
from .track import Track
from .track_metadata_type_0 import TrackMetadataType0
from .track_type import TrackType
from .viewer_token import ViewerToken

Expand All @@ -41,6 +43,7 @@
"Peer",
"PeerDetailsResponse",
"PeerDetailsResponseData",
"PeerMetadata",
"PeerOptionsAgent",
"PeerOptionsWebRTC",
"PeerOptionsWebRTCMetadata",
Expand All @@ -64,6 +67,7 @@
"SubscribeOptionsAudioFormat",
"SubscribeOptionsAudioSampleRate",
"Track",
"TrackMetadataType0",
"TrackType",
"ViewerToken",
)
28 changes: 24 additions & 4 deletions fishjam/_openapi_client/models/peer.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from ..models.peer_type import PeerType

if TYPE_CHECKING:
from ..models.peer_metadata import PeerMetadata
from ..models.subscribe_options import SubscribeOptions
from ..models.track import Track

Expand All @@ -27,7 +28,7 @@ class Peer:

Attributes:
id (str): Assigned peer id Example: peer-1.
metadata (Any): Custom metadata set by the peer Example: {'name': 'FishjamUser'}.
metadata (Union['PeerMetadata', None]): Custom metadata set by the peer Example: {'name': 'FishjamUser'}.
status (PeerStatus): Informs about the peer status Example: disconnected.
subscribe (Union['SubscribeOptions', None]): Configuration of server-side subscriptions to the peer's tracks
Example: {'audioFormat': 'pcm16'}.
Expand All @@ -36,19 +37,24 @@ class Peer:
"""

id: str
metadata: Any
metadata: Union["PeerMetadata", None]
status: PeerStatus
subscribe: Union["SubscribeOptions", None]
tracks: list["Track"]
type_: PeerType
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
from ..models.peer_metadata import PeerMetadata
from ..models.subscribe_options import SubscribeOptions

id = self.id

metadata = self.metadata
metadata: Union[None, dict[str, Any]]
if isinstance(self.metadata, PeerMetadata):
metadata = self.metadata.to_dict()
else:
metadata = self.metadata

status = self.status.value

Expand Down Expand Up @@ -82,13 +88,27 @@ def to_dict(self) -> dict[str, Any]:

@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
from ..models.peer_metadata import PeerMetadata
from ..models.subscribe_options import SubscribeOptions
from ..models.track import Track

d = dict(src_dict)
id = d.pop("id")

metadata = d.pop("metadata")
def _parse_metadata(data: object) -> Union["PeerMetadata", None]:
if data is None:
return data
try:
if not isinstance(data, dict):
raise TypeError()
componentsschemas_peer_metadata_type_0 = PeerMetadata.from_dict(data)

return componentsschemas_peer_metadata_type_0
except: # noqa: E722
pass
return cast(Union["PeerMetadata", None], data)

metadata = _parse_metadata(d.pop("metadata"))

status = PeerStatus(d.pop("status"))

Expand Down
49 changes: 49 additions & 0 deletions fishjam/_openapi_client/models/peer_metadata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from collections.abc import Mapping
from typing import Any, TypeVar

from attrs import define as _attrs_define
from attrs import field as _attrs_field

T = TypeVar("T", bound="PeerMetadata")


@_attrs_define
class PeerMetadata:
"""Custom metadata set by the peer

Example:
{'name': 'FishjamUser'}

"""

additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)

return field_dict

@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
peer_metadata = cls()

peer_metadata.additional_properties = d
return peer_metadata

@property
def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())

def __getitem__(self, key: str) -> Any:
return self.additional_properties[key]

def __setitem__(self, key: str, value: Any) -> None:
self.additional_properties[key] = value

def __delitem__(self, key: str) -> None:
del self.additional_properties[key]

def __contains__(self, key: str) -> bool:
return key in self.additional_properties
39 changes: 35 additions & 4 deletions fishjam/_openapi_client/models/track.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from collections.abc import Mapping
from typing import (
TYPE_CHECKING,
Any,
TypeVar,
Union,
cast,
)

from attrs import define as _attrs_define
Expand All @@ -11,6 +13,10 @@
from ..models.track_type import TrackType
from ..types import UNSET, Unset

if TYPE_CHECKING:
from ..models.track_metadata_type_0 import TrackMetadataType0


T = TypeVar("T", bound="Track")


Expand All @@ -20,19 +26,27 @@ class Track:

Attributes:
id (Union[Unset, str]):
metadata (Union[Unset, Any]):
metadata (Union['TrackMetadataType0', None, Unset]): Example: {'source': 'camera'}.
type_ (Union[Unset, TrackType]):
"""

id: Union[Unset, str] = UNSET
metadata: Union[Unset, Any] = UNSET
metadata: Union["TrackMetadataType0", None, Unset] = UNSET
type_: Union[Unset, TrackType] = UNSET
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
from ..models.track_metadata_type_0 import TrackMetadataType0

id = self.id

metadata = self.metadata
metadata: Union[None, Unset, dict[str, Any]]
if isinstance(self.metadata, Unset):
metadata = UNSET
elif isinstance(self.metadata, TrackMetadataType0):
metadata = self.metadata.to_dict()
else:
metadata = self.metadata

type_: Union[Unset, str] = UNSET
if not isinstance(self.type_, Unset):
Expand All @@ -52,10 +66,27 @@ def to_dict(self) -> dict[str, Any]:

@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
from ..models.track_metadata_type_0 import TrackMetadataType0

d = dict(src_dict)
id = d.pop("id", UNSET)

metadata = d.pop("metadata", UNSET)
def _parse_metadata(data: object) -> Union["TrackMetadataType0", None, Unset]:
if data is None:
return data
if isinstance(data, Unset):
return data
try:
if not isinstance(data, dict):
raise TypeError()
metadata_type_0 = TrackMetadataType0.from_dict(data)

return metadata_type_0
except: # noqa: E722
pass
return cast(Union["TrackMetadataType0", None, Unset], data)

metadata = _parse_metadata(d.pop("metadata", UNSET))

_type_ = d.pop("type", UNSET)
type_: Union[Unset, TrackType]
Expand Down
48 changes: 48 additions & 0 deletions fishjam/_openapi_client/models/track_metadata_type_0.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from collections.abc import Mapping
from typing import Any, TypeVar

from attrs import define as _attrs_define
from attrs import field as _attrs_field

T = TypeVar("T", bound="TrackMetadataType0")


@_attrs_define
class TrackMetadataType0:
"""
Example:
{'source': 'camera'}

"""

additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)

return field_dict

@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
track_metadata_type_0 = cls()

track_metadata_type_0.additional_properties = d
return track_metadata_type_0

@property
def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())

def __getitem__(self, key: str) -> Any:
return self.additional_properties[key]

def __setitem__(self, key: str, value: Any) -> None:
self.additional_properties[key] = value

def __delitem__(self, key: str) -> None:
del self.additional_properties[key]

def __contains__(self, key: str) -> bool:
return key in self.additional_properties
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "fishjam-server-sdk"
version = "0.20.0"
version = "0.21.0"
description = "Python server SDK for the Fishjam"
authors = [{ name = "Fishjam Team", email = "[email protected]" }]
requires-python = ">=3.11"
Expand Down
2 changes: 1 addition & 1 deletion scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def update_client():

check_exit_code(
f"openapi-python-client generate \
--path {sys.argv[1]} \
--url {sys.argv[1]} \
--config openapi-python-client-config.yaml \
--meta=none \
--overwrite \
Expand Down
2 changes: 1 addition & 1 deletion tests/agent/test_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
HOST = "fishjam" if os.getenv("DOCKER_TEST") == "TRUE" else "localhost"
FISHJAM_URL = f"http://{HOST}:5002"
FISHJAM_ID = ""
SERVER_API_TOKEN = "development"
SERVER_API_TOKEN = os.getenv("MANAGEMENT_TOKEN", "development")


@pytest.fixture
Expand Down
2 changes: 1 addition & 1 deletion tests/test_notifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
HOST = "fishjam" if os.getenv("DOCKER_TEST") == "TRUE" else "localhost"
FISHJAM_URL = f"http://{HOST}:5002"
FISHJAM_ID = ""
SERVER_API_TOKEN = "development"
SERVER_API_TOKEN = os.getenv("MANAGEMENT_TOKEN", "development")
WEBHOOK_ADDRESS = "test" if os.getenv("DOCKER_TEST") == "TRUE" else "localhost"
WEBHOOK_URL = f"http://{WEBHOOK_ADDRESS}:5000/webhook"
queue = Queue()
Expand Down
Loading