carry_video.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. import html
  2. import json
  3. import os
  4. import random
  5. import re
  6. import time
  7. import uuid
  8. import requests
  9. from datetime import datetime
  10. from urllib.parse import urlparse, parse_qs
  11. from loguru import logger
  12. from common import Oss, Feishu, AliyunLogger
  13. from common.download_video import DownLoad
  14. from common.ffmpeg import FFmpeg
  15. from common.gpt4o_mini_help import GPT4oMini
  16. from common.redis import in_carry_video_data
  17. from common.sql_help import sqlCollect
  18. from common.tag_video import Tag
  19. from common.tts_help import TTS
  20. from data_channel.piaoquan import PQ
  21. class CarryViode:
  22. def get_text_dy_video(self,url):
  23. max_retries = 3
  24. retry_count = 0
  25. while retry_count < max_retries:
  26. try:
  27. if "&vid=" in url:
  28. parsed_url = urlparse(url)
  29. params = parse_qs(parsed_url.query)
  30. video_id = params.get('vid', [None])[0]
  31. elif "?modal_id=" in url:
  32. parsed_url = urlparse(url)
  33. params = parse_qs(parsed_url.query)
  34. video_id = params.get('modal_id', [None])[0]
  35. else:
  36. headers = {
  37. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;'
  38. 'q=0.8,application/signed-exchange;v=b3;q=0.7',
  39. 'Accept-Language': 'zh-CN,zh;q=0.9',
  40. 'Cache-Control': 'no-cache',
  41. 'Pragma': 'no-cache',
  42. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
  43. 'Chrome/127.0.0.0 Safari/537.36',
  44. }
  45. response = requests.request(url=url, method='GET', headers=headers, allow_redirects=False, timeout=30)
  46. location = response.headers.get('Location', None)
  47. video_id = re.search(r'/video/(\d+)/?', location.split('?')[0] if location else url).group(1)
  48. url = "http://8.217.192.46:8889/crawler/dou_yin/detail"
  49. payload = json.dumps({
  50. "content_id": str(video_id)
  51. })
  52. headers = {
  53. 'Content-Type': 'application/json'
  54. }
  55. response = requests.request("POST", url, headers=headers, data=payload, timeout= 60)
  56. response = response.json()
  57. code = response["code"]
  58. if code == 0:
  59. data = response["data"]["data"]
  60. video_url = data["video_url_list"][0]["video_url"]
  61. original_title = data["title"]
  62. return video_url, original_title, video_id
  63. if code == 22002:
  64. if '抖音内容已被删除或无法访问' in response['msg']:
  65. return "作品不存在", None, None
  66. except Exception as e:
  67. retry_count += 1
  68. logger.error(f"[+] 抖音{url}获取视频链接失败,失败信息{e}")
  69. time.sleep(1)
  70. return None, None, None
  71. def get_text_ks_video(self,url):
  72. try:
  73. headers = {
  74. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;'
  75. 'q=0.8,application/signed-exchange;v=b3;q=0.7',
  76. 'Accept-Language': 'zh-CN,zh;q=0.9',
  77. 'Cache-Control': 'no-cache',
  78. 'Pragma': 'no-cache',
  79. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
  80. 'Chrome/127.0.0.0 Safari/537.36',
  81. }
  82. response = requests.request(url=url, method='GET', headers=headers, allow_redirects=False, timeout= 30)
  83. location = response.headers.get('Location', None)
  84. video_id = re.search(r'/(f|photo|short-video|long-video)/(.*)/?',
  85. location.split('?')[0] if location else url).group(2)
  86. url = "http://8.217.192.46:8889/crawler/kuai_shou/detail"
  87. payload = json.dumps({
  88. "content_id": str(video_id)
  89. })
  90. headers = {
  91. 'Content-Type': 'application/json'
  92. }
  93. time.sleep(random.uniform(10, 50))
  94. response = requests.request("POST", url, headers=headers, data=payload, timeout= 30)
  95. response = response.json()
  96. code = response["code"]
  97. if code == 0:
  98. data = response["data"]["data"]
  99. content_type = data['content_type']
  100. if content_type == 'note':
  101. return "note","note"
  102. video_url = data["video_url_list"][0]["video_url"]
  103. original_title = data["title"]
  104. return video_url, original_title, video_id
  105. elif code == 27006:
  106. if "作品不存在" in response['msg']:
  107. return "作品不存在", None, None
  108. time.sleep(3)
  109. except Exception as e:
  110. logger.error(f"[+] 快手{url}获取视频链接失败,失败信息{e}")
  111. return None, None,None
  112. def insert_pq(self, REDIS_NAME, data, oss_object_key, title, tags, tag_transport_channel, channel_mark):
  113. logger.info(f"[+] {REDIS_NAME}的{data}开始写入票圈")
  114. n_ids = str(data["pq_ids"])
  115. if ',' in n_ids:
  116. n_id_list = n_ids.split(',')
  117. else:
  118. n_id_list = [n_ids]
  119. pq_list = []
  120. for n_id in n_id_list:
  121. code = PQ.insert_piaoquantv(oss_object_key, title, n_id)
  122. if not code:
  123. logger.error(f"[+] {REDIS_NAME}的{data}写入票圈后台失败")
  124. AliyunLogger.logging(data["name"], "效率工具", tag_transport_channel, data["video_url"],
  125. "改造失败,写入票圈后台失败", "3001", str(data))
  126. text = (
  127. f"**负责人**: {data['name']}\n"
  128. f"**内容**: {data}\n"
  129. f"**失败信息**: 视频写入票圈后台失败,视频ID{code}\n"
  130. )
  131. Feishu.finish_bot(text,
  132. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  133. "【 搬运&改造效率工具失败通知 】")
  134. continue
  135. pq_list.append(code)
  136. logger.info(f"[+] {REDIS_NAME}的{data}写入票圈成功,返回视频id{code}")
  137. tag_status = Tag.video_tag(code, str(tags))
  138. if tag_status == 0:
  139. logger.info(f"[+] {REDIS_NAME}的{data}写入标签成功,后台视频ID为{code}")
  140. try:
  141. current_time = datetime.now()
  142. formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
  143. sqlCollect.insert_machine_making_data(data["name"], "搬运工具", tag_transport_channel,
  144. data["video_url"], data["video_url"], data["pq_ids"],
  145. data["title_category"],
  146. code,
  147. formatted_time, data["title_category"], oss_object_key)
  148. pq_url = f'https://admin.piaoquantv.com/cms/post-detail/{code}/detail' # 站内视频链接
  149. values = [
  150. [
  151. str(code),
  152. str(n_id),
  153. formatted_time,
  154. channel_mark,
  155. data["name"],
  156. data["pq_ids"],
  157. data["pq_label"],
  158. data["activate_data"],
  159. data["video_url"],
  160. data["title_category"],
  161. tag_transport_channel,
  162. data["tag_transport_scene"],
  163. data["tag_transport_keyword"],
  164. data["tag"],
  165. data["transform_rule"],
  166. data["video_share"],
  167. data["trailer_share"],
  168. data["trailer_share_audio"],
  169. data["video_clipping"],
  170. data["video_clipping_time"],
  171. data["title_transform"],
  172. pq_url
  173. ]
  174. ]
  175. name_to_sheet = {
  176. "范军": "276ffc",
  177. "鲁涛": "QqrKRY",
  178. "余海涛": "dTzUlI",
  179. "罗情": "8JPv9g",
  180. "刘诗雨": "HqwG0o",
  181. "张峰": "vtWvle",
  182. "周仙琴": "MWUqWt",
  183. "王雪珂": "xN1KrU",
  184. "信欣": "PtoeGT"
  185. }
  186. name = re.sub(r"\s+", "", data.get("name", ""))
  187. sheet = name_to_sheet.get(name)
  188. Feishu.insert_columns("R4dLsce8Jhz9oCtDMr9ccpFHnbI", sheet, "ROWS", 1, 2)
  189. time.sleep(0.5)
  190. Feishu.update_values("R4dLsce8Jhz9oCtDMr9ccpFHnbI", sheet, "A2:Z2", values)
  191. logger.info(f"[+] {REDIS_NAME}的{data}写入飞书成功")
  192. except Exception as e:
  193. logger.error(f"[+] {REDIS_NAME}的{data}写入飞书失败{e}")
  194. pass
  195. AliyunLogger.logging(data["name"], "效率工具", tag_transport_channel, data["video_url"],
  196. "改造成功", "1000", str(data), str(pq_list))
  197. return
  198. def main(self, data, REDIS_NAME, file_path):
  199. tag_transport_channel = None
  200. try:
  201. url = data['video_url']
  202. if "&vid=" in url or "?modal_id=" in url:
  203. host = urlparse(url).netloc
  204. else:
  205. msg = html.unescape(url).split('?')[0]
  206. pattern = re.search(r'https?://[^\s<>"\'\u4e00-\u9fff]+', msg)
  207. if not pattern:
  208. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  209. return
  210. url = pattern.group()
  211. host = urlparse(url).netloc
  212. if host in ['v.douyin.com', 'www.douyin.com', 'www.iesdouyin.com']:
  213. tag_transport_channel = "抖音"
  214. logger.info(f"[+] {url}开始获取抖音视频链接")
  215. url, original_title, video_id = self.get_text_dy_video(url=url)
  216. elif host in ['v.kuaishou.com', 'www.kuaishou.com', 'v.m.chenzhongtech.com', 'creater.eozatvmq.com']:
  217. tag_transport_channel = "快手"
  218. logger.info(f"[+] {url}开始获取快手视频链接")
  219. url, original_title, video_id = self.get_text_ks_video(url=url)
  220. else:
  221. AliyunLogger.logging(data["name"], "效率工具", "", data["video_url"], "扫描到一条视频",
  222. "2001", str(data))
  223. logger.error(f"[+] {url}该链接不是抖/快 不做处理")
  224. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  225. "不是抖/快不做处理", "1001", str(data))
  226. text = (
  227. f"**负责人**: {data['name']}\n"
  228. f"**内容**: {data}\n"
  229. f"**失败信息**: 该链接不是抖/快 不做处理\n"
  230. )
  231. Feishu.finish_bot(text,
  232. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  233. "【 搬运&改造效率工具失败通知 】")
  234. return
  235. if url == "作品不存在":
  236. text = (
  237. f"**负责人**: {data['name']}\n"
  238. f"**内容**: {data}\n"
  239. f"**失败信息**: 作品不存在,不做处理\n"
  240. )
  241. Feishu.finish_bot(text,
  242. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  243. "【 搬运&改造效率工具作品不存在,不做处理 】")
  244. return
  245. except Exception as e:
  246. logger.info(f"[+] 获取视频链接异常{e}")
  247. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  248. return
  249. AliyunLogger.logging(data["name"],"效率工具", tag_transport_channel, data["video_url"], "扫描到一条视频", "2001", str(data))
  250. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"], "符合规则等待改造", "2004", str(data))
  251. if not url:
  252. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  253. logger.info(f"[+] {url}没有获取到视频链接,等待重新处理")
  254. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  255. "没有获取到视频链接,等待重新处理", "1002", str(data))
  256. text = (
  257. f"**负责人**: {data['name']}\n"
  258. f"**内容**: {data}\n"
  259. f"**失败信息**: 没有获取到视频链接,等待重新处理\n"
  260. )
  261. Feishu.finish_bot(text,
  262. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  263. "【 搬运&改造效率工具失败通知 】")
  264. return
  265. if url == "note":
  266. logger.info(f"[+] {url}是图文不做处理")
  267. AliyunLogger.logging(data["name"], "效率工具", tag_transport_channel, data["video_url"],
  268. "是图文不做处理", "1002", str(data))
  269. text = (
  270. f"**负责人**: {data['name']}\n"
  271. f"**内容**: {data}\n"
  272. f"**失败信息**: 是图文不做处理\n"
  273. )
  274. Feishu.finish_bot(text,
  275. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  276. "【 搬运&改造效率工具失败通知 】")
  277. return
  278. logger.info(f"[+] {url}开始下载视频")
  279. video_path = DownLoad.download_video(url, file_path, tag_transport_channel, video_id)
  280. # video_path = Oss.download_video_oss(url, file_path)
  281. if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
  282. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  283. logger.error(f"[+] {url}下载失败")
  284. AliyunLogger.logging(data["name"],"效率工具", tag_transport_channel, data["video_url"],
  285. "视频下载失败等待重新处理", "3002", str(data))
  286. text = (
  287. f"**负责人**: {data['name']}\n"
  288. f"**内容**: {data}\n"
  289. f"**失败信息**: 视频下载失败等待重新处理,视频链接{url}\n"
  290. )
  291. Feishu.finish_bot(text,
  292. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  293. "【 搬运&改造效率工具失败通知 】")
  294. return
  295. logger.info(f"[+] {url}开始视频下载成功")
  296. logger.info(f"[+] {url}开始处理标题")
  297. if data["title_category"] == "AI标题" or data["trailer_share"] == "AI标题":
  298. title = GPT4oMini.get_ai_mini_title(
  299. original_title if data["title_category"] == "AI标题" else data["title_category"])
  300. else:
  301. title = original_title if data["title_category"] == "原标题" else data["title_category"]
  302. if tag_transport_channel == "抖音":
  303. if "复制打开抖音" in data['video_url']:
  304. channel_mark = "APP"
  305. else:
  306. channel_mark = "PC"
  307. else:
  308. if "https://www.kuaishou.com/f" in data['video_url']:
  309. channel_mark = "PC"
  310. else:
  311. channel_mark = "APP"
  312. if data["transform_rule"] == '否'or data["transform_rule"] == "是":
  313. logger.info(f"[+] {REDIS_NAME}的{data}数据开始发送oss")
  314. oss_object_key = Oss.stitching_sync_upload_oss(video_path, str(uuid.uuid4())) # 视频发送OSS
  315. status = oss_object_key.get("status")
  316. if status != 200:
  317. logger.error(f"[+] {REDIS_NAME}的{data}数据发送oss失败")
  318. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  319. "改造失败,发送oss失败", "3001", str(data))
  320. text = (
  321. f"**负责人**: {data['name']}\n"
  322. f"**内容**: {data}\n"
  323. f"**失败信息**: 视频发送OSS失败\n"
  324. )
  325. Feishu.finish_bot(text,
  326. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  327. "【 搬运&改造效率工具失败通知 】")
  328. return
  329. logger.info(f"[+] {REDIS_NAME}的{data}数据发送oss成功")
  330. oss_object_key = oss_object_key.get("oss_object_key")
  331. tags = ','.join(filter(None, [
  332. data['pq_label'],
  333. channel_mark,
  334. tag_transport_channel,
  335. data['tag_transport_scene'],
  336. data['tag_transport_keyword'],
  337. "搬运工具",
  338. data['tag']
  339. ]))
  340. self.insert_pq(REDIS_NAME, data, oss_object_key, title, tags, tag_transport_channel, channel_mark)
  341. if data["transform_rule"] == "仅改造" or data["transform_rule"] == "是":
  342. try:
  343. width, height = FFmpeg.get_w_h_size(video_path)
  344. if width < height: # 判断是否需要修改为竖屏
  345. video_path = FFmpeg.update_video_h_w(video_path, file_path)
  346. logger.info(f"[+] {REDIS_NAME}的{data}视频更改分辨率处理")
  347. video_path = FFmpeg.video_640(video_path, file_path)
  348. if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
  349. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  350. logger.error(f"[+] {REDIS_NAME}的{data}视频更改分辨率失败")
  351. AliyunLogger.logging(data["name"], "效率工具", tag_transport_channel, data["video_url"],
  352. "改造失败,片尾拼接失败", "3001", str(data))
  353. text = (
  354. f"**负责人**: {data['name']}\n"
  355. f"**内容**: {data}\n"
  356. f"**失败信息**: 视频更改分辨率失败\n"
  357. )
  358. Feishu.finish_bot(text,
  359. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  360. "【 搬运&改造效率工具失败通知 】")
  361. return
  362. logger.info(f"[+] {REDIS_NAME}的{data}视频更改分辨率处理成功")
  363. if data["video_clipping"]: # 判断是否需要裁剪
  364. video_path = FFmpeg.video_crop(video_path, file_path)
  365. if data["video_clipping_time"]: # 判断是否需要指定视频时长
  366. video_path = FFmpeg.video_ggduration(video_path, file_path, data["video_clipping_time"])
  367. if data['trailer_share']:
  368. if data['trailer_share'] == "AI片尾引导":
  369. pw_srt_text = GPT4oMini.get_ai_mini_pw(title)
  370. else:
  371. pw_srt_text = str(data['trailer_share'])
  372. voice = data['trailer_share_audio']
  373. if voice:
  374. if ',' in voice:
  375. voices = voice.split(',')
  376. else:
  377. voices = [voice]
  378. voice = random.choice(voices)
  379. else:
  380. voice = "zhifeng_emo"
  381. pw_url = TTS.get_pw_zm(pw_srt_text, voice)
  382. if not pw_url:
  383. logger.error(f"[+] {REDIS_NAME}的{data}数据片尾获取失败")
  384. data["transform_rule"] = "仅改造"
  385. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  386. AliyunLogger.logging(data["name"],"效率工具", tag_transport_channel, data["video_url"],
  387. "改造失败,片尾获取失败", "3001", str(data))
  388. text = (
  389. f"**负责人**: {data['name']}\n"
  390. f"**内容**: {data}\n"
  391. f"**失败信息**: 获取片尾失败\n"
  392. )
  393. Feishu.finish_bot(text,
  394. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  395. "【 搬运&改造效率工具失败通知 】")
  396. return
  397. logger.info(f"[+] {REDIS_NAME}的{data}数据片尾获取成功")
  398. pw_srt = TTS.getSrt(pw_url)
  399. if not pw_srt:
  400. data["transform_rule"] = "仅改造"
  401. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  402. logger.error(f"[+] {REDIS_NAME}的{data}数据片尾音频srt获取失败")
  403. AliyunLogger.logging(data["name"], "效率工具", tag_transport_channel, data["video_url"],
  404. "改造失败,片尾音频下载失败", "3001", str(data))
  405. text = (
  406. f"**负责人**: {data['name']}\n"
  407. f"**内容**: {data}\n"
  408. f"**失败信息**: 片尾音频下载失败\n"
  409. )
  410. Feishu.finish_bot(text,
  411. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  412. "【 搬运&改造效率工具失败通知 】")
  413. return
  414. pw_mp3_path = TTS.download_mp3(pw_url, file_path)
  415. if not pw_mp3_path:
  416. data["transform_rule"] = "仅改造"
  417. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  418. logger.error(f"[+] {REDIS_NAME}的{data}数据片尾音频下载失败")
  419. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  420. "改造失败,片尾音频下载失败", "3001", str(data))
  421. text = (
  422. f"**负责人**: {data['name']}\n"
  423. f"**内容**: {data}\n"
  424. f"**失败信息**: 片尾音频下载失败\n"
  425. )
  426. Feishu.finish_bot(text,
  427. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  428. "【 搬运&改造效率工具失败通知 】")
  429. return
  430. logger.info(f"[+] {REDIS_NAME}的{data}数据片尾音频下载成功")
  431. jpg_path = FFmpeg.video_png(video_path, file_path) # 生成视频最后一帧jpg
  432. if not os.path.exists(jpg_path) or os.path.getsize(jpg_path) == 0:
  433. data["transform_rule"] = "仅改造"
  434. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  435. logger.error(f"[+] {REDIS_NAME}的{data}数据片尾获取最后一帧失败")
  436. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  437. "改造失败,获取最后一帧失败", "3001", str(data))
  438. text = (
  439. f"**负责人**: {data['name']}\n"
  440. f"**内容**: {data}\n"
  441. f"**失败信息**: 获取视频最后一帧失败\n"
  442. )
  443. Feishu.finish_bot(text,
  444. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  445. "【 搬运&改造效率工具失败通知 】")
  446. return
  447. logger.info(f"[+] {REDIS_NAME}的{data}数据片尾获取最后一帧成功")
  448. pw_path = FFmpeg.pw_video(jpg_path, file_path, pw_mp3_path, pw_srt) # 生成片尾视频
  449. if not os.path.exists(pw_path) or os.path.getsize(pw_path) == 0:
  450. data["transform_rule"] = "仅改造"
  451. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  452. logger.error(f"[+] {REDIS_NAME}的{data}数据片尾拼接失败")
  453. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  454. "改造失败,片尾拼接失败", "3001", str(data))
  455. text = (
  456. f"**负责人**: {data['name']}\n"
  457. f"**内容**: {data}\n"
  458. f"**失败信息**: 片尾拼接失败\n"
  459. )
  460. Feishu.finish_bot(text,
  461. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  462. "【 搬运&改造效率工具失败通知 】")
  463. return
  464. logger.info(f"[+] {REDIS_NAME}的{data}数据合并开始拼接")
  465. video_path = FFmpeg.h_b_video(video_path, pw_path, file_path)
  466. video_path = FFmpeg.single_video(video_path, file_path, data["video_share"])
  467. if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
  468. data["transform_rule"] = "仅改造"
  469. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  470. logger.error(f"[+] {REDIS_NAME}的{data}数据添加片中字幕失败")
  471. AliyunLogger.logging(data["name"], "效率工具",tag_transport_channel, data["video_url"],
  472. "改造失败,添加片中字幕失败", "3001", str(data))
  473. text = (
  474. f"**负责人**: {data['name']}\n"
  475. f"**内容**: {data}\n"
  476. f"**失败信息**: 视频片中增加字幕失败\n"
  477. )
  478. Feishu.finish_bot(text,
  479. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  480. "【 搬运&改造效率工具失败通知 】")
  481. return
  482. logger.info(f"[+] {REDIS_NAME}的{data}数据添加片中字幕成功")
  483. logger.info(f"[+] {REDIS_NAME}的{data}数据开始发送oss")
  484. oss_object_key = Oss.stitching_sync_upload_oss(video_path, str(uuid.uuid4())) # 视频发送OSS
  485. status = oss_object_key.get("status")
  486. if status != 200:
  487. logger.error(f"[+] {REDIS_NAME}的{data}数据发送oss失败")
  488. AliyunLogger.logging(data["name"],"效率工具", tag_transport_channel, data["video_url"],
  489. "改造失败,发送oss失败", "3001", str(data))
  490. text = (
  491. f"**负责人**: {data['name']}\n"
  492. f"**内容**: {data}\n"
  493. f"**失败信息**: 视频发送OSS失败\n"
  494. )
  495. Feishu.finish_bot(text,
  496. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  497. "【 搬运&改造效率工具失败通知 】")
  498. return
  499. logger.info(f"[+] {REDIS_NAME}的{data}数据发送oss成功")
  500. oss_object_key = oss_object_key.get("oss_object_key")
  501. tags = ','.join(filter(None, [
  502. data['pq_label'],
  503. channel_mark,
  504. tag_transport_channel,
  505. data['tag_transport_scene'],
  506. data['tag_transport_keyword'],
  507. "搬运改造",
  508. data['tag']
  509. ]))
  510. self.insert_pq(REDIS_NAME, data, oss_object_key, title, tags, tag_transport_channel, channel_mark)
  511. return
  512. except Exception as e:
  513. data["transform_rule"] = "仅改造"
  514. in_carry_video_data(REDIS_NAME, json.dumps(data, ensure_ascii=False, indent=4))
  515. logger.error(f"[+] 视频改造失败{e}")
  516. text = (
  517. f"**负责人**: {data['name']}\n"
  518. f"**内容**: {data}\n"
  519. f"**失败信息**: 视频改造失败\n"
  520. )
  521. Feishu.finish_bot(text,
  522. "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
  523. "【 搬运&改造效率工具失败通知 】")
  524. return
  525. return