diff --git a/biz/ffmpeg.py b/biz/ffmpeg.py index e46e5ad..e8c38ef 100644 --- a/biz/ffmpeg.py +++ b/biz/ffmpeg.py @@ -29,7 +29,8 @@ def parse_ffmpeg_task(task_info, template_info): for overlay in part.get('overlays', []): sub_ffmpeg_task.add_overlay(os.path.join(template_info.get("local_path"), overlay)) tasks.append(sub_ffmpeg_task) - task = FfmpegTask(tasks, output_file="test.mp4") + output_file = "out_" + str(time.time()) + ".mp4" + task = FfmpegTask(tasks, output_file=output_file) overall = template_info.get("overall_template") task.frame_rate = template_info.get("frame_rate", 25) for lut in overall.get('filters', []): @@ -64,4 +65,16 @@ def parse_video(source, task_params, template_info): def start_ffmpeg_task(ffmpeg_task): for task in ffmpeg_task.analyze_input_render_tasks(): start_ffmpeg_task(task) - ffmpeg.start_render(ffmpeg_task) + return ffmpeg.start_render(ffmpeg_task) + + +def clear_task_tmp_file(ffmpeg_task): + for task in ffmpeg_task.analyze_input_render_tasks(): + clear_task_tmp_file(task) + try: + os.remove(ffmpeg_task.get_output_file()) + logger.info("delete tmp file: " + ffmpeg_task.get_output_file()) + except OSError: + logger.warning("delete tmp file failed: " + ffmpeg_task.get_output_file()) + return False + return True \ No newline at end of file diff --git a/biz/task.py b/biz/task.py index 8f20f08..e8d9ab4 100644 --- a/biz/task.py +++ b/biz/task.py @@ -1,4 +1,5 @@ from template import get_template_def +from util import api def normalize_task(task_info): @@ -7,8 +8,15 @@ def normalize_task(task_info): def start_task(task_info): - from biz.ffmpeg import parse_ffmpeg_task, start_ffmpeg_task + from biz.ffmpeg import parse_ffmpeg_task, start_ffmpeg_task, clear_task_tmp_file task_info = normalize_task(task_info) template_info = get_template_def(task_info.get("templateId")) ffmpeg_task = parse_ffmpeg_task(task_info, template_info) - result = start_ffmpeg_task(ffmpeg_task) \ No newline at end of file + result = start_ffmpeg_task(ffmpeg_task) + if not result: + return api.report_task_failed(task_info) + oss_result = api.upload_task_file(task_info, ffmpeg_task) + if not oss_result: + return api.report_task_failed(task_info) + clear_task_tmp_file(ffmpeg_task) + api.report_task_success(task_info) \ No newline at end of file diff --git a/index.py b/index.py index 2b14166..30f3593 100644 --- a/index.py +++ b/index.py @@ -15,4 +15,4 @@ while True: for task in task_list: print("start task:", task) biz.task.start_task(task) - sleep(1) \ No newline at end of file + sleep(10000) \ No newline at end of file diff --git a/template/__init__.py b/template/__init__.py index ec3fc6e..ea37dbe 100644 --- a/template/__init__.py +++ b/template/__init__.py @@ -70,6 +70,8 @@ def load_local_template(): def get_template_def(template_id): + if template_id not in TEMPLATES: + download_template(template_id) return TEMPLATES.get(template_id) def download_template(template_id): diff --git a/util/api.py b/util/api.py index 9824e02..fbe581d 100644 --- a/util/api.py +++ b/util/api.py @@ -43,7 +43,6 @@ def get_template_info(template_id): try: response = session.post('{0}/template/{1}'.format(os.getenv('API_ENDPOINT'), template_id), json={ 'accessKey': os.getenv('ACCESS_KEY'), - 'clientStatus': util.system.get_sys_info() }, timeout=10) except requests.RequestException as e: logger.error("请求失败!", e) @@ -96,3 +95,42 @@ def get_template_info(template_id): template['video_parts'].append(parts) template['local_path'] = os.path.join(os.getenv('TEMPLATE_DIR'), str(template_id)) return template + + +def report_task_success(task_info): + try: + response = session.post('{0}/{1}/success'.format(os.getenv('API_ENDPOINT'), task_info.get("id")), json={ + 'accessKey': os.getenv('ACCESS_KEY'), + }, timeout=10) + except requests.RequestException as e: + logger.error("请求失败!", e) + return None + + +def report_task_failed(task_info): + try: + response = session.post('{0}/{1}/fail'.format(os.getenv('API_ENDPOINT'), task_info.get("id")), json={ + 'accessKey': os.getenv('ACCESS_KEY'), + }, timeout=10) + except requests.RequestException as e: + logger.error("请求失败!", e) + return None + + +def upload_task_file(task_info, ffmpeg_task): + try: + response = session.post('{0}/{1}/uploadUrl'.format(os.getenv('API_ENDPOINT'), task_info.get("id")), json={ + 'accessKey': os.getenv('ACCESS_KEY'), + }, timeout=10) + except requests.RequestException as e: + logger.error("请求失败!", e) + return False + data = response.json() + url = data.get('data', "") + try: + with open(ffmpeg_task.get_output_file(), 'rb') as f: + requests.put(url, data=f) + except requests.RequestException as e: + logger.error("上传失败!", e) + return False + return True \ No newline at end of file diff --git a/util/ffmpeg.py b/util/ffmpeg.py index 678c164..4a024d5 100644 --- a/util/ffmpeg.py +++ b/util/ffmpeg.py @@ -8,7 +8,8 @@ from entity.ffmpeg import FfmpegTask def start_render(ffmpeg_task: FfmpegTask): print(ffmpeg_task) print(ffmpeg_task.get_ffmpeg_args()) - os.system("ffmpeg.exe "+" ".join(ffmpeg_task.get_ffmpeg_args())) + code = os.system("ffmpeg.exe "+" ".join(ffmpeg_task.get_ffmpeg_args())) + return code == 0 def handle_ffmpeg_output(stdout: Optional[IO[bytes]]) -> str: out_time = "0:0:0.0"