Skip to content

Commit 95f8318

Browse files
authored
feat: type checking (#15)
1 parent 180714e commit 95f8318

34 files changed

+3203
-1462
lines changed
Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,52 @@
1-
import livekit
2-
import logging
31
import asyncio
2+
import logging
43
from signal import SIGINT, SIGTERM
54

5+
import livekit
6+
67
URL = 'ws://localhost:7880'
78
TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5MDY2MTMyODgsImlzcyI6IkFQSVRzRWZpZFpqclFvWSIsIm5hbWUiOiJuYXRpdmUiLCJuYmYiOjE2NzI2MTMyODgsInN1YiI6Im5hdGl2ZSIsInZpZGVvIjp7InJvb20iOiJ0ZXN0Iiwicm9vbUFkbWluIjp0cnVlLCJyb29tQ3JlYXRlIjp0cnVlLCJyb29tSm9pbiI6dHJ1ZSwicm9vbUxpc3QiOnRydWV9fQ.uSNIangMRu8jZD5mnRYoCHjcsQWCrJXgHCs0aNIgBFY'
89

910

10-
async def main():
11+
async def main() -> None:
1112
room = livekit.Room()
1213

13-
@room.on("participant_connected")
14-
def on_participant_connected(participant: livekit.RemoteParticipant):
14+
@room.listens_to("participant_connected")
15+
def on_participant_connected(participant: livekit.RemoteParticipant) -> None:
1516
logging.info(
1617
"participant connected: %s %s", participant.sid, participant.identity)
1718

18-
@room.on("participant_disconnected")
19+
@room.listens_to("participant_disconnected")
1920
def on_participant_disconnected(participant: livekit.RemoteParticipant):
2021
logging.info("participant disconnected: %s %s",
2122
participant.sid, participant.identity)
2223

23-
@room.on("local_track_published")
24+
@room.listens_to("local_track_published")
2425
def on_local_track_published(publication: livekit.LocalTrackPublication, track: livekit.LocalAudioTrack | livekit.LocalVideoTrack):
2526
logging.info("local track published: %s", publication.sid)
2627

27-
@room.on("active_speakers_changed")
28+
@room.listens_to("active_speakers_changed")
2829
def on_active_speakers_changed(speakers: list[livekit.Participant]):
2930
logging.info("active speakers changed: %s", speakers)
3031

31-
@room.on("local_track_unpublished")
32+
@room.listens_to("local_track_unpublished")
3233
def on_local_track_unpublished(publication: livekit.LocalTrackPublication):
3334
logging.info("local track unpublished: %s", publication.sid)
3435

35-
@room.on("track_published")
36+
@room.listens_to("track_published")
3637
def on_track_published(publication: livekit.LocalTrackPublication, participant: livekit.RemoteParticipant):
3738
logging.info("track published: %s from participant %s (%s)",
3839
publication.sid, participant.sid, participant.identity)
3940

40-
@room.on("track_unpublished")
41+
@room.listens_to("track_unpublished")
4142
def on_track_unpublished(publication: livekit.LocalTrackPublication, participant: livekit.RemoteParticipant):
4243
logging.info("track unpublished: %s", publication.sid)
4344

4445
# Keep a reference to the streams, otherwise they will be disposed
4546
audio_stream = None
4647
video_stream = None
4748

48-
@room.on("track_subscribed")
49+
@room.listens_to("track_subscribed")
4950
def on_track_subscribed(track: livekit.Track, publication: livekit.RemoteTrackPublication, participant: livekit.RemoteParticipant):
5051
logging.info("track subscribed: %s", publication.sid)
5152
if track.kind == livekit.TrackKind.KIND_VIDEO:
@@ -66,41 +67,41 @@ def on_audio_frame(frame: livekit.AudioFrame):
6667
# received an audio frame from the track
6768
pass
6869

69-
@room.on("track_unsubscribed")
70+
@room.listens_to("track_unsubscribed")
7071
def on_track_unsubscribed(track: livekit.Track, publication: livekit.RemoteTrackPublication, participant: livekit.RemoteParticipant):
7172
logging.info("track unsubscribed: %s", publication.sid)
7273

73-
@room.on("data_received")
74+
@room.listens_to("data_received")
7475
def on_data_received(data: bytes, kind: livekit.DataPacketKind, participant: livekit.Participant):
7576
logging.info("received data from %s: %s", participant.identity, data)
7677

77-
@room.on("connection_quality_changed")
78+
@room.listens_to("connection_quality_changed")
7879
def on_connection_quality_changed(participant: livekit.Participant, quality: livekit.ConnectionQuality):
7980
logging.info("connection quality changed for %s", participant.identity)
8081

81-
@room.on("track_subscription_failed")
82+
@room.listens_to("track_subscription_failed")
8283
def on_track_subscription_failed(participant: livekit.RemoteParticipant, track_sid: str, error: str):
8384
logging.info("track subscription failed: %s %s",
8485
participant.identity, error)
8586

86-
@room.on("connection_state_changed")
87+
@room.listens_to("connection_state_changed")
8788
def on_connection_state_changed(state: livekit.ConnectionState):
8889
logging.info("connection state changed: %s", state)
8990

90-
@room.on("connected")
91-
def on_connected():
91+
@room.listens_to("connected")
92+
def on_connected() -> None:
9293
logging.info("connected")
9394

94-
@room.on("disconnected")
95-
def on_disconnected():
95+
@room.listens_to("disconnected")
96+
def on_disconnected() -> None:
9697
logging.info("disconnected")
9798

98-
@room.on("reconnecting")
99-
def on_reconnecting():
99+
@room.listens_to("reconnecting")
100+
def on_reconnecting() -> None:
100101
logging.info("reconnecting")
101102

102-
@room.on("reconnected")
103-
def on_reconnected():
103+
@room.listens_to("reconnected")
104+
def on_reconnected() -> None:
104105
logging.info("reconnected")
105106

106107
try:

examples/face_landmark/face_landmark.py

Whitespace-only changes.

examples/face_landmark/room.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
import matplotlib.pyplot as plt
2-
import livekit
31
import asyncio
4-
import cv2
5-
import numpy as np
62
import os
73
from queue import Queue
4+
5+
import cv2
86
import mediapipe as mp
9-
from mediapipe.tasks import python
10-
from mediapipe.tasks.python import vision
7+
import numpy as np
118
from mediapipe import solutions
129
from mediapipe.framework.formats import landmark_pb2
13-
import numpy as np
10+
11+
import livekit
1412

1513
URL = 'ws://localhost:7880'
1614
TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5MDY2MTMyODgsImlzcyI6IkFQSVRzRWZpZFpqclFvWSIsIm5hbWUiOiJuYXRpdmUiLCJuYmYiOjE2NzI2MTMyODgsInN1YiI6Im5hdGl2ZSIsInZpZGVvIjp7InJvb20iOiJ0ZXN0Iiwicm9vbUFkbWluIjp0cnVlLCJyb29tQ3JlYXRlIjp0cnVlLCJyb29tSm9pbiI6dHJ1ZSwicm9vbUxpc3QiOnRydWV9fQ.uSNIangMRu8jZD5mnRYoCHjcsQWCrJXgHCs0aNIgBFY'
@@ -70,7 +68,7 @@ def draw_landmarks_on_image(rgb_image, detection_result):
7068
.get_default_face_mesh_iris_connections_style())
7169

