consumption_work.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import os
  2. import sys
  3. import uuid
  4. from apscheduler.schedulers.blocking import BlockingScheduler
  5. from apscheduler.triggers.interval import IntervalTrigger
  6. from loguru import logger
  7. from utils.gpt4o_mini_help import GPT4oMini
  8. from utils.tts_help import TTS
  9. # sys.path.append('/app')
  10. from utils.download_video import DownLoad
  11. from utils.sql_help import sqlCollect
  12. from utils.aliyun_oss import Oss
  13. from utils.ffmpeg import FFmpeg
  14. # CACHE_DIR = '/app/cache/'
  15. # CACHE_DIR = '/Users/z/Downloads/'
  16. CACHE_DIR = '/root/long_text_video_transform/path/'
  17. class ConsumptionRecommend(object):
  18. @classmethod
  19. def data_handle(cls, oss_url, title, file_path):
  20. video_url = f"https://rescdn.yishihui.com/{oss_url}"
  21. logger.info(f"[长文] {video_url}视频开始下载")
  22. video_path = DownLoad.download_video(video_url, file_path)
  23. if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
  24. """下载失败修改状态"""
  25. sqlCollect.update_oss_path_status(99, oss_url)
  26. return
  27. logger.info(f"[长文] {video_url}视频下载成功")
  28. width, height = FFmpeg.get_w_h_size(video_path)
  29. if width < height: # 判断是否需要修改为竖屏
  30. logger.info(f"[长文] {video_url}视频修改为竖屏")
  31. video_path = FFmpeg.update_video_h_w(video_path, file_path)
  32. logger.info(f"[长文] 视频更改分辨率处理")
  33. video_path = FFmpeg.video_640(video_path, file_path)
  34. logger.info(f"[长文] 视频更改分辨率处理成功")
  35. pw_srt_text = GPT4oMini.get_ai_mini_pw(title)
  36. pw_url = TTS.get_pw_zm(pw_srt_text, "zhifeng_emo")
  37. if not pw_url:
  38. """获取片尾引导失败"""
  39. sqlCollect.update_oss_path_status(99, oss_url)
  40. return
  41. pw_srt = TTS.getSrt(pw_url)
  42. if not pw_srt:
  43. """获取片尾引导失败"""
  44. sqlCollect.update_oss_path_status(99, oss_url)
  45. return
  46. logger.info(f"[长文] 开始下载音频")
  47. pw_mp3_path = TTS.download_mp3(pw_url, file_path)
  48. if not pw_mp3_path:
  49. """片尾音频下载失败"""
  50. sqlCollect.update_oss_path_status(99, oss_url)
  51. return
  52. logger.info(f"[长文] 片尾下载成功")
  53. jpg_path = FFmpeg.video_png(video_path, file_path) # 生成视频最后一帧jpg
  54. pw_path = FFmpeg.pw_video(jpg_path, file_path, pw_mp3_path, pw_srt) # 生成片尾视频
  55. if not os.path.exists(pw_path) or os.path.getsize(pw_path) == 0:
  56. """片尾生成失败"""
  57. sqlCollect.update_oss_path_status(99, oss_url)
  58. return
  59. logger.info(f"[长文] 合并开始拼接")
  60. video_path = FFmpeg.h_b_video(video_path, pw_path, file_path)
  61. zm = "温馨提示:\n点击下方按钮,传递好运"
  62. video_path = FFmpeg.single_video(video_path, file_path, zm)
  63. if not os.path.exists(video_path) or os.path.getsize(video_path) == 0:
  64. """视频合并失败"""
  65. sqlCollect.update_oss_path_status(99, oss_url)
  66. return
  67. logger.info(f"[长文] 视频-开始发送oss")
  68. oss_object_key = Oss.stitching_sync_upload_oss(video_path, str(uuid.uuid4())) # 视频发送OSS
  69. logger.info(f"[长文] 数据发送oss成功")
  70. oss_object_key = oss_object_key.get("oss_object_key")
  71. logger.info(f"[长文] oss新地址写入数据")
  72. sqlCollect.add_new_oss_path(oss_object_key,oss_url)
  73. logger.info(f"[长文] oss新地址写入成功")
  74. logger.info(f"[长文] 修改数据库状态")
  75. sqlCollect.update_oss_path_status(2, oss_url)
  76. logger.info(f"[长文] 修改数据库状态成功")
  77. return
  78. @classmethod
  79. def run(cls):
  80. uid = str(uuid.uuid4())
  81. file_path = os.path.join(CACHE_DIR, uid)
  82. logger.info(f"[长文] 查询数据")
  83. data = sqlCollect.get_oss_path()
  84. title = data[0][0]
  85. oss_url = data[0][1]
  86. if not oss_url:
  87. logger.info(f"[长文] 无待处理的数据")
  88. return
  89. try:
  90. sqlCollect.update_oss_path_status(1, oss_url)
  91. cls.data_handle(oss_url, title, file_path)
  92. for filename in os.listdir(CACHE_DIR):
  93. # 检查文件名是否包含关键字
  94. if uid in filename:
  95. file_path = os.path.join(CACHE_DIR, filename)
  96. try:
  97. # 删除文件
  98. os.remove(file_path)
  99. logger.info(f"[长文] 已删除文件: {file_path}")
  100. except Exception as e:
  101. logger.error(f"[长文] 删除文件时出错: {file_path}, 错误: {e}")
  102. return
  103. except Exception as e:
  104. for filename in os.listdir(CACHE_DIR):
  105. # 检查文件名是否包含关键字
  106. if uid in filename:
  107. file_path = os.path.join(CACHE_DIR, filename)
  108. try:
  109. # 删除文件
  110. os.remove(file_path)
  111. logger.info(f"[长文] 已删除文件: {file_path}")
  112. except Exception as e:
  113. logger.error(f"[长文] 删除文件时出错: {file_path}, 错误: {e}")
  114. return
  115. #
  116. # def run():
  117. # scheduler = BlockingScheduler()
  118. # try:
  119. # logger.info(f"[长文] 开始启动")
  120. # scheduler.add_job(ConsumptionRecommend.run, trigger=IntervalTrigger(minutes=1)) # 每1分钟启动一次
  121. # scheduler.start()
  122. # except KeyboardInterrupt:
  123. # pass
  124. # except Exception as e:
  125. # logger.error(f"[长文] 启动异常,异常信息:{e}")
  126. # pass
  127. # finally:
  128. # scheduler.shutdown()
  129. #
  130. #
  131. # if __name__ == '__main__':
  132. # ConsumptionRecommend.run()