agora-python-server-sdk 2.4.6__tar.gz → 2.4.7__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.
Files changed (49) hide show
  1. {agora_python_server_sdk-2.4.6/agora_python_server_sdk.egg-info → agora_python_server_sdk-2.4.7}/PKG-INFO +22 -2
  2. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/README.md +21 -1
  3. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_ctypes_handle/_ctypes_data.py +2 -1
  4. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/agora_base.py +2 -1
  5. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/local_video_track.py +2 -2
  6. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/rtc_connection.py +22 -2
  7. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtm/_ctypes_handle/_ctypes_data.py +2 -1
  8. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtm/rtm_client.py +13 -6
  9. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7/agora_python_server_sdk.egg-info}/PKG-INFO +22 -2
  10. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/setup.py +1 -1
  11. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/MANIFEST.in +0 -0
  12. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/__init__.py +0 -0
  13. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/__init__.py +0 -0
  14. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_ctypes_handle/_audio_frame_observer.py +0 -0
  15. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_ctypes_handle/_local_user_observer.py +0 -0
  16. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_ctypes_handle/_rtc_connection_observer.py +0 -0
  17. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_ctypes_handle/_video_encoded_frame_observer.py +0 -0
  18. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_ctypes_handle/_video_frame_observer.py +0 -0
  19. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/_utils/globals.py +0 -0
  20. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/agora_parameter.py +0 -0
  21. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/agora_service.py +0 -0
  22. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/audio_encoded_frame_sender.py +0 -0
  23. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/audio_frame_observer.py +0 -0
  24. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/audio_pcm_data_sender.py +0 -0
  25. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/audio_sessionctrl.py +0 -0
  26. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/audio_vad_manager.py +0 -0
  27. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/external_audio_processor.py +0 -0
  28. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/local_audio_track.py +0 -0
  29. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/local_user.py +0 -0
  30. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/local_user_observer.py +0 -0
  31. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/media_node_factory.py +0 -0
  32. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/remote_audio_track.py +0 -0
  33. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/remote_video_track.py +0 -0
  34. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/rtc_connection_observer.py +0 -0
  35. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/utils/audio_consumer.py +0 -0
  36. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/utils/vad_dump.py +0 -0
  37. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/video_encoded_frame_observer.py +0 -0
  38. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/video_encoded_image_sender.py +0 -0
  39. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/video_frame_observer.py +0 -0
  40. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/video_frame_sender.py +0 -0
  41. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtc/voice_detection.py +0 -0
  42. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtm/__init__.py +0 -0
  43. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtm/rtm_base.py +0 -0
  44. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora/rtm/rtm_event_handler.py +0 -0
  45. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora_python_server_sdk.egg-info/SOURCES.txt +0 -0
  46. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
  47. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/agora_python_server_sdk.egg-info/top_level.txt +0 -0
  48. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/pyproject.toml +0 -0
  49. {agora_python_server_sdk-2.4.6 → agora_python_server_sdk-2.4.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: agora_python_server_sdk
3
- Version: 2.4.6
3
+ Version: 2.4.7
4
4
  Summary: A Python SDK for Agora Server
5
5
  Home-page: https://github.com/AgoraIO-Extensions/Agora-Python-Server-SDK
6
6
  Classifier: Intended Audience :: Developers
@@ -63,7 +63,27 @@ export LD_LIBRARY_PATH=/site_packages/agora/agora_sdk/
63
63
  python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
64
64
  ```
65
65
 
66
- # Change log
66
+ # Release Note
67
+
68
+ ## 2026.06.24 Release Version 2.4.7
69
+
70
+ - **New Features**:
71
+ - Added `RTCConnection.get_sid()` and `RTCConnection.set_simulcast_stream()` interfaces for retrieving SID and configuring Simulcast stream capabilities.
72
+ - In `EncryptionConfig`, added the `datastream_encryption_enabled` option to support data stream encryption.
73
+
74
+ - **Improvements and Enhancements**:
75
+ - Improved the Simulcast Stream configuration process to further simplify the usage of `LocalVideoTrack.enable_simulcast_stream()`.
76
+ - Adjusted audio encoding timestamp behavior: when `capture_time_ms` is not set, the current time will be used by default.
77
+ - Optimized RTC/RTM binary message processing to enhance raw data passthrough capability.
78
+ - Enhanced lifecycle management of RTM ctypes callback objects to improve overall stability.
79
+
80
+ - **Examples and Documentation**:
81
+ - Updated RTM/RTC example code, adding detailed examples for Simulcast and binary message transmission.
82
+ - Updated macOS SDK version records.
83
+
84
+ ## 2026.06.01 Release Version 2.4.6
85
+ - **Update**: Updated the RTC SDK to version 174, resolving the issue where two same UIDs could join the same channel.
86
+
67
87
  ## 2026.05.08 Release Version 2.4.5
68
88
  - **Update**: Update arm rtc sdk, which can run basic function on arm64 platform, the vad function is not supported yet.
69
89
 
@@ -48,7 +48,27 @@ export LD_LIBRARY_PATH=/site_packages/agora/agora_sdk/
48
48
  python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
49
49
  ```
50
50
 
51
- # Change log
51
+ # Release Note
52
+
53
+ ## 2026.06.24 Release Version 2.4.7
54
+
55
+ - **New Features**:
56
+ - Added `RTCConnection.get_sid()` and `RTCConnection.set_simulcast_stream()` interfaces for retrieving SID and configuring Simulcast stream capabilities.
57
+ - In `EncryptionConfig`, added the `datastream_encryption_enabled` option to support data stream encryption.
58
+
59
+ - **Improvements and Enhancements**:
60
+ - Improved the Simulcast Stream configuration process to further simplify the usage of `LocalVideoTrack.enable_simulcast_stream()`.
61
+ - Adjusted audio encoding timestamp behavior: when `capture_time_ms` is not set, the current time will be used by default.
62
+ - Optimized RTC/RTM binary message processing to enhance raw data passthrough capability.
63
+ - Enhanced lifecycle management of RTM ctypes callback objects to improve overall stability.
64
+
65
+ - **Examples and Documentation**:
66
+ - Updated RTM/RTC example code, adding detailed examples for Simulcast and binary message transmission.
67
+ - Updated macOS SDK version records.
68
+
69
+ ## 2026.06.01 Release Version 2.4.6
70
+ - **Update**: Updated the RTC SDK to version 174, resolving the issue where two same UIDs could join the same channel.
71
+
52
72
  ## 2026.05.08 Release Version 2.4.5
53
73
  - **Update**: Update arm rtc sdk, which can run basic function on arm64 platform, the vad function is not supported yet.
54
74
 
@@ -1276,7 +1276,8 @@ class EncryptionConfigInner(ctypes.Structure):
1276
1276
  return EncryptionConfigInner(
1277
1277
  config.encryption_mode,
1278
1278
  encryption_key,
1279
- encryption_kdf_salt
1279
+ encryption_kdf_salt,
1280
+ config.datastream_encryption_enabled
1280
1281
  )
1281
1282
 
1282
1283
 
@@ -566,7 +566,7 @@ class EncodedAudioFrameInfo:
566
566
  samples_per_channel: int = 1024
567
567
  send_even_if_empty: int = 1
568
568
  number_of_channels: int = 1
569
- capture_time_ms: int = 0
569
+ capture_time_ms: int = -1 #-1 means not set, when push_audio_encoded_data, if capture_time_ms is not set, will use the current time
570
570
 
571
571
 
572
572
  @dataclass(kw_only=True)
@@ -701,6 +701,7 @@ class EncryptionConfig:
701
701
  encryption_mode: int
702
702
  encryption_key: str
703
703
  encryption_kdf_salt: bytearray = None
704
+ datastream_encryption_enabled: bool = False
704
705
  @dataclass(kw_only=True)
705
706
  class CapabilityItem:
706
707
  id: int
@@ -53,8 +53,8 @@ class LocalVideoTrack:
53
53
  ret = agora_local_video_track_set_video_encoder_config(self.track_handle, ctypes.byref(VideoEncoderConfigurationInner.create(config)))
54
54
  return ret
55
55
 
56
- def enable_simulcast_stream(self, enabled, config):
57
- ret = agora_local_video_track_enable_simulcast_stream(self.track_handle, enabled, ctypes.byref(config))
56
+ def enable_simulcast_stream(self, enabled, config: SimulcastStreamConfig):
57
+ ret = agora_local_video_track_enable_simulcast_stream(self.track_handle, enabled, ctypes.byref(SimulcastStreamConfigInner.create(config)))
58
58
  return ret
59
59
 
60
60
  # def update_simulcast_stream(self, enabled, config):
@@ -87,6 +87,11 @@ agora_local_audio_track_set_total_extra_send_ms = agora_lib.agora_local_audio_tr
87
87
  agora_local_audio_track_set_total_extra_send_ms.restype = AGORA_API_C_INT
88
88
  agora_local_audio_track_set_total_extra_send_ms.argtypes = [AGORA_HANDLE, ctypes.c_uint64]
89
89
 
90
+ #get sid
91
+ agora_rtc_conn_get_sid = agora_lib.agora_rtc_conn_get_sid
92
+ agora_rtc_conn_get_sid.restype = ctypes.c_char_p
93
+ agora_rtc_conn_get_sid.argtypes = [AGORA_HANDLE]
94
+
90
95
  #global variable
91
96
  _is_deliver_mute_data_has_set: bool = False
92
97
 
@@ -208,11 +213,13 @@ class RTCConnection:
208
213
  # send data stream message to connection
209
214
  def send_stream_message(self, data) -> int:
210
215
  length = len(data)
211
- c_data = ctypes.c_char_p(data)
216
+ #c_data = ctypes.c_char_p(data)
217
+ arr = (ctypes.c_char * length).from_buffer(data) # zero copy
218
+ ptr = ctypes.cast(arr, ctypes.POINTER(ctypes.c_char_p))
212
219
  ret = agora_rtc_conn_send_stream_message(
213
220
  self.conn_handle,
214
221
  self._data_stream_id,
215
- c_data,
222
+ ptr,
216
223
  length
217
224
  )
218
225
  return ret
@@ -631,4 +638,17 @@ class RTCConnection:
631
638
  ret = self.local_user._send_intra_request(remote_uid)
632
639
  return ret
633
640
  pass
641
+ def set_simulcast_stream(self, enabled: bool, config: SimulcastStreamConfig)->int:
642
+ ret = -1000
643
+ if self._video_track:
644
+ ret = self._video_track.enable_simulcast_stream(enabled, config)
645
+ return ret
646
+ pass
647
+ def get_sid(self)->str:
648
+ ret = -1000
649
+ if self.conn_handle is None:
650
+ return ""
651
+ sid = agora_rtc_conn_get_sid(self.conn_handle)
652
+ return sid.decode() if sid else ""
653
+ pass
634
654
 
@@ -182,12 +182,13 @@ class MessageEventInner(ctypes.Structure):
182
182
  ("customType", ctypes.c_char_p)
183
183
  ]
