-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path_fishjam_client.py
More file actions
193 lines (147 loc) · 5.93 KB
/
_fishjam_client.py
File metadata and controls
193 lines (147 loc) · 5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
"""
Fishjam client used to manage rooms
"""
from dataclasses import dataclass
from typing import Any, List, Literal, Tuple, cast
from fishjam._openapi_client.api.room import add_peer as room_add_peer
from fishjam._openapi_client.api.room import create_room as room_create_room
from fishjam._openapi_client.api.room import delete_peer as room_delete_peer
from fishjam._openapi_client.api.room import delete_room as room_delete_room
from fishjam._openapi_client.api.room import get_all_rooms as room_get_all_rooms
from fishjam._openapi_client.api.room import get_room as room_get_room
from fishjam._openapi_client.api.room import refresh_token as room_refresh_token
from fishjam._openapi_client.api.viewer import generate_token as viewer_generate_token
from fishjam._openapi_client.models import (
AddPeerJsonBody,
Peer,
PeerDetailsResponse,
PeerOptionsWebRTC,
PeerRefreshTokenResponse,
RoomConfig,
RoomConfigRoomType,
RoomCreateDetailsResponse,
RoomDetailsResponse,
RoomsListingResponse,
ViewerToken,
)
from fishjam._openapi_client.models.peer_options_web_rtc_metadata import (
PeerOptionsWebRTCMetadata,
)
from fishjam._openapi_client.models.room_config_video_codec import RoomConfigVideoCodec
from fishjam.api._client import Client
@dataclass
class Room:
"""Description of the room state"""
config: RoomConfig
"""Room configuration"""
id: str
"""Room ID"""
peers: List[Peer]
"""List of all peers"""
@dataclass
class RoomOptions:
"""Description of a room options"""
max_peers: int | None = None
"""Maximum amount of peers allowed into the room"""
video_codec: Literal["h264", "vp8"] | None = None
"""Enforces video codec for each peer in the room"""
webhook_url: str | None = None
"""URL where Fishjam notifications will be sent"""
room_type: Literal[
"full_feature", "audio_only", "broadcaster", "livestream"
] = "full_feature"
"""The use-case of the room. If not provided, this defaults to full_feature."""
@dataclass
class PeerOptions:
"""Options specific to the Peer"""
enable_simulcast: bool = True
"""Enables the peer to use simulcast"""
metadata: dict[str, Any] | None = None
"""Peer metadata"""
class FishjamClient(Client):
"""Allows for managing rooms"""
def __init__(self, fishjam_url: str, management_token: str):
"""
Create FishjamClient instance, providing the fishjam url and managment token.
"""
super().__init__(fishjam_url=fishjam_url, management_token=management_token)
def create_peer(
self, room_id: str, options: PeerOptions | None = None
) -> Tuple[Peer, str]:
"""
Creates peer in the room
Returns a tuple (`Peer`, `PeerToken`) - the token is needed by Peer
to authenticate to Fishjam.
The possible options to pass for peer are `PeerOptions`.
"""
options = options or PeerOptions()
peer_type = "webrtc"
peer_metadata = self.__parse_peer_metadata(options.metadata)
peer_options = PeerOptionsWebRTC(
enable_simulcast=options.enable_simulcast, metadata=peer_metadata
)
json_body = AddPeerJsonBody(type=peer_type, options=peer_options)
resp = cast(
PeerDetailsResponse,
self._request(room_add_peer, room_id=room_id, json_body=json_body),
)
return (resp.data.peer, resp.data.token)
def create_room(self, options: RoomOptions | None = None) -> Room:
"""
Creates a new room
Returns the created `Room`
"""
options = options or RoomOptions()
codec = None
if options.video_codec:
codec = RoomConfigVideoCodec(options.video_codec)
if options.room_type == "livestream":
options.room_type = "broadcaster"
config = RoomConfig(
max_peers=options.max_peers,
video_codec=codec,
webhook_url=options.webhook_url,
room_type=RoomConfigRoomType(options.room_type),
)
room = cast(
RoomCreateDetailsResponse, self._request(room_create_room, json_body=config)
).data.room
return Room(config=room.config, id=room.id, peers=room.peers)
def get_all_rooms(self) -> List[Room]:
"""Returns list of all rooms"""
rooms = cast(RoomsListingResponse, self._request(room_get_all_rooms)).data
return [
Room(config=room.config, id=room.id, peers=room.peers) for room in rooms
]
def get_room(self, room_id: str) -> Room:
"""Returns room with the given id"""
room = cast(
RoomDetailsResponse, self._request(room_get_room, room_id=room_id)
).data
return Room(config=room.config, id=room.id, peers=room.peers)
def delete_peer(self, room_id: str, peer_id: str) -> None:
"""Deletes peer"""
return self._request(room_delete_peer, id=peer_id, room_id=room_id)
def delete_room(self, room_id: str) -> None:
"""Deletes a room"""
return self._request(room_delete_room, room_id=room_id)
def refresh_peer_token(self, room_id: str, peer_id: str) -> str:
"""Refreshes peer token"""
response = cast(
PeerRefreshTokenResponse,
self._request(room_refresh_token, id=peer_id, room_id=room_id),
)
return response.data.token
def create_livestream_viewer_token(self, room_id: str) -> str:
"""Generates viewer token for livestream rooms"""
response = cast(
ViewerToken, self._request(viewer_generate_token, room_id=room_id)
)
return response.token
def __parse_peer_metadata(self, metadata: dict | None) -> PeerOptionsWebRTCMetadata:
peer_metadata = PeerOptionsWebRTCMetadata()
if not metadata:
return peer_metadata
for key, value in metadata.items():
peer_metadata.additional_properties[key] = value
return peer_metadata