Merge branch 'master' into v4

Resolve 57 conflicts keeping v4's architecture (UI removal, api app
context, path isolation, streaming/codecs/rtc, workflow-mode superset,
args_helper) and taking master's post-fork features so none are dropped:
inference override/adjust provider hooks (+ face_swapper 3.8.1 coreml
fix), is_vision_frame validity guards, resolve_temp_frame_set frame
numbering with the source audio/voice trim offset, the ffmpeg color
pipeline (restrict_color_transfer / convert_color_space / temp_pixel_format),
ffprobe select_stream v:0 + format duration, pre_check ffprobe with
dependency_not_installed, onnxruntime arena-leak guard + version lru_cache,
installer cuda@12/@13 provider split, workflow_strategy disk/memory
(memory default), and the dependency version bumps. content_analyser hash
guard rehashed to 3c6ce25e.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V7MdZEmd1GE8uSDTMyq34r
This commit is contained in:
henryruhs
2026-08-05 22:12:54 +02:00
co-authored by Claude Opus 4.8
50 changed files with 1032 additions and 302 deletions
+18 -9
View File
@@ -26,13 +26,14 @@ def before_all() -> None:
ffmpeg_builder.set_output(get_test_example_file('source-48000khz-2ch.wav'))
)
)
ffmpeg.run_ffmpeg(
ffmpeg_builder.chain(
ffmpeg_builder.set_input(get_test_example_file('target-240p.mp4')),
ffmpeg_builder.set_video_duration(1),
ffmpeg_builder.set_output(get_test_example_file('target-240p-1s.mov'))
for video_format in [ 'mkv', 'mov' ]:
ffmpeg.run_ffmpeg(
ffmpeg_builder.chain(
ffmpeg_builder.set_input(get_test_example_file('target-240p.mp4')),
ffmpeg_builder.set_video_duration(1),
ffmpeg_builder.set_output(get_test_example_file('target-240p-1s.' + video_format))
)
)
)
def test_extract_audio_metadata() -> None:
@@ -40,7 +41,7 @@ def test_extract_audio_metadata() -> None:
assert audio_metadata.get('sample_rate') == 44100
assert audio_metadata.get('channel_total') == 1
assert audio_metadata.get('frame_total') == 167039
assert audio_metadata.get('frame_total') == 167040
assert audio_metadata.get('bit_rate') == 128000
audio_metadata = extract_audio_metadata(get_test_example_file('source-48000khz-2ch.wav'))
@@ -48,7 +49,7 @@ def test_extract_audio_metadata() -> None:
assert audio_metadata.get('sample_rate') == 48000
assert audio_metadata.get('channel_total') == 2
assert audio_metadata.get('frame_total') == 91200
assert audio_metadata.get('bit_rate') == 1536000
assert audio_metadata.get('bit_rate') == 1536328
def test_extract_video_metadata() -> None:
@@ -57,7 +58,15 @@ def test_extract_video_metadata() -> None:
assert video_metadata.get('fps') == 25.0
assert video_metadata.get('duration') == 10.8
assert video_metadata.get('resolution') == (426, 226)
assert video_metadata.get('bit_rate') == 138754
assert video_metadata.get('bit_rate') == 141981
assert video_metadata.get('color_transfer') == 'smpte170m'
video_metadata = extract_video_metadata(get_test_example_file('target-240p-1s.mkv'))
assert video_metadata.get('fps') == 25.0
assert video_metadata.get('duration') == 1.0
assert video_metadata.get('frame_total') == 25
assert video_metadata.get('resolution') == (426, 226)
video_metadata = extract_video_metadata(get_test_example_file('target-240p-1s.mov'))