7270

73-
async def room():
71+
async def room() -> None:
7472
room = livekit.Room()
7573
await room.connect(URL, TOKEN)
7674
print("connected to room: " + room.name)
@@ -90,7 +88,7 @@ def on_video_frame(frame: livekit.VideoFrame):
9088
await room.run()
9189

9290

93-
def display_frames():
91+
def display_frames() -> None:
9492
cv2.namedWindow('livekit_video', cv2.WINDOW_AUTOSIZE)
9593
cv2.startWindowThread()
9694

@@ -128,7 +126,7 @@ def display_frames():
128126
cv2.destroyAllWindows()
129127

130128

131-
async def main():
129+
async def main() -> None:
132130
loop = asyncio.get_event_loop()
133131
future = loop.run_in_executor(None, asyncio.run, room())
134132

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
import livekit
2-
import logging
3-
import numpy as np
4-
import colorsys
51
import asyncio
2+
import colorsys
3+
import logging
64
from signal import SIGINT, SIGTERM
75

6+
import numpy as np
7+
8+
import livekit
9+
810
URL = 'ws://localhost:7880'
9-
TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5MDY2MTMyODgsImlzcyI6IkFQSVRzRWZpZFpqclFvWSIsIm5hbWUiOiJuYXRpdmUiLCJuYmYiOjE2NzI2MTMyODgsInN1YiI6Im5hdGl2ZSIsInZpZGVvIjp7InJvb20iOiJ0ZXN0Iiwicm9vbUFkbWluIjp0cnVlLCJyb29tQ3JlYXRlIjp0cnVlLCJyb29tSm9pbiI6dHJ1ZSwicm9vbUxpc3QiOnRydWV9fQ.uSNIangMRu8jZD5mnRYoCHjcsQWCrJXgHCs0aNIgBFY'
11+
TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5MDY2MTMyODgsImlzcyI6IkFQSVRzRWZpZFpqclFvWSIsIm5hbWUiOiJuYXRpdmUiLCJuYmYiOjE2NzI2MTMyODgsInN1YiI6Im5hdGl2ZSIsInZpZGVvIjp7InJvb20iOiJ0ZXN0Iiwicm9vbUFkbWluIjp0cnVlLCJyb29tQ3JlYXRlIjp0cnVlLCJyb29tSm9pbiI6dHJ1ZSwicm9vbUxpc3QiOnRydWV9fQ.uSNIangMRu8jZD5mnRYoCHjcsQWCrJXgHCs0aNIgBFY' # noqa
1012

