sora-sdk 2025.4.0.dev3__tar.gz → 2025.4.0.dev6__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 sora-sdk might be problematic. Click here for more details.

Files changed (48) hide show
  1. {sora_sdk-2025.4.0.dev3/src/sora_sdk.egg-info → sora_sdk-2025.4.0.dev6}/PKG-INFO +1 -1
  2. sora_sdk-2025.4.0.dev6/VERSION +1 -0
  3. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/pyproject.toml +8 -7
  4. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/run.py +117 -32
  5. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/__init__.py +5 -1
  6. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/sora_sdk_ext.cpython-311-darwin.so +0 -0
  7. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/sora_sdk_ext.pyi +16 -15
  8. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6/src/sora_sdk.egg-info}/PKG-INFO +1 -1
  9. sora_sdk-2025.4.0.dev6/tests/test_capability.py +50 -0
  10. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_intel_vpl.py +6 -4
  11. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_openh264.py +1 -1
  12. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_openh264_simulcast.py +1 -1
  13. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_version.py +3 -3
  14. sora_sdk-2025.4.0.dev3/VERSION +0 -1
  15. sora_sdk-2025.4.0.dev3/tests/test_capability.py +0 -52
  16. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/LICENSE +0 -0
  17. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/MANIFEST.in +0 -0
  18. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/README.md +0 -0
  19. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/buildbase.py +0 -0
  20. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/pypath.py +0 -0
  21. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/setup.cfg +0 -0
  22. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/setup.py +0 -0
  23. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk/py.typed +0 -0
  24. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk.egg-info/SOURCES.txt +0 -0
  25. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk.egg-info/dependency_links.txt +0 -0
  26. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/src/sora_sdk.egg-info/top_level.txt +0 -0
  27. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_amd_amf.py +0 -0
  28. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_apple_video_toolbox.py +0 -0
  29. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_authz.py +0 -0
  30. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_authz_simulcast.py +0 -0
  31. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_ca_cert.py +0 -0
  32. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_degradation_preference.py +0 -0
  33. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_encoded_transform.py +0 -0
  34. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_key_frame_request.py +0 -0
  35. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_messaging.py +0 -0
  36. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_messaging_header.py +0 -0
  37. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_nvidia_video_codec_sdk.py +0 -0
  38. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_opus.py +0 -0
  39. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_re_offer_re_answer_sdp.py +0 -0
  40. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_sendonly_recvonly.py +0 -0
  41. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_signaling.py +0 -0
  42. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_signaling_message.py +0 -0
  43. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_signaling_notify.py +0 -0
  44. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_simulcast.py +0 -0
  45. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_sora_disconnect.py +0 -0
  46. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_type_disconnect.py +0 -0
  47. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_type_switched.py +0 -0
  48. {sora_sdk-2025.4.0.dev3 → sora_sdk-2025.4.0.dev6}/tests/test_vad.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sora_sdk
3
- Version: 2025.4.0.dev3
3
+ Version: 2025.4.0.dev6
4
4
  Summary: WebRTC SFU Sora Python SDK
5
5
  Home-page: https://github.com/shiguredo/sora-python-sdk
6
6
  Author-email: "Shiguredo Inc." <contact+pypi@shiguredo.jp>
@@ -0,0 +1 @@
1
+ 2025.4.0.dev6
@@ -26,16 +26,15 @@ build-backend = "setuptools.build_meta"
26
26
  [tool.uv]
27
27
  python-preference = "only-managed"
28
28
  dev-dependencies = [
29
- "nanobind==2.8.0",
30
- "setuptools==80.9",
31
- "build==1.3.0",
32
- "wheel==0.45.1",
29
+ "nanobind==2.9.2",
30
+ "setuptools==80.9.0",
31
+ "pytest",
32
+ "pytest-repeat",
33
+ "pytest-xdist",
33
34
  "numpy",
34
35
  "httpx",
35
- "pytest",
36
- "ruff",
37
36
  "pyjwt",
38
- "pytest-repeat",
37
+ "ruff",
39
38
  "ty",
40
39
  ]
