agora-python-server-sdk 2.4.7__tar.gz → 2.4.8__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 (52) hide show
  1. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/PKG-INFO +13 -1
  2. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/README.md +12 -0
  3. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_ctypes_handle/_ctypes_data.py +4 -2
  4. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora_python_server_sdk.egg-info/PKG-INFO +13 -1
  5. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora_python_server_sdk.egg-info/SOURCES.txt +4 -1
  6. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/setup.py +1 -1
  7. agora_python_server_sdk-2.4.8/tests/test_agora_base.py +51 -0
  8. agora_python_server_sdk-2.4.8/tests/test_rtc_ctypes_data.py +97 -0
  9. agora_python_server_sdk-2.4.8/tests/test_rtm_ctypes_data.py +72 -0
  10. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/MANIFEST.in +0 -0
  11. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/__init__.py +0 -0
  12. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/__init__.py +0 -0
  13. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_ctypes_handle/_audio_frame_observer.py +0 -0
  14. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_ctypes_handle/_local_user_observer.py +0 -0
  15. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_ctypes_handle/_rtc_connection_observer.py +0 -0
  16. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_ctypes_handle/_video_encoded_frame_observer.py +0 -0
  17. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_ctypes_handle/_video_frame_observer.py +0 -0
  18. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/_utils/globals.py +0 -0
  19. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/agora_base.py +0 -0
  20. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/agora_parameter.py +0 -0
  21. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/agora_service.py +0 -0
  22. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/audio_encoded_frame_sender.py +0 -0
  23. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/audio_frame_observer.py +0 -0
  24. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/audio_pcm_data_sender.py +0 -0
  25. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/audio_sessionctrl.py +0 -0
  26. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/audio_vad_manager.py +0 -0
  27. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/external_audio_processor.py +0 -0
  28. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/local_audio_track.py +0 -0
  29. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/local_user.py +0 -0
  30. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/local_user_observer.py +0 -0
  31. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/local_video_track.py +0 -0
  32. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/media_node_factory.py +0 -0
  33. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/remote_audio_track.py +0 -0
  34. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/remote_video_track.py +0 -0
  35. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/rtc_connection.py +0 -0
  36. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/rtc_connection_observer.py +0 -0
  37. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/utils/audio_consumer.py +0 -0
  38. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/utils/vad_dump.py +0 -0
  39. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/video_encoded_frame_observer.py +0 -0
  40. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/video_encoded_image_sender.py +0 -0
  41. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/video_frame_observer.py +0 -0
  42. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/video_frame_sender.py +0 -0
  43. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtc/voice_detection.py +0 -0
  44. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtm/__init__.py +0 -0
  45. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtm/_ctypes_handle/_ctypes_data.py +0 -0
  46. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtm/rtm_base.py +0 -0
  47. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtm/rtm_client.py +0 -0
  48. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora/rtm/rtm_event_handler.py +0 -0
  49. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora_python_server_sdk.egg-info/dependency_links.txt +0 -0
  50. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/agora_python_server_sdk.egg-info/top_level.txt +0 -0
  51. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/pyproject.toml +0 -0
  52. {agora_python_server_sdk-2.4.7 → agora_python_server_sdk-2.4.8}/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.7
3
+ Version: 2.4.8
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
@@ -65,6 +65,18 @@ python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx
65
65
 
66
66
  # Release Note
67
67
 
68
+ ## 2026.06.24 Release Version 2.4.8
69
+
70
+ - **Bugfixes**:
71
+ - Fixed an implementation error in `encryptionconfigure`.
72
+ - **New Features**:
73
+ - Added `ut test case`
74
+ - Usage:
75
+ cd agora_rtc
76
+ pip install pytest
77
+ PYTHONPATH=. pytest tests/ -v
78
+ or pytest tests/ -v
79
+
68
80
  ## 2026.06.24 Release Version 2.4.7
69
81
 
70
82
  - **New Features**:
@@ -50,6 +50,18 @@ python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx
50
50
 
51
51
  # Release Note
52
52
 
