From 6e5d706f65fda7ab16a81690fe871d181e7dcaec Mon Sep 17 00:00:00 2001
From: 0xb00bface <0xboobface@gmail.com>
Date: Sat, 11 Sep 2021 14:51:42 +0200
Subject: [PATCH] Fix switching between "record later" and "recording"

Starting the recording coming from "record later" did not work in every
case (client/server, standalone, start, start paused, record until)
---
 .../ctbrec/ui/action/StartRecordingAction.java   |  3 +++
 .../java/ctbrec/ui/tasks/AbstractModelTask.java  |  1 +
 .../ctbrec/recorder/NextGenLocalRecorder.java    | 16 ++++++++++++++--
 .../java/ctbrec/recorder/RemoteRecorder.java     |  4 ++++
 .../ctbrec/recorder/server/RecorderServlet.java  |  4 ++++
 5 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java b/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java
index 6adc772f..076d5e60 100644
--- a/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java
+++ b/client/src/main/java/ctbrec/ui/action/StartRecordingAction.java
@@ -69,6 +69,9 @@ public class StartRecordingAction extends AbstractModelAction {
                 }
             }
 
+            if (showRecordUntilDialog) {
+                model.setSuspended(false);
+            }
             new StartRecordingTask(recorder).executeSync(model)
             .whenComplete((mdl, ex) -> result.add(new Result(mdl, ex)));
         }
diff --git a/client/src/main/java/ctbrec/ui/tasks/AbstractModelTask.java b/client/src/main/java/ctbrec/ui/tasks/AbstractModelTask.java
index 6b05fc8a..2a8a6baf 100644
--- a/client/src/main/java/ctbrec/ui/tasks/AbstractModelTask.java
+++ b/client/src/main/java/ctbrec/ui/tasks/AbstractModelTask.java
@@ -18,6 +18,7 @@ public abstract class AbstractModelTask {
 
     public CompletableFuture<Model> executeSync(Model model) {
         try {
+            org.slf4j.LoggerFactory.getLogger(getClass()).debug("Executing concrete task for {} - suspended:{}", model, model.isSuspended());
             concreteTask.accept(model);
             return CompletableFuture.completedFuture(model);
         } catch (Exception e) {
diff --git a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java
index b1a03096..47cbdc3f 100644
--- a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java
+++ b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java
@@ -265,8 +265,8 @@ public class NextGenLocalRecorder implements Recorder {
 
     @Override
     public void addModel(Model model) throws IOException, InvalidKeyException, NoSuchAlgorithmException {
-        Optional<Model> existing = findModel(model);
-        if (!existing.isPresent()) {
+        Optional<Model> result = findModel(model);
+        if (!result.isPresent()) {
             LOG.info("Model {} added", model);
             recorderLock.lock();
             try {
@@ -280,9 +280,21 @@ public class NextGenLocalRecorder implements Recorder {
                 recorderLock.unlock();
             }
             startRecordingProcess(model);
+        } else {
+            Model existing = result.get();
+            copyModelProperties(model, existing);
+            startRecordingProcess(existing);
         }
     }
 
+    private void copyModelProperties(Model src, Model existing) {
+        existing.setSuspended(src.isSuspended());
+        existing.setMarkedForLaterRecording(src.isMarkedForLaterRecording());
+        existing.setPriority(src.getPriority());
+        existing.setRecordUntil(src.getRecordUntil());
+        existing.setRecordUntilSubsequentAction(src.getRecordUntilSubsequentAction());
+    }
+
     private CompletableFuture<Void> startRecordingProcess(Model model) {
         return CompletableFuture.runAsync(() -> {
             try {
diff --git a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java
index 441e157e..1fccb041 100644
--- a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java
+++ b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java
@@ -98,6 +98,10 @@ public class RemoteRecorder implements Recorder {
 
     @Override
     public void addModel(Model model) throws IOException, InvalidKeyException, NoSuchAlgorithmException {
+        LOG.trace("Model marked: {}", model.isMarkedForLaterRecording());
+        LOG.trace("Model paused: {}", model.isSuspended());
+        LOG.trace("Model until: {}", model.getRecordUntil().equals(Instant.ofEpochMilli(Model.RECORD_INDEFINITELY)) ? "no limit" : model.getRecordUntil());
+        LOG.trace("Model after: {}", model.getRecordUntilSubsequentAction());
         sendRequest("start", model);
     }
 
diff --git a/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java
index c7ffc8d5..27a231a2 100644
--- a/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java
+++ b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java
@@ -82,6 +82,10 @@ public class RecorderServlet extends AbstractCtbrecServlet {
             switch (request.action) {
             case "start":
                 LOG.debug("Starting recording for model {} - {}", request.model.getName(), request.model.getUrl());
+                LOG.trace("Model marked: {}", request.model.isMarkedForLaterRecording());
+                LOG.trace("Model paused: {}", request.model.isSuspended());
+                LOG.trace("Model until: {}", request.model.getRecordUntil().equals(Instant.ofEpochMilli(Model.RECORD_INDEFINITELY)) ? "no limit" : request.model.getRecordUntil());
+                LOG.trace("Model after: {}", request.model.getRecordUntilSubsequentAction());
                 recorder.addModel(request.model);
                 String response = "{\"status\": \"success\", \"msg\": \"Recording started\"}";
                 responseWriter.write(response);