utils.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import requests
  2. import json
  3. import time
  4. from db_helper import HologresHelper, RedisHelper
  5. from config import set_config
  6. from log import Log
  7. config_ = set_config()
  8. log_ = Log()
  9. def request_post(request_url, request_data):
  10. """
  11. post 请求 HTTP接口
  12. :param request_url: 接口URL
  13. :param request_data: 请求参数
  14. :return: res_data json格式
  15. """
  16. response = requests.post(url=request_url, json=request_data)
  17. if response.status_code == 200:
  18. res_data = json.loads(response.text)
  19. return res_data
  20. def get_videos_remain_view_count(app_type, videos):
  21. """
  22. 获取视频在流量池中的剩余可分发数
  23. :param app_type: 产品标识 type-int
  24. :param videos: 视频信息 (视频id, 流量池标记) type-list,[{'videoId': video_id, 'flowPool': flow_pool}, ...]
  25. :return: data type-list,[(video_id, flow_pool, view_count), ...]
  26. """
  27. if not videos:
  28. return []
  29. request_data = {'appType': app_type, 'videos': videos}
  30. result = request_post(request_url=config_.GET_REMAIN_VIEW_COUNT_URL, request_data=request_data)
  31. if result is None:
  32. return []
  33. if result['code'] != 0:
  34. log_.info('获取视频在流量池中的剩余可分发数失败')
  35. return []
  36. data = [(item['videoId'], item['flowPool'], item['viewCount']) for item in result['data']]
  37. return data
  38. class FilterVideos(object):
  39. """视频过滤"""
  40. def __init__(self, app_type, mid, uid, video_ids):
  41. """
  42. 初始化
  43. :param app_type: 产品标识 type-int
  44. :param mid: mid type-string
  45. :param uid: uid type-string
  46. :param video_ids: 需过滤的视频列表 type-list
  47. """
  48. self.app_type = app_type
  49. self.mid = mid
  50. self.uid = uid
  51. self.video_ids = video_ids
  52. def filter_videos(self):
  53. """视频过滤"""
  54. # 预曝光过滤
  55. st_pre = time.time()
  56. filtered_pre_result = self.filter_video_previewed(self.video_ids)
  57. et_pre = time.time()
  58. log_.info('filter by previewed: app_type = {}, result = {}, execute time = {}ms'.format(
  59. self.app_type, filtered_pre_result, (et_pre - st_pre) * 1000))
  60. if not filtered_pre_result:
  61. return None
  62. # 视频状态过滤
  63. st_status = time.time()
  64. filtered_status_result = self.filter_video_status(video_ids=filtered_pre_result)
  65. et_status = time.time()
  66. log_.info('filter by video status: result = {}, execute time = {}ms'.format(
  67. filtered_status_result, (et_status - st_status) * 1000))
  68. if not filtered_status_result:
  69. return None
  70. # 视频已曝光过滤
  71. st_viewed = time.time()
  72. filtered_viewed_result = self.filter_video_viewed(video_ids=filtered_status_result)
  73. et_viewed = time.time()
  74. log_.info('filter by viewed: app_type = {}, mid = {}, uid = {}, result = {}, execute time = {}ms'.format(
  75. self.app_type, self.mid, self.uid, filtered_viewed_result, (et_viewed - st_viewed) * 1000))
  76. if not filtered_viewed_result:
  77. return None
  78. else:
  79. return filtered_viewed_result
  80. def filter_video_previewed(self, video_ids):
  81. """
  82. 预曝光过滤
  83. :param video_ids: 需过滤的视频列表 type-list
  84. :return: filtered_videos 过滤后的列表 type-list
  85. """
  86. # 根据Redis缓存中的数据过滤
  87. redis_helper = RedisHelper()
  88. # key拼接
  89. key_name = config_.PREVIEW_KEY_PREFIX + '{}.{}'.format(self.app_type, self.mid)
  90. pe_videos_list = redis_helper.get_data_from_set(key_name)
  91. if not pe_videos_list:
  92. return video_ids
  93. pe_videos = [eval(video) for video in pe_videos_list]
  94. filtered_videos = [video_id for video_id in video_ids if video_id not in pe_videos]
  95. return filtered_videos
  96. def filter_video_status(self, video_ids):
  97. """
  98. 对视频状态进行过滤
  99. :param video_ids: 视频id列表 type-list
  100. :return: filtered_videos
  101. """
  102. sql = "SELECT video_id" \
  103. "FROM {}" \
  104. "WHERE audit_status = 5" \
  105. "AND applet_rec_status IN (1, 6)" \
  106. "AND open_status = 1" \
  107. "AND payment_status = 0" \
  108. "AND encryption_status is null" \
  109. "AND transcoding_status = 3" \
  110. "AND video_id IN {};".format(config_.VIDEO_STATUS, tuple(video_ids))
  111. hologres_helper = HologresHelper()
  112. data = hologres_helper.get_data(sql=sql)
  113. filtered_videos = [temp[0] for temp in data]
  114. return filtered_videos
  115. def filter_video_viewed(self, video_ids, types=(1,)):
  116. """
  117. 调用后端接口过滤用户已观看视频
  118. :param video_ids: 视频id列表 type-list
  119. :param types: 过滤参数 type-tuple, 默认(1, ) 1-已观看 2-视频状态 3-是否进入老年人社区 4-话题状态 5-推荐状态
  120. :return: filtered_videos
  121. """
  122. # 调用http接口
  123. request_data = {"appType": self.app_type,
  124. "mid": self.mid,
  125. "uid": self.uid,
  126. "types": list(types),
  127. "videoIds": video_ids}
  128. result = request_post(request_url=config_.VIDEO_FILTER_URL, request_data=request_data)
  129. if result['code'] != 0:
  130. log_.info('过滤失败,types: {}'.format(types))
  131. return video_ids
  132. filtered_videos = result['data']
  133. return filtered_videos
  134. if __name__ == '__main__':
  135. filter_ = FilterVideos(app_type=1, mid='22', uid='www', video_ids=[1, 2, 3, 55])
  136. filter_.filter_videos()
  137. filter_.filter_video_status(video_ids=[1, 3, 5])