184
184
  def get(self) -> MessageEvent:
185
+ message = ctypes.string_at(self.message, self.messageLength) if self.message else b""
185
186
  return MessageEvent(
186
187
  channel_type=self.channelType,
187
188
  message_type=self.messageType,
188
189
  channel_name=self.channelName.decode('utf-8') if self.channelName else "",
189
190
  channel_topic=self.channelTopic.decode('utf-8') if self.channelTopic else "",
190
- message=self.message.decode('utf-8') if self.message else "",
191
+ message=message,
191
192
  message_length=self.messageLength,
192
193
  publisher=self.publisher.decode('utf-8') if self.publisher else "",
193
194
  custom_type=self.customType.decode('utf-8') if self.customType else "",
@@ -100,12 +100,13 @@ class RTMClient:
100
100
  #register event handler from python to ctypes
101
101
 
102
102
  config_inner = RtmConfigInner.create(config)
103
- c_event_handler = RtmEventHandlerInner(config.event_handler, self)
104
- config_inner.eventHandler = ctypes.cast(ctypes.byref(c_event_handler), ctypes.c_void_p)
103
+ self._event_handler = RtmEventHandlerInner(config.event_handler, self)
104
+ config_inner.eventHandler = ctypes.cast(ctypes.byref(self._event_handler), ctypes.c_void_p)
105
105
  self.client_handle = agora_rtm_client_create(ctypes.byref(config_inner), ctypes.byref(ret))
106
106
  print(f"create_rtm_client ret: {ret.value}, client_handle: {self.client_handle}")
107
107
  print(f"error reason: {self.get_error_reason(ret.value)}")
108
108
  self.is_valid = self.client_handle is not None and ret.value == 0
109
+ self._config_inner = config_inner
109
110
  def _is_valid(self)->bool:
110
111
  return self.is_valid
111
112
 
@@ -116,6 +117,8 @@ class RTMClient:
116
117
  if ret == 0:
117
118
  self.client_handle = None
118
119
  self.config = None
120
+ self._event_handler = None # release 之后再清
121
+ self._config_inner = None
119
122
  def login(self, token: str)->(int, int):
120
123
  #convert from str to c_char_p without memory copy
121
124
  bytes_data = token.encode('utf-8')
@@ -132,13 +135,17 @@ class RTMClient:
132
135
  request_id = ctypes.c_uint64(0)
133
136
  ret = agora_rtm_client_renew_token(self.client_handle, token.encode(), ctypes.byref(request_id))
134
137
  return ret, int(request_id.value)
135
- def publish(self, channel_name: str, message: str, options: PublishOptions) ->(int, uint64_t):
138
+ def publish(self, channel_name: str, message, options: PublishOptions) ->(int, uint64_t):
136
139
  inner_options = PublishOptionsInner.create(options)
137
140
  request_id = ctypes.c_uint64(0)
138
- ret = agora_rtm_client_publish(self.client_handle, channel_name.encode(), message.encode(), len(message), ctypes.byref(inner_options), ctypes.byref(request_id))
141
+ #change msg to c_char_p without memory copy
142
+ length = len(message)
143
+ arr = (ctypes.c_char * length).from_buffer_copy(message)
144
+ ptr = ctypes.cast(arr, ctypes.c_char_p)
145
+ ret = agora_rtm_client_publish(self.client_handle, channel_name.encode(), ptr, length, ctypes.byref(inner_options), ctypes.byref(request_id))
139
146
  return ret, int(request_id.value)
140
147
 
141
- def send_channel_message(self, channel_name: str, message: str) ->(int, uint64_t):
148
+ def send_channel_message(self, channel_name: str, message) ->(int, uint64_t):
142
149
  publish_options = PublishOptions(
143
150
  channel_type=RtmChannelType.RTM_CHANNEL_TYPE_MESSAGE,
144
151
  message_type=RtmMessageType.RTM_MESSAGE_TYPE_BINARY,
@@ -147,7 +154,7 @@ class RTMClient:
147
154
  )
148
155
  ret, request_id = self.publish(channel_name, message, publish_options)
149
156
  return ret, request_id
150
- def send_user_message(self, user_id: str, message: str) ->(int, uint64_t):
157
+ def send_user_message(self, user_id: str, message) ->(int, uint64_t):
151
158
  publish_options = PublishOptions(
152
159
  channel_type=RtmChannelType.RTM_CHANNEL_TYPE_USER,
153
160
  message_type=RtmMessageType.RTM_MESSAGE_TYPE_BINARY,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: agora_python_server_sdk
3
- Version: 2.4.6
3
+ Version: 2.4.7
4
4
  Summary: A Python SDK for Agora Server
5
5
  Home-page: https://github.com/AgoraIO-Extensions/Agora-Python-Server-SDK
6
6
  Classifier: Intended Audience :: Developers
@@ -63,7 +63,27 @@ export LD_LIBRARY_PATH=/site_packages/agora/agora_sdk/
63
63
  python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx --userId=xxx --audioFile=./test_data/demo.pcm --sampleRate=16000 --numOfChannels=1
64
64
  ```
65
65
 
66
- # Change log
66
+ # Release Note
67
+
68
+ ## 2026.06.24 Release Version 2.4.7
69
+
70
+ - **New Features**:
71
+ - Added `RTCConnection.get_sid()` and `RTCConnection.set_simulcast_stream()` interfaces for retrieving SID and configuring Simulcast stream capabilities.
72
+ - In `EncryptionConfig`, added the `datastream_encryption_enabled` option to support data stream encryption.
73
+
74
+ - **Improvements and Enhancements**:
75
+ - Improved the Simulcast Stream configuration process to further simplify the usage of `LocalVideoTrack.enable_simulcast_stream()`.
76
+ - Adjusted audio encoding timestamp behavior: when `capture_time_ms` is not set, the current time will be used by default.
77
+ - Optimized RTC/RTM binary message processing to enhance raw data passthrough capability.
78
+ - Enhanced lifecycle management of RTM ctypes callback objects to improve overall stability.
79
+
80
+ - **Examples and Documentation**:
81
+ - Updated RTM/RTC example code, adding detailed examples for Simulcast and binary message transmission.
82
+ - Updated macOS SDK version records.
83
+
84
+ ## 2026.06.01 Release Version 2.4.6
85
+ - **Update**: Updated the RTC SDK to version 174, resolving the issue where two same UIDs could join the same channel.
86
+
67
87
  ## 2026.05.08 Release Version 2.4.5
68
88
  - **Update**: Update arm rtc sdk, which can run basic function on arm64 platform, the vad function is not supported yet.
69
89
 
@@ -134,7 +134,7 @@ class CustomInstallCommand(install):
134
134
 
135
135
  setup(
136
136
  name='agora_python_server_sdk',
137
- version='2.4.6',
137
+ version='2.4.7',
138
138
  description='A Python SDK for Agora Server',
139
139
  long_description=open('README.md').read(),
140
140
  long_description_content_type='text/markdown',