checkVideoStatusDaily.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. """
  2. @author: luojunhui
  3. @description: 校验视频状态,若视频状态为不通过,则修改视频状态
  4. """
  5. import traceback
  6. from tqdm import tqdm
  7. from applications import PQAPI, longArticlesMySQL, bot
  8. class VideoStatusManager(object):
  9. """
  10. 视频状态校验 and 修改
  11. """
  12. def __init__(self):
  13. self.db_client = None
  14. self.pq_api = None
  15. def base_init(self):
  16. """
  17. 初始化数据库连接和 pq 方法类
  18. """
  19. try:
  20. self.db_client = longArticlesMySQL()
  21. except Exception as e:
  22. error_msg = traceback.format_exc()
  23. bot(
  24. title="视频状态校验任务,每 20 分钟执行一次,数据库初始化异常",
  25. detail={
  26. "error": str(e),
  27. "error_msg": error_msg,
  28. "server": "new_server"
  29. }
  30. )
  31. return False
  32. try:
  33. self.pq_api = PQAPI()
  34. except Exception as e:
  35. error_msg = traceback.format_exc()
  36. bot(
  37. title="视频状态校验任务,每 20 分钟执行一次,apollo连接异常",
  38. detail={
  39. "error": str(e),
  40. "error_msg": error_msg,
  41. "server": "new_server"
  42. }
  43. )
  44. return False
  45. return True
  46. def get_video_list_status(self, videoList):
  47. """
  48. 获取视频 list 的状态,并且返回状态为不通过的视频 list
  49. :param videoList: 视频 id_list, 最长为 20
  50. :return: bad video list
  51. """
  52. response = self.pq_api.getPQVideoListDetail(video_list=videoList)
  53. detail_list = response.get('data', [])
  54. if detail_list:
  55. bad_video_list = [i for i in detail_list if i['auditStatus'] != 5]
  56. bad_id_list = [i['id'] for i in bad_video_list]
  57. else:
  58. bad_id_list = []
  59. return bad_id_list
  60. def get_published_video_ids_daily(self):
  61. """
  62. 获取每日发布的视频 id 的状态
  63. :return:
  64. publish_time > {today_time_stamp} and
  65. """
  66. select_sql = f"""
  67. SELECT video_id
  68. FROM get_off_videos
  69. WHERE check_status = 0 and video_status = 1;
  70. """
  71. video_id_tuple = self.db_client.select(select_sql)
  72. video_id_list = [i[0] for i in video_id_tuple]
  73. return video_id_list
  74. def update_check_status(self, vid_list):
  75. """
  76. :param vid_list:
  77. :return:
  78. """
  79. sql = f"""
  80. UPDATE get_off_videos
  81. SET check_status = %s
  82. where video_id in %s;
  83. """
  84. self.db_client.update(
  85. sql=sql,
  86. params=(1, tuple(vid_list))
  87. )
  88. print("更新 check_status 成功")
  89. def deal(self):
  90. """
  91. Deal Function
  92. :return:
  93. """
  94. def chunk_iterator(arr, chunk_size):
  95. """生成器函数,将数组分组成指定大小的chunks"""
  96. for i in range(0, len(arr), chunk_size):
  97. yield arr[i:i + chunk_size]
  98. video_id_list = self.get_published_video_ids_daily()
  99. video_chunks = chunk_iterator(video_id_list, 10)
  100. bad_count = 0
  101. for video_temp in video_chunks:
  102. bad_id_list = self.get_video_list_status(video_temp)
  103. fail_list = []
  104. if bad_id_list:
  105. bad_count += len(bad_id_list)
  106. for bad_id in tqdm(bad_id_list):
  107. response = self.pq_api.changeVideoStatus(bad_id)
  108. if not response:
  109. fail_list.append(bad_id)
  110. if fail_list:
  111. bot(
  112. title="修改视频状态失败",
  113. detail={
  114. "list": fail_list,
  115. "server": "new_server"
  116. }
  117. )
  118. self.update_check_status(video_temp)
  119. print("total", len(video_id_list))
  120. print("bad_total", bad_count)
  121. def main():
  122. """
  123. task
  124. :return:
  125. """
  126. VM = VideoStatusManager()
  127. if VM.base_init():
  128. VM.deal()
  129. if __name__ == '__main__':
  130. main()