stream uploads for real

This commit is contained in:
henryruhs
2026-09-12 19:16:33 +02:00
parent c9802d9c59
commit 09fa38ae04
3 changed files with 30 additions and 29 deletions
+3 -4
View File
@@ -75,17 +75,16 @@ async def save_asset_files(upload_files : List[UploadFile]) -> List[str]:
asset_file_name = uuid.uuid4().hex
asset_path = os.path.join(temp_path, asset_file_name + file_extension)
file_content = await upload_file.read()
process_manager.start()
if media_type == 'audio' and await asyncio.to_thread(ffmpeg.sanitize_audio, file_content, asset_path, api_security_strategy):
if media_type == 'audio' and await asyncio.to_thread(ffmpeg.sanitize_audio, upload_file.file, asset_path, api_security_strategy):
asset_paths.append(asset_path)
if media_type == 'image' and await asyncio.to_thread(ffmpeg.sanitize_image, file_content, asset_path):
if media_type == 'image' and await asyncio.to_thread(ffmpeg.sanitize_image, upload_file.file, asset_path):
asset_paths.append(asset_path)
if media_type == 'video' and await asyncio.to_thread(ffmpeg.sanitize_video, file_content, asset_path, api_security_strategy):
if media_type == 'video' and await asyncio.to_thread(ffmpeg.sanitize_video, upload_file.file, asset_path, api_security_strategy):
asset_paths.append(asset_path)
process_manager.end()
+12 -12
View File
@@ -3,7 +3,7 @@ import subprocess
import tempfile
from functools import lru_cache
from types import SimpleNamespace
from typing import List, Optional, cast
from typing import BinaryIO, List, Optional, cast
import facefusion.choices
from facefusion import cli_progress, ffmpeg_builder, ffprobe, logger, process_manager, state_manager, translator, vision
@@ -41,10 +41,10 @@ def run_ffmpeg_with_progress(commands : List[Command], progress : SimpleNamespac
return process
def run_ffmpeg_with_pipe(commands : List[Command], file_content : Buffer) -> subprocess.Popen[Buffer]:
def run_ffmpeg_with_pipe(commands : List[Command], file : BinaryIO) -> subprocess.Popen[Buffer]:
commands = ffmpeg_builder.run(commands)
process = subprocess.Popen(commands, stdin = subprocess.PIPE, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
process.communicate(input = file_content)
process = subprocess.Popen(commands, stdin = file, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
process.communicate()
return process
@@ -359,7 +359,7 @@ def concat_video(output_path : str, temp_output_paths : List[str]) -> bool:
return process.returncode == 0
def sanitize_audio(file_content : Buffer, asset_path : str, security_strategy : ApiSecurityStrategy) -> bool:
def sanitize_audio(file : BinaryIO, asset_path : str, security_strategy : ApiSecurityStrategy) -> bool:
if security_strategy == 'strict':
commands = ffmpeg_builder.chain(
ffmpeg_builder.set_input('pipe:0'),
@@ -367,7 +367,7 @@ def sanitize_audio(file_content : Buffer, asset_path : str, security_strategy :
ffmpeg_builder.strip_metadata(),
ffmpeg_builder.force_output(asset_path)
)
return run_ffmpeg_with_pipe(commands, file_content).returncode == 0
return run_ffmpeg_with_pipe(commands, file).returncode == 0
commands = ffmpeg_builder.chain(
ffmpeg_builder.set_input('pipe:0'),
@@ -375,20 +375,20 @@ def sanitize_audio(file_content : Buffer, asset_path : str, security_strategy :
ffmpeg_builder.strip_metadata(),
ffmpeg_builder.force_output(asset_path)
)
return run_ffmpeg_with_pipe(commands, file_content).returncode == 0
return run_ffmpeg_with_pipe(commands, file).returncode == 0
def sanitize_image(file_content : Buffer, asset_path : str) -> bool:
def sanitize_image(file : BinaryIO, asset_path : str) -> bool:
commands = ffmpeg_builder.chain(
ffmpeg_builder.set_input('pipe:0'),
ffmpeg_builder.deep_copy_image(),
ffmpeg_builder.strip_metadata(),
ffmpeg_builder.force_output(asset_path)
)
return run_ffmpeg_with_pipe(commands, file_content).returncode == 0
return run_ffmpeg_with_pipe(commands, file).returncode == 0
def sanitize_video(file_content : Buffer, asset_path : str, security_strategy : ApiSecurityStrategy) -> bool:
def sanitize_video(file : BinaryIO, asset_path : str, security_strategy : ApiSecurityStrategy) -> bool:
if security_strategy == 'strict':
available_video_encoders = get_static_available_encoder_set().get('video')
commands = ffmpeg_builder.chain(
@@ -401,7 +401,7 @@ def sanitize_video(file_content : Buffer, asset_path : str, security_strategy :
ffmpeg_builder.strip_metadata(),
ffmpeg_builder.force_output(asset_path)
)
return run_ffmpeg_with_pipe(commands, file_content).returncode == 0
return run_ffmpeg_with_pipe(commands, file).returncode == 0
commands = ffmpeg_builder.chain(
ffmpeg_builder.set_input('pipe:0'),
@@ -410,7 +410,7 @@ def sanitize_video(file_content : Buffer, asset_path : str, security_strategy :
ffmpeg_builder.strip_metadata(),
ffmpeg_builder.force_output(asset_path)
)
return run_ffmpeg_with_pipe(commands, file_content).returncode == 0
return run_ffmpeg_with_pipe(commands, file).returncode == 0
def fix_audio_encoder(video_format : VideoFormat, audio_encoder : AudioEncoder) -> AudioEncoder:
+15 -13
View File
@@ -249,43 +249,45 @@ def test_replace_audio() -> None:
def test_sanitize_audio() -> None:
file_path = get_test_example_file('source.wav')
file_content = open(file_path, 'rb').read()
output_paths =\
[
get_test_output_path('test-sanitize-audio-strict.mp3'),
get_test_output_path('test-sanitize-audio-moderate.wav')
]
assert sanitize_audio(file_content, output_paths[0], 'strict') is True
assert probe_audio_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'mp3'
with open(file_path, 'rb') as file:
assert sanitize_audio(file, output_paths[0], 'strict') is True
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_audio_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'pcm_s16le'
with open(file_path, 'rb') as file:
assert sanitize_audio(file, output_paths[1], 'moderate') is True
assert probe_audio_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'pcm_s16le'
def test_sanitize_image() -> None:
file_path = get_test_example_file('source.jpg')
file_content = open(file_path, 'rb').read()
output_path = get_test_output_path('test-sanitize-image.jpg')
assert sanitize_image(file_content, output_path) is True
assert is_image(output_path) is True
with open(file_path, 'rb') as file:
assert sanitize_image(file, output_path) is True
assert is_image(output_path) is True
def test_sanitize_video() -> None:
file_path = get_test_example_file('target-240p-h265.mp4')
file_content = open(file_path, 'rb').read()
output_paths =\
[
get_test_output_path('test-sanitize-video-strict.mp4'),
get_test_output_path('test-sanitize-video-moderate.mp4')
]
assert sanitize_video(file_content, output_paths[0], 'strict') is True
assert probe_video_entries(output_paths[0], [ 'codec_name' ]).get('codec_name') == 'h264'
with open(file_path, 'rb') as file:
assert sanitize_video(file, output_paths[0], 'strict') is True
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_video_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'hevc'
with open(file_path, 'rb') as file:
assert sanitize_video(file, output_paths[1], 'moderate') is True
assert probe_video_entries(output_paths[1], [ 'codec_name' ]).get('codec_name') == 'hevc'
def test_fix_audio_encoder() -> None: