agora-python-server-sdk 2.0.0__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of agora-python-server-sdk might be problematic. Click here for more details.
- {agora_python_server_sdk-2.0.0/agora_python_server_sdk.egg-info → agora_python_server_sdk-2.0.1}/PKG-INFO +1 -1
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_audio_frame_observer.py +10 -10
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_local_user_observer.py +5 -70
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_video_encoded_frame_observer.py +1 -1
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_video_frame_observer.py +1 -1
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/remote_audio_track.py +15 -1
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1/agora_python_server_sdk.egg-info}/PKG-INFO +1 -1
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora_python_server_sdk.egg-info/SOURCES.txt +6 -1
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/setup.py +1 -1
- agora_python_server_sdk-2.0.1/tests/test_conn.py +30 -0
- agora_python_server_sdk-2.0.1/tests/test_conn2.py +73 -0
- agora_python_server_sdk-2.0.1/tests/test_conn3.py +95 -0
- agora_python_server_sdk-2.0.1/tests/test_conn4.py +90 -0
- agora_python_server_sdk-2.0.1/tests/test_conn5.py +68 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/MANIFEST.in +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/README.md +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/__init__.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_rtc_connection_observer.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/agora_base.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/agora_parameter.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/agora_service.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/audio_encoded_frame_sender.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/audio_frame_observer.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/audio_pcm_data_sender.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/audio_vad.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/globals.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_audio_track.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_user.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_user_observer.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_video_track.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/media_node_factory.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/remote_video_track.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/rtc_connection.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/rtc_connection_observer.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/video_encoded_frame_observer.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/video_frame_observer.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/video_frame_sender.py +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora_python_server_sdk.egg-info/top_level.txt +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/pyproject.toml +0 -0
- {agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/setup.cfg +0 -0
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_audio_frame_observer.py
RENAMED
|
@@ -73,31 +73,31 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
73
73
|
# self.on_get_ear_monitoring_audio_frame_param = ON_GET_EAR_MONITORING_AUDIO_FRAME_PARAM_CALLBACK(self._on_get_ear_monitoring_audio_frame_param)
|
|
74
74
|
|
|
75
75
|
def _on_record_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
76
|
-
print("AudioFrameObserverInner _on_record_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
76
|
+
# print("AudioFrameObserverInner _on_record_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
77
77
|
channel_id_str = channel_id.decode('utf-8')
|
|
78
78
|
frame = audio_frame_inner.contents._to_audio_frame()
|
|
79
79
|
ret = self.observer.on_record_audio_frame(self.local_user, channel_id_str, frame)
|
|
80
80
|
return ret
|
|
81
81
|
|
|
82
82
|
def _on_playback_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
83
|
-
print("AudioFrameObserverInner _on_playback_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
83
|
+
# print("AudioFrameObserverInner _on_playback_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
84
84
|
channel_id_str = channel_id.decode('utf-8')
|
|
85
85
|
frame = audio_frame_inner.contents._to_audio_frame()
|
|
86
86
|
ret = self.observer.on_playback_audio_frame(self.local_user, channel_id_str, frame)
|
|
87
87
|
return ret
|
|
88
88
|
|
|
89
89
|
def _on_mixed_audio_frame(self, local_user_handle, channel_id, audio_frame_inner):
|
|
90
|
-
print("AudioFrameObserverInner _on_mixed_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
90
|
+
# print("AudioFrameObserverInner _on_mixed_audio_frame", local_user_handle, channel_id, audio_frame_inner)
|
|
91
91
|
ret = self.observer.on_mixed_audio_frame(self.local_user, audio_frame_inner)
|
|
92
92
|
return ret
|
|
93
93
|
|
|
94
94
|
def _on_ear_monitoring_audio_frame(self, local_user_handle, audio_frame_inner):
|
|
95
|
-
print("AudioFrameObserverInner _on_ear_monitoring_audio_frame", local_user_handle, audio_frame_inner)
|
|
95
|
+
# print("AudioFrameObserverInner _on_ear_monitoring_audio_frame", local_user_handle, audio_frame_inner)
|
|
96
96
|
ret = self.observer.on_ear_monitoring_audio_frame(self.local_user, audio_frame_inner)
|
|
97
97
|
return ret
|
|
98
98
|
|
|
99
99
|
def _on_playback_audio_frame_before_mixing(self, local_user_handle, channel_id, user_id, audio_frame_inner):
|
|
100
|
-
print("AudioFrameObserverInner _on_playback_audio_frame_before_mixing", local_user_handle, channel_id, user_id, audio_frame_inner)
|
|
100
|
+
# print("AudioFrameObserverInner _on_playback_audio_frame_before_mixing", local_user_handle, channel_id, user_id, audio_frame_inner)
|
|
101
101
|
if channel_id is None:
|
|
102
102
|
channel_id_str = ""
|
|
103
103
|
else:
|
|
@@ -109,12 +109,12 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
109
109
|
return ret
|
|
110
110
|
|
|
111
111
|
def _on_get_audio_frame_position(self, local_user_handle):
|
|
112
|
-
print("AudioFrameObserverInner _on_get_audio_frame_position", local_user_handle)
|
|
112
|
+
# print("AudioFrameObserverInner _on_get_audio_frame_position", local_user_handle)
|
|
113
113
|
return 0
|
|
114
114
|
return self.observer.on_get_audio_frame_position(self.local_user)
|
|
115
115
|
|
|
116
116
|
def _on_get_playback_audio_frame_param(self, local_user_handle):
|
|
117
|
-
print("AudioFrameObserverInner _on_get_playback_audio_frame_param", local_user_handle)
|
|
117
|
+
# print("AudioFrameObserverInner _on_get_playback_audio_frame_param", local_user_handle)
|
|
118
118
|
params = AudioParams()
|
|
119
119
|
params.sample_rate = 16000 # 示例值
|
|
120
120
|
params.channels = 1 # 示例值
|
|
@@ -124,7 +124,7 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
124
124
|
return self.observer.on_get_playback_audio_frame_param(self.local_user)
|
|
125
125
|
|
|
126
126
|
def _on_get_record_audio_frame_param(self, local_user_handle):
|
|
127
|
-
print("AudioFrameObserverInner _on_get_record_audio_frame_param", local_user_handle)
|
|
127
|
+
# print("AudioFrameObserverInner _on_get_record_audio_frame_param", local_user_handle)
|
|
128
128
|
params = AudioParams()
|
|
129
129
|
params.sample_rate = 16000 # 示例值
|
|
130
130
|
params.channels = 1 # 示例值
|
|
@@ -134,7 +134,7 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
134
134
|
return self.observer.on_get_record_audio_frame_param(self.local_user)
|
|
135
135
|
|
|
136
136
|
def _on_get_mixed_audio_frame_param(self, local_user_handle):
|
|
137
|
-
print("AudioFrameObserverInner _on_get_mixed_audio_frame_param", local_user_handle)
|
|
137
|
+
# print("AudioFrameObserverInner _on_get_mixed_audio_frame_param", local_user_handle)
|
|
138
138
|
params = AudioParams()
|
|
139
139
|
params.sample_rate = 16000 # 示例值
|
|
140
140
|
params.channels = 1 # 示例值
|
|
@@ -144,7 +144,7 @@ class AudioFrameObserverInner(ctypes.Structure):
|
|
|
144
144
|
return self.observer.on_get_mixed_audio_frame_param(self.local_user)
|
|
145
145
|
|
|
146
146
|
def _on_get_ear_monitoring_audio_frame_param(self, local_user_handle):
|
|
147
|
-
print("AudioFrameObserverInner _on_get_ear_monitoring_audio_frame_param", local_user_handle)
|
|
147
|
+
# print("AudioFrameObserverInner _on_get_ear_monitoring_audio_frame_param", local_user_handle)
|
|
148
148
|
params = AudioParams()
|
|
149
149
|
params.sample_rate = 16000 # 示例值
|
|
150
150
|
params.channels = 1 # 示例值
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_local_user_observer.py
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import ctypes
|
|
2
2
|
from .agora_base import *
|
|
3
3
|
from .local_user import *
|
|
4
|
-
from .
|
|
5
|
-
from .remote_video_track import RemoteVideoTrack
|
|
4
|
+
from .remote_audio_track import RemoteAudioTrack, RemoteAudioTrackStats
|
|
5
|
+
from .remote_video_track import RemoteVideoTrack, RemoteVideoTrackStats
|
|
6
6
|
uid_t = ctypes.c_uint
|
|
7
7
|
track_id_t = ctypes.c_uint
|
|
8
8
|
|
|
@@ -10,21 +10,6 @@ track_id_t = ctypes.c_uint
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
class RemoteAudioTrackStats(ctypes.Structure):
|
|
14
|
-
_fields_ = [
|
|
15
|
-
("uid", ctypes.c_uint),
|
|
16
|
-
("quality", ctypes.c_int),
|
|
17
|
-
("network_transport_delay", ctypes.c_int),
|
|
18
|
-
("jitter_buffer_delay", ctypes.c_int),
|
|
19
|
-
("audio_loss_rate", ctypes.c_int),
|
|
20
|
-
("num_channels", ctypes.c_int),
|
|
21
|
-
("received_sample_rate", ctypes.c_int),
|
|
22
|
-
("received_bitrate", ctypes.c_int),
|
|
23
|
-
("total_frozen_time", ctypes.c_int),
|
|
24
|
-
("frozen_rate", ctypes.c_int),
|
|
25
|
-
("received_bytes", ctypes.c_int64)
|
|
26
|
-
]
|
|
27
|
-
|
|
28
13
|
class VideoTrackInfoInner(ctypes.Structure):
|
|
29
14
|
_fields_ = [
|
|
30
15
|
("is_local", ctypes.c_int),
|
|
@@ -51,56 +36,6 @@ class VideoTrackInfoInner(ctypes.Structure):
|
|
|
51
36
|
track_info.owner_uid = self.owner_uid
|
|
52
37
|
return track_info
|
|
53
38
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
class LocalVideoTrackStats(ctypes.Structure):
|
|
57
|
-
_fields_ = [
|
|
58
|
-
("number_of_streams", ctypes.c_uint64),
|
|
59
|
-
("bytes_major_stream", ctypes.c_uint64),
|
|
60
|
-
("bytes_minor_stream", ctypes.c_uint64),
|
|
61
|
-
("frames_encoded", ctypes.c_uint32),
|
|
62
|
-
("ssrc_major_stream", ctypes.c_uint32),
|
|
63
|
-
("ssrc_minor_stream", ctypes.c_uint32),
|
|
64
|
-
("capture_frame_rate", ctypes.c_int),
|
|
65
|
-
("regulated_capture_frame_rate", ctypes.c_int),
|
|
66
|
-
("input_frame_rate", ctypes.c_int),
|
|
67
|
-
("encode_frame_rate", ctypes.c_int),
|
|
68
|
-
("render_frame_rate", ctypes.c_int),
|
|
69
|
-
("target_media_bitrate_bps", ctypes.c_int),
|
|
70
|
-
("media_bitrate_bps", ctypes.c_int),
|
|
71
|
-
("total_bitrate_bps", ctypes.c_int),
|
|
72
|
-
("capture_width", ctypes.c_int),
|
|
73
|
-
("capture_height", ctypes.c_int),
|
|
74
|
-
("regulated_capture_width", ctypes.c_int),
|
|
75
|
-
("regulated_capture_height", ctypes.c_int),
|
|
76
|
-
("width", ctypes.c_int),
|
|
77
|
-
("height", ctypes.c_int),
|
|
78
|
-
("encoder_type", ctypes.c_uint32),
|
|
79
|
-
("uplink_cost_time_ms", ctypes.c_uint32),
|
|
80
|
-
("quality_adapt_indication", ctypes.c_int)
|
|
81
|
-
]
|
|
82
|
-
class RemoteVideoTrackStats(ctypes.Structure):
|
|
83
|
-
_fields_ = [
|
|
84
|
-
("uid", ctypes.c_uint),
|
|
85
|
-
("delay", ctypes.c_int),
|
|
86
|
-
("width", ctypes.c_int),
|
|
87
|
-
("height", ctypes.c_int),
|
|
88
|
-
("received_bitrate", ctypes.c_int),
|
|
89
|
-
("decoder_output_frame_rate", ctypes.c_int),
|
|
90
|
-
("renderer_output_frame_rate", ctypes.c_int),
|
|
91
|
-
("frame_loss_rate", ctypes.c_int),
|
|
92
|
-
("packet_loss_rate", ctypes.c_int),
|
|
93
|
-
("rx_stream_type", ctypes.c_int),
|
|
94
|
-
("total_frozen_time", ctypes.c_int),
|
|
95
|
-
("frozen_rate", ctypes.c_int),
|
|
96
|
-
("total_decoded_frames", ctypes.c_uint32),
|
|
97
|
-
("av_sync_time_ms", ctypes.c_int),
|
|
98
|
-
("downlink_process_time_ms", ctypes.c_uint32),
|
|
99
|
-
("frame_render_delay_ms", ctypes.c_uint32),
|
|
100
|
-
("totalActiveTime", ctypes.c_uint64),
|
|
101
|
-
("publishDuration", ctypes.c_uint64)
|
|
102
|
-
]
|
|
103
|
-
|
|
104
39
|
class AudioVolumeInfo(ctypes.Structure):
|
|
105
40
|
_fields_ = [
|
|
106
41
|
("user_id", ctypes.c_uint),
|
|
@@ -338,7 +273,7 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
338
273
|
self.local_user_observer.on_user_audio_track_subscribed(self.local_user, user_id_str, remote_audio_track)
|
|
339
274
|
|
|
340
275
|
def _on_remote_audio_track_statistics(self, local_user_handle, remote_audio_track_handle, stats):
|
|
341
|
-
print("LocalUserCB _on_remote_audio_track_statistics:", local_user_handle, remote_audio_track_handle, stats)
|
|
276
|
+
# print("LocalUserCB _on_remote_audio_track_statistics:", local_user_handle, remote_audio_track_handle, stats)
|
|
342
277
|
audio_stats = stats.contents #RemoteAudioTrackStats
|
|
343
278
|
remote_audio_track = self.local_user.get_remote_audio_map(remote_audio_track_handle)
|
|
344
279
|
self.local_user_observer.on_remote_audio_track_statistics(self.local_user, remote_audio_track, audio_stats)
|
|
@@ -480,10 +415,10 @@ class RTCLocalUserObserverInner(ctypes.Structure):
|
|
|
480
415
|
self.local_user_observer.on_remote_subscribe_fallback_to_audio_only(self.local_user, user_id_str, is_fallback)
|
|
481
416
|
|
|
482
417
|
def _on_stream_message(self, local_user_handle, user_id, stream_id, data, size):
|
|
483
|
-
print("LocalUserCB _on_stream_message:", local_user_handle, user_id, stream_id, data, size)
|
|
418
|
+
# print("LocalUserCB _on_stream_message:", local_user_handle, user_id, stream_id, data, size)
|
|
484
419
|
user_id_str = user_id.decode('utf-8') if user_id else ""
|
|
485
420
|
bytes_from_c = ctypes.string_at(data, size)
|
|
486
|
-
data_byte_array = bytearray(bytes_from_c)
|
|
421
|
+
data_byte_array = bytearray(bytes_from_c).decode()
|
|
487
422
|
#note: do not use date_byte_array.decode() for the stream msg is binary data, not limited to only text
|
|
488
423
|
self.local_user_observer.on_stream_message(self.local_user, user_id_str, stream_id, data_byte_array, size)
|
|
489
424
|
|
|
@@ -53,7 +53,7 @@ class VideoEncodedFrameObserverInner(ctypes.Structure):
|
|
|
53
53
|
self.on_encoded_video_frame = ON_ENCODED_VIDEO_FRAME(self._on_encoded_video_frame)
|
|
54
54
|
|
|
55
55
|
def _on_encoded_video_frame(self, agora_video_encoded_frame_observer ,uid, image_buffer, length, video_encoded_frame_info):
|
|
56
|
-
print("VideoEncodedFrameObserverInnerCB on_encoded_video_frame")
|
|
56
|
+
# print("VideoEncodedFrameObserverInnerCB on_encoded_video_frame")
|
|
57
57
|
img_buffer = ctypes.string_at(image_buffer, length)
|
|
58
58
|
vefi = video_encoded_frame_info.contents._to_encoded_video_frame_info()
|
|
59
59
|
self.video_encoded_frame_observer.on_encoded_video_frame(agora_video_encoded_frame_observer, uid, img_buffer, length, vefi)
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/_video_frame_observer.py
RENAMED
|
@@ -63,7 +63,7 @@ class VideoFrameObserverInner(ctypes.Structure):
|
|
|
63
63
|
|
|
64
64
|
def _on_frame(self, agora_handle, channel_id, user_id, video_frame:VideoFrameInner):
|
|
65
65
|
vf = video_frame.contents
|
|
66
|
-
print("VideoFrameObserver _on_frame:", agora_handle, channel_id, user_id, vf.metadata_buffer, vf.metadata_size)
|
|
66
|
+
# print("VideoFrameObserver _on_frame:", agora_handle, channel_id, user_id, vf.metadata_buffer, vf.metadata_size)
|
|
67
67
|
self.video_frame_observer.on_frame(agora_handle, channel_id.decode() if channel_id else None, user_id.decode(), vf.to_video_frame())
|
|
68
68
|
|
|
69
69
|
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/remote_audio_track.py
RENAMED
|
@@ -1,7 +1,21 @@
|
|
|
1
1
|
import ctypes
|
|
2
2
|
from .agora_base import *
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
class RemoteAudioTrackStats(ctypes.Structure):
|
|
6
|
+
_fields_ = [
|
|
7
|
+
("uid", ctypes.c_uint),
|
|
8
|
+
("quality", ctypes.c_int),
|
|
9
|
+
("network_transport_delay", ctypes.c_int),
|
|
10
|
+
("jitter_buffer_delay", ctypes.c_int),
|
|
11
|
+
("audio_loss_rate", ctypes.c_int),
|
|
12
|
+
("num_channels", ctypes.c_int),
|
|
13
|
+
("received_sample_rate", ctypes.c_int),
|
|
14
|
+
("received_bitrate", ctypes.c_int),
|
|
15
|
+
("total_frozen_time", ctypes.c_int),
|
|
16
|
+
("frozen_rate", ctypes.c_int),
|
|
17
|
+
("received_bytes", ctypes.c_int64)
|
|
18
|
+
]
|
|
5
19
|
|
|
6
20
|
agora_remote_audio_track_get_statistics = agora_lib.agora_remote_audio_track_get_statistics
|
|
7
21
|
agora_remote_audio_track_get_statistics.restype = ctypes.POINTER(RemoteAudioTrackStats)
|
|
@@ -31,4 +31,9 @@ agora/rtc/video_frame_sender.py
|
|
|
31
31
|
agora_python_server_sdk.egg-info/PKG-INFO
|
|
32
32
|
agora_python_server_sdk.egg-info/SOURCES.txt
|
|
33
33
|
agora_python_server_sdk.egg-info/dependency_links.txt
|
|
34
|
-
agora_python_server_sdk.egg-info/top_level.txt
|
|
34
|
+
agora_python_server_sdk.egg-info/top_level.txt
|
|
35
|
+
tests/test_conn.py
|
|
36
|
+
tests/test_conn2.py
|
|
37
|
+
tests/test_conn3.py
|
|
38
|
+
tests/test_conn4.py
|
|
39
|
+
tests/test_conn5.py
|
|
@@ -47,7 +47,7 @@ class CustomInstallCommand(install):
|
|
|
47
47
|
|
|
48
48
|
setup(
|
|
49
49
|
name='agora_python_server_sdk',
|
|
50
|
-
version='2.0.
|
|
50
|
+
version='2.0.1',
|
|
51
51
|
description='A Python SDK for Agora Server',
|
|
52
52
|
long_description=open('README.md').read(),
|
|
53
53
|
long_description_content_type='text/markdown',
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
import asyncio
|
|
3
|
+
from unittest.mock import patch
|
|
4
|
+
|
|
5
|
+
class TestRTCConnection:
|
|
6
|
+
@pytest.mark.asyncio
|
|
7
|
+
async def test_connect_with_correct_uid(self):
|
|
8
|
+
# 创建模拟的 RTCConnection 对象
|
|
9
|
+
with patch('your_module.RTCConnection') as mock_rtc_connection:
|
|
10
|
+
# 配置模拟对象的行为
|
|
11
|
+
mock_rtc_connection.return_value.connect.return_value = 0 # 假设连接成功
|
|
12
|
+
mock_rtc_connection.return_value.register_observer.return_value = 0
|
|
13
|
+
|
|
14
|
+
# 创建测试用的 Observer
|
|
15
|
+
class TestObserver(IRTCConnectionObserver):
|
|
16
|
+
def __init__(self):
|
|
17
|
+
self.local_user_id = None
|
|
18
|
+
|
|
19
|
+
def on_connected(self, agora_rtc_conn, conn_info, reason):
|
|
20
|
+
self.local_user_id = conn_info.local_user_id
|
|
21
|
+
|
|
22
|
+
test_observer = TestObserver()
|
|
23
|
+
|
|
24
|
+
# 创建 RTCConnection 实例并调用 connect
|
|
25
|
+
rtc_conn = mock_rtc_connection()
|
|
26
|
+
rtc_conn.register_observer(test_observer)
|
|
27
|
+
await rtc_conn.connect('token', 'channel_id', 'my_uid')
|
|
28
|
+
|
|
29
|
+
# 断言 local_user_id
|
|
30
|
+
assert test_observer.local_user_id == 'my_uid'
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import pytest
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
8
|
+
sdk_dir = os.path.dirname(script_dir)
|
|
9
|
+
# sdk_dir = os.path.dirname(os.path.dirname(script_dir))
|
|
10
|
+
if sdk_dir not in sys.path:
|
|
11
|
+
sys.path.insert(0, sdk_dir)
|
|
12
|
+
|
|
13
|
+
import time
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
import datetime
|
|
17
|
+
from agora.rtc.agora_service import AgoraServiceConfig, AgoraService, AudioSubscriptionOptions, RTCConnConfig
|
|
18
|
+
from agora.rtc.rtc_connection_observer import IRTCConnectionObserver
|
|
19
|
+
from agora.rtc.rtc_connection import RTCConnection
|
|
20
|
+
from agora.rtc.agora_base import *
|
|
21
|
+
|
|
22
|
+
class MockObserver(IRTCConnectionObserver):
|
|
23
|
+
def __init__(self):
|
|
24
|
+
self.event = asyncio.Event()
|
|
25
|
+
self.conn_info = None
|
|
26
|
+
|
|
27
|
+
def on_connected(self, rtc_conn, conn_info, reason):
|
|
28
|
+
print("on_connected")
|
|
29
|
+
self.conn_info = conn_info
|
|
30
|
+
self.event.set() # 设置事件,表示回调已被调用
|
|
31
|
+
|
|
32
|
+
# 使用 pytest-asyncio 的异步测试
|
|
33
|
+
@pytest.mark.asyncio
|
|
34
|
+
async def test_connection_connect_with_observer():
|
|
35
|
+
# 创建RTCConnection实例
|
|
36
|
+
#---------------1. Init SDK
|
|
37
|
+
config = AgoraServiceConfig()
|
|
38
|
+
config.appid = "aab8b8f5a8cd4469a63042fcfafe7063"
|
|
39
|
+
config.log_path = "/Users/dingyusong/Downloads/tests_log/agorasdk.log"
|
|
40
|
+
|
|
41
|
+
agora_service = AgoraService()
|
|
42
|
+
agora_service.initialize(config)
|
|
43
|
+
|
|
44
|
+
#---------------2. Create Connection
|
|
45
|
+
con_config = RTCConnConfig(
|
|
46
|
+
client_role_type=ClientRoleType.CLIENT_ROLE_BROADCASTER,
|
|
47
|
+
channel_profile=ChannelProfileType.CHANNEL_PROFILE_LIVE_BROADCASTING,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
connection = agora_service.create_rtc_connection(con_config)
|
|
51
|
+
|
|
52
|
+
# 创建MockObserver实例
|
|
53
|
+
observer = MockObserver()
|
|
54
|
+
|
|
55
|
+
# 注册观察者
|
|
56
|
+
connection.register_observer(observer)
|
|
57
|
+
print("before connect")
|
|
58
|
+
# 调用connect方法
|
|
59
|
+
sample_token = "aab8b8f5a8cd4469a63042fcfafe7063"
|
|
60
|
+
channel_id = "dummy_channel"
|
|
61
|
+
uid = "1"
|
|
62
|
+
connection.connect(sample_token, channel_id, uid)
|
|
63
|
+
|
|
64
|
+
print("after connect")
|
|
65
|
+
# 等待事件被设置,表示 on_connected 已被调用
|
|
66
|
+
await observer.event.wait()
|
|
67
|
+
|
|
68
|
+
# 验证 conn_info 是否被正确设置
|
|
69
|
+
assert observer.conn_info is not None
|
|
70
|
+
assert observer.conn_info.local_user_id == "dummy_uid"
|
|
71
|
+
|
|
72
|
+
# if __name__ == '__main__':
|
|
73
|
+
# test_connection_connect_with_observer()
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import pytest
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
8
|
+
sdk_dir = os.path.dirname(script_dir)
|
|
9
|
+
# sdk_dir = os.path.dirname(os.path.dirname(script_dir))
|
|
10
|
+
if sdk_dir not in sys.path:
|
|
11
|
+
sys.path.insert(0, sdk_dir)
|
|
12
|
+
|
|
13
|
+
import time
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
import datetime
|
|
17
|
+
from agora.rtc.agora_service import AgoraServiceConfig, AgoraService, AudioSubscriptionOptions, RTCConnConfig
|
|
18
|
+
from agora.rtc.rtc_connection_observer import IRTCConnectionObserver
|
|
19
|
+
from agora.rtc.rtc_connection import RTCConnection
|
|
20
|
+
from agora.rtc.agora_base import *
|
|
21
|
+
|
|
22
|
+
# class MockObserver(IRTCConnectionObserver):
|
|
23
|
+
# def __init__(self):
|
|
24
|
+
# self.event = asyncio.Event()
|
|
25
|
+
# self.conn_info = None
|
|
26
|
+
|
|
27
|
+
# def on_connected(self, rtc_conn, conn_info, reason):
|
|
28
|
+
# print("on_connected")
|
|
29
|
+
# self.conn_info = conn_info
|
|
30
|
+
# self.event.set() # 设置事件,表示回调已被调用
|
|
31
|
+
import pytest
|
|
32
|
+
from unittest.mock import MagicMock
|
|
33
|
+
import threading
|
|
34
|
+
import time
|
|
35
|
+
|
|
36
|
+
# 假设RTCConnection和IRTCConnectionObserver的定义在my_module.py中
|
|
37
|
+
# from my_module import RTCConnection, IRTCConnectionObserver
|
|
38
|
+
|
|
39
|
+
class MockObserver(IRTCConnectionObserver):
|
|
40
|
+
def __init__(self):
|
|
41
|
+
self.connected_info = None
|
|
42
|
+
self.event = threading.Event()
|
|
43
|
+
|
|
44
|
+
def on_connected(self, agora_rtc_conn, conn_info, reason):
|
|
45
|
+
print("Observer: on_connected called")
|
|
46
|
+
self.connected_info = conn_info
|
|
47
|
+
self.event.set() # 触发事件,表示已连接
|
|
48
|
+
print(f"Observer: Connected with local_user_id: {conn_info.local_user_id}")
|
|
49
|
+
|
|
50
|
+
# 测试用例
|
|
51
|
+
def test_on_connected_called_with_correct_user_id():
|
|
52
|
+
print("Test: Starting test_on_connected_called_with_correct_user_id")
|
|
53
|
+
# 创建一个RTCConnection实例
|
|
54
|
+
#---------------1. Init SDK
|
|
55
|
+
config = AgoraServiceConfig()
|
|
56
|
+
config.appid = "aab8b8f5a8cd4469a63042fcfafe7063"
|
|
57
|
+
config.log_path = "/Users/dingyusong/Downloads/tests_log/agorasdk.log"
|
|
58
|
+
|
|
59
|
+
agora_service = AgoraService()
|
|
60
|
+
agora_service.initialize(config)
|
|
61
|
+
|
|
62
|
+
#---------------2. Create Connection
|
|
63
|
+
con_config = RTCConnConfig(
|
|
64
|
+
client_role_type=ClientRoleType.CLIENT_ROLE_BROADCASTER,
|
|
65
|
+
channel_profile=ChannelProfileType.CHANNEL_PROFILE_LIVE_BROADCASTING,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
connection = agora_service.create_rtc_connection(con_config)
|
|
69
|
+
|
|
70
|
+
# 创建一个具体的观察者实例
|
|
71
|
+
observer = MockObserver()
|
|
72
|
+
|
|
73
|
+
# 注册观察者
|
|
74
|
+
connection.register_observer(observer)
|
|
75
|
+
|
|
76
|
+
print("before connect")
|
|
77
|
+
# 调用connect方法
|
|
78
|
+
sample_token = "aab8b8f5a8cd4469a63042fcfafe7063"
|
|
79
|
+
channel_id = "dummy_channel"
|
|
80
|
+
uid = "1"
|
|
81
|
+
connection.connect(sample_token, channel_id, uid)
|
|
82
|
+
|
|
83
|
+
print("after connect")
|
|
84
|
+
|
|
85
|
+
# 等待 on_connected 被调用
|
|
86
|
+
observer.event.wait(timeout=5) # 等待最多5秒
|
|
87
|
+
|
|
88
|
+
print("after connect2222")
|
|
89
|
+
# 验证 local_user_id 是否与 uid 一致
|
|
90
|
+
assert observer.connected_info is not None, "on_connected should have been called"
|
|
91
|
+
assert observer.connected_info.local_user_id == uid, "local_user_id should match the provided uid"
|
|
92
|
+
|
|
93
|
+
# 运行测试
|
|
94
|
+
# if __name__ == "__main__":
|
|
95
|
+
# pytest.main()
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import pytest
|
|
3
|
+
|
|
4
|
+
import os
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
8
|
+
sdk_dir = os.path.dirname(script_dir)
|
|
9
|
+
# sdk_dir = os.path.dirname(os.path.dirname(script_dir))
|
|
10
|
+
if sdk_dir not in sys.path:
|
|
11
|
+
sys.path.insert(0, sdk_dir)
|
|
12
|
+
|
|
13
|
+
import time
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
import datetime
|
|
17
|
+
import threading
|
|
18
|
+
|
|
19
|
+
from agora.rtc.agora_service import AgoraServiceConfig, AgoraService, AudioSubscriptionOptions, RTCConnConfig
|
|
20
|
+
from agora.rtc.rtc_connection_observer import IRTCConnectionObserver
|
|
21
|
+
from agora.rtc.rtc_connection import RTCConnection
|
|
22
|
+
from agora.rtc.agora_base import *
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class MockObserver(IRTCConnectionObserver):
|
|
26
|
+
def __init__(self):
|
|
27
|
+
self.connected_info = None
|
|
28
|
+
self.event = asyncio.Event()
|
|
29
|
+
|
|
30
|
+
def on_connected(self, agora_rtc_conn, conn_info, reason):
|
|
31
|
+
print("Observer: on_connected called")
|
|
32
|
+
self.connected_info = conn_info
|
|
33
|
+
self.event.set() # 触发事件,表示已连接
|
|
34
|
+
print(f"Observer: Connected with local_user_id: {conn_info.local_user_id}")
|
|
35
|
+
print("Observer: thread id", threading.get_ident())
|
|
36
|
+
|
|
37
|
+
# 测试用例
|
|
38
|
+
@pytest.mark.asyncio
|
|
39
|
+
async def test_on_connected_called_with_correct_user_id():
|
|
40
|
+
print("Test: Starting test_on_connected_called_with_correct_user_id")
|
|
41
|
+
# 创建一个RTCConnection实例
|
|
42
|
+
#---------------1. Init SDK
|
|
43
|
+
config = AgoraServiceConfig()
|
|
44
|
+
config.appid = "aab8b8f5a8cd4469a63042fcfafe7063"
|
|
45
|
+
config.log_path = "/Users/dingyusong/Downloads/tests_log/agorasdk.log"
|
|
46
|
+
|
|
47
|
+
agora_service = AgoraService()
|
|
48
|
+
agora_service.initialize(config)
|
|
49
|
+
|
|
50
|
+
#---------------2. Create Connection
|
|
51
|
+
con_config = RTCConnConfig(
|
|
52
|
+
client_role_type=ClientRoleType.CLIENT_ROLE_BROADCASTER,
|
|
53
|
+
channel_profile=ChannelProfileType.CHANNEL_PROFILE_LIVE_BROADCASTING,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
connection = agora_service.create_rtc_connection(con_config)
|
|
57
|
+
|
|
58
|
+
# 创建一个具体的观察者实例
|
|
59
|
+
observer = MockObserver()
|
|
60
|
+
|
|
61
|
+
# 注册观察者
|
|
62
|
+
connection.register_observer(observer)
|
|
63
|
+
|
|
64
|
+
print("before connect")
|
|
65
|
+
# 调用connect方法
|
|
66
|
+
sample_token = "aab8b8f5a8cd4469a63042fcfafe7063"
|
|
67
|
+
channel_id = "dummy_channel"
|
|
68
|
+
uid = "1"
|
|
69
|
+
connection.connect(sample_token, channel_id, uid)
|
|
70
|
+
print("connect: thread id", threading.get_ident())
|
|
71
|
+
print("after connect")
|
|
72
|
+
|
|
73
|
+
# 等待 on_connected 被调用
|
|
74
|
+
# observer.event.wait() # 等待最多5秒
|
|
75
|
+
await observer.event.wait() # 等待事件被设置
|
|
76
|
+
print("after connect2222")
|
|
77
|
+
|
|
78
|
+
# try:
|
|
79
|
+
# await asyncio.wait_for(observer.event.wait(), timeout=5)
|
|
80
|
+
# except asyncio.TimeoutError:
|
|
81
|
+
# assert False, "on_connected was not called within the timeout period"
|
|
82
|
+
|
|
83
|
+
print("after connect3333")
|
|
84
|
+
# 验证 local_user_id 是否与 uid 一致
|
|
85
|
+
assert observer.connected_info is not None, "on_connected should have been called"
|
|
86
|
+
assert observer.connected_info.local_user_id == uid, "local_user_id should match the provided uid"
|
|
87
|
+
|
|
88
|
+
# 运行测试
|
|
89
|
+
# if __name__ == "__main__":
|
|
90
|
+
# pytest.main()
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import pytest
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
7
|
+
sdk_dir = os.path.dirname(script_dir)
|
|
8
|
+
if sdk_dir not in sys.path:
|
|
9
|
+
sys.path.insert(0, sdk_dir)
|
|
10
|
+
|
|
11
|
+
from agora.rtc.agora_service import AgoraServiceConfig, AgoraService, RTCConnConfig
|
|
12
|
+
from agora.rtc.rtc_connection_observer import IRTCConnectionObserver
|
|
13
|
+
from agora.rtc.agora_base import *
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class MockObserver(IRTCConnectionObserver):
|
|
17
|
+
def __init__(self):
|
|
18
|
+
self.connected_info = None
|
|
19
|
+
self.event = asyncio.Event()
|
|
20
|
+
|
|
21
|
+
def on_connected(self, agora_rtc_conn, conn_info, reason):
|
|
22
|
+
print("Observer: on_connected called")
|
|
23
|
+
self.connected_info = conn_info
|
|
24
|
+
self.event.set() # 触发事件,表示已连接
|
|
25
|
+
print(f"Observer: Connected with local_user_id: {conn_info.local_user_id}")
|
|
26
|
+
|
|
27
|
+
# 测试用例
|
|
28
|
+
@pytest.mark.asyncio
|
|
29
|
+
async def test_on_connected_called_with_correct_user_id():
|
|
30
|
+
print("Test: Starting test_on_connected_called_with_correct_user_id")
|
|
31
|
+
# 创建一个RTCConnection实例
|
|
32
|
+
#---------------1. Init SDK
|
|
33
|
+
config = AgoraServiceConfig()
|
|
34
|
+
config.appid = "aab8"
|
|
35
|
+
config.log_path = "/Users/dd/Downloads/tests_log/agorasdk.log"
|
|
36
|
+
|
|
37
|
+
agora_service = AgoraService()
|
|
38
|
+
agora_service.initialize(config)
|
|
39
|
+
|
|
40
|
+
#---------------2. Create Connection
|
|
41
|
+
con_config = RTCConnConfig(
|
|
42
|
+
client_role_type=ClientRoleType.CLIENT_ROLE_BROADCASTER,
|
|
43
|
+
channel_profile=ChannelProfileType.CHANNEL_PROFILE_LIVE_BROADCASTING,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
connection = agora_service.create_rtc_connection(con_config)
|
|
47
|
+
|
|
48
|
+
# 创建一个具体的观察者实例
|
|
49
|
+
observer = MockObserver()
|
|
50
|
+
|
|
51
|
+
# 注册观察者
|
|
52
|
+
connection.register_observer(observer)
|
|
53
|
+
|
|
54
|
+
print("before connect")
|
|
55
|
+
# 调用connect方法
|
|
56
|
+
sample_token = "aab8"
|
|
57
|
+
channel_id = "dummy_channel"
|
|
58
|
+
uid = "1"
|
|
59
|
+
connection.connect(sample_token, channel_id, uid)
|
|
60
|
+
|
|
61
|
+
print("after connect")
|
|
62
|
+
|
|
63
|
+
await observer.event.wait()
|
|
64
|
+
|
|
65
|
+
print("after connect3333")
|
|
66
|
+
assert observer.connected_info is not None, "on_connected should have been called"
|
|
67
|
+
assert observer.connected_info.local_user_id == uid, "local_user_id should match the provided uid"
|
|
68
|
+
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/agora_parameter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/audio_frame_observer.py
RENAMED
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/audio_pcm_data_sender.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_audio_track.py
RENAMED
|
File without changes
|
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_user_observer.py
RENAMED
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/local_video_track.py
RENAMED
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/media_node_factory.py
RENAMED
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/remote_video_track.py
RENAMED
|
File without changes
|
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/rtc_connection_observer.py
RENAMED
|
File without changes
|
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/video_frame_observer.py
RENAMED
|
File without changes
|
{agora_python_server_sdk-2.0.0 → agora_python_server_sdk-2.0.1}/agora/rtc/video_frame_sender.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|