sora-sdk 2025.3.0.dev8__tar.gz → 2025.4.0__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.3.0.dev8/src/sora_sdk.egg-info → sora_sdk-2025.4.0}/PKG-INFO +2 -2
  2. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/README.md +1 -1
  3. sora_sdk-2025.4.0/VERSION +1 -0
  4. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/buildbase.py +292 -3
  5. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/pyproject.toml +8 -8
  6. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/run.py +117 -32
  7. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk/__init__.py +5 -1
  8. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk/sora_sdk_ext.cpython-311-darwin.so +0 -0
  9. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk/sora_sdk_ext.pyi +16 -15
  10. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0/src/sora_sdk.egg-info}/PKG-INFO +2 -2
  11. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk.egg-info/SOURCES.txt +1 -0
  12. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_amd_amf.py +73 -7
  13. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_apple_video_toolbox.py +3 -11
  14. sora_sdk-2025.4.0/tests/test_capability.py +50 -0
  15. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_intel_vpl.py +140 -138
  16. sora_sdk-2025.4.0/tests/test_key_frame_request.py +75 -0
  17. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_nvidia_video_codec_sdk.py +64 -10
  18. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_openh264.py +4 -19
  19. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_openh264_simulcast.py +4 -11
  20. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_sendonly_recvonly.py +10 -0
  21. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_version.py +3 -3
  22. sora_sdk-2025.3.0.dev8/VERSION +0 -1
  23. sora_sdk-2025.3.0.dev8/tests/test_capability.py +0 -52
  24. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/LICENSE +0 -0
  25. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/MANIFEST.in +0 -0
  26. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/pypath.py +0 -0
  27. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/setup.cfg +0 -0
  28. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/setup.py +0 -0
  29. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk/py.typed +0 -0
  30. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk.egg-info/dependency_links.txt +0 -0
  31. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/src/sora_sdk.egg-info/top_level.txt +0 -0
  32. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_authz.py +0 -0
  33. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_authz_simulcast.py +0 -0
  34. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_ca_cert.py +0 -0
  35. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_degradation_preference.py +0 -0
  36. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_encoded_transform.py +0 -0
  37. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_messaging.py +0 -0
  38. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_messaging_header.py +0 -0
  39. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_opus.py +0 -0
  40. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_re_offer_re_answer_sdp.py +0 -0
  41. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_signaling.py +0 -0
  42. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_signaling_message.py +0 -0
  43. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_signaling_notify.py +0 -0
  44. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_simulcast.py +0 -0
  45. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_sora_disconnect.py +0 -0
  46. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_type_disconnect.py +0 -0
  47. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_type_switched.py +0 -0
  48. {sora_sdk-2025.3.0.dev8 → sora_sdk-2025.4.0}/tests/test_vad.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sora_sdk
3
- Version: 2025.3.0.dev8
3
+ Version: 2025.4.0
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>
@@ -108,7 +108,7 @@ PyPI 経由ではインストールできません。
108
108
 
109
109
  ## システム条件
110
110
 
111
- - WebRTC SFU Sora 2024.1.0 以降
111
+ - WebRTC SFU Sora 2024.2.0 以降
112
112
  - Python 3.11 以上
113
113
 
114
114
  ## Python サポートポリシー
@@ -88,7 +88,7 @@ PyPI 経由ではインストールできません。
88
88
 
89
89
  ## システム条件
90
90
 
91
- - WebRTC SFU Sora 2024.1.0 以降
91
+ - WebRTC SFU Sora 2024.2.0 以降
92
92
  - Python 3.11 以上
93
93
 
94
94
  ## Python サポートポリシー
@@ -0,0 +1 @@
1
+ 2025.4.0
@@ -302,7 +302,12 @@ def _extractzip(z: zipfile.ZipFile, path: str):
302
302
  def extract(file: str, output_dir: str, output_dirname: str, filetype: Optional[str] = None):
303
303
  path = os.path.join(output_dir, output_dirname)
304
304
  logging.info(f"Extract {file} to {path}")
305
- if filetype == "gzip" or file.endswith(".tar.gz"):
305
+ if (
306
+ filetype == "gzip"
307
+ or file.endswith(".tar.gz")
308
+ or filetype == "lzma"
309
+ or file.endswith(".tar.xz")
310
+ ):
306
311
  rm_rf(path)
307
312
  with tarfile.open(file) as t:
308
313
  dir = is_single_dir_tar(t)
@@ -378,6 +383,7 @@ def git_clone_shallow(url, hash, dir, submodule=False):
378
383
 