41
40
 
@@ -43,6 +42,8 @@ dev-dependencies = [
43
42
  target-version = "py311"
44
43
  line-length = 100
45
44
 
45
+ [tool.ty.src]
46
+ include = ["src", "tests"]
46
47
 
47
48
  [tool.pytest.ini_options]
48
49
  xfail_strict = true
@@ -1,4 +1,5 @@
1
1
  import argparse
2
+ import glob
2
3
  import hashlib
3
4
  import importlib.metadata
4
5
  import multiprocessing
@@ -180,35 +181,48 @@ AVAILABLE_TARGETS = [
180
181
  ]
181
182
 
182
183
 
183
- def main():
184
- parser = argparse.ArgumentParser()
185
- parser.add_argument("--debug", action="store_true")
186
- parser.add_argument("--relwithdebinfo", action="store_true")
187
- parser.add_argument("--local-webrtc-build-dir", type=os.path.abspath)
188
- parser.add_argument("--local-webrtc-build-args", default="", type=shlex.split)
189
- parser.add_argument("--local-sora-cpp-sdk-dir", type=os.path.abspath)
190
- parser.add_argument("--local-sora-cpp-sdk-args", default="", type=shlex.split)
191
- parser.add_argument("target", choices=AVAILABLE_TARGETS)
184
+ def _find_clang_binary(name: str) -> Optional[str]:
185
+ if shutil.which(name) is not None:
186
+ return name
187
+ else:
188
+ for n in range(50, 14, -1):
189
+ if shutil.which(f"{name}-{n}") is not None:
190
+ return f"{name}-{n}"
191
+ return None
192
192
 
193
- args = parser.parse_args()
194
- if args.target == "windows_x86_64":
193
+
194
+ def _get_platform(target: str) -> Platform:
195
+ if target == "windows_x86_64":
195
196
  platform = Platform("windows", get_windows_osver(), "x86_64")
196
- elif args.target == "macos_x86_64":
197
+ elif target == "macos_x86_64":
197
198
  platform = Platform("macos", get_macos_osver(), "x86_64")
198
- elif args.target == "macos_arm64":
199
+ elif target == "macos_arm64":
199
200
  platform = Platform("macos", get_macos_osver(), "arm64")
200
- elif args.target == "ubuntu-22.04_x86_64":
201
+ elif target == "ubuntu-22.04_x86_64":
201
202
  platform = Platform("ubuntu", "22.04", "x86_64")
202
- elif args.target == "ubuntu-24.04_x86_64":
203
+ elif target == "ubuntu-24.04_x86_64":
203
204
  platform = Platform("ubuntu", "24.04", "x86_64")
204
- elif args.target == "ubuntu-22.04_armv8":
205
+ elif target == "ubuntu-22.04_armv8":
205
206
  platform = Platform("ubuntu", "22.04", "armv8")
206
- elif args.target == "ubuntu-24.04_armv8":
207
+ elif target == "ubuntu-24.04_armv8":
207
208
  platform = Platform("ubuntu", "24.04", "armv8")
208
- elif args.target == "ubuntu-22.04_armv8_jetson":
209
+ elif target == "ubuntu-22.04_armv8_jetson":
209
210
  platform = Platform("jetson", None, "armv8", "ubuntu-22.04")
210
211
  else:
211
- raise Exception(f"Unknown target {args.target}")
212
+ raise Exception(f"Unknown target {target}")
213
+ return platform
214
+
215
+
216
+ def _build(
217
+ target: str,
218
+ debug: bool,
219
+ relwithdebinfo: bool,
220
+ local_webrtc_build_dir: Optional[str],
221
+ local_webrtc_build_args: List[str],
222
+ local_sora_cpp_sdk_dir: Optional[str],
223
+ local_sora_cpp_sdk_args: List[str],
224
+ ):
225
+ platform = _get_platform(target)
212
226
 
213
227
  source_dir = os.path.join(BASE_DIR, "_source", platform.target.package_name)
214
228
  build_dir = os.path.join(BASE_DIR, "_build", platform.target.package_name)
@@ -223,27 +237,23 @@ def main():
223
237
  source_dir,
224
238
  build_dir,
225
239
  install_dir,
226
- args.debug,
227
- args.local_webrtc_build_dir,
228
- args.local_webrtc_build_args,
229
- args.local_sora_cpp_sdk_dir,
230
- args.local_sora_cpp_sdk_args,
240
+ debug,
241
+ local_webrtc_build_dir,
242
+ local_webrtc_build_args,
243
+ local_sora_cpp_sdk_dir,
244
+ local_sora_cpp_sdk_args,
231
245
  )
