|  | @@ -1,9 +1,10 @@
 | 
	
		
			
				|  |  |  import configparser
 | 
	
		
			
				|  |  |  import os
 | 
	
		
			
				|  |  |  import random
 | 
	
		
			
				|  |  | +import threading
 | 
	
		
			
				|  |  |  import time
 | 
	
		
			
				|  |  |  from datetime import datetime
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +import concurrent.futures
 | 
	
		
			
				|  |  |  from common import Material, Feishu, Common, Oss
 | 
	
		
			
				|  |  |  from common.ffmpeg import FFmpeg
 | 
	
		
			
				|  |  |  from data_channel.douyin import DY
 | 
	
	
		
			
				|  | @@ -75,7 +76,9 @@ class getVideo:
 | 
	
		
			
				|  |  |          if len(task_data) == 0:
 | 
	
		
			
				|  |  |              Feishu.bot(mark, '机器自动改造消息通知', f'今日任务为空,请关注', name)
 | 
	
		
			
				|  |  |              return mark
 | 
	
		
			
				|  |  | -        for task in task_data:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        lock = threading.Lock()
 | 
	
		
			
				|  |  | +        def process_task(task):
 | 
	
		
			
				|  |  |              task_mark = task["task_mark"]  # 任务标示
 | 
	
		
			
				|  |  |              channel_id = str(task["channel_id"])
 | 
	
		
			
				|  |  |              channel_urls = str(task["channel_url"])
 | 
	
	
		
			
				|  | @@ -132,7 +135,7 @@ class getVideo:
 | 
	
		
			
				|  |  |                          else:
 | 
	
		
			
				|  |  |                              new_video_path = Oss.download_video_oss(video_url, video_path_url, v_id)  # 下载视频地址
 | 
	
		
			
				|  |  |                          if not os.path.isfile(new_video_path):
 | 
	
		
			
				|  |  | -                            Common.logger("log").info(f"{task_mark}下的视频ID{id},{new_video_path}视频下载失败")
 | 
	
		
			
				|  |  | +                            Common.logger("log").info(f"{task_mark}下的视频{url},{new_video_path}视频下载失败")
 | 
	
		
			
				|  |  |                              cls.remove_files(video_path_url)
 | 
	
		
			
				|  |  |                              continue
 | 
	
		
			
				|  |  |                          if crop_total and crop_total != 'None':  # 判断是否需要裁剪
 | 
	
	
		
			
				|  | @@ -155,22 +158,22 @@ class getVideo:
 | 
	
		
			
				|  |  |                              for attempt in range(3):
 | 
	
		
			
				|  |  |                                  jpg_path = FFmpeg.video_png(new_video_path, video_path_url, pw_random_id)  # 生成视频最后一帧jpg
 | 
	
		
			
				|  |  |                                  if os.path.isfile(jpg_path):
 | 
	
		
			
				|  |  | -                                    Common.logger("log").info(f"{task_mark}下的视频ID{id},生成视频最后一帧成功")
 | 
	
		
			
				|  |  | +                                    Common.logger("log").info(f"{task_mark}下的视频{url},生成视频最后一帧成功")
 | 
	
		
			
				|  |  |                                      break
 | 
	
		
			
				|  |  |                                  time.sleep(1)
 | 
	
		
			
				|  |  |                              if not os.path.isfile(jpg_path):
 | 
	
		
			
				|  |  | -                                Feishu.bot(mark, '机器自动改造消息通知', f'{task_mark}任务用户ID{id}下的视频{v_id},获取视频最后一帧失败,请关注', name)
 | 
	
		
			
				|  |  | +                                Feishu.bot(mark, '机器自动改造消息通知', f'{task_mark}任务用户{url}下的视频{v_id},获取视频最后一帧失败,请关注', name)
 | 
	
		
			
				|  |  |                                  cls.remove_files(video_path_url)
 | 
	
		
			
				|  |  |                                  continue
 | 
	
		
			
				|  |  |                              for attempt in range(3):
 | 
	
		
			
				|  |  |                                  pw_mp3_path = FFmpeg.get_video_mp3(pw_url, video_path_url, pw_random_id)
 | 
	
		
			
				|  |  |                                  pw_path = FFmpeg.pw_video(jpg_path, video_path_url, pw_url, pw_srt, pw_random_id, pw_mp3_path)  # 生成片尾视频
 | 
	
		
			
				|  |  |                                  if os.path.isfile(pw_path):
 | 
	
		
			
				|  |  | -                                    Common.logger("log").info(f"{task_mark}下的视频ID{id},生成片尾视频成功")
 | 
	
		
			
				|  |  | +                                    Common.logger("log").info(f"{task_mark}下的视频{url},生成片尾视频成功")
 | 
	
		
			
				|  |  |                                      break
 | 
	
		
			
				|  |  |                                  time.sleep(1)
 | 
	
		
			
				|  |  |                              if not os.path.isfile(pw_path):
 | 
	
		
			
				|  |  | -                                Feishu.bot(mark, '机器自动改造消息通知', f'{task_mark}任务用户ID{id}下的视频{v_id},生成片尾视频失败,请关注',
 | 
	
		
			
				|  |  | +                                Feishu.bot(mark, '机器自动改造消息通知', f'{task_mark}任务用户{url}下的视频{v_id},生成片尾视频失败,请关注',
 | 
	
		
			
				|  |  |                                             name)
 | 
	
		
			
				|  |  |                                  cls.remove_files(video_path_url)
 | 
	
		
			
				|  |  |                                  continue
 | 
	
	
		
			
				|  | @@ -199,16 +202,29 @@ class getVideo:
 | 
	
		
			
				|  |  |                                  current_time = datetime.now()
 | 
	
		
			
				|  |  |                                  formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
 | 
	
		
			
				|  |  |                                  values = [[name, task_mark, v_id, piaoquan_id, new_title, str(code), formatted_time]]
 | 
	
		
			
				|  |  | -                                Feishu.insert_columns("ILb4sa0LahddRktnRipcu2vQnLb", "a74fc4", "ROWS", 1, 2)
 | 
	
		
			
				|  |  | -                                time.sleep(0.5)
 | 
	
		
			
				|  |  | -                                Feishu.update_values("ILb4sa0LahddRktnRipcu2vQnLb", "a74fc4", "A2:Z2", values)
 | 
	
		
			
				|  |  | +                                # 使用锁保护表格插入操作
 | 
	
		
			
				|  |  | +                                with lock:
 | 
	
		
			
				|  |  | +                                    Feishu.insert_columns("ILb4sa0LahddRktnRipcu2vQnLb", "a74fc4", "ROWS", 1, 2)
 | 
	
		
			
				|  |  | +                                    time.sleep(0.5)
 | 
	
		
			
				|  |  | +                                    Feishu.update_values("ILb4sa0LahddRktnRipcu2vQnLb", "a74fc4", "A2:Z2", values)
 | 
	
		
			
				|  |  |                              cls.remove_files(video_path_url)
 | 
	
		
			
				|  |  |                          else:
 | 
	
		
			
				|  |  |                              cls.remove_files(video_path_url)
 | 
	
		
			
				|  |  | -                            Common.logger("log").info(f"{task_mark}下的视频ID{id} 视频发送OSS失败 ")
 | 
	
		
			
				|  |  | +                            Common.logger("log").info(f"{task_mark}下的{url}视频{v_id} 视频发送OSS失败 ")
 | 
	
		
			
				|  |  |                      Feishu.bot(mark, '机器自动改造消息通知', f'{task_mark}任务改造完成,请关注', name)
 | 
	
		
			
				|  |  |                  except Exception as e:
 | 
	
		
			
				|  |  |                      cls.remove_files(video_path_url)
 | 
	
		
			
				|  |  |                      Common.logger("warning").warning(f"{name}的{task_mark}任务处理失败:{e}\n")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
 | 
	
		
			
				|  |  | +            futures = {executor.submit(process_task, task): task for task in task_data}
 | 
	
		
			
				|  |  | +            for future in concurrent.futures.as_completed(futures):
 | 
	
		
			
				|  |  | +                task = futures[future]
 | 
	
		
			
				|  |  | +                try:
 | 
	
		
			
				|  |  | +                    future.result()
 | 
	
		
			
				|  |  | +                    print(f"Task {task['task_mark']} 完成")
 | 
	
		
			
				|  |  | +                except Exception as exc:
 | 
	
		
			
				|  |  | +                    print(f"Task {task['task_mark']} 异常信息: {exc}")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          Feishu.bot(mark, '机器自动改造消息通知', f'你的任务全部完成,请关注!!!!!', name)
 | 
	
		
			
				|  |  |          return mark
 |