zhangyong 5 months ago
parent
commit
5decbf65b3
3 changed files with 160 additions and 169 deletions
  1. 108 105
      carry_video/carry_video.py
  2. 30 15
      common/download_video.py
  3. 22 49
      common/feishu_form.py

+ 108 - 105
carry_video/carry_video.py

@@ -85,21 +85,14 @@ class CarryViode:
             headers = {
                 'Content-Type': 'application/json'
             }
-            video_url = None
-            original_title = None
-            for i in range(3):
-                response = requests.request("POST", url, headers=headers, data=payload)
-                response = response.json()
-                code = response["code"]
-                if code == 0:
-                    data = response["data"]["data"]
+            response = requests.request("POST", url, headers=headers, data=payload)
+            response = response.json()
+            code = response["code"]
+            if code == 0:
+                data = response["data"]["data"]
 
-                    video_url = data["video_url_list"][0]["video_url"]
-                    original_title = data["title"]
-                    if ".mp4" in video_url:
-                        return video_url, original_title
-                    time.sleep(5)
-            if video_url:
+                video_url = data["video_url_list"][0]["video_url"]
+                original_title = data["title"]
                 return video_url, original_title
             else:
                 return None,None
@@ -107,6 +100,87 @@ class CarryViode:
             logger.error(f"[+] 快手{url}获取视频链接失败,失败信息{e}")
             return None, None
 
+
+    def insert_pq(self, REDIS_NAME, data, oss_object_key, title, tags):
+        logger.info(f"[+] {REDIS_NAME}的{data}开始写入票圈")
+        n_ids = data["pq_ids"]
+        if ',' in n_ids:
+            n_id_list = n_ids.split(',')
+        else:
+            n_id_list = [n_ids]
+        pq_list = []
+        for n_id in n_id_list:
+            code = PQ.insert_piaoquantv(oss_object_key, title, n_id)
+            if not code:
+                logger.error(f"[+] {REDIS_NAME}的{data}写入票圈后台失败")
+                AliyunLogger.logging(data["name"], "效率工具", data["tag_transport_channel"], data["video_url"],
+                                     "改造失败,写入票圈后台失败", "3001", str(data))
+                text = (
+                    f"**负责人**: {data['name']}\n"
+                    f"**内容**: {data}\n"
+                    f"**失败信息**: 视频写入票圈后台失败,视频ID{code}\n"
+                )
+                Feishu.finish_bot(text,
+                                  "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
+                                  "【 搬运&改造效率工具失败通知 】")
+                continue
+            pq_list.append(code)
+            logger.info(f"[+] {REDIS_NAME}的{data}写入票圈成功,返回视频id{code}")
+            tag_status = Tag.video_tag(code, str(tags))
+            if tag_status == 0:
+                logger.info(f"[+] {REDIS_NAME}的{data}写入标签成功,后台视频ID为{code}")
+            try:
+                current_time = datetime.now()
+                formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
+                pq_url = f'https://admin.piaoquantv.com/cms/post-detail/{code}/detail'  # 站内视频链接
+
+                values = [
+                    [
+                        str(code),
+                        str(n_id),
+                        formatted_time,
+                        data["channel_mark"],
+                        data["name"],
+                        data["pq_ids"],
+                        data["pq_label"],
+                        data["activate_data"],
+                        data["video_url"],
+                        data["title_category"],
+                        data["tag_transport_channel"],
+                        data["tag_transport_scene"],
+                        data["tag_transport_keyword"],
+                        data["tag"],
+                        data["transform_rule"],
+                        data["video_share"],
+                        data["trailer_share"],
+                        data["trailer_share_audio"],
+                        data["video_clipping"],
+                        data["video_clipping_time"],
+                        data["title_transform"],
+                        pq_url
+                    ]
+                ]
+                name_to_sheet = {
+                    "范军": "276ffc",
+                    "鲁涛": "QqrKRY",
+                    "余海涛": "dTzUlI",
+                    "罗情": "8JPv9g",
+                    "刘诗雨": "HqwG0o",
+                    "张峰": "vtWvle",
+                    "周仙琴": "MWUqWt"
+                }
+                name = re.sub(r"\s+", "", data.get("name", ""))
+                sheet = name_to_sheet.get(name)
+                Feishu.insert_columns("R4dLsce8Jhz9oCtDMr9ccpFHnbI", sheet, "ROWS", 1, 2)
+                time.sleep(0.5)
+                Feishu.update_values("R4dLsce8Jhz9oCtDMr9ccpFHnbI", sheet, "A2:Z2", values)
+                logger.info(f"[+] {REDIS_NAME}的{data}写入飞书成功")
+            except Exception as e:
+                logger.error(f"[+] {REDIS_NAME}的{data}写入飞书失败{e}")
+                pass
+        AliyunLogger.logging(data["name"], "效率工具", data["tag_transport_channel"], data["video_url"],
+                             "改造成功", "1000", str(data), str(pq_list))
+
     def main(self, data, REDIS_NAME, file_path):
         AliyunLogger.logging(data["name"],"效率工具", data["tag_transport_channel"], data["video_url"], "扫描到一条视频", "2001", str(data))
         AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],  "符合规则等待改造", "2004", str(data))