232
246
 
233
247
  configuration = "Release"
234
- if args.debug:
248
+ if debug:
235
249
  configuration = "Debug"
236
- if args.relwithdebinfo:
250
+ if relwithdebinfo:
237
251
  configuration = "RelWithDebInfo"
238
252
 
239
253
  webrtc_platform = get_webrtc_platform(platform)
240
- webrtc_info = get_webrtc_info(
241
- webrtc_platform, args.local_webrtc_build_dir, install_dir, args.debug
242
- )
254
+ webrtc_info = get_webrtc_info(webrtc_platform, local_webrtc_build_dir, install_dir, debug)
243
255
 
244
- sora_info = get_sora_info(
245
- webrtc_platform, args.local_sora_cpp_sdk_dir, install_dir, args.debug
246
- )
256
+ sora_info = get_sora_info(webrtc_platform, local_sora_cpp_sdk_dir, install_dir, debug)
247
257
 
248
258
  cmake_args = []
249
259
  cmake_args.append(f"-DCMAKE_BUILD_TYPE={configuration}")
@@ -373,5 +383,80 @@ def main():
373
383
  )
374
384
 
375
385
 
386
+ def _format(
387
+ clang_format_path: Optional[str] = None,
388
+ skip_clang_format: bool = False,
389
+ skip_ruff: bool = False,
390
+ ):
391
+ # C++ ファイルのフォーマット
392
+ if not skip_clang_format:
393
+ if clang_format_path is None:
394
+ clang_format_path = _find_clang_binary("clang-format")
395
+ if clang_format_path is None:
396
+ print("Warning: clang-format not found. Skipping C++ formatting.")
397
+ else:
398
+ patterns = [
399
+ "src/**/*.h",
400
+ "src/**/*.cpp",
401
+ ]
402
+ target_files = []
403
+ for pattern in patterns:
404
+ files = glob.glob(pattern, recursive=True)
405
+ target_files.extend(files)
406
+ if target_files:
407
+ print(f"Formatting {len(target_files)} C++ files...")
408
+ cmd([clang_format_path, "-i"] + target_files)
409
+
410
+ # Python ファイルのフォーマット
411
+ if not skip_ruff:
412
+ print("Running Python formatting with ruff...")
413
+ try:
414
+ cmd(["uv", "run", "ruff", "format"])
415
+ except Exception as e:
416
+ print(f"Formatting failed: {e}")
417
+
418
+
419
+ def main():
420
+ parser = argparse.ArgumentParser()
421
+ sp = parser.add_subparsers(dest="command", required=True)
422
+
423
+ # build サブコマンド
424
+ bp = sp.add_parser("build")
425
+ bp.add_argument("target", choices=AVAILABLE_TARGETS)
426
+ bp.add_argument("--debug", action="store_true")
427
+ bp.add_argument("--relwithdebinfo", action="store_true")
428
+ bp.add_argument("--local-webrtc-build-dir", type=os.path.abspath)
429
+ bp.add_argument("--local-webrtc-build-args", default="", type=shlex.split)
430
+ bp.add_argument("--local-sora-cpp-sdk-dir", type=os.path.abspath)
431
+ bp.add_argument("--local-sora-cpp-sdk-args", default="", type=shlex.split)
432
+
433
+ # format サブコマンド
434
+ fp = sp.add_parser("format")
435
+ fp.add_argument("--clang-format-path", type=str, default=None)
436
+ fp.add_argument(
437
+ "--skip-clang-format", action="store_true", help="Skip C++ formatting with clang-format"
438
+ )
439
+ fp.add_argument("--skip-ruff", action="store_true", help="Skip Python formatting with ruff")
440
+
441
+ args = parser.parse_args()
442
+
443
+ if args.command == "build":
444
+ _build(
445
+ target=args.target,
446
+ debug=args.debug,
447
+ relwithdebinfo=args.relwithdebinfo,
448
+ local_webrtc_build_dir=args.local_webrtc_build_dir,
449
+ local_webrtc_build_args=args.local_webrtc_build_args,
450
+ local_sora_cpp_sdk_dir=args.local_sora_cpp_sdk_dir,
451
+ local_sora_cpp_sdk_args=args.local_sora_cpp_sdk_args,
452
+ )
453
+ elif args.command == "format":
454
+ _format(
455
+ clang_format_path=args.clang_format_path,
456
+ skip_clang_format=args.skip_clang_format,
457
+ skip_ruff=args.skip_ruff,
458
+ )
459
+
460
+
376
461
  if __name__ == "__main__":
