Initial commit
This commit is contained in:
140
tools/tongyi/main.py
Normal file
140
tools/tongyi/main.py
Normal file
@@ -0,0 +1,140 @@
|
||||
#!/usr/bin/env python
|
||||
# coding=utf-8
|
||||
|
||||
import sys
|
||||
import os
|
||||
from bilibili_spider import crawl_bilibili_video
|
||||
from tingwu_api import submit_tingwu_task, get_task_result, check_task_status
|
||||
|
||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from shared.oss_upload import upload_file_to_oss
|
||||
|
||||
|
||||
def main():
|
||||
"""
|
||||
主函数:爬取B站视频并提交给通义听悟API分析
|
||||
"""
|
||||
if len(sys.argv) != 2:
|
||||
print("使用方法: python bilibili_to_tingwu.py <视频链接>")
|
||||
print(
|
||||
"示例: python bilibili_to_tingwu.py https://www.bilibili.com/video/BV1uHFjzVEju/"
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
video_url = sys.argv[1]
|
||||
|
||||
print("===== 开始爬取B站视频 =====")
|
||||
# 爬取视频,获取视频标题和播放URL(下载视频)
|
||||
video_title, video_play_url = crawl_bilibili_video(video_url, download=True)
|
||||
|
||||
if not video_play_url:
|
||||
print("视频爬取失败,无法提交给通义听悟API")
|
||||
sys.exit(1)
|
||||
|
||||
# 构建下载的文件路径
|
||||
from config import DOWNLOAD_DIR
|
||||
from utils import sanitize_filename
|
||||
|
||||
# 音频流路径
|
||||
audio_stream_path = os.path.join(
|
||||
DOWNLOAD_DIR,
|
||||
sanitize_filename(video_title),
|
||||
f"{sanitize_filename(video_title)}_audio.mp4",
|
||||
)
|
||||
|
||||
# 视频流路径
|
||||
video_stream_path = os.path.join(
|
||||
DOWNLOAD_DIR,
|
||||
sanitize_filename(video_title),
|
||||
f"{sanitize_filename(video_title)}_video.mp4",
|
||||
)
|
||||
|
||||
# 合并后的视频路径
|
||||
merged_video_path = os.path.join(
|
||||
DOWNLOAD_DIR, f"{sanitize_filename(video_title)}.mp4"
|
||||
)
|
||||
|
||||
# 强制使用合并后的视频文件
|
||||
if os.path.exists(merged_video_path):
|
||||
upload_path = merged_video_path
|
||||
print("使用合并后的视频文件进行分析")
|
||||
else:
|
||||
print("错误:无法找到合并后的视频文件")
|
||||
print("必须成功合并音视频才能继续")
|
||||
sys.exit(1)
|
||||
|
||||
print(f"上传文件路径: {upload_path}")
|
||||
|
||||
print("\n===== 上传视频到OSS =====")
|
||||
# 配置OSS参数
|
||||
ACCESS_KEY_ID = "LTAI5tB7sQADpKZnXY7s6Xz8"
|
||||
ACCESS_KEY_SECRET = "Fgab9klwKoH1GACP97WIb7s6BSvNAm"
|
||||
BUCKET_NAME = "bucket-xcnote" # 请替换为实际的OSS桶名称
|
||||
|
||||
# 生成OSS对象名称
|
||||
import datetime
|
||||
|
||||
timestamp = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||
object_name = f"bilibili/{timestamp}_{sanitize_filename(video_title)}.mp4"
|
||||
|
||||
# 上传文件到OSS
|
||||
oss_url = upload_file_to_oss(
|
||||
upload_path, BUCKET_NAME, object_name, ACCESS_KEY_ID, ACCESS_KEY_SECRET
|
||||
)
|
||||
|
||||
if not oss_url:
|
||||
print("文件上传失败,无法提交给通义听悟API")
|
||||
sys.exit(1)
|
||||
|
||||
print("\n===== 开始提交给通义听悟API分析 =====")
|
||||
print(f"视频标题: {video_title}")
|
||||
print(f"使用的OSS文件URL: {oss_url}")
|
||||
|
||||
# 配置参数
|
||||
APP_KEY = "vjZPEUfWtszQP2n6" # 必须替换为实际的AppKey
|
||||
|
||||
# 使用OSS的文件URL作为FileUrl
|
||||
file_url = oss_url
|
||||
|
||||
# 提交任务
|
||||
task_id = submit_tingwu_task(file_url, APP_KEY, ACCESS_KEY_ID, ACCESS_KEY_SECRET)
|
||||
|
||||
if task_id:
|
||||
print("\n===== 等待任务处理完成 =====")
|
||||
# 轮询任务状态,直到任务完成或失败
|
||||
import time
|
||||
|
||||
max_retries = 60 # 最大轮询次数
|
||||
retry_interval = 10 # 轮询间隔(秒)
|
||||
retry_count = 0
|
||||
|
||||
while retry_count < max_retries:
|
||||
print(f"\n第 {retry_count + 1} 次查询任务状态...")
|
||||
task_status = check_task_status(task_id, ACCESS_KEY_ID, ACCESS_KEY_SECRET)
|
||||
|
||||
if task_status == "COMPLETED":
|
||||
print("\n===== 任务处理完成 =====")
|
||||
print("分析完成,结果已打印如上")
|
||||
break
|
||||
elif task_status in ["FAILED", "INVALID"]:
|
||||
print(f"\n===== 任务处理{task_status} =====")
|
||||
print("分析完成,结果已打印如上")
|
||||
break
|
||||
elif task_status == "ONGOING":
|
||||
print(f"任务正在处理中,{retry_interval}秒后再次查询...")
|
||||
time.sleep(retry_interval)
|
||||
retry_count += 1
|
||||
else:
|
||||
print(f"未知任务状态: {task_status},{retry_interval}秒后再次查询...")
|
||||
time.sleep(retry_interval)
|
||||
retry_count += 1
|
||||
|
||||
if retry_count >= max_retries:
|
||||
print("\n===== 任务处理超时 =====")
|
||||
print("已达到最大查询次数,任务可能仍在处理中")
|
||||
else:
|
||||
print("\n===== 提交任务失败 =====")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user