53
+ ## 2026.06.24 Release Version 2.4.8
54
+
55
+ - **Bugfixes**:
56
+ - Fixed an implementation error in `encryptionconfigure`.
57
+ - **New Features**:
58
+ - Added `ut test case`
59
+ - Usage:
60
+ cd agora_rtc
61
+ pip install pytest
62
+ PYTHONPATH=. pytest tests/ -v
63
+ or pytest tests/ -v
64
+
53
65
  ## 2026.06.24 Release Version 2.4.7
54
66
 
55
67
  - **New Features**:
@@ -1246,14 +1246,16 @@ class EncryptionConfigInner(ctypes.Structure):
1246
1246
  _fields_ = [
1247
1247
  ("encryption_mode", ctypes.c_int),
1248
1248
  ("encryption_key", ctypes.c_char_p),
1249
- ("encryption_kdf_salt", ctypes.c_uint8 * 32)
1249
+ ("encryption_kdf_salt", ctypes.c_uint8 * 32),
1250
+ ("datastream_encryption_enabled", ctypes.c_bool),
1250
1251
  ]
1251
1252
 
1252
1253
  def get(self):
1253
1254
  return EncryptionConfig(
1254
1255
  encryption_mode=self.encryption_mode,
1255
1256
  encryption_key=self.encryption_key.decode() if self.encryption_key else "",
1256
- encryption_kdf_salt=bytearray(bytes(self.encryption_kdf_salt))
1257
+ encryption_kdf_salt=bytearray(bytes(self.encryption_kdf_salt)),
1258
+ datastream_encryption_enabled=self.datastream_encryption_enabled
1257
1259
  )
1258
1260
 
1259
1261
  @staticmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: agora_python_server_sdk
3
- Version: 2.4.7
3
+ Version: 2.4.8
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
@@ -65,6 +65,18 @@ python agora_rtc/examples/example_audio_pcm_send.py --appId=xxx --channelId=xxx
65
65
 
66
66
  # Release Note
67
67
 
68
+ ## 2026.06.24 Release Version 2.4.8
69
+
70
+ - **Bugfixes**:
71
+ - Fixed an implementation error in `encryptionconfigure`.
72
+ - **New Features**:
73
+ - Added `ut test case`
74
+ - Usage:
75
+ cd agora_rtc
76
+ pip install pytest
77
+ PYTHONPATH=. pytest tests/ -v
78
+ or pytest tests/ -v
79
+
68
80
  ## 2026.06.24 Release Version 2.4.7
69
81
 
70
82
  - **New Features**:
@@ -44,4 +44,7 @@ agora/rtm/_ctypes_handle/_ctypes_data.py
44
44
  agora_python_server_sdk.egg-info/PKG-INFO
45
45
  agora_python_server_sdk.egg-info/SOURCES.txt
46
46
  agora_python_server_sdk.egg-info/dependency_links.txt
47
- agora_python_server_sdk.egg-info/top_level.txt
47
+ agora_python_server_sdk.egg-info/top_level.txt
48
+ tests/test_agora_base.py
49
+ tests/test_rtc_ctypes_data.py
50
+ tests/test_rtm_ctypes_data.py
@@ -134,7 +134,7 @@ class CustomInstallCommand(install):
134
134
 