377
462
  main()
@@ -4,12 +4,16 @@ from .sora_sdk_ext import * # noqa: F401,F403
4
4
  # 開発環境の場合は VERSION ファイルから取得
5
5
  try:
6
6
  from importlib.metadata import version, PackageNotFoundError
7
+
7
8
  try:
8
9
  __version__ = version("sora_sdk")
9
10
  except PackageNotFoundError:
10
11
  # パッケージがインストールされていない場合(開発環境)
11
12
  import os
12
- _version_file = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "VERSION")
13
+
14
+ _version_file = os.path.join(
15
+ os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "VERSION"
16
+ )
13
17
  if os.path.exists(_version_file):
14
18
  with open(_version_file, "r") as f:
15
19
  __version__ = f.read().strip()
@@ -2,7 +2,8 @@ from collections.abc import Callable, Sequence
2
2
  import enum
3
3
  from typing import Annotated, overload
4
4
 
5
- from numpy.typing import ArrayLike
5
+ import numpy
6
+ from numpy.typing import NDArray
6
7
 
7
8
 
8
9
  class SoraSignalingErrorCode(enum.IntEnum):
@@ -92,20 +93,20 @@ class SoraAudioSource(SoraTrackInterface):
92
93
  def on_data(self, data: int, samples_per_channel: int) -> None: ...
93
94
 
94
95
  @overload
95
- def on_data(self, ndarray: Annotated[ArrayLike, dict(dtype='int16', shape=(None, None), order='C', device='cpu')], timestamp: float) -> None: ...
96
+ def on_data(self, ndarray: Annotated[NDArray[numpy.int16], dict(shape=(None, None), order='C', device='cpu')], timestamp: float) -> None: ...
96
97
 
97
98
  @overload
98
- def on_data(self, ndarray: Annotated[ArrayLike, dict(dtype='int16', shape=(None, None), order='C', device='cpu')]) -> None: ...
99
+ def on_data(self, ndarray: Annotated[NDArray[numpy.int16], dict(shape=(None, None), order='C', device='cpu')]) -> None: ...
99
100
 
100
101
  class SoraVideoSource(SoraTrackInterface):
101
102
  @overload
102
- def on_captured(self, ndarray: Annotated[ArrayLike, dict(dtype='uint8', shape=(None, None, 3), order='C', device='cpu')]) -> None: ...
103
+ def on_captured(self, ndarray: Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3), order='C', device='cpu')]) -> None: ...
103
104
 
104
105
  @overload
105
- def on_captured(self, ndarray: Annotated[ArrayLike, dict(dtype='uint8', shape=(None, None, 3), order='C', device='cpu')], timestamp: float) -> None: ...
106
+ def on_captured(self, ndarray: Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3), order='C', device='cpu')], timestamp: float) -> None: ...
106
107
 
