zhangyong 5 mesiacov pred
rodič
commit
2337a234eb
3 zmenil súbory, kde vykonal 51 pridanie a 23 odobranie
  1. 11 1
      carry_data_handle.py
  2. 6 6
      carry_video/carry_video.py
  3. 34 16
      common/download_video.py

+ 11 - 1
carry_data_handle.py

@@ -7,6 +7,7 @@ import schedule
 from loguru import logger
 
 from carry_video.carry_video import CarryViode
+from common import Feishu, AliyunLogger
 from common.redis import get_carry_data
 
 ENV = os.getenv('ENV', 'dev')
@@ -23,7 +24,6 @@ def video_task_start():
         logger.info(f"[+] {NAME}任务开始,数据为{data}")
         uid = str(uuid.uuid4())
         file_path = os.path.join(CACHE_DIR, uid)
-
         carry_video = CarryViode()
         mark = carry_video.main(json.loads(data), REDIS_NAME, file_path)
         print(f"返回用户名: {mark}")
@@ -39,6 +39,16 @@ def video_task_start():
                 except Exception as e:
                     logger.error(f"删除文件时出错: {file_path}, 错误: {e}")
     except Exception as e:
+        text = (
+            f"**负责人**: {data['name']}\n"
+            f"**内容**: {data}\n"
+            f"**失败信息**: 视频处理失败\n"
+        )
+        AliyunLogger.logging(data["name"], "效率工具", data["tag_transport_channel"], data["video_url"],
+                             f"视频处理失败,失败信息{e}", "3002", str(data))
+        Feishu.finish_bot(text,
+                          "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
+                          "【 搬运&改造效率工具失败通知 】")
         logger.error(f"[+] {data}处理失败,失败信息{e}")
 
 def schedule_tasks():

+ 6 - 6
carry_video/carry_video.py

@@ -150,8 +150,8 @@ class CarryViode:
         else:
             title = original_title if data["title_category"] == "原标题" else data["title_category"]
         logger.info(f"[+] {url}开始下载视频")
-        # video_path = DownLoad.download_video(url, file_path)
-        video_path = Oss.download_video_oss(url, file_path)
+        video_path = DownLoad.download_video(url, file_path)
+        # video_path = Oss.download_video_oss(url, file_path)
         if not video_path:
             logger.error(f"[+] {url}下载失败")
             AliyunLogger.logging(data["name"],"效率工具", data["tag_transport_channel"], data["video_url"],
@@ -238,7 +238,7 @@ class CarryViode:
                     return
                 logger.info(f"[+] {REDIS_NAME}的{data}数据片尾音频下载成功")
                 jpg_path = FFmpeg.video_png(video_path, file_path)  # 生成视频最后一帧jpg
-                if not os.path.isfile(jpg_path) or not jpg_path:
+                if not jpg_path:
                     logger.error(f"[+] {REDIS_NAME}的{data}数据片尾获取最后一帧失败")
                     AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],
                                          "改造失败,获取最后一帧失败", "3001", str(data))
@@ -253,7 +253,7 @@ class CarryViode:
                     return
                 logger.info(f"[+] {REDIS_NAME}的{data}数据片尾获取最后一帧成功")
                 pw_path = FFmpeg.pw_video(jpg_path, file_path, pw_mp3_path, pw_srt)  # 生成片尾视频
-                if not os.path.isfile(pw_path) or not pw_path:
+                if not pw_path:
                     logger.error(f"[+] {REDIS_NAME}的{data}数据片尾拼接失败")
                     AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],
                                          "改造失败,片尾拼接失败", "3001", str(data))
@@ -268,7 +268,7 @@ class CarryViode:
                     return
                 pw_video_list = [video_path, pw_path]
                 video_path = FFmpeg.concatenate_videos(pw_video_list, video_path)  # 视频与片尾拼接到一起
-                if not os.path.isfile(video_path) or not video_path:
+                if not video_path:
                     logger.error(f"[+] {REDIS_NAME}的{data}数据合并拼接失败")
                     AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],
                                          "改造失败,合并拼接失败", "3001", str(data))
@@ -284,7 +284,7 @@ class CarryViode:
                 logger.info(f"[+] {REDIS_NAME}的{data}数据合并拼接成功")
             if data["video_share"]:
                 video_path = FFmpeg.single_video(video_path, file_path, data["video_share"])
-                if not os.path.isfile(video_path) or not video_path:
+                if not video_path:
                     logger.error(f"[+] {REDIS_NAME}的{data}数据添加片中字幕失败")
                     AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],
                                          "改造失败,添加片中字幕失败", "3001", str(data))

+ 34 - 16
common/download_video.py

@@ -1,3 +1,5 @@
+import html
+import subprocess
 import time
 
 import requests
@@ -6,19 +8,35 @@ import requests
 class DownLoad:
     @classmethod
     def download_video(cls, video_url, video_path_url):
-        try:
-            for i in range(3):
-                payload = {}
-                headers = {}
-                response = requests.request("GET", video_url, headers=headers, data=payload, timeout=240)
-                if response.status_code == 200:
-                    # 以二进制写入模式打开文件
-                    video = video_path_url + 'video.mp4'
-                    with open(f"{video}", "wb") as file:
-                        # 将响应内容写入文件
-                        file.write(response.content)
-                    time.sleep(5)
-                    return video
-            return None
-        except Exception:
-            return None
+        video = video_path_url + 'video.mp4'
+        url_type = html.unescape(video_url).split('?')[0]
+        if ".m3u8" in url_type:
+            ffmpeg_cmd_oss = [
+                "ffmpeg",
+                "-y",  # 覆盖输出文件
+                "-i", video_url,  # 输入文件
+                "-c", "copy",  # 复制视频流
+                "-bsf:a", "aac_adtstoasc",  # 转换 AAC 音频格式
+                video  # 输出文件
+            ]
+
+            # 使用 subprocess 运行命令
+            subprocess.run(ffmpeg_cmd_oss, capture_output=True, text=True)
+            return video
+        else:
+            try:
+                for i in range(3):
+                    payload = {}
+                    headers = {}
+                    response = requests.request("GET", video_url, headers=headers, data=payload, timeout=240)
+                    if response.status_code == 200:
+                        # 以二进制写入模式打开文件
+
+                        with open(f"{video}", "wb") as file:
+                            # 将响应内容写入文件
+                            file.write(response.content)
+                        time.sleep(5)
+                        return video
+                return None
+            except Exception:
+                return None