上传main

This commit is contained in:
HKXluo
2025-04-19 23:37:46 +08:00
parent 70da8b17a5
commit 967a3ad705
11 changed files with 302 additions and 0 deletions

117
ffmpeg_utils.py Normal file
View File

@@ -0,0 +1,117 @@
import os
import uuid
import subprocess
import requests
import tempfile
import shutil
import logging
import threading
import time
from contextlib import contextmanager
UPLOAD_FOLDER = 'temp_files'
@contextmanager
def temp_directory(dir=None):
temp_dir = tempfile.mkdtemp(dir=dir)
try:
yield temp_dir
finally:
# 不再在这里自动删除临时目录
pass
def download_file(url, temp_dir):
try:
headers = {
'User-Agent': 'Mozilla/5.0',
'Accept': '*/*'
}
logging.info(f"开始从URL下载文件: {url}")
response = requests.get(url, headers=headers, stream=True, timeout=30)
response.raise_for_status()
file_path = os.path.join(temp_dir, 'input_audio')
with open(file_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
file_size = os.path.getsize(file_path)
if file_size < 1024:
error_msg = f"下载的文件太小(仅{file_size}字节),可能无效"
logging.error(error_msg)
raise Exception(error_msg)
logging.info(f"文件下载成功,保存到: {file_path} (大小: {file_size}字节)")
return file_path
except Exception as e:
logging.error(f"{url} 下载文件时出错: {e}")
raise
def execute_ffmpeg(input_path, output_path, ffmpeg_args):
try:
filtered_args = [arg for arg in ffmpeg_args if not (arg.lower() in ['-i', '-input'] or
(ffmpeg_args.index(arg) > 0 and ffmpeg_args[ffmpeg_args.index(arg) - 1].lower() == '-i'))]
cmd = ['lib/ffmpeg/bin/ffmpeg', '-i', input_path] + filtered_args + [output_path]
logging.info(f"执行FFmpeg命令: {' '.join(cmd)}")
result = subprocess.run(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
encoding='utf-8',
errors='replace'
)
if result.returncode != 0:
error_msg = f"FFmpeg处理失败返回码: {result.returncode}, 错误: {result.stderr}"
logging.error(error_msg)
raise Exception(error_msg)
logging.info("FFmpeg处理成功完成")
return True
except Exception as e:
logging.error(f"执行FFmpeg时出错: {e}")
raise
def process_ffmpeg(data, file_registry, file_lock):
try:
temp_dir = tempfile.mkdtemp(dir=UPLOAD_FOLDER)
logging.info(f"创建临时目录: {temp_dir}")
input_url = data.get('input_url')
ffmpeg_args = data.get('args', [])
input_path = download_file(input_url, temp_dir)
output_id = str(uuid.uuid4())[:8]
output_format = data.get('output_format', 'mp4')
output_filename = f"{output_id}.{output_format}"
output_path = os.path.join(temp_dir, output_filename)
execute_ffmpeg(input_path, output_path, ffmpeg_args)
with file_lock:
file_registry[output_id] = {
'path': os.path.abspath(output_path),
'filename': output_filename,
'last_access': time.time(),
'download_count': 0
}
logging.info(f"已注册新文件ID: {output_id}, 路径: {output_path}")
# 返回临时目录路径以便在主函数中删除
return {
'status': 'success',
'download_url': f"http://ffmpeg.liulikeji.cn/download/{output_id}/{output_filename}",
'file_id': output_id,
'temp_dir': temp_dir # 返回临时目录路径
}
except Exception as e:
logging.error(f"处理过程中出错: {e}")
return {'error': str(e)}