From 515bf156abeb7cf6477b257bba0d9a1641a04f86 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Mon, 9 Dec 2024 09:25:58 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 biz/ffmpeg.py        | 17 +++++++++++++++--
 biz/task.py          | 12 ++++++++++--
 index.py             |  2 +-
 template/__init__.py |  2 ++
 util/api.py          | 40 +++++++++++++++++++++++++++++++++++++++-
 util/ffmpeg.py       |  3 ++-
 6 files changed, 69 insertions(+), 7 deletions(-)

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"