107
108
  @overload
108
- def on_captured(self, ndarray: Annotated[ArrayLike, dict(dtype='uint8', shape=(None, None, 3), order='C', device='cpu')], timestamp_us: int) -> None: ...
109
+ def on_captured(self, ndarray: Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3), order='C', device='cpu')], timestamp_us: int) -> None: ...
109
110
 
110
111
  class SoraAudioSinkImpl:
111
112
  def __init__(self, track: SoraTrackInterface, output_frequency: int = -1, output_channels: int = 0) -> None: ...
@@ -115,10 +116,10 @@ class SoraAudioSinkImpl:
115
116
  def read(self, frames: int = 0, timeout: float = 1) -> tuple: ...
116
117
 
117
118
  @property
118
- def on_data(self) -> Callable[[Annotated[ArrayLike, dict(dtype='int16', shape=(None, None))]], None]: ...
119
+ def on_data(self) -> Callable[[Annotated[NDArray[numpy.int16], dict(shape=(None, None))]], None]: ...
119
120
 
120
121
  @on_data.setter
121
- def on_data(self, arg: Callable[[Annotated[ArrayLike, dict(dtype='int16', shape=(None, None))]], None], /) -> None: ...
122
+ def on_data(self, arg: Callable[[Annotated[NDArray[numpy.int16], dict(shape=(None, None))]], None], /) -> None: ...
122
123
 
123
124
  @property
124
125
  def on_format(self) -> Callable[[int, int], None]: ...
@@ -143,7 +144,7 @@ class SoraAudioFrame:
143
144
  @property
144
145
  def absolute_capture_timestamp_ms(self) -> int | None: ...
145
146
 
146
- def data(self) -> Annotated[ArrayLike, dict(dtype='int16', shape=(None, None))]: ...
147
+ def data(self) -> Annotated[NDArray[numpy.int16], dict(shape=(None, None))]: ...
147
148
 
148
149
  class SoraAudioStreamSinkImpl:
149
150
  def __init__(self, track: SoraTrackInterface, output_frequency: int = -1, output_channels: int = 0) -> None: ...
@@ -162,7 +163,7 @@ class SoraVAD:
162
163
  def analyze(self, frame: SoraAudioFrame) -> float: ...
163
164
 
164
165
  class SoraVideoFrame:
165
- def data(self) -> Annotated[ArrayLike, dict(dtype='uint8', shape=(None, None, 3))]: ...
166
+ def data(self) -> Annotated[NDArray[numpy.uint8], dict(shape=(None, None, 3))]: ...
166
167
 
167
168
  class SoraVideoSinkImpl:
168
169
  def __init__(self, arg: SoraTrackInterface, /) -> None: ...
@@ -258,9 +259,9 @@ class SoraTransformableFrameDirection(enum.IntEnum):
258
259
  SENDER = 2
259
260
 
260
261
  class SoraTransformableFrame:
261
- def get_data(self) -> Annotated[ArrayLike, dict(dtype='uint8', shape=(None), writable=False)]: ...
262
+ def get_data(self) -> Annotated[NDArray[numpy.uint8], dict(shape=(None,), writable=False)]: ...
262
263
 
263
- def set_data(self, arg: Annotated[ArrayLike, dict(dtype='uint8', shape=(None), order='C', device='cpu', writable=False)], /) -> None: ...
264
+ def set_data(self, arg: Annotated[NDArray[numpy.uint8], dict(shape=(None,), order='C', device='cpu', writable=False)], /) -> None: ...
264
265
 
265
266
  @property
266
267
  def payload_type(self) -> int: ...
@@ -289,7 +290,7 @@ class SoraTransformableAudioFrameType(enum.IntEnum):
289
290
 
290
291
  class SoraTransformableAudioFrame(SoraTransformableFrame):
291
292
  @property
292
- def contributing_sources(self) -> Annotated[ArrayLike, dict(dtype='uint32', shape=(None), writable=False)]: ...
293
+ def contributing_sources(self) -> Annotated[NDArray[numpy.uint32], dict(shape=(None,), writable=False)]: ...
293
294
 