135
135
  setup(
136
136
  name='agora_python_server_sdk',
137
- version='2.4.7',
137
+ version='2.4.8',
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',
@@ -0,0 +1,51 @@
1
+ """
2
+ author: Wei
3
+ date: 2026-07-01
4
+ """
5
+
6
+ from agora.rtc.agora_base import (
7
+ AreaCode,
8
+ ChannelProfileType,
9
+ ClientRoleType,
10
+ RTCConnInfo,
11
+ VideoCodecType,
12
+ APMConfig,
13
+ )
14
+
15
+
16
+ def test_channel_profile_enum():
17
+ assert ChannelProfileType.CHANNEL_PROFILE_COMMUNICATION == 0
18
+ assert ChannelProfileType.CHANNEL_PROFILE_LIVE_BROADCASTING == 1
19
+
20
+
21
+ def test_client_role_enum():
22
+ assert ClientRoleType.CLIENT_ROLE_BROADCASTER == 1
23
+ assert ClientRoleType.CLIENT_ROLE_AUDIENCE == 2
24
+
25
+
26
+ def test_video_codec_enum():
27
+ assert VideoCodecType.VIDEO_CODEC_H264 == 2
28
+ assert VideoCodecType.VIDEO_CODEC_AV1 == 12
29
+
30
+
31
+ def test_area_code_enum():
32
+ assert AreaCode.AREA_CODE_GLOB == 0xFFFFFFFF
33
+
34
+
35
+ def test_rtc_conn_info_dataclass():
36
+ info = RTCConnInfo(
37
+ id=1,
38
+ channel_id="test_channel",
39
+ state=2,
40
+ local_user_id="user_1",
41
+ internal_uid=10086,
42
+ )
43
+ assert info.channel_id == "test_channel"
44
+ assert info.internal_uid == 10086
45
+
46
+
47
+ def test_apm_config_to_json_string():
48
+ config = APMConfig()
49
+ json_str = config._to_json_string()
50
+ assert '"enabled":false' in json_str
51
+ assert '"ainsModelPref":10' in json_str
@@ -0,0 +1,97 @@
1
+ """
2
+ author: Wei
3
+ date: 2026-07-01
4
+ """
5
+
6
+ from agora.rtc.agora_base import (
7
+ AudioEncoderConfiguration,
8
+ AudioProfileType,
9
+ AudioSubscriptionOptions,
10
+ EncryptionConfig,
11
+ EncodedVideoFrameInfo,
12
+ RTCConnInfo,
13
+ VideoCodecType,
14
+ VideoDimensions,
15
+ )
16
+ from agora.rtc._ctypes_handle._ctypes_data import (
17
+ AudioEncoderConfigurationInner,
18
+ AudioSubscriptionOptionsInner,
19
+ EncryptionConfigInner,
20
+ EncodedVideoFrameInfoInner,
21
+ RTCConnInfoInner,
22
+ VideoDimensionsInner,
23
+ )
24
+
25
+
26
+ def test_audio_encoder_configuration_inner_create():
27
+ config = AudioEncoderConfiguration(audioProfile=AudioProfileType.AUDIO_PROFILE_MUSIC_STANDARD)
28
+ inner = AudioEncoderConfigurationInner.create(config)
29
+ assert inner.audioProfile == AudioProfileType.AUDIO_PROFILE_MUSIC_STANDARD
30
+
31
+
32
+ def test_rtc_conn_info_inner_create_and_get():
33
+ info = RTCConnInfo(
34
+ id=1,
35
+ channel_id="channel_a",
36
+ state=2,
37
+ local_user_id="user_1",
38
+ internal_uid=10086,
39
+ )
40
+ inner = RTCConnInfoInner.create(info)
41
+ assert inner.channel_id == b"channel_a"
42
+ assert inner.local_user_id == b"user_1"
43
+
44
+ restored = inner.get()
45
+ assert restored.channel_id == "channel_a"
46
+ assert restored.local_user_id == "user_1"
47
+ assert restored.internal_uid == 10086
48
+
49
+
50
+ def test_audio_subscription_options_inner_create_and_get():
51
+ options = AudioSubscriptionOptions(
52
+ pcm_data_only=1,
53
+ bytes_per_sample=2,
54
+ number_of_channels=2,
55
+ sample_rate_hz=48000,
56
+ )
57
+ inner = AudioSubscriptionOptionsInner.create(options)
58
+ assert inner.pcm_data_only == 1
59
+ assert inner.sample_rate_hz == 48000
60
+
61
+ restored = inner.get()
62
+ assert restored.number_of_channels == 2
63
+ assert restored.sample_rate_hz == 48000
64
+
65
+
66
+ def test_encryption_config_inner_create_and_get():
67
+ config = EncryptionConfig(
68
+ encryption_mode=1,
69
+ encryption_key="secret",
70
+ encryption_kdf_salt=bytearray(b"salt"),
71
+ datastream_encryption_enabled=True,
72
+ )
73
+ inner = EncryptionConfigInner.create(config)
74
+ assert inner.encryption_key == b"secret"
75
+ assert inner.encryption_kdf_salt[0] == ord("s")
76
+
77
+ restored = inner.get()
78
+ assert restored.encryption_key == "secret"
79
+ assert restored.datastream_encryption_enabled is True
80
+
81
+
82
+ def test_video_dimensions_and_encoded_frame_info_inner():
83
+ dimensions = VideoDimensions(width=1280, height=720)
84
+ dim_inner = VideoDimensionsInner.create(dimensions)
85
+ assert dim_inner.width == 1280
86
+ assert dim_inner.height == 720
87
+ assert dim_inner.get().height == 720
88
+
89
+ info = EncodedVideoFrameInfo(
90
+ codec_type=VideoCodecType.VIDEO_CODEC_H264,
91
+ width=1280,
92
+ height=720,
93
+ frames_per_second=30,
94
+ )
95
+ info_inner = EncodedVideoFrameInfoInner.create(info)
96
+ assert info_inner.codec_type == VideoCodecType.VIDEO_CODEC_H264
97
+ assert info_inner.get().frames_per_second == 30
@@ -0,0 +1,72 @@
1
+ """
2
+ author: Wei
3
+ date: 2026-07-01
4
+ """
5
+
6
+ import ctypes
7
+
8
+ from agora.rtm.rtm_base import (
9
+ PublishOptions,
10
+ RtmEncryptionConfig,
11
+ RtmLogConfig,
12
+ RtmLogLevel,
13
+ SubscribeOptions,
14
+ )
15
+ from agora.rtm._ctypes_handle._ctypes_data import (
16
+ MessageEventInner,
17
+ PublishOptionsInner,
18
+ RtmEncryptionConfigInner,
19
+ RtmLogConfigInner,
20
+ SubscribeOptionsInner,
21
+ )
22
+
23
+
24
+ def test_subscribe_options_inner_create():
25
+ options = SubscribeOptions(with_message=False, with_presence=True)
26
+ inner = SubscribeOptionsInner.create(options)
27
+ assert inner.withMessage is False
28
+ assert inner.withPresence is True
29
+
30
+
31
+ def test_rtm_encryption_config_inner_create():
32
+ config = RtmEncryptionConfig(encryption_key="secret", encryption_salt="salt")
33
+ inner = RtmEncryptionConfigInner.create(config)
34
+ assert inner.encryptionKey == b"secret"
35
+ assert inner.encryptionSalt[0] == ord("s")
36
+
37
+
38
+ def test_rtm_log_config_inner_create():
39
+ config = RtmLogConfig(
40
+ file_path="/tmp/rtm.log",
41
+ file_size_kb=1024,
42
+ log_level=RtmLogLevel.RTM_LOG_LEVEL_INFO,
43
+ )
44
+ inner = RtmLogConfigInner.create(config)
45
+ assert inner.filePath == b"/tmp/rtm.log"
46
+ assert inner.fileSizeInKB == 1024
47
+ assert inner.level == RtmLogLevel.RTM_LOG_LEVEL_INFO
48
+
49
+
50
+ def test_publish_options_inner_create():
51
+ options = PublishOptions(custom_type="demo", store_in_history=True)
52
+ inner = PublishOptionsInner.create(options)
53
+ assert inner.customType == b"demo"
54
+ assert inner.storeInHistory is True
55
+
56
+
57
+ def test_message_event_inner_get():
58
+ payload = b"hello"
59
+ inner = MessageEventInner(
60
+ channelType=1,
61
+ messageType=0,
62
+ channelName=b"channel_a",
63
+ channelTopic=b"topic_a",
64
+ message=ctypes.c_char_p(payload),
65
+ messageLength=len(payload),
66
+ publisher=b"user_1",
67
+ customType=b"text",
68
+ )
69
+ event = inner.get()
70
+ assert event.channel_name == "channel_a"
71
+ assert event.message == payload
72
+ assert event.publisher == "user_1"