""" @author: luojunhui @description: 校验视频状态,若视频状态为不通过,则修改视频状态 """ import os import time import multiprocessing from tqdm import tqdm from applications import PQAPI, PQMySQL, bot class VideoStatusManager(object): """ 视频状态校验 and 修改 """ db_client = PQMySQL() pq_api = PQAPI() @classmethod def getVideoListStatus(cls, videoList): """ 获取视频 list 的状态,并且返回状态为不通过的视频 list :param videoList: 视频 id_list, 最长为 20 :return: bad video list """ response = cls.pq_api.getPQVideoListDetail(video_list=videoList) detail_list = response.get('data', []) if detail_list: bad_video_list = [i for i in detail_list if i['auditStatus'] != 5] bad_id_list = [i['id'] for i in bad_video_list] else: bad_id_list = [] return bad_id_list @classmethod def getPublishedVideoIdsDaily(cls): """ 获取每日发布的视频 id 的状态 :return: publish_time > {today_time_stamp} and """ select_sql = f""" SELECT video_id FROM get_off_videos WHERE check_status = 0 and video_status = 1; """ video_id_tuple = cls.db_client.select(select_sql) video_id_list = [i[0] for i in video_id_tuple] return video_id_list @classmethod def updateCheckStatus(cls, vid_list): """ :param vid_list: :return: """ sql = f""" UPDATE get_off_videos SET check_status = %s where video_id in %s; """ cls.db_client.update( sql=sql, params=(1, tuple(vid_list)) ) print("更新 check_status 成功") @classmethod def deal(cls): """ Deal Function :return: """ def chunk_iterator(arr, chunk_size): """生成器函数,将数组分组成指定大小的chunks""" for i in range(0, len(arr), chunk_size): yield arr[i:i + chunk_size] video_id_list = cls.getPublishedVideoIdsDaily() video_chunks = chunk_iterator(video_id_list, 10) bad_count = 0 for video_temp in video_chunks: bad_id_list = cls.getVideoListStatus(video_temp) fail_list = [] if bad_id_list: bad_count += len(bad_id_list) for bad_id in tqdm(bad_id_list): response = cls.pq_api.changeVideoStatus(bad_id) if not response: fail_list.append(bad_id) if fail_list: bot( title="修改视频状态失败", detail=fail_list ) cls.updateCheckStatus(video_temp) print("total", len(video_id_list)) print("bad_total", bad_count) def task(): """ task :return: """ while True: VM = VideoStatusManager() VM.deal() # print(1) time.sleep(10 * 60) if __name__ == '__main__': process = None try: while True: if process is None or not process.is_alive(): process = multiprocessing.Process(target=task) process.start() time.sleep(60) except KeyboardInterrupt: if process and process.is_alive(): process.terminate()