bottom_videos.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import datetime
  2. import traceback
  3. import os
  4. import json
  5. from utils import execute_sql_from_odps, request_post, update_video_w_h_rate
  6. from db_helper import RedisHelper
  7. from config import set_config
  8. from log import Log
  9. config_ = set_config()
  10. log_ = Log()
  11. def update_bottom_videos():
  12. """更新兜底视频"""
  13. try:
  14. # 获取总播放量top1000的视频
  15. now_date = datetime.datetime.today()
  16. sql = "SELECT id " \
  17. ",play_count_total " \
  18. "FROM videoods.wx_video_test " \
  19. "WHERE transcode_status = 3 " \
  20. "AND STATUS = 1 " \
  21. "AND recommend_status IN ( - 6, 1) " \
  22. "ORDER BY play_count_total DESC " \
  23. "LIMIT 2000" \
  24. ";"
  25. records = execute_sql_from_odps(project='videoods', sql=sql)
  26. # 视频按照总播放量写入redis
  27. video_id_list = []
  28. videos = {}
  29. with records.open_reader() as reader:
  30. for record in reader:
  31. video_id = int(record['id'])
  32. video_id_list.append(video_id)
  33. videos[video_id] = record['play_count_total']
  34. redis_helper = RedisHelper()
  35. redis_helper.add_data_with_zset(key_name=config_.BOTTOM_KEY_NAME, data=videos)
  36. # 与原有兜底视频排序,保留top1000
  37. redis_helper.remove_by_rank_from_zset(key_name=config_.BOTTOM_KEY_NAME, start=config_.BOTTOM_NUM, stop=-1)
  38. # 移除bottom key的过期时间,将其转换为永久状态
  39. redis_helper.persist_key(key_name=config_.BOTTOM_KEY_NAME)
  40. log_.info('{} update bottom videos success! num = {}'.format(now_date, config_.BOTTOM_NUM))
  41. # 更新视频的宽高比数据
  42. video_ids = redis_helper.get_data_zset_with_index(key_name=config_.BOTTOM_KEY_NAME, start=0, end=-1)
  43. if video_ids:
  44. update_video_w_h_rate(video_ids=video_ids,
  45. key_name=config_.W_H_RATE_UP_1_VIDEO_LIST_KEY_NAME['bottom_last'])
  46. log_.info('update video w_h_rate to redis finished!')
  47. # 获取今日兜底视频的json,并存入redis
  48. video_json_list = []
  49. for i in range(0, len(video_id_list) // 10):
  50. video_json = get_video_info_json(video_ids=video_id_list[i * 10:(i + 1) * 10])
  51. if video_json is not None:
  52. video_json_list.extend(video_json)
  53. if len(video_json_list) >= 1000:
  54. break
  55. # 写入redis,先删除key,再重新写入
  56. redis_helper.del_keys(config_.BOTTOM_JSON_KEY_NAME)
  57. redis_helper.add_data_with_set(key_name=config_.BOTTOM_JSON_KEY_NAME, values=video_json_list[:1000])
  58. # 移除过期时间,将其转换为永久状态
  59. redis_helper.persist_key(key_name=config_.BOTTOM_JSON_KEY_NAME)
  60. log_.info('{} update bottom videos info json success!, video nums = {}'.format(now_date,
  61. len(video_json_list[:1000])))
  62. except Exception as e:
  63. log_.error(traceback.format_exc())
  64. def get_video_info_json(video_ids):
  65. """
  66. 获取视频对应json
  67. :param video_ids: type-list [int, int, ...]
  68. :return: json_data_list
  69. """
  70. request_data = {
  71. "appType": 4,
  72. "platform": "android",
  73. "versionCode": 295,
  74. "pageSize": 10,
  75. "machineCode": "weixin_openid_otjoB5WWWmkRjpMzkV5ltZ3osg3A",
  76. "uid": 6281917,
  77. "videoIds": video_ids
  78. }
  79. res = request_post(request_url=config_.BOTTOM_JSON_URL, request_data=request_data)
  80. if res is None:
  81. return None
  82. if res['code'] != 0:
  83. log_.info('获取视频json失败!')
  84. return None
  85. json_data_list = [json.dumps(item) for item in res['data']]
  86. return json_data_list
  87. if __name__ == '__main__':
  88. update_bottom_videos()
  89. # 将日志上传到oss
  90. # log_cmd = "ossutil cp -r -f {} oss://{}/{}".format(log_.logname, config_.BUCKET_NAME,
  91. # config_.OSS_FOLDER_LOGS + 'bottom_videos/')
  92. # os.system(log_cmd)