294
295
  @property
295
296
  def sequence_number(self) -> int | None: ...
@@ -314,7 +315,7 @@ class SoraTransformableVideoFrame(SoraTransformableFrame):
314
315
  def frame_id(self) -> int | None: ...
315
316
 
316
317
  @property
317
- def frame_dependencies(self) -> Annotated[ArrayLike, dict(dtype='int64', shape=(None), writable=False)]: ...
318
+ def frame_dependencies(self) -> Annotated[NDArray[numpy.int64], dict(shape=(None,), writable=False)]: ...
318
319
 
319
320
  @property
320
321
  def width(self) -> int: ...
@@ -329,7 +330,7 @@ class SoraTransformableVideoFrame(SoraTransformableFrame):
329
330
  def temporal_index(self) -> int: ...
330
331
 
331
332
  @property
332
- def contributing_sources(self) -> Annotated[ArrayLike, dict(dtype='uint32', shape=(None), writable=False)]: ...
333
+ def contributing_sources(self) -> Annotated[NDArray[numpy.uint32], dict(shape=(None,), writable=False)]: ...
333
334
 
334
335
  class SoraFrameTransformer:
335
336
  def enqueue(self, arg: SoraTransformableFrame, /) -> None: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sora_sdk
3
- Version: 2025.4.0.dev3
3
+ Version: 2025.4.0.dev6
4
4
  Summary: WebRTC SFU Sora Python SDK
5
5
  Home-page: https://github.com/shiguredo/sora-python-sdk
6
6
  Author-email: "Shiguredo Inc." <contact+pypi@shiguredo.jp>
@@ -0,0 +1,50 @@
1
+ import time
2
+
3
+ from client import SoraClient, SoraRole
4
+
5
+ from sora_sdk import (
6
+ SoraVideoCodecImplementation,
7
+ SoraVideoCodecPreference,
8
+ SoraVideoCodecType,
9
+ )
10
+
11
+ # def test_preference_invalid(settings):
12
+ # # opneh264 のパスを設定してないのに H264 エンコーダを使おうとしているので Sora 生成時にエラーになる
13
+ # with pytest.raises(RuntimeError):
14
+ # SoraClient(
15
+ # settings,
16
+ # SoraRole.SENDONLY,
17
+ # audio=False,
18
+ # video=True,
19
+ # video_codec_type="H264",
20
+ # video_codec_preference=SoraVideoCodecPreference(
21
+ # codecs=[
22
+ # SoraVideoCodecPreference.Codec(
23
+ # type=SoraVideoCodecType.H264,
24
+ # encoder=SoraVideoCodecImplementation.CISCO_OPENH264,
25
+ # )
26
+ # ]
27
+ # ),
28
+ # )
29
+
30
+
31
+ def test_preference_vp8(settings):
32
+ sendonly = SoraClient(
33
+ settings,
34
+ SoraRole.SENDONLY,
35
+ audio=False,
36
+ video=True,
37
+ video_codec_type="VP8",
38
+ video_codec_preference=SoraVideoCodecPreference(
39
+ codecs=[
40
+ SoraVideoCodecPreference.Codec(
41
+ type=SoraVideoCodecType.VP8, encoder=SoraVideoCodecImplementation.INTERNAL
42
+ )
43
+ ]
44
+ ),
45
+ )
46
+ sendonly.connect(fake_video=True)
47
+
48
+ time.sleep(5)
49
+
50
+ sendonly.disconnect()
@@ -19,7 +19,9 @@ from sora_sdk import (
19
19
  get_video_codec_capability,
20
20
  )
21
21
 
22
- pytestmark = pytest.mark.skipif(os.environ.get("INTEL_VPL") is None, reason="Intel VPL でのみ実行する")
22
+ pytestmark = pytest.mark.skipif(
23
+ os.environ.get("INTEL_VPL") is None, reason="Intel VPL でのみ実行する"
24
+ )
23
25
 
24
26
 