1113

1214
async def publish_frames(source: livekit.VideoSource):
@@ -16,7 +18,7 @@ async def publish_frames(source: livekit.VideoSource):
1618
arr = np.ctypeslib.as_array(argb_frame.data)
1719

1820
framerate = 1 / 30
19-
hue = 0
21+
hue = 0.0
2022

2123
while True:
2224
frame = livekit.VideoFrame(
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import livekit
2-
import logging
3-
import numpy as np
4-
import math
51
import asyncio
2+
import logging
63
from signal import SIGINT, SIGTERM
74

5+
import numpy as np
6+
7+
import livekit
8+
89
URL = 'ws://localhost:7880'
910
TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE5MDY2MTMyODgsImlzcyI6IkFQSVRzRWZpZFpqclFvWSIsIm5hbWUiOiJuYXRpdmUiLCJuYmYiOjE2NzI2MTMyODgsInN1YiI6Im5hdGl2ZSIsInZpZGVvIjp7InJvb20iOiJ0ZXN0Iiwicm9vbUFkbWluIjp0cnVlLCJyb29tQ3JlYXRlIjp0cnVlLCJyb29tSm9pbiI6dHJ1ZSwicm9vbUxpc3QiOnRydWV9fQ.uSNIangMRu8jZD5mnRYoCHjcsQWCrJXgHCs0aNIgBFY'
1011

@@ -40,7 +41,7 @@ async def publish_frames(source: livekit.AudioSource):
4041
break
4142

4243

43-
async def main():
44+
async def main() -> None:
4445
room = livekit.Room()
4546

4647
logging.info("connecting to %s", URL)

generate_proto.sh

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
#!/bin/bash
22

3+
# This script requires protobuf-compiler and https://github.com/nipunn1313/mypy-protobuf
4+
35
FFI_PROTOCOL=./client-sdk-rust/livekit-ffi/protocol
46
OUT_PYTHON=./livekit/_proto
57

68
protoc \
79
-I=$FFI_PROTOCOL \
810
--python_out=$OUT_PYTHON \
9-
--pyi_out=$OUT_PYTHON \
11+
--mypy_out=$OUT_PYTHON \
1012
$FFI_PROTOCOL/audio_frame.proto \
1113
$FFI_PROTOCOL/ffi.proto \
1214
$FFI_PROTOCOL/handle.proto \
1315
$FFI_PROTOCOL/participant.proto \
1416
$FFI_PROTOCOL/room.proto \
1517
$FFI_PROTOCOL/track.proto \
16-
$FFI_PROTOCOL/video_frame.proto
18+
$FFI_PROTOCOL/video_frame.proto
19+
20+
touch -a "$OUT_PYTHON/__init__.py"
21+
22+
for f in "$OUT_PYTHON"/*.py "$OUT_PYTHON"/*.pyi; do
23+
perl -i -pe 's|^(import (audio_frame_pb2\|ffi_pb2\|handle_pb2\|participant_pb2\|room_pb2\|track_pb2\|video_frame_pb2))|from . $1|g' "$f"
24+
done
25+

livekit/__init__.py

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,47 @@
11
"""LiveKit Client SDK
22
"""
33

4-
__version__ = "0.1.3"
5-
6-
from ._proto.video_frame_pb2 import (
7-
VideoRotation, VideoFormatType, VideoFrameBufferType)
8-
from ._proto.track_pb2 import (TrackKind, TrackSource, StreamState)
4+
# flake8: noqa
95
from ._proto.room_pb2 import (
10-
TrackPublishOptions, DataPacketKind, ConnectionQuality, ConnectionState)
11-
12-
from .room import (Room, ConnectError)
13-
from .participant import (Participant, LocalParticipant, RemoteParticipant)
14-
from .track import (Track, LocalAudioTrack, LocalVideoTrack,
15-
RemoteAudioTrack, RemoteVideoTrack)
6+
ConnectionQuality,
7+
ConnectionState,
8+
DataPacketKind,
9+
TrackPublishOptions,
10+
)
11+
from ._proto.track_pb2 import StreamState, TrackKind, TrackSource
12+
from ._proto.video_frame_pb2 import VideoFormatType, VideoFrameBufferType, VideoRotation
13+
from .audio_frame import AudioFrame
14+
from .audio_source import AudioSource
15+
from .audio_stream import AudioStream
16+
from .participant import LocalParticipant, Participant, RemoteParticipant
17+
from .room import ConnectError, Room
18+
from .track import (
19+
LocalAudioTrack,
20+
LocalVideoTrack,
21+
RemoteAudioTrack,
22+
RemoteVideoTrack,
23+
Track,
24+
)
1625
from .track_publication import (
17-
TrackPublication, LocalTrackPublication, RemoteTrackPublication)
18-
19-
from .video_frame import (ArgbFrame, VideoFrame, VideoFrameBuffer, NativeVideoFrameBuffer, PlanarYuvBuffer,
20-
PlanarYuv8Buffer, PlanarYuv16Buffer, I420Buffer, I420ABuffer, I422Buffer, I010Buffer, NV12Buffer)
21-
from .video_stream import VideoStream
26+
LocalTrackPublication,
27+
RemoteTrackPublication,
28+
TrackPublication,
29+
)
30+
from .video_frame import (
31+
ArgbFrame,
32+
I010Buffer,
33+
I420ABuffer,
34+
I420Buffer,
35+
I422Buffer,
36+
NativeVideoFrameBuffer,
37+
NV12Buffer,
38+
PlanarYuv8Buffer,
39+
PlanarYuv16Buffer,
40+
PlanarYuvBuffer,
41+
VideoFrame,
42+
VideoFrameBuffer,
43+
)
2244
from .video_source import VideoSource
45+
from .video_stream import VideoStream
2346

24-
from .audio_frame import AudioFrame
25-
from .audio_stream import AudioStream
26-
from .audio_source import AudioSource
47+
__version__ = "0.1.3"

0 commit comments

Comments
 (0)