| 
					
				 | 
			
			
				@@ -0,0 +1,486 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import configparser 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import glob 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import os 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import random 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import re 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import subprocess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import urllib.parse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import json 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import requests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from datetime import datetime, timedelta 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from urllib.parse import urlencode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from common.sql_help import sqlHelp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sys.path.append(os.getcwd()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from common.db import MysqlHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from common.material import Material 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from common import Common, Oss, Feishu, PQ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from common.srt import SRT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+config = configparser.ConfigParser() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+config.read('./config.ini')  # 替换为您的配置文件路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class AGC(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """清除文件下所有mp4文件""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def clear_mp4_files(cls, folder_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 获取文件夹中所有扩展名为 '.mp4' 的文件路径列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mp4_files = glob.glob(os.path.join(folder_path, '*.mp4')) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not mp4_files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 遍历并删除所有 .mp4 文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for mp4_file in mp4_files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            os.remove(mp4_file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(f"文件夹 '{folder_path}' 中的所有 .mp4 文件已清空。") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    站外视频拼接 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def zw_concatenate_videos(cls, videos, audio_duration, audio_video, platform, s_path, v_path, mark, v_oss_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        video_files = cls.concat_videos_with_subtitles(videos, audio_duration, platform, mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Common.logger("video").info(f"{mark}的{platform}视频文件:{video_files}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if video_files == "": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(f"{mark}的{platform}:开始拼接视频喽~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Common.logger("video").info(f"{mark}的{platform}:开始拼接视频喽~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if os.path.exists(s_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # subtitle_cmd = f"subtitles={s_path}:force_style='Fontsize=11,Fontname=Hiragino Sans GB,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subtitle_cmd = f"subtitles={s_path}:force_style='Fontsize=12,Fontname=wqy-zenhei,Bold=1,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            start_time = cls.seconds_to_srt_time(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            end_time = cls.seconds_to_srt_time(audio_duration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            with open(s_path, 'w') as f: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                f.write(f"1\n{start_time} --> {end_time}\n分享、转发给群友\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # subtitle_cmd = "drawtext=text='分享、转发给群友':fontsize=28:fontcolor=black:x=(w-text_w)/2:y=h-text_h-15" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subtitle_cmd = f"subtitles={s_path}:force_style='Fontsize=12,Fontname=wqy-zenhei,Bold=1,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 背景色参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background_cmd = "drawbox=y=ih-65:color=yellow@1.0:width=iw:height=0:t=fill" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        VIDEO_COUNTER = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FF_INPUT = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FF_SCALE = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FF_FILTER = "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ffmpeg_cmd = ["ffmpeg"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for videos in video_files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Common.logger("video").info(f"{mark}的{platform}视频:{videos[3]}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 添加输入文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FF_INPUT += f" -i {videos[3]}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 为每个视频文件统一长宽,并设置SAR(采样宽高比) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FF_SCALE += f"[{VIDEO_COUNTER}:v]scale=320x480,setsar=1[v{VIDEO_COUNTER}];" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 为每个视频文件创建一个输入流,并添加到-filter_complex参数中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FF_FILTER += f"[v{VIDEO_COUNTER}][{VIDEO_COUNTER}:a]" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 增加视频计数器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            VIDEO_COUNTER += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 构建最终的FFmpeg命令 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ffmpeg_cmd.extend(FF_INPUT.split()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ffmpeg_cmd.extend(["-filter_complex", f"{FF_SCALE}{FF_FILTER}concat=n={VIDEO_COUNTER}:v=1:a=1[v][a]", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           "-map", "[v]", "-map", "[a]", v_path]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 多线程数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num_threads = 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 构建 FFmpeg 命令,生成视频 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ffmpeg_cmd_oss = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "ffmpeg", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-i", v_path,  # 视频文件列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-i", audio_video,  # 音频文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-c:v", "libx264",  # 复制视频流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-c:a", "aac",  # 编码音频流为AAC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-threads", str(num_threads), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-vf", f"{background_cmd},{subtitle_cmd}",  # 添加背景色和字幕 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-t", str(int(audio_duration)),  # 保持与音频时长一致 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-map", "0:v:0",  # 映射第一个输入的视频流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-map", "1:a:0",  # 映射第二个输入的音频流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-y",  # 覆盖输出文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            v_oss_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subprocess.run(ffmpeg_cmd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if os.path.isfile(v_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                subprocess.run(ffmpeg_cmd_oss) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print("视频处理完成!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except subprocess.CalledProcessError as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(f"视频处理失败:{e}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(f"{mark}的{platform}:视频拼接成功啦~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Common.logger("video").info(f"{mark}的{platform}:视频拼接成功啦~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return video_files 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """视频秒数转换""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def seconds_to_srt_time(cls, seconds): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        hours = int(seconds // 3600) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        minutes = int((seconds % 3600) // 60) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        seconds = seconds % 60 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        milliseconds = int((seconds - int(seconds)) * 1000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return f"{hours:02d}:{minutes:02d}:{int(seconds):02d},{milliseconds:03d}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    获取视频文件的时长(秒) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def get_video_duration(cls, video_file): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = subprocess.run( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ["ffprobe", "-v", "error", "-show_entries", "format=duration", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             "-of", "default=noprint_wrappers=1:nokey=1", video_file], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            capture_output=True, text=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return float(result.stdout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """计算需要拼接的视频""" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def concat_videos_with_subtitles(cls, videos, audio_duration, platform, mark): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 计算视频文件列表总时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if platform == "爆款" or platform == "跟随": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            total_video_duration = sum(cls.get_video_duration(video_file) for video_file in videos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            total_video_duration = sum(cls.get_video_duration(video_file[3]) for video_file in videos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if platform == "爆款" or platform == "跟随": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 视频时长大于音频时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if total_video_duration > audio_duration: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return videos 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 计算音频秒数与视频秒数的比率,然后加一得到需要的视频数量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            video_audio_ratio = audio_duration / total_video_duration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            videos_needed = int(video_audio_ratio) + 2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            trimmed_video_list = videos * videos_needed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return trimmed_video_list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 如果视频总时长小于音频时长,则不做拼接 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if total_video_duration < audio_duration: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Common.logger("video").info(f"{mark}的{platform}渠道时长小于等于目标时长,不做视频拼接") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # 如果视频总时长大于音频时长,则截断视频 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            trimmed_video_list = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            remaining_duration = audio_duration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for video_file in videos: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                video_duration = cls.get_video_duration(video_file[3]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if video_duration <= remaining_duration: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # 如果视频时长小于或等于剩余时长,则将整个视频添加到列表中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trimmed_video_list.append(video_file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    remaining_duration -= video_duration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trimmed_video_list.append(video_file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    break 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return trimmed_video_list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    text文件没有则创建目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def bk_text_folders(cls, mark): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        oss_id = cls.random_id() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        v_text_url = config['PATHS']['VIDEO_PATH'] + mark + "/text/" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not os.path.exists(v_text_url): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            os.makedirs(v_text_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # srt 文件地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        text_path = v_text_url + mark + f"{str(oss_id)}.text" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return text_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    站内视频拼接 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def zn_concatenate_videos(cls, videos, audio_duration, audio_video, platform, s_path, mark, v_oss_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        text_ptah = cls.bk_text_folders(mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        video_files = cls.concat_videos_with_subtitles(videos, audio_duration, platform, mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with open(text_ptah, 'w') as f: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for file in video_files: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                f.write(f"file '{file}'\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Common.logger("video").info(f"{mark}的{platform}视频文件:{video_files}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if video_files == "": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(f"{mark}的{platform}:开始拼接视频喽~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Common.logger("video").info(f"{mark}的{platform}:开始拼接视频喽~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if os.path.exists(s_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # subtitle_cmd = f"subtitles={s_path}:force_style='Fontsize=11,Fontname=Hiragino Sans GB,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subtitle_cmd = f"subtitles={s_path}:force_style='Fontsize=12,Fontname=wqy-zenhei,Bold=1,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            start_time = cls.seconds_to_srt_time(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            end_time = cls.seconds_to_srt_time(audio_duration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            with open(s_path, 'w') as f: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                f.write(f"1\n{start_time} --> {end_time}\n分享、转发给群友\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            # subtitle_cmd = "drawtext=text='分享、转发给群友':fontsize=28:fontcolor=black:x=(w-text_w)/2:y=h-text_h-15" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subtitle_cmd = f"subtitles={s_path}:force_style='Fontsize=12,Fontname=wqy-zenhei,Bold=1,Outline=0,PrimaryColour=&H000000,SecondaryColour=&H000000'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 背景色参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        background_cmd = "drawbox=y=ih-65:color=yellow@1.0:width=iw:height=0:t=fill" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 多线程数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        num_threads = 4 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 构建 FFmpeg 命令,生成视频 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ffmpeg_cmd_oss = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "ffmpeg", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-f", "concat", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-safe", "0", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-i", f"{text_ptah}",  # 视频文件列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-i", audio_video,  # 音频文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-c:v", "libx264", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-c:a", "aac", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-threads", str(num_threads), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-vf", f"scale=320x480,{background_cmd},{subtitle_cmd}",  # 添加背景色和字幕 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-t", str(int(audio_duration)),  # 保持与音频时长一致 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-map", "0:v:0",  # 映射第一个输入的视频流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-map", "1:a:0",  # 映射第二个输入的音频流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-y",  # 覆盖输出文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            v_oss_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            subprocess.run(ffmpeg_cmd_oss) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print("视频处理完成!") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if os.path.isfile(text_ptah): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                os.remove(text_ptah) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        except subprocess.CalledProcessError as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            print(f"视频处理失败:{e}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print(f"{mark}:视频拼接成功啦~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Common.logger("video").info(f"{mark}:视频拼接成功啦~~~") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return v_oss_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    获取视频时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def get_audio_duration(cls, video_url): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ffprobe_cmd = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "ffprobe", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-i", video_url, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-show_entries", "format=duration", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-v", "quiet", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "-of", "csv=p=0" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        output = subprocess.check_output(ffprobe_cmd).decode("utf-8").strip() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return float(output) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    创建临时字幕 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def create_subtitle_file(cls, srt, s_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        with open(s_path, 'w') as f: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            f.write(srt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    随机生成id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def random_id(cls): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        now = datetime.now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        rand_num = random.randint(10000, 99999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        oss_id = "{}{}".format(now.strftime("%Y%m%d%H%M%S"), rand_num) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return oss_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    文件没有则创建目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def create_folders(cls, mark): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        oss_id = cls.random_id() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        video_path_url = config['PATHS']['VIDEO_PATH'] + mark + "/" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # srt 目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        s_path_url = config['PATHS']['VIDEO_PATH'] + mark + "/srt/" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # oss 目录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        v_path_url = config['PATHS']['VIDEO_PATH'] + mark + "/oss/" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not os.path.exists(video_path_url): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            os.makedirs(video_path_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not os.path.exists(s_path_url): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            os.makedirs(s_path_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not os.path.exists(v_path_url): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            os.makedirs(v_path_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # srt 文件地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        s_path = s_path_url + mark + f"{str(oss_id)}.srt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # 最终生成视频地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        v_path = v_path_url + mark + f"{str(oss_id)}.mp4" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        v_oss_path = v_path_url + mark + f"{str(oss_id)}oss.mp4" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return s_path, v_path, video_path_url, v_oss_path 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    获取未使用的数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def get_unique_uid_data(cls, data, count): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        unique_data_dict = {item['uid']: item for item in data} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        unique_data = list(unique_data_dict.values()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if count > len(unique_data): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return unique_data 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return random.sample(unique_data, count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    任务处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def video(cls, data, platform): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        mark_name = data['mark_name']  # 负责人 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if platform == "爆款": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pq_ids = data["pq_id"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pq_ids_list = pq_ids.split(',')  # 账号ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mark = data["mark"]  # 标示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            feishu_id = data["feishu_id"]  # 飞书文档ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            video_call = data["video_call"]  # 脚本sheet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            list_data = Material.get_allbk_data(feishu_id, video_call) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if len(list_data) == 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Feishu.bot('recommend', 'AGC完成通知', f'爆款任务数为0,不做拼接', mark, mark_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return mark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elif platform == "常规": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pq_ids = data["pq_id"]# 账号ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pq_ids_list = pq_ids.split(',') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mark = data["mark"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            feishu_id = data["feishu_id"]  # 飞书文档ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            video_call = data["video_call"]  # 脚本sheet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            video_count = data["video_count"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if int(video_count) == 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Feishu.bot('recommend', 'AGC完成通知', f'常规任务数为{video_count},不做拼接', mark, mark_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return mark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data_list = Material.get_all_data(feishu_id, video_call, mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            list_data = cls.get_unique_uid_data(data_list, int(video_count)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elif platform == "跟随": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pq_ids = data["pq_id"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pq_ids_list = pq_ids.split(',')  # 账号ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            mark = data["mark"]  # 标示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            feishu_id = data["feishu_id"]  # 飞书文档ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            video_call = data["video_call"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            video_count = data["video_count"] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if int(video_count) == 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Feishu.bot('recommend', 'AGC完成通知', f'跟随任务数为{video_count},不做拼接', mark, mark_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return mark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data_list, videos = Material.get_all_data(feishu_id, video_call, mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            list_data = cls.get_unique_uid_data(data_list, int(video_count)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        s_path, v_path, video_path_url, v_oss_path = cls.create_folders(mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        count = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for d_list in list_data: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                uid = d_list['uid']  # 音频id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                srt = d_list['text']  # srt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                cover = d_list['cover'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                audio_title = d_list['title'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if srt: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # 创建临时字幕文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    cls.create_subtitle_file(srt, s_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Common.logger("bk_video").info(f"S{mark} 文件目录创建成功") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    srt_new = SRT.getSrt(int(uid)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if srt_new: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        current_time = datetime.now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        values = [[mark, str(uid), srt_new, formatted_time]] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        random_wait_time = random.uniform(0.5, 2.5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        time.sleep(random_wait_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Feishu.insert_columns("IbVVsKCpbhxhSJtwYOUc8S1jnWb", "jd9qD9", "ROWS", 1, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        time.sleep(random_wait_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Feishu.update_values("IbVVsKCpbhxhSJtwYOUc8S1jnWb", "jd9qD9", "A2:Z2", values) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        # 创建临时字幕文件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        cls.create_subtitle_file(srt_new, s_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"S{mark}的{platform}渠道RT 文件目录创建成功") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # 获取音频 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                audio_video = PQ.get_audio_url(uid) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Common.logger("video").info(f"{mark}的{platform}渠道获音频成功") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                audio_duration = cls.get_audio_duration(audio_video) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Common.logger("video").info(f"{mark}的{platform}渠道获取需要拼接的音频秒数为:{audio_duration}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if platform != "常规": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if platform == "爆款": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        videos = d_list['video'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if ',' in videos: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            videos = str(videos).split(',') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            videos = [str(videos)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    video_id = random.choice(videos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    video_url = PQ.get_audio_url(video_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    download_video = Oss.download_url(video_url, video_path_url, str(video_id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if download_video: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        video_files = cls.zn_concatenate_videos(download_video, audio_duration, audio_video, platform, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                s_path, mark, v_oss_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if os.path.isfile(v_oss_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Common.logger("video").info(f"{mark}的{platform}渠道新视频生成成功") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            Common.logger("video").info(f"{mark}的{platform}渠道新视频生成失败") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    chnnel_count = int(len(list_data)/2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if chnnel_count >= count: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        channel = "kuaishou" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        channel = "douyin" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    user_id = sqlHelp.get_user_id(channel, mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    url_list, user = sqlHelp.get_url_list(user_id, mark, "35") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    videos = [list(item) for item in url_list] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    videos = Oss.get_oss_url(videos, video_path_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    video_files = cls.zw_concatenate_videos(videos, audio_duration, audio_video, platform, s_path, v_path, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                         mark, v_oss_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if video_files == "": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"{mark}的{platform}渠道使用拼接视频为空") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if os.path.isfile(v_oss_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"{mark}的{platform}渠道新视频生成成功") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"{mark}的{platform}渠道新视频生成失败") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                # 随机生成视频oss_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                oss_id = cls.random_id() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Common.logger("video").info(f"{mark}的{platform}渠道上传到 OSS 生成视频id为:{oss_id}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                oss_object_key = Oss.stitching_sync_upload_oss(v_oss_path, oss_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                status = oss_object_key.get("status") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if status == 200: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # 获取 oss 视频地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    oss_object_key = oss_object_key.get("oss_object_key") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Common.logger("video").info(f"{mark}的{platform}渠道拼接视频发送成功,OSS 地址:{oss_object_key}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    time.sleep(10) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if platform != "常规": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        # 已使用视频存入数据库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"{mark}的{platform}渠道开始已使用视频存入数据库") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sqlHelp.insert_videoAudio(video_files, uid, platform, mark) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"{mark}的{platform}渠道完成已使用视频存入数据库") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Common.logger("video").info(f"{mark}的{platform}渠道开始视频添加到对应用户") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    new_video_id = PQ.insert_piaoquantv(oss_object_key, audio_title, pq_ids_list, cover, uid) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if new_video_id: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        Common.logger("video").info(f"{mark}的{platform}渠道视频添加到对应用户成功") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if os.path.isfile(v_oss_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        os.remove(v_oss_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if os.path.isfile(v_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        os.remove(v_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if os.path.isfile(s_path): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        os.remove(s_path) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        # 清空所有mp4数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    cls.clear_mp4_files(video_path_url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    count += 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    current_time = datetime.now() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if platform == "常规": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        third_chars = [j[2] for j in video_files] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        data = ",".join(third_chars) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        user_id = user 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        user_id = video_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        data = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    values = [[mark, str(uid), user_id, data, audio_title, new_video_id, formatted_time]] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if mark_name == "穆新艺": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet = '50b8a1' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    elif mark_name == "信欣": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet = 'UyVK7y' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    elif mark_name == "范军": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet = 'uP3zbf' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    elif mark_name == "鲁涛": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet = 'iDTHt4' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    elif mark_name == "余海涛": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet = 'R1jIeT' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    elif mark_name == "罗情": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        sheet = 'iuxfAt' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Feishu.insert_columns("LAn9so7E0hxRYht2UMEcK5wpnMj", sheet, "ROWS", 1, 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    random_wait_time = random.uniform(0.5, 2.5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    time.sleep(random_wait_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Feishu.update_values("LAn9so7E0hxRYht2UMEcK5wpnMj", sheet, "A2:Z2", values) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            except Exception as e: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Common.logger("bk_video").warning(f"{mark}的视频拼接失败:{e}\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if "-" in mark: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            name = mark.split("-")[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            name = mark 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Feishu.bot('recommend', 'AGC完成通知', f'今日{platform}任务拼接任务完成,共{count}条', name, mark_name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |