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 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 451 JSONObject object = new JSONObject();
452 452 object.put("coverUrl", null);
453 453 object.put("playbackUrl", null);
  454 + if (CollectionUtils.isEmpty(collect))
  455 + return object;
454 456 final String accountNo = dbLive.getPhoneNo();
455 457 final Double liveDuration = dbLive.getDuration();// 数据接口返回直播时长
456 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 477 final double timeSubAbs = Math.abs(liveDuration - duration);
465 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 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 495 return object;
494 496 }
... ...
src/main/java/cn/fw/freya/task/DataCaptureTask.java
... ... @@ -99,8 +99,9 @@ public class DataCaptureTask {
99 99 */
100 100 @Scheduled(fixedRate = 2 * 60 * 1000, initialDelay = 5000)
101 101 public void captureLivePlayback() {
  102 + Double durationThreshold = 60d;// 设置直播时长阈值
102 103 final Random random = new Random();
103   - List<LivePool> withoutPlaybackLive = common.getWithoutPlaybackLive(1, 60d)
  104 + List<LivePool> withoutPlaybackLive = common.getWithoutPlaybackLive(1, durationThreshold)
104 105 .stream()
105 106 .filter(item -> 0 <= item.getGetPlaybackFailTimes() && item.getGetPlaybackFailTimes() < 30)
106 107 .collect(Collectors.toList());// 找到直播时长>60分钟, 失败次数<30的直播数据
... ... @@ -119,11 +120,15 @@ public class DataCaptureTask {
119 120 final List<JSONObject> playbackMsg = this.getPlaybackMsg(account);// 获取该人的直播回放信息
120 121 boolean flag = false;
121 122 for (LivePool item : list) {
122   - JSONObject obj = kuaiShouCrawl.setPlaybackUrl(item, playbackMsg);
  123 + JSONObject obj = kuaiShouCrawl.setPlaybackUrl(item, playbackMsg, durationThreshold);
123 124 String playbackUrl = obj.getString("playbackUrl");
  125 + Boolean hasInvalidPlayback = obj.getBoolean("hasInvalidPlayback");
124 126 final LivePool livePool = PublicUtil.copy(item, LivePool.class);// 对象拷贝
125 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 132 } else {
128 133 flag = true;
129 134 livePool.setRoomCoverImage(obj.getString("coverUrl"));
... ...