@@ -170,7 +244,13 @@ class CarryViode:
                               "【 搬运&改造效率工具失败通知 】")
             return
         logger.info(f"[+] {url}开始视频下载成功")
-        if data["transform_rule"] == '否':
+        logger.info(f"[+] {url}开始处理标题")
+        if data["title_category"] == "AI标题" or data["trailer_share"] == "AI标题":
+            title = GPT4o.get_ai_title(
+                original_title if data["title_category"] == "原标题" else data["title_category"])
+        else:
+            title = original_title if data["title_category"] == "原标题" else data["title_category"]
+        if data["transform_rule"] == '否'or data["transform_rule"] == "是":
             logger.info(f"[+] {REDIS_NAME}的{data}数据开始发送oss")
             oss_object_key = Oss.stitching_sync_upload_oss(video_path, str(uuid.uuid4()))  # 视频发送OSS
             status = oss_object_key.get("status")
@@ -189,9 +269,17 @@ class CarryViode:
                 return
             logger.info(f"[+] {REDIS_NAME}的{data}数据发送oss成功")
             oss_object_key = oss_object_key.get("oss_object_key")
-
-
-        elif data["transform_rule"] == "仅改造":
+            tags = ','.join(filter(None, [
+                data['pq_label'],
+                data['channel_mark'],
+                data['tag_transport_channel'],
+                data['tag_transport_scene'],
+                data['tag_transport_keyword'],
+                data['tag'],
+                "搬运"
+            ]))
+            self.insert_pq(REDIS_NAME, data, oss_object_key, title, tags)
+        if data["transform_rule"] == "仅改造" or data["transform_rule"] == "是":
             logger.info(f"[+] {REDIS_NAME}的{data}视频更改分辨率处理")
             video_path = FFmpeg.video_640(video_path, file_path)
             if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
@@ -321,40 +409,6 @@ class CarryViode:
                 return
             logger.info(f"[+] {REDIS_NAME}的{data}数据发送oss成功")
             oss_object_key = oss_object_key.get("oss_object_key")
-        logger.info(f"[+] {REDIS_NAME}的{data}开始写入票圈")
-        n_ids = data["pq_ids"]
-        if ',' in n_ids:
-            n_id_list = n_ids.split(',')
-        else:
-            n_id_list = [n_ids]
-        pq_list = []
-        for n_id in n_id_list:
-            logger.info(f"[+] {url}开始处理标题")
-            if data["title_category"] == "AI标题" or data["trailer_share"] == "AI标题":
-                title = GPT4o.get_ai_title(
-                    original_title if data["title_category"] == "原标题" else data["title_category"])
-            else:
-                title = original_title if data["title_category"] == "原标题" else data["title_category"]
-            code = PQ.insert_piaoquantv(oss_object_key, title, n_id)
-            if not code:
-                logger.error(f"[+] {REDIS_NAME}的{data}写入票圈后台失败")
-                AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],
-                                     "改造失败,写入票圈后台失败", "3001", str(data))
-                text = (
-                    f"**负责人**: {data['name']}\n"
-                    f"**内容**: {data}\n"
-                    f"**失败信息**: 视频写入票圈后台失败,视频ID{code}\n"
-                )
-                Feishu.finish_bot(text,
-                                  "https://open.feishu.cn/open-apis/bot/v2/hook/65bc5463-dee9-46d0-bc2d-ec6c49a8f3cd",
-                                  "【 搬运&改造效率工具失败通知 】")
-                continue
-            pq_list.append(code)
-            logger.info(f"[+] {REDIS_NAME}的{data}写入票圈成功,返回视频id{code}")
-            if data["transform_rule"] == '否':
-                tag_s = "搬运"
-            else:
-                tag_s = "搬运改造"
             tags = ','.join(filter(None, [
                 data['pq_label'],
                 data['channel_mark'],
@@ -362,61 +416,10 @@ class CarryViode:
                 data['tag_transport_scene'],
                 data['tag_transport_keyword'],
                 data['tag'],
-                tag_s
+                "搬运改造"
             ]))
