bottom_videos.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import datetime
  2. import traceback
  3. import os
  4. import json
  5. from utils import execute_sql_from_odps, request_post
  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. # 获取今日兜底视频的json,并存入redis
  42. video_json_list = []
  43. for i in range(0, len(video_id_list) // 10):
  44. video_json = get_video_info_json(video_ids=video_id_list[i * 10:(i + 1) * 10])
  45. if video_json is not None:
  46. video_json_list.extend(video_json)
  47. if len(video_json_list) >= 1000:
  48. break
  49. # 写入redis,先删除key,再重新写入
  50. redis_helper.del_keys(config_.BOTTOM_JSON_KEY_NAME)
  51. redis_helper.add_data_with_set(key_name=config_.BOTTOM_JSON_KEY_NAME, values=video_json_list[:1000])
  52. # 移除过期时间,将其转换为永久状态
  53. redis_helper.persist_key(key_name=config_.BOTTOM_JSON_KEY_NAME)
  54. log_.info('{} update bottom videos info json success!, video nums = {}'.format(now_date,
  55. len(video_json_list[:1000])))
  56. except Exception as e:
  57. log_.error(traceback.format_exc())
  58. def get_video_info_json(video_ids):
  59. """
  60. 获取视频对应json
  61. :param video_ids: type-list [int, int, ...]
  62. :return: json_data_list
  63. """
  64. request_data = {
  65. "appType": 4,
  66. "platform": "android",
  67. "versionCode": 295,
  68. "pageSize": 10,
  69. "machineCode": "weixin_openid_otjoB5WWWmkRjpMzkV5ltZ3osg3A",
  70. "uid": 6281917,
  71. "videoIds": video_ids
  72. }
  73. res = request_post(request_url=config_.BOTTOM_JSON_URL, request_data=request_data)
  74. if res is None:
  75. return None
  76. if res['code'] != 0:
  77. log_.info('获取视频json失败!')
  78. return None
  79. json_data_list = [json.dumps(item) for item in res['data']]
  80. return json_data_list
  81. if __name__ == '__main__':
  82. update_bottom_videos()
  83. # 将日志上传到oss
  84. # log_cmd = "ossutil cp -r -f {} oss://{}/{}".format(log_.logname, config_.BUCKET_NAME,
  85. # config_.OSS_FOLDER_LOGS + 'bottom_videos/')
  86. # os.system(log_cmd)