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
+5 -5
View File
@@ -7,7 +7,7 @@ import facefusion.ffmpeg
from facefusion import ffmpeg, ffmpeg_builder, process_manager, state_manager
from facefusion.download import conditional_download
from facefusion.ffmpeg import concat_video, extract_frames, merge_video, read_audio_buffer, replace_audio, restore_audio, sanitize_audio, sanitize_image, sanitize_video, spawn_frames
from facefusion.ffprobe import probe_entries
from facefusion.ffprobe import probe_audio_entries, probe_video_entries
from facefusion.filesystem import copy_file, is_image
from facefusion.temp_helper import clear_temp_directory, create_temp_directory, get_temp_file_path, resolve_temp_frame_paths
from facefusion.types import EncoderSet
@@ -253,10 +253,10 @@ def test_sanitize_audio() -> None:
]
assert sanitize_audio(file_content, output_paths[0], 'strict') is True
assert probe_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'mp3'
assert probe_audio_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'mp3'
assert sanitize_audio(file_content, output_paths[1], 'moderate') is True
assert probe_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'pcm_s16le'
assert probe_audio_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'pcm_s16le'
def test_sanitize_image() -> None:
@@ -278,9 +278,9 @@ def test_sanitize_video() -> None:
]
assert sanitize_video(file_content, output_paths[0], 'strict') is True
assert probe_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'h264'
assert probe_video_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'h264'
assert sanitize_video(file_content, output_paths[1], 'moderate') is True
assert probe_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'hevc'
assert probe_video_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'hevc'