25
27
  def test_intel_vpl_available():
@@ -600,6 +602,6 @@ def test_intel_vpl_av1_rtp_hdr_ext(settings):
600
602
  sendonly.disconnect()
601
603
 
602
604
  # AV1 の RTP ヘッダー拡張が送られてきていることを確認
603
- assert stats["rtp_hdrext"]["total_received_rtp_hdrext_av1_rtp_sepc"] > 0, (
604
- "Dependency Descriptor RTP Header Extension が Python SDK から送られてきていません"
605
- )
605
+ assert (
606
+ stats["rtp_hdrext"]["total_received_rtp_hdrext_av1_rtp_sepc"] > 0
607
+ ), "Dependency Descriptor RTP Header Extension が Python SDK から送られてきていません"
@@ -15,7 +15,7 @@ from sora_sdk import (
15
15
  )
16
16
 
17
17
  pytestmark = pytest.mark.skipif(
18
- os.environ.get("OPENH264_VERSION") is None,
18
+ os.environ.get("OPENH264_PATH") is None,
19
19
  reason="OpenH264 のときだけ実行する",
20
20
  )
21
21
 
@@ -12,7 +12,7 @@ from sora_sdk import (
12
12
  )
13
13
 
14
14
  pytestmark = pytest.mark.skipif(
15
- os.environ.get("OPENH264_VERSION") is None,
15
+ os.environ.get("OPENH264_PATH") is None,
16
16
  reason="OpenH264 のときだけ実行する",
17
17
  )
18
18
 
@@ -7,11 +7,11 @@ def test_version():
7
7
  assert hasattr(sora_sdk, "__version__")
8
8
  assert isinstance(sora_sdk.__version__, str)
9
9
  assert sora_sdk.__version__ != "unknown"
10
-
10
+
11
11
  # VERSION ファイルの内容と一致することを確認
12
12
  version_file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "VERSION")
13
13
  with open(version_file, "r") as f:
14
14
  expected_version = f.read().strip()
15
-
15
+
16
16
  assert sora_sdk.__version__ == expected_version
17
- print(f"sora_sdk.__version__ = {sora_sdk.__version__}")
17
+ print(f"sora_sdk.__version__ = {sora_sdk.__version__}")
@@ -1 +0,0 @@
1
- 2025.4.0.dev3
@@ -1,52 +0,0 @@
1
- import time
2
-
3
- import pytest
4
- from client import SoraClient, SoraRole
5
-
6
- from sora_sdk import (
7
- SoraVideoCodecImplementation,
8
- SoraVideoCodecPreference,
9
- SoraVideoCodecType,
10
- )
11
-
12
-
13
- def test_preference_invalid(settings):
14
- # opneh264 のパスを設定してないのに H264 エンコーダを使おうとしているので Sora 生成時にエラーになる
15
- with pytest.raises(RuntimeError):
16
- SoraClient(
17
- settings,
18
- SoraRole.SENDONLY,
19
- audio=False,
20
- video=True,
21
- video_codec_type="H264",
22
- video_codec_preference=SoraVideoCodecPreference(
23
- codecs=[
24
- SoraVideoCodecPreference.Codec(
25
- type=SoraVideoCodecType.H264,
26
- encoder=SoraVideoCodecImplementation.CISCO_OPENH264,
27
- )
28
- ]
29
- ),
30
- )
31
-
32
-
33
- def test_preference_vp8(settings):
34
- sendonly = SoraClient(
35
- settings,
36
- SoraRole.SENDONLY,
37
- audio=False,
38
- video=True,
39
- video_codec_type="VP8",
40
- video_codec_preference=SoraVideoCodecPreference(
41
- codecs=[
42
- SoraVideoCodecPreference.Codec(
43
- type=SoraVideoCodecType.VP8, encoder=SoraVideoCodecImplementation.INTERNAL
44
- )
45
- ]
46
- ),
47
- )
48
- sendonly.connect(fake_video=True)
49
-
50
- time.sleep(5)
51
-
52
- sendonly.disconnect()