浏览代码

更新 recommend 相关接口

reghao 11 月之前
父节点
当前提交
a0c1230034

+ 1 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/db/mapper/VideoPostTagMapper.java

@@ -16,4 +16,5 @@ import java.util.List;
 public interface VideoPostTagMapper extends BaseMapper<VideoPostTag> {
     int countVideosByTag(String tagId);
     List<String> findVideosByPage(Page page, String tagId, List<Integer> scopes);
+    List<String> findVideoTags(String videoId);
 }

+ 2 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/RecommendServiceImpl.java

@@ -13,11 +13,10 @@ import cn.reghao.tnb.content.app.vod.model.query.VideoQuery;
 import cn.reghao.tnb.content.app.vod.service.ContentPermission;
 import cn.reghao.tnb.content.app.vod.service.RecommendService;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
-import cn.reghao.tnb.content.app.vod.service.rcmd.RcmdData;
-import cn.reghao.tnb.content.app.vod.service.rcmd.RcmdProducer;
+import cn.reghao.tnb.content.app.vod.service.rcmd.task.RcmdData;
+import cn.reghao.tnb.content.app.vod.service.rcmd.task.RcmdProducer;
 import cn.reghao.tnb.content.app.vod.service.rcmd.RedisKeys;
 import cn.reghao.tnb.content.app.vod.service.rcmd.UserInterestBased;
-import cn.reghao.tnb.content.app.util.redis.RedisKey;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisHash;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisSet;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisSortedSet;

+ 26 - 23
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPlayServiceImpl.java

@@ -10,19 +10,24 @@ import cn.reghao.tnb.content.api.dto.VideoUrl;
 import cn.reghao.tnb.content.api.dto.VideoUrls;
 import cn.reghao.tnb.content.app.vod.db.mapper.PlayRecordMapper;
 import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostMapper;
+import cn.reghao.tnb.content.app.vod.db.mapper.VideoPostTagMapper;
 import cn.reghao.tnb.content.app.vod.db.repository.VideoRepository;
 import cn.reghao.tnb.content.app.vod.model.po.PlayRecord;
 import cn.reghao.tnb.content.app.vod.model.po.VideoPost;
 import cn.reghao.tnb.content.api.dto.VideoRecordCard;
+import cn.reghao.tnb.content.app.vod.service.ContentPermission;
 import cn.reghao.tnb.content.app.vod.service.VideoPlayService;