-            tag_status = Tag.video_tag(code, str(tags))
-            if tag_status == 0:
-                logger.info(f"[+] {REDIS_NAME}的{data}写入标签成功,后台视频ID为{code}")
-            try:
-                current_time = datetime.now()
-                formatted_time = current_time.strftime("%Y-%m-%d %H:%M:%S")
-                values = [
-                    [
-                        str(code),
-                        str(n_id),
-                        formatted_time,
-                        data["channel_mark"],
-                        data["name"],
-                        data["pq_ids"],
-                        data["pq_label"],
-                        data["activate_data"],
-                        data["video_url"],
-                        data["title_category"],
-                        data["tag_transport_channel"],
-                        data["tag_transport_scene"],
-                        data["tag_transport_keyword"],
-                        data["tag"],
-                        data["transform_rule"],
-                        data["video_share"],
-                        data["trailer_share"],
-                        data["trailer_share_audio"],
-                        data["video_clipping"],
-                        data["video_clipping_time"],
-                        data["title_transform"],
+            self.insert_pq(REDIS_NAME, data, oss_object_key, title, tags)
 
-                    ]
-                ]
-                name_to_sheet = {
-                    "范军": "276ffc",
-                    "鲁涛": "QqrKRY",
-                    "余海涛": "dTzUlI",
-                    "罗情": "8JPv9g",
-                    "刘诗雨": "HqwG0o",
-                    "张峰": "vtWvle",
-                    "周仙琴": "MWUqWt"
-                }
-                name = re.sub(r"\s+", "", data.get("name", ""))
-                sheet = name_to_sheet.get(name)
-                Feishu.insert_columns("R4dLsce8Jhz9oCtDMr9ccpFHnbI", sheet, "ROWS", 1, 2)
-                time.sleep(0.5)
-                Feishu.update_values("R4dLsce8Jhz9oCtDMr9ccpFHnbI", sheet, "A2:Z2", values)
-                logger.info(f"[+] {REDIS_NAME}的{data}写入飞书成功")
-            except Exception as e:
-                logger.error(f"[+] {REDIS_NAME}的{data}写入飞书失败{e}")
-                pass
-        AliyunLogger.logging(data["name"], "效率工具",data["tag_transport_channel"], data["video_url"],
-                             "改造成功", "1000", str(data),str(pq_list))
-        return
 
 
 

+ 30 - 15
common/download_video.py

@@ -1,9 +1,6 @@
 import html
-import subprocess
-import time
-
+import os
 import requests
-from loguru import logger
 
 
 class DownLoad:
@@ -12,16 +9,11 @@ class DownLoad:
         video = video_path_url + 'video.mp4'
         url_type = html.unescape(video_url).split('?')[0]
         if ".m3u8" in url_type:
-            logger.info(f"[+] {video_url}开始下载m3u8格式的视频")
-            ffmpeg_cmd_oss = [
-                "ffmpeg",
-                "-y",  # 覆盖输出文件
-                "-i", video_url,  # 输入文件
-                "-c", "copy",  # 复制视频流
-                "-bsf:a", "aac_adtstoasc",  # 转换 AAC 音频格式
-                video  # 输出文件
-            ]
-            subprocess.run(ffmpeg_cmd_oss)
+            ts_video = video_path_url + 'video.ts'
+            status_code = cls.download_m3u8_video(video_url, ts_video)
+            if status_code == False:
+                return video
+            cls.convert_ts_to_mp4(ts_video, video)
             return video
         else:
             try:
@@ -38,4 +30,27 @@ class DownLoad:
                         return video
                 return video
             except Exception:
