bottom_videos.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # coding:utf-8
  2. import datetime
  3. import json
  4. import traceback
  5. import os
  6. from utils import execute_sql_from_odps, request_post
  7. from db_helper import RedisHelper
  8. from config import set_config
  9. from log import Log
  10. config_ = set_config()
  11. log_ = Log()
  12. def update_bottom_videos():
  13. """更新兜底视频"""
  14. try:
  15. # 获取昨日播放量top1000的视频
  16. now_date = datetime.datetime.today()
  17. delta_date = now_date - datetime.timedelta(days=1)
  18. sql = "SELECT video_playcount.videoid " \
  19. ",video_playcount.play_count " \
  20. "FROM ( " \
  21. "SELECT videoid " \
  22. ",COUNT(*) play_count " \
  23. "FROM loghubods.video_action_log_applet " \
  24. "WHERE dt = {} " \
  25. "AND business = 'videoPlay' " \
  26. "GROUP BY videoid " \
  27. ") video_playcount INNER " \
  28. "JOIN ( " \
  29. "SELECT DISTINCT videoid " \
  30. "FROM videoods.dim_video " \
  31. "WHERE video_edit = '通过' " \
  32. "AND video_data_stat = '有效' " \
  33. "AND video_recommend IN ( '待推荐', '普通推荐') " \
  34. "AND charge = '免费' " \
  35. "AND is_pwd = '未加密' " \
  36. ") video_status " \
  37. "ON video_playcount.videoid = video_status.videoid " \
  38. "ORDER BY video_playcount.play_count DESC " \
  39. "LIMIT 1000 " \
  40. ";".format(delta_date.strftime('%Y%m%d'))
  41. records = execute_sql_from_odps(project='loghubods', sql=sql)
  42. # 视频按照昨日播放量写入redis
  43. video_id_list = []
  44. videos = {}
  45. with records.open_reader() as reader:
  46. for record in reader:
  47. video_id = int(record['videoid'])
  48. video_id_list.append(video_id)
  49. videos[video_id] = record['play_count']
  50. redis_helper = RedisHelper()
  51. redis_helper.del_keys(key_name=config_.BOTTOM_KEY_NAME)
  52. redis_helper.add_data_with_zset(key_name=config_.BOTTOM_KEY_NAME, data=videos)
  53. # 与原有兜底视频排序,保留top1000
  54. redis_helper.remove_by_rank_from_zset(key_name=config_.BOTTOM_KEY_NAME, start=config_.BOTTOM_NUM, stop=-1)
  55. # 移除bottom key的过期时间,将其转换为永久状态
  56. redis_helper.persist_key(key_name=config_.BOTTOM_KEY_NAME)
  57. log_.info('{} update bottom videos success!, video nums = {}'.format(now_date, len(videos)))
  58. # 获取今日兜底视频的json,并存入redis
  59. video_json_list = []
  60. for i in range(0, len(video_id_list)//10):
  61. video_json = get_video_info_json(video_ids=video_id_list[i*10:(i+1)*10])
  62. if video_json is not None:
  63. print(len(video_json))
  64. video_json_list.extend(video_json)
  65. # 写入redis,先删除key,再重新写入
  66. redis_helper.del_keys(config_.BOTTOM_JSON_KEY_NAME)
  67. redis_helper.add_data_with_set(key_name=config_.BOTTOM_JSON_KEY_NAME, values=video_json_list)
  68. # 移除过期时间,将其转换为永久状态
  69. redis_helper.persist_key(key_name=config_.BOTTOM_JSON_KEY_NAME)
  70. log_.info('{} update bottom videos info json success!, video nums = {}'.format(now_date, len(video_json_list)))
  71. except Exception as e:
  72. log_.error(traceback.format_exc())
  73. def get_video_info_json(video_ids):
  74. """
  75. 获取视频对应json
  76. :param video_ids: type-list [int, int, ...]
  77. :return: json_data_list
  78. """
  79. request_data = {
  80. "appType": 4,
  81. "platform": "android",
  82. "versionCode": 295,
  83. "pageSize": 10,
  84. "machineCode": "weixin_openid_otjoB5WWWmkRjpMzkV5ltZ3osg3A",
  85. "uid": 6281917,
  86. "videoIds": video_ids
  87. }
  88. res = request_post(request_url=config_.BOTTOM_JSON_URL, request_data=request_data)
  89. if res is None:
  90. return None
  91. if res['code'] != 0:
  92. log_.info('获取视频json失败!')
  93. return None
  94. json_data_list = [json.dumps(item) for item in res['data']]
  95. return json_data_list
  96. if __name__ == '__main__':
  97. update_bottom_videos()