+import cn.reghao.tnb.content.app.vod.service.rcmd.UserInterestBased;
 import cn.reghao.tnb.message.api.dto.MediaProgress;
 import cn.reghao.tnb.user.api.dto.UserCard;
 import cn.reghao.tnb.user.api.iface.UserService;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -40,12 +45,19 @@ public class VideoPlayServiceImpl implements VideoPlayService {
     private final VideoPostMapper videoPostMapper;
     private final PlayRecordMapper playRecordMapper;
     private final VideoRepository videoRepository;
+    private final VideoPostTagMapper videoPostTagMapper;
+    private final UserInterestBased userInterestBased;
+    private final ContentPermission contentPermission;
 
     public VideoPlayServiceImpl(VideoPostMapper videoPostMapper, PlayRecordMapper playRecordMapper,
-                                VideoRepository videoRepository) {
+                                VideoRepository videoRepository, VideoPostTagMapper videoPostTagMapper,
+                                UserInterestBased userInterestBased, ContentPermission contentPermission) {
         this.videoPostMapper = videoPostMapper;
         this.playRecordMapper = playRecordMapper;
         this.videoRepository = videoRepository;
+        this.videoPostTagMapper = videoPostTagMapper;
+        this.userInterestBased = userInterestBased;
+        this.contentPermission = contentPermission;
     }
 
     public VideoUrls getVideoPlayData(String videoId) {
@@ -55,7 +67,6 @@ public class VideoPlayServiceImpl implements VideoPlayService {
             currentTime = getCurrentTime(loginUser, videoId);
         }
 
-        // TODO 判断当前请求是否具备访问 video 需要的权限
         VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
         String videoFileId = videoPost.getVideoFileId();
         List<VideoUrlDto> list = videoRepository.findVideoUrls(videoFileId);
@@ -65,6 +76,12 @@ public class VideoPlayServiceImpl implements VideoPlayService {
 
         String urlType = list.get(0).getType();
         int scope = videoPost.getScope();
+        Set<Integer> userScopes = new HashSet<>(contentPermission.getUserScopes());
+        // 判断当前请求是否具备访问 video 需要的权限
+        if (!userScopes.contains(scope)) {
+            return new VideoUrls();
+        }
+
         if (scope != PostScope.PUBLIC.getCode()) {
             int channelId = videoPost.getChannelId();
             try {
@@ -93,27 +110,6 @@ public class VideoPlayServiceImpl implements VideoPlayService {
         }
     }
 
-    /*public VideoUrls getVideoPlayData1(String videoId) {
-        double currentTime = 0.0;
-        long loginUser = UserContext.getUser();
-        if (loginUser != -1) {
-            currentTime = getCurrentTime(loginUser, videoId);
-        }
-
-        VideoPost videoPost = videoPostMapper.findByVideoId(videoId);
-        Integer channelId = videoPost.getChannelId();
-        String videoFileId = videoPost.getVideoFileId();
-        String signedUrl = aliService.getSignedUrl(videoFileId);
-        if (signedUrl == null) {
-            return new VideoUrls();
-        }
-
-        String quality = "720p";
-        List<VideoUrl> videoUrls = List.of(new VideoUrl(quality, signedUrl));
-        VideoUrls videoUrlsRet = new VideoUrls(currentTime, VideoUrlType.mp4.name(), videoUrls);
-        return videoUrlsRet;
-    }*/
-
     private Double getCurrentTime(long userId, String videoId) {
         Double currentTime = playRecordMapper.findCurrentTime(userId, videoId);
         return currentTime != null ? currentTime : 0.0;
@@ -136,6 +132,13 @@ public class VideoPlayServiceImpl implements VideoPlayService {
             playRecord.setEnded(ended);
             playRecordMapper.update(playRecord);
         }
+
+        addUserInterest(userId, videoId);
+    }
+
+    private void addUserInterest(long userId, String videoId) {
+        List<String> tagIds = videoPostTagMapper.findVideoTags(videoId);
+        tagIds.forEach(tagId -> userInterestBased.addUserInterests(userId, tagId));
     }
 
     public PageScroll<VideoRecordCard> getPlayRecord(long nextId, long userId) {

+ 0 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/impl/VideoPostQueryImpl.java

@@ -140,7 +140,6 @@ public class VideoPostQueryImpl implements VideoPostQuery {
     }
 
     private PageList<VideoCard> getVideoCardsByUserGroup(VideoQuery videoQuery, int pageNumber) {
-        // int total = videoPostMapper.countByCriteriaAndUserGroup(videoQuery).size();
         int total = videoCategoryPostMapper.countByCriteria(videoQuery);
         if (total > pageSize*100) {
             total = pageSize*100;
@@ -152,14 +151,12 @@ public class VideoPostQueryImpl implements VideoPostQuery {
         }
 
         Page page = new Page(pageNumber, pageSize);
-        //List<VideoPostCard> list = videoPostMapper.findCriteriaAndUserGroupByPage(page, videoQuery);
         List<VideoCategoryPost> list0 = videoCategoryPostMapper.findVideoCategoryPostByPage(page, videoQuery);
         List<String> videoIds = list0.stream().map(VideoCategoryPost::getVideoId).collect(Collectors.toList());
         List<VideoPostCard> list = videoPostMapper.findVideoCardByVideoIds(videoIds);
         List<VideoCard> list1 = list.stream()
                 .map(videoPostCard -> getVideoCard(videoPostCard, true))
                 .collect(Collectors.toList());
-
         return PageList.pageList(pageNumber, pageSize, total, list1);
     }
 
@@ -194,8 +191,6 @@ public class VideoPostQueryImpl implements VideoPostQuery {
             videoQuery = new VideoQuery.Builder().scope(scopes).userId(userId).build();
         }
 
-        /*VideoQuery videoQuery = new VideoQuery.Builder().scope(scopes).userId(userId).build();
-        VideoQuery videoQuery1 = new VideoQuery.Builder().userId(userId).build();*/
         return getVideoCards(videoQuery, page, false);
     }
 

+ 2 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/RcmdConsumer.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/task/RcmdConsumer.java

@@ -1,11 +1,11 @@
-package cn.reghao.tnb.content.app.vod.service.rcmd;
+package cn.reghao.tnb.content.app.vod.service.rcmd.task;
 
 import cn.reghao.jutil.jdk.thread.ThreadPoolWrapper;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisList;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisSet;
 import cn.reghao.tnb.content.app.vod.service.ContentPermission;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
-import cn.reghao.tnb.content.app.vod.service.rcmd.task.RcmdTask;
+import cn.reghao.tnb.content.app.vod.service.rcmd.UserInterestBased;
 import cn.reghao.tnb.user.api.iface.UserService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;

+ 1 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/RcmdData.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/task/RcmdData.java

@@ -1,4 +1,4 @@
-package cn.reghao.tnb.content.app.vod.service.rcmd;
+package cn.reghao.tnb.content.app.vod.service.rcmd.task;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

+ 1 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/RcmdProducer.java → content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/task/RcmdProducer.java

@@ -1,4 +1,4 @@
-package cn.reghao.tnb.content.app.vod.service.rcmd;
+package cn.reghao.tnb.content.app.vod.service.rcmd.task;
 
 import org.springframework.stereotype.Component;
 

+ 12 - 5
content/content-service/src/main/java/cn/reghao/tnb/content/app/vod/service/rcmd/task/RcmdTask.java

@@ -5,7 +5,6 @@ import cn.reghao.tnb.content.app.util.redis.ds.RedisList;
 import cn.reghao.tnb.content.app.util.redis.ds.RedisSet;
 import cn.reghao.tnb.content.app.vod.service.ContentPermission;
 import cn.reghao.tnb.content.app.vod.service.VideoPostQuery;
-import cn.reghao.tnb.content.app.vod.service.rcmd.RcmdData;
 import cn.reghao.tnb.content.app.vod.service.rcmd.RedisKeys;
 import cn.reghao.tnb.content.app.vod.service.rcmd.UserInterestBased;
 import lombok.extern.slf4j.Slf4j;
@@ -51,15 +50,23 @@ public class RcmdTask implements Runnable {
         List<Integer> userScopes = contentPermission.getUserScopes(loginUser);
         long start = System.currentTimeMillis();
         try {
-            List<String> tagIds = videoPostQuery.getRandomTags(1000);
-            for (String tagId : tagIds) {
-                userInterestBased.addUserInterests(loginUser, tagId);
+            Set<String> interestTagIds = userInterestBased.getUserInterestCategory(loginUser);
+            if (interestTagIds.size() < 1000) {
+                List<String> tagIds = videoPostQuery.getRandomTags(100);
+                for (String tagId : tagIds) {
+                    userInterestBased.addUserInterests(loginUser, tagId);
+                }
             }
+            Set<String> interestItems = userInterestBased.getUserInterestItems(loginUser);
+            List<String> videoIds1 = new ArrayList<>(interestItems);
 
-            String itemsKey = RedisKeys.getUserItemKey(loginUser);
             List<String> videoIds = videoPostQuery.getRandomVideoIds(userScopes, size);
             if (!videoIds.isEmpty()) {
+                if (mode == 1) {
+                }
                 List<VideoCard> videoCards = videoPostQuery.getVideoCards(videoIds);
+
+                String itemsKey = RedisKeys.getUserItemKey(loginUser);
                 VideoCard[] arr = videoCards.toArray(new VideoCard[0]);
                 redisSet.sadd(itemsKey, arr);
             }

+ 5 - 0
content/content-service/src/main/resources/mapper/vod/VideoPostTagMapper.xml

@@ -35,4 +35,9 @@
             #{id}
         </foreach>
     </select>
+    <select id="findVideoTags" resultType="java.lang.String">
+        select tag_id
+        from vod_video_tags
+        where video_id=#{videoId}
+    </select>
 </mapper>