|
@@ -0,0 +1,87 @@
|
|
|
+package com.tzld.piaoquan.recommend.server.service.filter.strategy;
|
|
|
+
|
|
|
+import com.google.common.hash.Hashing;
|
|
|
+import com.tzld.piaoquan.recommend.server.common.enums.AppTypeEnum;
|
|
|
+import com.tzld.piaoquan.recommend.server.service.PreViewedService;
|
|
|
+import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
|
|
|
+import com.tzld.piaoquan.recommend.server.service.filter.FilterStrategy;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author dyp
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class AllowListStrategy implements FilterStrategy {
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate<String, String> redisTemplate;
|
|
|
+
|
|
|
+ private static final String VIDEO_ALLOW_LIST_BITMAP_KEY_PREFIX = "movie:videoid:allowlist:";
|
|
|
+ private static final String VIDEO_ALLOW_LIST_BITMAP_KEY_SET_PREFIX = "movie:videoid:allowSet:";
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Long> filter(FilterParam param) {
|
|
|
+
|
|
|
+ if (param == null
|
|
|
+ || CollectionUtils.isEmpty(param.getVideoIds()) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ //不是新小程序 在白名单则不显示
|
|
|
+ if (param.getAppType() != AppTypeEnum.WAN_NENG_VIDEO.getCode()
|
|
|
+ && param.getAppType() != AppTypeEnum.LAO_HAO_KAN_VIDEO.getCode()
|
|
|
+ && param.getAppType() != AppTypeEnum.ZUI_JING_QI.getCode()
|
|
|
+ && param.getAppType() != AppTypeEnum.H5.getCode()) {
|
|
|
+
|
|
|
+ Iterator<Long> iterator = videoIds.iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ Long videoId = iterator.next();
|
|
|
+ //如果在白名单 则移除
|
|
|
+ if (movieStoreMpService.isMemberOfAllowList(videoId)) {
|
|
|
+ iterator.remove();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (param.getAppType() != AppTypeEnum.WAN_NENG_VIDEO.getCode()
|
|
|
+ && param.getAppType() != AppTypeEnum.LAO_HAO_KAN_VIDEO.getCode()
|
|
|
+ && param.getAppType() != AppTypeEnum.ZUI_JING_QI.getCode()
|
|
|
+ && param.getAppType() != AppTypeEnum.H5.getCode()) {
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ Long videoId = iterator.next();
|
|
|
+ //如果在宗教白名单 则移除
|
|
|
+ if (movieStoreMpService.isMemberOfReligionVideoAllowList(videoId)) {
|
|
|
+ iterator.remove();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return videoIds;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO 未找到优化方法 暂时保留源代码
|
|
|
+ private boolean isMemberOfVideoAllowList(Long videoId) {
|
|
|
+ if (Objects.isNull(videoId)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ int newIdx = Math.abs(Hashing.murmur3_32().hashLong(videoId).asInt()) % 100;
|
|
|
+ String newPrefix = VIDEO_ALLOW_LIST_BITMAP_KEY_SET_PREFIX + newIdx;
|
|
|
+ Boolean result = redisTemplate.opsForSet().isMember(newPrefix, videoId);
|
|
|
+ // 兼容旧 key
|
|
|
+ if (Objects.equals(1, mvalCompatible) && !result) {
|
|
|
+ int idx = Math.abs(Hashing.murmur3_32().hashLong(videoId).asInt()) % 10;
|
|
|
+ result = redisUtils.getBit(VIDEO_ALLOW_LIST_BITMAP_KEY_PREFIX + idx, videoId);
|
|
|
+ }
|
|
|
+ if (Objects.equals(1, mvalCompatible) && !result) {
|
|
|
+ result = redisUtils.getBit(VIDEO_ALLOW_LIST_BITMAP_KEY, videoId);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ LOGGER.error("isMemberOfVideoAllowList error {}", videoId, e);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|