Commit 7ae97ee4dd6e3727b55d55b843ffd818a051155d

Authored by 王明元
1 parent b6a90a52

2022年5月27日14:37:21 标记有直播回放数据但是回放未匹配上昨天直播的项

src/main/java/cn/fw/freya/service/crawl/impl/KuaiShouCrawl.java
@@ -447,48 +447,50 @@ public class KuaiShouCrawl implements CrawlStrategy { @@ -447,48 +447,50 @@ public class KuaiShouCrawl implements CrawlStrategy {
447 return livePoolList; 447 return livePoolList;
448 } 448 }
449 449
450 - public JSONObject setPlaybackUrl(LivePool dbLive, List<JSONObject> collect) { 450 + public JSONObject setPlaybackUrl(LivePool dbLive, List<JSONObject> collect, Double durationThreshold) {
451 JSONObject object = new JSONObject(); 451 JSONObject object = new JSONObject();
452 object.put("coverUrl", null); 452 object.put("coverUrl", null);
453 object.put("playbackUrl", null); 453 object.put("playbackUrl", null);
  454 + if (CollectionUtils.isEmpty(collect))
  455 + return object;
454 final String accountNo = dbLive.getPhoneNo(); 456 final String accountNo = dbLive.getPhoneNo();
455 final Double liveDuration = dbLive.getDuration();// 数据接口返回直播时长 457 final Double liveDuration = dbLive.getDuration();// 数据接口返回直播时长
456 final Long liveStartTimeStamp = dbLive.getOpenTime().getTime();// 数据接口返回开播时间戳 458 final Long liveStartTimeStamp = dbLive.getOpenTime().getTime();// 数据接口返回开播时间戳
457 - if (liveDuration >= 60) {// 直播时长大于等于60分钟才记录回放信息  
458 - if (!CollectionUtils.isEmpty(collect)) {  
459 - JSONObject playbackMsg;  
460 - if (Objects.equals(collect.size(), 1)) {  
461 - playbackMsg = collect.get(0);  
462 - Double duration = playbackMsg.getDouble("duration");// 回放信息返回直播时长  
463 - final Long startTimeStamp = playbackMsg.getLong("startTime");// 回放信息返回直播开始时间戳 459 + if (liveDuration >= durationThreshold) {// 直播时长大于等于durationThreshold指定的分钟才记录回放信息
  460 + JSONObject playbackMsg;
  461 + if (Objects.equals(collect.size(), 1)) {
  462 + playbackMsg = collect.get(0);
  463 + Double duration = playbackMsg.getDouble("duration");// 回放信息返回直播时长
  464 + final Long startTimeStamp = playbackMsg.getLong("startTime");// 回放信息返回直播开始时间戳
  465 + final double timeSubAbs = Math.abs(liveDuration - duration);
  466 + final double liveStartSub = BigDecimal.valueOf(Math.abs(liveStartTimeStamp - startTimeStamp)).divide(BigDecimal.valueOf(60 * 1000), 1, RoundingMode.HALF_UP).doubleValue();
  467 + // (Objects.equals(liveDuration, duration) || (timeSubAbs < 5))->说明时长几乎相等
  468 + // (liveStartSub < 2)->说明开播时间几乎一样
  469 + if (!((Objects.equals(liveDuration, duration) || (timeSubAbs < 5)) && liveStartSub < 10)) {
  470 + playbackMsg = null;
  471 + log.info(String.format("%s [%s]平台账户号为: %s的直播回放数据不匹配!!!", LocalDateTime.now(), this.getType().getName(), accountNo));
  472 + }
  473 + } else {
  474 + List<JSONObject> collect1 = collect.stream().filter(item1 -> {
  475 + Double duration = item1.getDouble("duration");
  476 + final Long startTimeStamp = item1.getLong("startTime");// 回放信息返回直播开始时间戳
464 final double timeSubAbs = Math.abs(liveDuration - duration); 477 final double timeSubAbs = Math.abs(liveDuration - duration);
465 final double liveStartSub = BigDecimal.valueOf(Math.abs(liveStartTimeStamp - startTimeStamp)).divide(BigDecimal.valueOf(60 * 1000), 1, RoundingMode.HALF_UP).doubleValue(); 478 final double liveStartSub = BigDecimal.valueOf(Math.abs(liveStartTimeStamp - startTimeStamp)).divide(BigDecimal.valueOf(60 * 1000), 1, RoundingMode.HALF_UP).doubleValue();
466 - // (Objects.equals(liveDuration, duration) || (timeSubAbs < 5))->说明时长几乎相等  
467 - // (liveStartSub < 2)->说明开播时间几乎一样  
468 - if (!((Objects.equals(liveDuration, duration) || (timeSubAbs < 5)) && liveStartSub < 10)) {  
469 - playbackMsg = null;  
470 - log.info(String.format("%s [%s]平台账户号为: %s的直播回放数据不匹配!!!", LocalDateTime.now(), this.getType().getName(), accountNo));  
471 - } 479 + return (Objects.equals(liveDuration, duration) || timeSubAbs < 5) && liveStartSub < 10;
  480 + }).collect(Collectors.toList());
  481 + if (Objects.equals(collect1.size(), 1)) {
  482 + playbackMsg = collect1.get(0);
472 } else { 483 } else {
473 - List<JSONObject> collect1 = collect.stream().filter(item1 -> {  
474 - Double duration = item1.getDouble("duration");  
475 - final Long startTimeStamp = item1.getLong("startTime");// 回放信息返回直播开始时间戳  
476 - final double timeSubAbs = Math.abs(liveDuration - duration);  
477 - final double liveStartSub = BigDecimal.valueOf(Math.abs(liveStartTimeStamp - startTimeStamp)).divide(BigDecimal.valueOf(60 * 1000), 1, RoundingMode.HALF_UP).doubleValue();  
478 - return (Objects.equals(liveDuration, duration) || timeSubAbs < 5) && liveStartSub < 10;  
479 - }).collect(Collectors.toList());  
480 - if (Objects.equals(collect1.size(), 1)) {  
481 - playbackMsg = collect1.get(0);  
482 - } else {  
483 - playbackMsg = null;  
484 - log.info(String.format("%s [%s]平台账户号为: %s的直播找到多条回放数据!!!", LocalDateTime.now(), this.getType().getName(), accountNo));  
485 - }  
486 - }  
487 - if (Objects.nonNull(playbackMsg)) {  
488 - object.put("coverUrl", playbackMsg.getString("coverUrl"));  
489 - object.put("playbackUrl", this.playbackBaseUrl + playbackMsg.getString("productId")); 484 + playbackMsg = null;
  485 + log.info(String.format("%s [%s]平台账户号为: %s的直播找到多条回放数据!!!", LocalDateTime.now(), this.getType().getName(), accountNo));
490 } 486 }
491 } 487 }
  488 + if (Objects.nonNull(playbackMsg)) {
  489 + object.put("coverUrl", playbackMsg.getString("coverUrl"));
  490 + object.put("playbackUrl", this.playbackBaseUrl + playbackMsg.getString("productId"));
  491 + } else {
  492 + object.put("hasInvalidPlayback", true);
  493 + }
492 } 494 }
493 return object; 495 return object;
494 } 496 }
src/main/java/cn/fw/freya/task/DataCaptureTask.java
@@ -99,8 +99,9 @@ public class DataCaptureTask { @@ -99,8 +99,9 @@ public class DataCaptureTask {
99 */ 99 */
100 @Scheduled(fixedRate = 2 * 60 * 1000, initialDelay = 5000) 100 @Scheduled(fixedRate = 2 * 60 * 1000, initialDelay = 5000)
101 public void captureLivePlayback() { 101 public void captureLivePlayback() {
  102 + Double durationThreshold = 60d;// 设置直播时长阈值
102 final Random random = new Random(); 103 final Random random = new Random();
103 - List<LivePool> withoutPlaybackLive = common.getWithoutPlaybackLive(1, 60d) 104 + List<LivePool> withoutPlaybackLive = common.getWithoutPlaybackLive(1, durationThreshold)
104 .stream() 105 .stream()
105 .filter(item -> 0 <= item.getGetPlaybackFailTimes() && item.getGetPlaybackFailTimes() < 30) 106 .filter(item -> 0 <= item.getGetPlaybackFailTimes() && item.getGetPlaybackFailTimes() < 30)
106 .collect(Collectors.toList());// 找到直播时长>60分钟, 失败次数<30的直播数据 107 .collect(Collectors.toList());// 找到直播时长>60分钟, 失败次数<30的直播数据
@@ -119,11 +120,15 @@ public class DataCaptureTask { @@ -119,11 +120,15 @@ public class DataCaptureTask {
119 final List<JSONObject> playbackMsg = this.getPlaybackMsg(account);// 获取该人的直播回放信息 120 final List<JSONObject> playbackMsg = this.getPlaybackMsg(account);// 获取该人的直播回放信息
120 boolean flag = false; 121 boolean flag = false;
121 for (LivePool item : list) { 122 for (LivePool item : list) {
122 - JSONObject obj = kuaiShouCrawl.setPlaybackUrl(item, playbackMsg); 123 + JSONObject obj = kuaiShouCrawl.setPlaybackUrl(item, playbackMsg, durationThreshold);
123 String playbackUrl = obj.getString("playbackUrl"); 124 String playbackUrl = obj.getString("playbackUrl");
  125 + Boolean hasInvalidPlayback = obj.getBoolean("hasInvalidPlayback");
124 final LivePool livePool = PublicUtil.copy(item, LivePool.class);// 对象拷贝 126 final LivePool livePool = PublicUtil.copy(item, LivePool.class);// 对象拷贝
125 if (Objects.isNull(playbackUrl)) { 127 if (Objects.isNull(playbackUrl)) {
126 - livePool.setGetPlaybackFailTimes(livePool.getGetPlaybackFailTimes() + 1); 128 + if (hasInvalidPlayback)
  129 + livePool.setGetPlaybackFailTimes(-2);// 表示拿到回放数据, 但是没有和昨天直播匹配的回放
  130 + else
  131 + livePool.setGetPlaybackFailTimes(livePool.getGetPlaybackFailTimes() + 1);
127 } else { 132 } else {
128 flag = true; 133 flag = true;
129 livePool.setRoomCoverImage(obj.getString("coverUrl")); 134 livePool.setRoomCoverImage(obj.getString("coverUrl"));