zhangyong 4 months ago
parent
commit
25c46b4d1c
3 changed files with 79 additions and 35 deletions
  1. 19 4
      common/ffmpeg.py
  2. 20 19
      common/tts_help.py
  3. 40 12
      video_rewriting/video_processor.py

+ 19 - 4
common/ffmpeg.py

@@ -52,6 +52,7 @@ class FFmpeg():
         video_url = file_path + 'pixelvideo.mp4'
         try:
             cls.asyncio_run_subprocess(["ffmpeg", "-i", video_path, "-vf", "scale=360:640", video_url], timeout=420)
+            logger.info(f"[+] 视频转为640像素成功")
             return video_url
         except Exception as e:
             return video_url
@@ -68,6 +69,7 @@ class FFmpeg():
             output_decoded = ffprobe_cmd.strip()
             split_output = [value for value in output_decoded.split(',') if value.strip()]
             height, width = map(int, split_output)
+            logger.info(f"[+] 获取视频宽高成功")
             return width, height
         except ValueError as e:
             return 1920, 1080
@@ -96,7 +98,8 @@ class FFmpeg():
                 "-c:a", "aac",
                 "-y",
                 crop_url
-            ], timeout=240)
+            ], timeout=200)
+        logger.info(f"[+] 视频裁剪成功")
         return crop_url
 
     """
@@ -120,7 +123,8 @@ class FFmpeg():
             "-t", str(duration),
             "-y",
             gg_duration_url
-        ], timeout=360)
+        ], timeout=200)
+        logger.info(f"[+] 视频截断成功")
         return gg_duration_url
 
     """
@@ -138,6 +142,8 @@ class FFmpeg():
         # 获取视频时长
         cls.asyncio_run_subprocess(
             ["ffmpeg", "-sseof", "-1", '-i', new_video_path, '-frames:v', '1', "-y", jpg_url], timeout=120)