-                return video
+                return video
+
+    @classmethod
+    def download_m3u8_video(cls ,url, file_path):
+        r = requests.get(url)
+        if r.status_code != 200:
+            return False
+        m3u8_list = r.text.split('\n')
+        m3u8_list = [i for i in m3u8_list if i and i[0] != '#']
+
+        ts_list = []
+        for ts_url in m3u8_list:
+            ts_url = url.rsplit('/', 1)[0] + '/' + ts_url
+            ts_list.append(ts_url)
+        with open(file_path, 'wb') as f:
+            for ts_url in ts_list:
+                r = requests.get(ts_url)
+                if r.status_code == 200:
+                    f.write(r.content)
+        return True
+
+    @classmethod
+    def convert_ts_to_mp4(cls, ts_file_path, mp4_file_path):
+        os.system(f'ffmpeg -i {ts_file_path} -c copy {mp4_file_path}')

+ 22 - 49
common/feishu_form.py

@@ -16,7 +16,6 @@ class Material():
         processed_list = []
         try:
             for row in data[2:]:
-
                 activate_data = row[4]  # 启动日期
                 if not activate_data:
                     continue
@@ -38,54 +37,28 @@ class Material():
                 video_clipping = row[15]  # 剪裁
                 video_clipping_time = row[16]  # 秒数剪裁
                 title_transform = row[17]  # 标题改造
-                if transform_rule == "否" or transform_rule == "仅改造":
-                    number_dict = {
-                        "channel_mark": channel_mark,
-                        "name":NAME,
-                        "pq_ids": pq_ids,
-                        "pq_label": pq_label,
-                        "activate_data": activate_data,
-                        "video_url": video_url,
-                        "title_category": title_category,
-                        "tag_transport_channel": tag_transport_channel,
-                        "tag_transport_scene": tag_transport_scene,
-                        "tag_transport_keyword": tag_transport_keyword,
-                        "tag": tag,
-                        "transform_rule": transform_rule,
-                        "video_share": video_share,
-                        "trailer_share": trailer_share,
-                        "trailer_share_audio": trailer_share_audio,
-                        "video_clipping": video_clipping,
-                        "video_clipping_time": video_clipping_time,
-                        "title_transform": title_transform,
-                        "dt":dt
-                    }
-                    processed_list.append(json.dumps(number_dict, ensure_ascii=False))
-                else:
-                    transform_rule = ["否","仅改造"]
-                    for t_rule in transform_rule:
-                        number_dict = {
-                            "channel_mark": channel_mark,
-                            "name": NAME,
-                            "pq_ids": pq_ids,
-                            "pq_label": pq_label,
-                            "activate_data": activate_data,
-                            "video_url": video_url,
-                            "title_category": title_category,
-                            "tag_transport_channel": tag_transport_channel,
-                            "tag_transport_scene": tag_transport_scene,
-                            "tag_transport_keyword": tag_transport_keyword,
-                            "tag": tag,
-                            "transform_rule": t_rule,
-                            "video_share": video_share,
-                            "trailer_share": trailer_share,
-                            "trailer_share_audio": trailer_share_audio,
-                            "video_clipping": video_clipping,
-                            "video_clipping_time": video_clipping_time,
-                            "title_transform": title_transform,
-                            "dt":dt
-                        }
-                        processed_list.append(json.dumps(number_dict, ensure_ascii=False))
+                number_dict = {
+                    "channel_mark": channel_mark,
+                    "name":NAME,
+                    "pq_ids": pq_ids,
+                    "pq_label": pq_label,
+                    "activate_data": activate_data,
+                    "video_url": video_url,
+                    "title_category": title_category,
+                    "tag_transport_channel": tag_transport_channel,
+                    "tag_transport_scene": tag_transport_scene,
+                    "tag_transport_keyword": tag_transport_keyword,
+                    "tag": tag,
+                    "transform_rule": transform_rule,
+                    "video_share": video_share,
+                    "trailer_share": trailer_share,
+                    "trailer_share_audio": trailer_share_audio,
+                    "video_clipping": video_clipping,
+                    "video_clipping_time": video_clipping_time,
+                    "title_transform": title_transform,
+                    "dt":dt
+                }
+                processed_list.append(json.dumps(number_dict, ensure_ascii=False))
             return  processed_list
         except:
             return processed_list