From 19da3c43bfb666d6477e53470255c31edbe52cb4 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sat, 16 Jan 2021 15:05:28 +0100 Subject: [PATCH] Take into account all files of a recording to determine its size --- common/src/main/java/ctbrec/Recording.java | 47 +++++++++++--- .../ctbrec/recorder/NextGenLocalRecorder.java | 61 +++++++++++++------ 2 files changed, 81 insertions(+), 27 deletions(-) diff --git a/common/src/main/java/ctbrec/Recording.java b/common/src/main/java/ctbrec/Recording.java index f2ccc264..42be3998 100644 --- a/common/src/main/java/ctbrec/Recording.java +++ b/common/src/main/java/ctbrec/Recording.java @@ -3,6 +3,7 @@ package ctbrec; import static ctbrec.Recording.State.*; import java.io.File; +import java.io.IOException; import java.io.Serializable; import java.time.Duration; import java.time.Instant; @@ -13,6 +14,9 @@ import java.util.HashSet; import java.util.Optional; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import ctbrec.event.EventBusHolder; import ctbrec.event.RecordingStateChangedEvent; import ctbrec.io.IoUtils; @@ -20,6 +24,8 @@ import ctbrec.recorder.download.Download; import ctbrec.recorder.download.VideoLengthDetector; public class Recording implements Serializable { + private static final transient Logger LOG = LoggerFactory.getLogger(Recording.class); + private String id; private Model model; private transient Download download; @@ -239,22 +245,43 @@ public class Recording implements Serializable { } private long getSize() { - File rec = getAbsoluteFile(); - if (rec.isDirectory()) { - return IoUtils.getDirectorySize(rec); - } else { - if (!rec.exists()) { - if (rec.getName().endsWith(".m3u8")) { - return IoUtils.getDirectorySize(rec.getParentFile()); + try { + Set files = getAllRecordingFiles(); + long sum = 0; + for (File file : files) { + if (file.isDirectory()) { + sum += IoUtils.getDirectorySize(file); } else { - return -1; + if (!file.exists()) { + if (file.getName().endsWith(".m3u8")) { + sum += IoUtils.getDirectorySize(file.getParentFile()); + } + } else { + sum += file.length(); + } } - } else { - return rec.length(); } + return sum; + } catch (IOException e) { + LOG.error("Couldn't determine recording size", e); + return -1; } } + private Set getAllRecordingFiles() throws IOException { + Set files = new HashSet<>(); + if (absoluteFile != null) { + files.add(absoluteFile.getCanonicalFile()); + } + if (postProcessedFile != null) { + files.add(postProcessedFile.getCanonicalFile()); + } + for (String associatedFile : associatedFiles) { + files.add(new File(associatedFile).getCanonicalFile()); + } + return files; + } + public void refresh() { sizeInByte = getSize(); } diff --git a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java index 7af9a570..d595f437 100644 --- a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java @@ -1,17 +1,7 @@ package ctbrec.recorder; -import com.google.common.eventbus.Subscribe; -import ctbrec.Config; -import ctbrec.Model; -import ctbrec.Recording; -import ctbrec.Recording.State; -import ctbrec.event.*; -import ctbrec.io.HttpClient; -import ctbrec.recorder.download.Download; -import ctbrec.recorder.postprocessing.PostProcessor; -import ctbrec.sites.Site; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static ctbrec.SubsequentAction.*; +import static ctbrec.event.Event.Type.*; import java.io.File; import java.io.IOException; @@ -21,14 +11,50 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.time.Instant; import java.time.ZoneId; -import java.util.*; -import java.util.concurrent.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.SynchronousQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; -import static ctbrec.SubsequentAction.PAUSE; -import static ctbrec.SubsequentAction.REMOVE; -import static ctbrec.event.Event.Type.MODEL_ONLINE; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.eventbus.Subscribe; + +import ctbrec.Config; +import ctbrec.Model; +import ctbrec.Recording; +import ctbrec.Recording.State; +import ctbrec.event.Event; +import ctbrec.event.EventBusHolder; +import ctbrec.event.ModelIsOnlineEvent; +import ctbrec.event.NoSpaceLeftEvent; +import ctbrec.event.RecordingStateChangedEvent; +import ctbrec.io.HttpClient; +import ctbrec.recorder.download.Download; +import ctbrec.recorder.postprocessing.PostProcessor; +import ctbrec.sites.Site; public class NextGenLocalRecorder implements Recorder { @@ -145,6 +171,7 @@ public class NextGenLocalRecorder implements Recorder { break; } } + recording.refresh(); setRecordingStatus(recording, State.FINISHED); recordingManager.saveRecording(recording); LOG.info("Post-processing finished for {}", recording.getModel().getName());