+        logger.info(f"[+] 截取原视频最后一帧成功")
+
         return jpg_url
 
     """
@@ -154,6 +160,8 @@ class FFmpeg():
             pw_mp3_path
         ], timeout=120)
         time.sleep(1)
+        logger.info(f"[+] 获取视频音频成功")
+
         return pw_mp3_path
 
     """横屏视频改为竖屏"""
@@ -162,7 +170,9 @@ class FFmpeg():
         video_h_w_path = video_path_url + str(pw_random_id) +'video_h_w_video.mp4'
         cls.asyncio_run_subprocess(
             ["ffmpeg", "-i", new_video_path, "-vf", "scale=640:ih*640/iw,pad=iw:iw*16/9:(ow-iw)/2:(oh-ih)/2",
-             video_h_w_path], timeout=420)
+             video_h_w_path], timeout=360)
+        logger.info(f"[+] 横屏视频改为竖屏成功")
+
         return video_h_w_path
 
     """横屏视频顶部增加字幕"""
@@ -194,6 +204,8 @@ class FFmpeg():
             "-y",
             single_video
         ], timeout=500)
+        logger.info(f"[+] 横屏视频顶部增加字幕成功")
+
         return single_video
 
 
@@ -243,9 +255,11 @@ class FFmpeg():
             '-shortest',  # 确保输出视频的长度与音频一致
             '-vf', f"{background_cmd},{subtitle_cmd}",  # 视频过滤器,设置分辨率和其他过滤器
             pw_url_path  # 输出的视频文件路径
-        ], timeout=500)
+        ], timeout=300)
         if os.path.exists(pw_srt_path):
             os.remove(pw_srt_path)
+        logger.info(f"[+] 生成片尾视频成功")
+
         return pw_url_path
 
     """视频拼接到一起"""
@@ -256,6 +270,7 @@ class FFmpeg():
             cls.asyncio_run_subprocess(["ffmpeg", "-i", video_path, "-i", pw_path, "-filter_complex",
                                         "[0:v]scale=360:640[v1]; [1:v]scale=360:640[v2]; [v1][0:a][v2][1:a]concat=n=2:v=1:a=1[outv][outa]",
                                         "-map", "[outv]", "-map", "[outa]", video_url], timeout=500)
+            logger.info(f"[+] 视频拼接成功")
             return video_url
         except Exception as e:
             return video_url

+ 20 - 19
common/tts_help.py

@@ -222,25 +222,26 @@ class TTS:
             'Host': 'api-internal.piaoquantv.com',
             'Connection': 'keep-alive'
         }
-
-        response = requests.request("POST", url, headers=headers, data=payload)
-        time.sleep(1)
-        data_list = response.json()
-        code = data_list["code"]
-        if code == 0:
-            srt = data_list["data"]
-            if srt:
-                srt = srt.replace("/n", "\n")
-                # srt = re.sub(r'(\w+)([,。!?])', r'\n\n', srt)
-                new_srt = cls.process_srt(srt)
-                result = cls.split_subtitle(new_srt)
-                # 生成SRT格式内容
-                srt_content = cls.generate_srt(result)
-                return srt_content
-            else:
-                return None
-        else:
-            return None
+        for i in  range(3):
+            try:
+                response = requests.request("POST", url, headers=headers, data=payload, timeout=30)
+                time.sleep(1)
+                data_list = response.json()
+                code = data_list["code"]
+                if code == 0:
+                    srt = data_list["data"]
+                    if srt:
+                        srt = srt.replace("/n", "\n")
+                        # srt = re.sub(r'(\w+)([,。!?])', r'\n\n', srt)
+                        new_srt = cls.process_srt(srt)
+                        result = cls.split_subtitle(new_srt)
+                        # 生成SRT格式内容
+                        srt_content = cls.generate_srt(result)
+                        return srt_content
+            except Exception as e:
+                
+                continue
+        return None
 
 
 if __name__ == '__main__':

+ 40 - 12
video_rewriting/video_processor.py

@@ -8,6 +8,8 @@ import time
 import traceback
 from datetime import datetime
 
+from loguru import logger
+
 from common.gpt4o_mini_help import GPT4oMini
 from common.redis import get_data, get_first_value_with_prefix, increment_key
 from common.tag_video import Tag
@@ -114,7 +116,7 @@ class VideoProcessor:
             else:
                 voice = "zhifeng_emo"
             zm = Material.get_pzsrt_data("summary", "500Oe0", video_share)
-            Common.logger(mark).info(f"{name}的{task_mark}下{channel_id}的用户:{url}开始获取视频")
+            logger.info(f"[+] {name}的{task_mark}下{channel_id}的用户:{url}开始获取视频")
             data_list = cls.get_data_list(
                 channel_id, task_mark, url,
                 number,
@@ -122,7 +124,6 @@ class VideoProcessor:
             )
             if not data_list:
                 AliyunLogger.logging(channel_id, name, url, "", "无改造视频", "4000")
-                Common.logger(mark).info(f"{name}的{task_mark}下{channel_id}的视频ID{url} 无改造视频")
                 text = (
                     f"**通知类型**: 没有改造的视频\n"
                     f"**负责人**: {name}\n"
@@ -132,11 +133,12 @@ class VideoProcessor:
                 Feishu.finish_bot(text, "https://open.feishu.cn/open-apis/bot/v2/hook/e7697dc6-5254-4411-8b59-3cd0742bf703",
                                   "【 机器改造通知 】")
                 return
-            Common.logger(mark).info(f"{name}的{task_mark}下的ID{url} 获取视频完成,共{len(data_list)}条")
+            logger.info(f"[+] {name}的{task_mark}下的ID{url} 获取视频完成,共{len(data_list)}条")
             for video in data_list:
                 current_time = datetime.now()
                 formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
-                print(f"{formatted_time}开始改造")
+                logger.info(f"[+][+][+][+][+][+] {name}的{task_mark}下的ID{url} , 时间:{formatted_time}开始改造")
+
                 cls.remove_files(mark)
                 file_path = cls.create_folders(mark)
                 new_title = cls.generate_title(video, title)
@@ -160,7 +162,7 @@ class VideoProcessor:
                     Common.logger(mark).info(f"{name}的{task_mark}下的视频{url},标题为空,使用兜底标题生成片尾")
                 time.sleep(1)
                 pw_random_id = cls.random_id()
-                Common.logger(mark).info(f"{name}的{task_mark}下的ID{url} 开始下载视频")
+                logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始下载视频")
                 video_path = cls.download_and_process_video( channel_id, video_url, file_path, v_id, video)
                 if not os.path.isfile(video_path) or os.path.getsize(video_path) == 0:
                     if name == "单点视频":
@@ -201,8 +203,10 @@ class VideoProcessor:
                 width, height = FFmpeg.get_w_h_size(video_path)
                 if width < height:  # 判断是否需要修改为竖屏
                     video_path = FFmpeg.update_video_h_w(video_path, file_path, pw_random_id)
+                logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始视频更改分辨率")
                 video_path = FFmpeg.video_640(video_path, file_path)
                 if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
+                    logger.error(f"[+] {name}的{task_mark}下的ID{url} 视频更改分辨率失败")
                     AliyunLogger.logging(channel_id, name, url, v_id, "视频更改分辨率失败", "3002")
                     continue
                 if crop_total and crop_total != 'None':  # 判断是否需要裁剪
@@ -210,10 +214,16 @@ class VideoProcessor:
                 if gg_duration_total and gg_duration_total != 'None':  # 判断是否需要指定视频时长
                     video_path = FFmpeg.video_ggduration(video_path, file_path, pw_random_id,gg_duration_total)
                 if video_ending == "AI片尾引导":
+                    logger.info(f"[+] {name}的{task_mark}下的ID{url} 获取ai片尾")
                     pw_srt_text = GPT4oMini.get_ai_mini_pw(old_title)
+                    logger.info(f"[+] {name}的{task_mark}下的ID{url} 获取ai片尾音频")
                     pw_url = TTS.get_pw_zm(pw_srt_text, voice)
                     pw_mp3_path = TTS.download_mp3(pw_url, file_path, pw_random_id)
+                    logger.info(f"[+] {name}的{task_mark}下的ID{url} 获取ai片尾srt")
                     pw_srt = TTS.getSrt(pw_url)
+                    if not pw_srt:
+                        logger.error(f"[+] {name}的{task_mark}下的ID{url} 获取ai片尾srt失败")
+                        continue
                 else:
                     if ',' in video_ending:
                         video_ending_list = video_ending.split(',')
@@ -226,14 +236,22 @@ class VideoProcessor:
                     pw_url = PQ.get_pw_url(pw_id)
                     pw_mp3_path = FFmpeg.get_video_mp3(pw_url, file_path, pw_random_id)
                 if not pw_url:
+                    logger.error(f"[+] {name}的{task_mark}下的ID{url} 获取片尾失败")
+
                     AliyunLogger.logging(channel_id, name, url, v_id, "获取片尾失败", "3002")
                     continue
+                logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始生成视频最后一帧jpg")
                 jpg_path = FFmpeg.video_png(video_path, file_path, pw_random_id)  # 生成视频最后一帧jpg
                 if not os.path.exists(jpg_path) or os.path.getsize(jpg_path) == 0:
+                    logger.error(f"[+] {name}的{task_mark}下的ID{url} 片尾获取最后一帧失败")
+
                     AliyunLogger.logging(channel_id, name, url, v_id, "片尾获取最后一帧失败", "3002")
                     continue
+                logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始生成片尾视频")
                 pw_path = FFmpeg.pw_video(jpg_path, file_path,  pw_srt, pw_random_id, pw_mp3_path)  # 生成片尾视频
                 if not os.path.exists(pw_path) or os.path.getsize(pw_path) == 0:
+                    logger.error(f"[+] {name}的{task_mark}下的ID{url} 生成片尾失败")
+
                     AliyunLogger.logging(channel_id, name, url, v_id, "生成片尾失败", "3002")
                     text = (
                         f"**通知类型**: 生成片尾失败\n"
@@ -246,9 +264,13 @@ class VideoProcessor:
                                       "https://open.feishu.cn/open-apis/bot/v2/hook/e7697dc6-5254-4411-8b59-3cd0742bf703",
                                       "【 机器改造通知 】")
                     continue
+                logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始视频拼接到一起")
                 video_path = FFmpeg.h_b_video(video_path, pw_path, file_path)
+                logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始视频拼接")
                 video_path = FFmpeg.single_video(video_path, file_path, zm)
                 if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
+                    logger.error(f"[+] {name}的{task_mark}下的ID{url} 拼接失败")
+
                     AliyunLogger.logging(channel_id, name, url, v_id, "拼接失败", "3002")
                     text = (
                         f"**通知类型**: 视频改造失败\n"
@@ -266,7 +288,8 @@ class VideoProcessor:
                 # 上传视频和封面,并更新数据库
                 code = cls.upload_video_and_thumbnail(video_path, cover, v_id, new_title, task_mark, name, piaoquan_id,
                                                    file_path, mark, channel_id, url, old_title, rule, video)
-                print("改造成功")
+                logger.info(f"[+][+][+][+][+][+] {name}的{task_mark}下的ID{url} , 时间:{formatted_time}改造成功")
+
                 # 更新已使用的视频号状态
                 pq_url = f'https://admin.piaoquantv.com/cms/post-detail/{code}/detail'  # 站内视频链接
                 if name == "单点视频":
@@ -311,7 +334,8 @@ class VideoProcessor:
                     tag = f"{tag_first},{tag_keyword},{tag_channel}"
                     tag_status = Tag.video_tag(code, tag)
                     if tag_status == 0:
-                        Common.logger(mark).info(f"{name}的{task_mark}下的ID{url}下的票圈视频{code},写入标签成功")
+                        logger.info(f"[+] {name}的{task_mark}下的ID{url}下的票圈视频{code},写入标签成功")
+
                     secondary_category = task["secondary_category"]
                     log_data = f"user:{url},,video_id:{v_id},,video_url:{video_url},,ai_title:{new_title},,voice:{voice},,first_category:{first_category},,secondary_category:{secondary_category},,keyword_principal:{keyword_principal},,tag:{tag}"
                     values = [
@@ -450,7 +474,7 @@ class VideoProcessor:
                     continue
         except Exception as e:
             AliyunLogger.logging(channel_id, name, url, v_id, f"改造失败{traceback.format_exc()}", "3001")
-            Common.logger(mark).error(f"{name}的{task_mark}任务处理失败:{traceback.format_exc()}")
+            logger.error(f"[+] {name}的{task_mark}任务处理失败:{traceback.format_exc()}")
             return
 
 
@@ -549,10 +573,13 @@ class VideoProcessor:
         上传视频和封面到OSS,并更新数据库
         """
         try:
+
             oss_id = cls.random_id()
-            Common.logger(mark).info(f"{name}的{task_mark},开始发送oss")
+            logger.info(f"[+] {name}的{task_mark}下的ID{url} 开始发送oss")
+
             oss_object_key = Oss.stitching_sync_upload_oss(new_video_path, oss_id)  # 视频发送OSS
-            Common.logger(mark).info(f"{name}的{task_mark},发送oss成功{oss_object_key}")
+            logger.info(f"[+] {name}的{task_mark}下的ID{url} 发送oss成功{oss_object_key}")
+
             status = oss_object_key.get("status")
             if status == 200:
                 oss_object_key = oss_object_key.get("oss_object_key")
@@ -571,7 +598,7 @@ class VideoProcessor:
                 else:
                     jpg = None
                 code = PQ.insert_piaoquantv(oss_object_key, new_title, jpg, piaoquan_id)
-                Common.logger(mark).info(f"{name}的{task_mark}下的视频ID{v_id}发送成功")
+                logger.info(f"[+] {name}的{task_mark}下的视频ID{v_id}写入票圈后台成功")
                 sqlCollect.insert_task(task_mark, v_id, mark, channel_id)  # 插入数据库
                 current_time = datetime.now()
                 formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
@@ -582,7 +609,7 @@ class VideoProcessor:
 
                 return code
         except Exception as e:
-            Common.logger(mark).error(f"{name}的{task_mark}上传视频和封面到OSS,并更新数据库失败:{e}\n")
+            logger.error(f"[+] {name}的{task_mark}上传视频和封面到OSS,并更新数据库失败:{traceback.format_exc()}")
             AliyunLogger.logging(channel_id, name, url, video["video_id"], "改造失败-上传视频和封面到OSS", "3001")
             return
 
@@ -640,6 +667,7 @@ class VideoProcessor:
             VideoProcessor.process_task(task, mark, name, feishu_id, cookie_sheet)
             return mark
         except Exception as e:
+            logger.error(f"[+] {name}用户抓取异常:{traceback.format_exc()}")
             AliyunLogger.logging((task["channel_id"]), name, task["channel_url"],'', f"用户抓取异常:{e}", "3001")
             return mark