From 3d00b45c7d8a396737beb709e78990318bcde2a2 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Fri, 17 Nov 2023 21:45:23 +0100 Subject: [PATCH] Fix recording size not properly being reported and transferred between server and client --- common/src/main/java/ctbrec/Recording.java | 2 +- common/src/main/java/ctbrec/recorder/RemoteRecorder.java | 9 ++++++++- .../java/ctbrec/recorder/download/AbstractDownload.java | 7 +++++++ .../java/ctbrec/recorder/download/RecordingProcess.java | 6 +----- .../recorder/download/hls/AbstractHlsDownload.java | 7 ++----- .../src/main/java/ctbrec/sites/camsoda/CamsodaModel.java | 2 +- 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/ctbrec/Recording.java b/common/src/main/java/ctbrec/Recording.java index 28525f24..4bc9fd8d 100644 --- a/common/src/main/java/ctbrec/Recording.java +++ b/common/src/main/java/ctbrec/Recording.java @@ -226,7 +226,7 @@ public class Recording implements Serializable { } else { long now = System.currentTimeMillis(); if (now - lastSizeUpdate > 2500) { - log.debug("full size update for {}", this); + log.trace("full size update for {}", this); sizeInByte = getSize(); lastSizeUpdate = now; } diff --git a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java index 7249904d..cb26d08c 100644 --- a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java +++ b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java @@ -397,7 +397,14 @@ public class RemoteRecorder implements Recorder { if (response.isSuccessful()) { RecordingListResponse resp = mapper.readValue(json, RecordingListResponse.class); if (resp.status.equals(SUCCESS)) { - List newRecordings = resp.recordings.stream().map(Mappers.getMapper(RecordingMapper.class)::toRecording).collect(Collectors.toList()); + List newRecordings = resp.recordings.stream() + .map(dto -> { + var rec = Mappers.getMapper(RecordingMapper.class).toRecording(dto); + rec.setSizeInByte(dto.getSizeInByte()); + rec.setLastSizeUpdate(Instant.now().toEpochMilli()); + return rec; + }) + .collect(Collectors.toList()); // fire changed events for (Recording recording : recordings) { if (newRecordings.contains(recording)) { diff --git a/common/src/main/java/ctbrec/recorder/download/AbstractDownload.java b/common/src/main/java/ctbrec/recorder/download/AbstractDownload.java index 6f248b99..356c66f2 100644 --- a/common/src/main/java/ctbrec/recorder/download/AbstractDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/AbstractDownload.java @@ -12,12 +12,14 @@ import java.time.Instant; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; +import java.util.concurrent.atomic.AtomicLong; import static ctbrec.recorder.download.StreamSource.UNKNOWN; @Slf4j public abstract class AbstractDownload implements RecordingProcess { + protected AtomicLong downloadedBytes = new AtomicLong(); protected Instant startTime; protected Instant rescheduleTime = Instant.now(); protected Model model = new UnknownModel(); @@ -112,4 +114,9 @@ public abstract class AbstractDownload implements RecordingProcess { } } } + + @Override + public AtomicLong getDownloadedBytes() { + return downloadedBytes; + } } diff --git a/common/src/main/java/ctbrec/recorder/download/RecordingProcess.java b/common/src/main/java/ctbrec/recorder/download/RecordingProcess.java index f9cdd020..f502a6b9 100644 --- a/common/src/main/java/ctbrec/recorder/download/RecordingProcess.java +++ b/common/src/main/java/ctbrec/recorder/download/RecordingProcess.java @@ -12,7 +12,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicLong; public interface RecordingProcess extends Callable { - AtomicLong downloadedBytes = new AtomicLong(); void init(Config config, Model model, Instant startTime, ExecutorService executorService) throws IOException; @@ -62,8 +61,5 @@ public interface RecordingProcess extends Callable { void awaitEnd(); - default AtomicLong getDownloadedBytes() { - return downloadedBytes; - } - + AtomicLong getDownloadedBytes(); } diff --git a/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java b/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java index e997c611..d2d76ec0 100644 --- a/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java @@ -44,7 +44,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicLong; import static ctbrec.io.HttpConstants.*; import static java.nio.charset.StandardCharsets.UTF_8; @@ -70,7 +69,6 @@ public abstract class AbstractHlsDownload extends AbstractDownload { private Instant beforeLastPlaylistRequest = Instant.EPOCH; private int consecutivePlaylistTimeouts = 0; private int consecutivePlaylistErrors = 0; - private final AtomicLong sizeInByte = new AtomicLong(); protected Instant lastSegmentDownload = Instant.MIN; private final List segmentErrorTimestamps = new LinkedList<>(); @@ -90,14 +88,13 @@ public abstract class AbstractHlsDownload extends AbstractDownload { @Override public long getSizeInByte() { - return sizeInByte.get(); + return getDownloadedBytes().get(); } protected abstract OutputStream getSegmentOutputStream(Segment segment) throws IOException; protected void segmentDownloadFinished(SegmentDownload segmentDownload) { // NOSONAR - long bytes = getDownloadedBytes().addAndGet(segmentDownload.size()); - sizeInByte.addAndGet(bytes); + getDownloadedBytes().addAndGet(segmentDownload.size()); lastSegmentDownload = Instant.now(); } diff --git a/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java b/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java index 0a0a9359..e5f6021a 100644 --- a/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java +++ b/common/src/main/java/ctbrec/sites/camsoda/CamsodaModel.java @@ -211,7 +211,7 @@ public class CamsodaModel extends AbstractModel { } else { try { List sources = getStreamSources(); - LOG.debug("stream sources {}", sources); + LOG.debug("{}:{} stream sources {}", getSite().getName(), getName(), sources); if (sources.isEmpty()) { return new int[]{0, 0}; } else {