379
384
 
380
385
  def apply_patch(patch, dir, depth):
386
+ patch = os.path.abspath(patch)
381
387
  with cd(dir):
382
388
  logging.info(f"patch -p{depth} < {patch}")
383
389
  if platform.system() == "Windows":
@@ -800,6 +806,7 @@ def build_and_install_boost(
800
806
  )
801
807
  elif target_os == "android":
802
808
  # Android の場合、android-ndk を使ってビルドする
809
+ # ただし cxx が指定されてた場合はそちらを優先する
803
810
  with open("project-config.jam", "w", encoding="utf-8") as f:
804
811
  bin = os.path.join(
805
812
  android_ndk, "toolchains", "llvm", "prebuilt", android_build_platform, "bin"
@@ -814,7 +821,7 @@ def build_and_install_boost(
814
821
  f.write(
815
822
  f"using clang \
816
823
  : android \
817
- : {escape(os.path.join(bin, 'clang++'))} \
824
+ : {escape(cxx if len(cxx) != 0 else os.path.join(bin, 'clang++'))} \
818
825
  --target=aarch64-none-linux-android{native_api_level} \
819
826
  --sysroot={escape(sysroot)} \
820
827
  : <archiver>{escape(os.path.join(bin, 'llvm-ar'))} \
@@ -932,7 +939,7 @@ def build_sora(
932
939
  ]
933
940
 
934
941
  with cd(local_sora_cpp_sdk_dir):
935
- cmd(["python3", "run.py", platform, *local_sora_cpp_sdk_args])
942
+ cmd(["python3", "run.py", "build", platform, *local_sora_cpp_sdk_args])
936
943
 
937
944
 
938
945
  class SoraInfo(NamedTuple):
@@ -1226,6 +1233,93 @@ def install_sdl2(
1226
1233
  cmd(["cmake", "--install", ".", "--config", configuration])
1227
1234
 
1228
1235
 
1236
+ @versioned
1237
+ def install_sdl3(
1238
+ version, source_dir, build_dir, install_dir, debug: bool, platform: str, cmake_args: List[str]
1239
+ ):
1240
+ url = f"https://github.com/libsdl-org/SDL/releases/download/release-{version}/SDL3-{version}.tar.gz"
1241
+ path = download(url, source_dir)
1242
+ sdl3_source_dir = os.path.join(source_dir, "sdl3")
1243
+ sdl3_build_dir = os.path.join(build_dir, "sdl3")
1244
+ sdl3_install_dir = os.path.join(install_dir, "sdl3")
1245
+ rm_rf(sdl3_source_dir)
1246
+ rm_rf(sdl3_build_dir)
1247
+ rm_rf(sdl3_install_dir)
1248
+ extract(path, source_dir, "sdl3")
1249
+
1250
+ mkdir_p(sdl3_build_dir)
1251
+ with cd(sdl3_build_dir):
1252
+ configuration = "Debug" if debug else "Release"
1253
+ cmake_args = cmake_args[:]
1254
+ cmake_args += [
1255
+ sdl3_source_dir,
1256
+ f"-DCMAKE_BUILD_TYPE={configuration}",
1257
+ f"-DCMAKE_INSTALL_PREFIX={cmake_path(sdl3_install_dir)}",
1258
+ "-DBUILD_SHARED_LIBS=OFF",
1259
+ "-DSDL_STATIC=ON",
1260
+ "-DSDL_SHARED=OFF",
1261
+ ]
1262
+ if platform == "windows":
1263
+ cmake_args += [
1264
+ f"-DCMAKE_MSVC_RUNTIME_LIBRARY={'MultiThreaded' if not debug else 'MultiThreadedDebug'}",
1265
+ "-DSDL_AUDIO=OFF",
1266
+ "-DSDL_JOYSTICK=OFF",
1267
+ "-DSDL_HAPTIC=OFF",
1268
+ # GitHub Actions 上で gameinput.h が存在しないのに
1269
+ # なぜか check_c_source_compiles() が成功してしまうので
1270
+ # HAVE_GAMEINPUT_H=0 で強制的に無効化する
1271
+ "-DHAVE_GAMEINPUT_H=0",
1272
+ ]
1273
+ elif platform == "macos":
1274
+ # どの環境でも同じようにインストールされるようにするため全部 ON/OFF を明示的に指定する
1275
+ cmake_args += [
1276
+ "-DSDL_AUDIO=OFF",
1277
+ "-DSDL_VIDEO=ON",
1278
+ "-DSDL_RENDER=ON",
1279
+ "-DSDL_HAPTIC=ON",
1280
+ "-DSDL_POWER=ON",
1281
+ "-DSDL_JOYSTICK=ON",
1282
+ "-DSDL_SENSOR=ON",
1283
+ "-DSDL_OPENGL=ON",
1284
+ "-DSDL_OPENGLES=ON",
1285
+ "-DSDL_METAL=ON",
1286
+ "-DSDL_VULKAN=OFF",
1287
+ ]
1288
+ elif platform == "linux":
1289
+ # どの環境でも同じようにインストールされるようにするため全部 ON/OFF を明示的に指定する
1290
+ cmake_args += [
1291
+ "-DSDL_AUDIO=OFF",
1292
+ "-DSDL_VIDEO=ON",
1293
+ "-DSDL_RENDER=ON",
1294
+ "-DSDL_HAPTIC=ON",
1295
+ "-DSDL_POWER=ON",
1296
+ "-DSDL_JOYSTICK=ON",
1297
+ "-DSDL_SENSOR=ON",
1298
+ "-DSDL_OPENGL=ON",
1299
+ "-DSDL_OPENGLES=ON",
1300
+ "-DSDL_X11=ON",
1301
+ "-DSDL_X11_SHARED=OFF",
1302
+ "-DSDL_X11_XCURSOR=OFF",
1303
+ "-DSDL_X11_XDBE=OFF",
1304
+ "-DSDL_X11_XFIXES=OFF",
1305
+ "-DSDL_X11_XINPUT=OFF",
1306
+ "-DSDL_X11_XRANDR=OFF",
1307
+ "-DSDL_X11_XSCRNSAVER=OFF",
1308
+ "-DSDL_X11_XSHAPE=OFF",
1309
+ "-DSDL_X11_XSYNC=OFF",
1310
+ "-DSDL_WAYLAND=OFF",
1311
+ "-DSDL_VULKAN=OFF",
1312
+ "-DSDL_KMSDRM=OFF",
1313
+ "-DSDL_RPI=OFF",
1314
+ ]
1315
+ cmd(["cmake"] + cmake_args)
1316
+
1317
+ cmd(
1318
+ ["cmake", "--build", ".", "--config", configuration, f"-j{multiprocessing.cpu_count()}"]
1319
+ )
1320
+ cmd(["cmake", "--install", ".", "--config", configuration])
1321
+
1322
+
1229
1323
  @versioned
1230
1324
  def install_cli11(version, install_dir):
1231
1325
  cli11_install_dir = os.path.join(install_dir, "cli11")
@@ -1307,6 +1401,33 @@ def install_vpl(version, configuration, source_dir, build_dir, install_dir, cmak
1307
1401
  cmd(["cmake", "--install", ".", "--config", configuration])
1308
1402
 
1309
1403
 
1404
+ @versioned
1405
+ def install_blend2d_official(
1406
+ version,
1407
+ configuration,
1408
+ source_dir,
1409
+ build_dir,
1410
+ install_dir,
1411
+ ios,
1412
+ cmake_args,
1413
+ ):
1414
+ rm_rf(os.path.join(source_dir, "blend2d"))
1415
+ rm_rf(os.path.join(build_dir, "blend2d"))
1416
+ rm_rf(os.path.join(install_dir, "blend2d"))
1417
+
1418
+ url = f"https://blend2d.com/download/blend2d-{version}.tar.gz"
1419
+ path = download(url, source_dir)
1420
+ extract(path, source_dir, "blend2d")
1421
+ _build_blend2d(
1422
+ configuration=configuration,
1423
+ source_dir=source_dir,
1424
+ build_dir=build_dir,
1425
+ install_dir=install_dir,
1426
+ ios=ios,
1427
+ cmake_args=cmake_args,
1428
+ )
1429
+
1430
+
1310
1431
  @versioned
1311
1432
  def install_blend2d(
1312
1433
  version,
@@ -1332,7 +1453,17 @@ def install_blend2d(
1332
1453
  asmjit_version,
1333
1454
  os.path.join(source_dir, "blend2d", "3rdparty", "asmjit"),
1334
1455
  )
1456
+ _build_blend2d(
1457
+ configuration=configuration,
1458
+ source_dir=source_dir,
1459
+ build_dir=build_dir,
1460
+ install_dir=install_dir,
1461
+ ios=ios,
1462
+ cmake_args=cmake_args,
1463
+ )
1464
+
1335
1465
 
1466
+ def _build_blend2d(configuration, source_dir, build_dir, install_dir, ios, cmake_args):
1336
1467
  mkdir_p(os.path.join(build_dir, "blend2d"))
1337
1468
  with cd(os.path.join(build_dir, "blend2d")):
1338
1469
  cmd(
@@ -1747,6 +1878,7 @@ def install_opus(
1747
1878
  "cmake",
1748
1879
  f"-DCMAKE_INSTALL_PREFIX={cmake_path(opus_install_dir)}",
1749
1880
  f"-DCMAKE_BUILD_TYPE={configuration}",
1881
+ "-DCMAKE_POSITION_INDEPENDENT_CODE=ON",
1750
1882
  "-DOPUS_BUILD_SHARED_LIBRARY=OFF",
1751
1883
  "-DOPUS_BUILD_TESTING=OFF",
1752
1884
  "-DOPUS_BUILD_PROGRAMS=OFF",
@@ -1803,6 +1935,163 @@ def install_amf(version, install_dir):
1803
1935
  )
1804
1936
 
1805
1937
 
1938
+ @versioned
1939
+ def install_mbedtls(version, source_dir, build_dir, install_dir, debug, cmake_args):
1940
+ rm_rf(os.path.join(source_dir, "mbedtls"))
1941
+ rm_rf(os.path.join(build_dir, "mbedtls"))
1942
+ rm_rf(os.path.join(install_dir, "mbedtls"))
1943
+ git_clone_shallow(
1944
+ "https://github.com/Mbed-TLS/mbedtls.git",
1945
+ version,
1946
+ os.path.join(source_dir, "mbedtls"),
1947
+ )
1948
+ with cd(os.path.join(source_dir, "mbedtls")):
1949
+ configuration = "Debug" if debug else "Release"
1950
+ cmd(["python3", "scripts/config.py", "set", "MBEDTLS_SSL_DTLS_SRTP"])
1951
+ cmd(
1952
+ [
1953
+ "cmake",
1954
+ f"-DCMAKE_INSTALL_PREFIX={cmake_path(os.path.join(install_dir, 'mbedtls'))}",
1955
+ f"-DCMAKE_BUILD_TYPE={configuration}",
1956
+ "-DCMAKE_POSITION_INDEPENDENT_CODE=ON",
1957
+ "-B",
1958
+ os.path.join(build_dir, "mbedtls"),
1959
+ ]
1960
+ + cmake_args
1961
+ )
1962
+ cmd(
1963
+ [
1964
+ "cmake",
1965
+ "--build",
1966
+ os.path.join(build_dir, "mbedtls"),
1967
+ f"-j{multiprocessing.cpu_count()}",
1968
+ "--config",
1969
+ "Release",
1970
+ ]
1971
+ )
1972
+ cmd(["cmake", "--install", os.path.join(build_dir, "mbedtls")])
1973
+
1974
+
1975
+ @versioned
1976
+ def install_libjpeg_turbo(version, source_dir, build_dir, install_dir, configuration, cmake_args):
1977
+ libjpeg_source_dir = os.path.join(source_dir, "libjpeg-turbo")
1978
+ libjpeg_build_dir = os.path.join(build_dir, "libjpeg-turbo")
1979
+ libjpeg_install_dir = os.path.join(install_dir, "libjpeg-turbo")
1980
+ rm_rf(libjpeg_source_dir)
1981
+ rm_rf(libjpeg_build_dir)
1982
+ rm_rf(libjpeg_install_dir)
1983
+ git_clone_shallow(
1984
+ "https://github.com/libjpeg-turbo/libjpeg-turbo.git",
1985
+ version,
1986
+ libjpeg_source_dir,
1987
+ )
1988
+ mkdir_p(libjpeg_build_dir)
1989
+ with cd(libjpeg_build_dir):
1990
+ cmd(
1991
+ [
1992
+ "cmake",
1993
+ libjpeg_source_dir,
1994
+ f"-DCMAKE_INSTALL_PREFIX={libjpeg_install_dir}",
1995
+ f"-DCMAKE_BUILD_TYPE={configuration}",
1996
+ "-DENABLE_SHARED=FALSE",
1997
+ "-DENABLE_STATIC=TRUE",
1998
+ "-DCMAKE_BUILD_TYPE=Release",
1999
+ "-DCMAKE_POSITION_INDEPENDENT_CODE=ON",
2000
+ ]
2001
+ + cmake_args
2002
+ )
2003
+ cmd(
2004
+ [
2005
+ "cmake",
2006
+ "--build",
2007
+ libjpeg_build_dir,
2008
+ f"-j{multiprocessing.cpu_count()}",
2009
+ "--config",
2010
+ "Release",
2011
+ ]
2012
+ )
2013
+ cmd(["cmake", "--install", libjpeg_build_dir])
2014
+
2015
+
2016
+ @versioned
2017
+ def install_libyuv(
2018
+ version, source_dir, build_dir, install_dir, libjpeg_turbo_dir, configuration, cmake_args
2019
+ ):
2020
+ libyuv_source_dir = os.path.join(source_dir, "libyuv")
2021
+ libyuv_build_dir = os.path.join(build_dir, "libyuv")
2022
+ libyuv_install_dir = os.path.join(install_dir, "libyuv")
2023
+ rm_rf(libyuv_source_dir)
2024
+ rm_rf(libyuv_build_dir)
2025
+ rm_rf(libyuv_install_dir)
2026
+ git_clone_shallow(
2027
+ "https://chromium.googlesource.com/libyuv/libyuv",
2028
+ version,
2029
+ libyuv_source_dir,
2030
+ )
2031
+ mkdir_p(libyuv_build_dir)
2032
+ with cd(libyuv_build_dir):
2033
+ cmd(
2034
+ [
2035
+ "cmake",
2036
+ libyuv_source_dir,
2037
+ f"-DCMAKE_INSTALL_PREFIX={cmake_path(libyuv_install_dir)}",
2038
+ f"-DCMAKE_BUILD_TYPE={configuration}",
2039
+ f"-DCMAKE_PREFIX_PATH={cmake_path(libjpeg_turbo_dir)}",
2040
+ *cmake_args,
2041
+ ]
2042
+ )
2043
+ cmd(
2044
+ [
2045
+ "cmake",
2046
+ "--build",
2047
+ libyuv_build_dir,
2048
+ f"-j{multiprocessing.cpu_count()}",
2049
+ "--config",
2050
+ "Release",
2051
+ ]
2052
+ )
2053
+ cmd(["cmake", "--install", libyuv_build_dir])
2054
+
2055
+
2056
+ @versioned
2057
+ def install_aom(version, source_dir, build_dir, install_dir, configuration, cmake_args):
2058
+ aom_source_dir = os.path.join(source_dir, "aom")
2059
+ aom_build_dir = os.path.join(build_dir, "aom")
2060
+ aom_install_dir = os.path.join(install_dir, "aom")
2061
+ rm_rf(aom_source_dir)
2062
+ rm_rf(aom_build_dir)
2063
+ rm_rf(aom_install_dir)
2064
+ git_clone_shallow(
2065
+ "https://aomedia.googlesource.com/aom",
2066
+ version,
2067
+ aom_source_dir,
2068
+ )
2069
+ with cd(aom_source_dir):
2070
+ cmd(
2071
+ [
2072
+ "cmake",
2073
+ "-B",
2074
+ aom_build_dir,
2075
+ f"-DCMAKE_INSTALL_PREFIX={cmake_path(aom_install_dir)}",
2076
+ f"-DCMAKE_BUILD_TYPE={configuration}",
2077
+ "-DENABLE_DOCS=OFF",
2078
+ "-DENABLE_TESTS=OFF",
2079
+ *cmake_args,
2080
+ ]
2081
+ )
2082
+ cmd(
2083
+ [
2084
+ "cmake",
2085
+ "--build",
2086
+ aom_build_dir,
2087
+ f"-j{multiprocessing.cpu_count()}",
2088
+ "--config",
2089
+ "Release",
2090
+ ]
2091
+ )
2092
+ cmd(["cmake", "--install", aom_build_dir])
2093
+
2094
+
1806
2095
  class PlatformTarget(object):
1807
2096
  def __init__(self, os, osver, arch, extra=None):
1808
2097
  self.os = os
@@ -26,24 +26,24 @@ build-backend = "setuptools.build_meta"
26
26
  [tool.uv]
27
27
  python-preference = "only-managed"
28
28
  dev-dependencies = [
29
- "nanobind==2.7.0",
30
- "setuptools==80.9",
31
- "build==1.2.2.post1",
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
- "pydantic-settings",
41
39
  ]
42
40
 
43
41
  [tool.ruff]
44
42
  target-version = "py311"
45
43
  line-length = 100
46
44
 
45
+ [tool.ty.src]
46
+ include = ["src", "tests"]
47
47
 
48
48
  [tool.pytest.ini_options]
49
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()