ソースを参照

add top videos

liqian 3 年 前
コミット
62d0ab1b25
3 ファイル変更65 行追加10 行削除
  1. 5 2
      config.py
  2. 1 1
      recommend.py
  3. 59 7
      video_recall.py

+ 5 - 2
config.py

@@ -47,6 +47,9 @@ class BaseConfig(object):
     # 兜底视频redis存储key
     BOTTOM_KEY_NAME = 'com.weiqu.video.bottom'
 
+    # 生效中的置顶视频列表 redis key
+    TOP_VIDEO_LIST_KEY_NAME = 'com.weiqu.video.top.item.score.area'
+
     # rov召回池更新时间
     ROV_UPDATE_H = 6
     ROV_UPDATE_MINUTE = 30
@@ -170,6 +173,6 @@ class ProductionConfig(BaseConfig):
 
 def set_config():
     # return DevelopmentConfig()
-    # return TestConfig()
+    return TestConfig()
     # return PreProductionConfig()
-    return ProductionConfig()
+    # return ProductionConfig()

+ 1 - 1
recommend.py

@@ -87,7 +87,7 @@ def video_recommend(mid, uid, size, app_type, algo_type):
         log_.info('preview redis update success!')
 
     # 将此次获取的ROV召回池config_.K末位视频id同步刷新到Redis中,方便下次快速定位到召回位置,过期时间为1天
-    rov_recall_video = [item['videoId'] for item in rank_result if item['pushFrom'] == 'recall_pool']
+    rov_recall_video = [item['videoId'] for item in rank_result[:3] if item['pushFrom'] == 'recall_pool']
     if 0 < len(rov_recall_video) <= config_.K:
         if not redis_helper.get_score_with_value(key_name=config_.UPDATE_ROV_KEY_NAME, value=rov_recall_video[-1]):
             redis_helper.set_data_to_redis(key_name=last_rov_recall_key, value=rov_recall_video[-1])

+ 59 - 7
video_recall.py

@@ -32,9 +32,19 @@ class PoolRecall(object):
         """从ROV召回池中获取视频"""
         log_.info('====== rov pool recall')
 
+        # 获取生效中的置顶视频
+        top_video_ids, top_video_result = self.get_top_videos()
+        log_.info('top video result = {}'.format(top_video_ids))
+
         # 获取修改过rov的视频
         update_rov_video_ids, update_rov_result = self.get_update_rov_videos()
         log_.info('update rov result = {}'.format(update_rov_video_ids))
+        # 与置顶视频去重
+        update_rov_video_ids_dup, update_rov_dup_result = [], []
+        for item in update_rov_result:
+            if item['videoId'] not in top_video_ids:
+                update_rov_video_ids_dup.append(item['videoId'])
+                update_rov_dup_result.append(item)
 
         # 获取相关redis key, 用户上一次在rov召回池对应的位置
         rov_pool_key, last_rov_recall_key, idx = self.get_video_last_idx()
@@ -68,18 +78,17 @@ class PoolRecall(object):
             video_score = {}
             for value in data:
                 video_id = int(value[0])
-                if video_id in update_rov_video_ids:
+                # 视频id在 生效中的置顶视频 或 修改过rov的视频 中,跳过
+                if video_id in update_rov_video_ids_dup or video_id in top_video_ids:
                     continue
                 video_ids.append(video_id)
                 video_score[video_id] = value[1]
             # 过滤
-            debug_tm_b = time.time()
             filter_ = FilterVideos(app_type=self.app_type, mid=self.mid, uid=self.uid, video_ids=video_ids)
             ge = gevent.spawn(filter_.filter_videos)
             ge.join()
             filtered_result = ge.get()
             # filtered_result = filter_.filter_videos()
-            debug_tm_e = time.time()
 
             if filtered_result:
                 # 添加视频源参数 pushFrom, abCode
@@ -92,10 +101,12 @@ class PoolRecall(object):
                 self.redis_helper.set_data_to_redis(key_name=last_rov_recall_key, value=data[-1][0])
             idx += get_size
 
-        # 被修改rov视频、rov召回池视频 归并排序
-        if update_rov_result:
-            rov_pool_recall_result.extend(update_rov_result)
-            rov_pool_recall_result.sort(key=lambda x: x.get('rovScore', 0), reverse=True)
+        # 生效中的置顶视频、被修改rov视频、rov召回池视频 归并排序
+        if top_video_result:
+            rov_pool_recall_result.extend(top_video_result)
+        if update_rov_dup_result:
+            rov_pool_recall_result.extend(update_rov_dup_result)
+        rov_pool_recall_result.sort(key=lambda x: x.get('rovScore', 0), reverse=True)
         return rov_pool_recall_result[:size]
 
     def flow_pool_recall(self, size=10):
@@ -355,4 +366,45 @@ class PoolRecall(object):
             log_.error(traceback.format_exc())
             return [], []
 
+    def get_top_videos(self):
+        """
+        获取置顶视频
+        :return: top_video_ids, top_video_result
+        """
+        try:
+            # 获取生效中的置顶视频列表
+            redis_helper = RedisHelper()
+            data = redis_helper.get_data_from_redis(key_name=config_.TOP_VIDEO_LIST_KEY_NAME)
+            if data is None:
+                return [], []
+            # 获取视频id,并转换类型为int,将videoId和score做mapping,并存储为key-value{videoId: score}
+            video_ids = []
+            video_info = {}
+            for item in eval(data):
+                video_id = int(item['videoId'])
+                video_ids.append(video_id)
+                video_info[video_id] = {'score': item['score'], 'area': item['area']}
+
+            # 过滤
+            filter_ = FilterVideos(app_type=self.app_type, video_ids=video_ids, mid=self.mid, uid=self.uid)
+            ge = gevent.spawn(filter_.filter_videos)
+            ge.join()
+            filtered_result = ge.get()
+
+            # 添加视频源参数 pushFrom = 'op_manual', abCode
+            top_video_ids, top_video_result = [], []
+            if not filtered_result:
+                return top_video_ids, top_video_result
+            for item in filtered_result:
+                video_id = int(item)
+                item_info = video_info.get(video_id)
+                if item_info is None:
+                    continue
+                top_video_ids.append(video_id)
+                top_video_result.append({'videoId': video_id, 'rovScore': item_info.get('score'),
+                                         'pushFrom': 'op_manual', 'abCode': self.ab_code})
+            return top_video_ids, top_video_result
 
+        except Exception as e:
+            log_.error(traceback.format_exc())
+            return [], []