From 99b21845abbbe1cc6f296206cc75c5327d34de43 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Wed, 30 Sep 2020 20:09:52 +0200 Subject: [PATCH] Change post-process return value to boolean --- .../main/java/ctbrec/ui/JavaFxRecording.java | 60 +++++++++++++++++++ client/src/main/java/ctbrec/ui/Player.java | 12 +--- .../ctbrec/ui/tabs/DownloadPostprocessor.java | 3 +- .../java/ctbrec/ui/tabs/RecordingsTab.java | 34 ++++++++++- common/src/main/java/ctbrec/Recording.java | 12 ++++ common/src/main/java/ctbrec/io/UrlUtil.java | 29 +++++++++ .../ctbrec/recorder/NextGenLocalRecorder.java | 6 +- .../ctbrec/recorder/postprocessing/Copy.java | 3 +- .../postprocessing/CreateContactSheet.java | 10 +++- .../postprocessing/CreateTimelineThumbs.java | 4 +- .../postprocessing/DeleteOriginal.java | 3 +- .../postprocessing/DeleteTooShort.java | 4 +- .../ctbrec/recorder/postprocessing/Move.java | 5 +- .../postprocessing/PostProcessor.java | 11 +++- .../postprocessing/RemoveKeepFile.java | 3 +- .../ctbrec/recorder/postprocessing/Remux.java | 3 +- .../recorder/postprocessing/Rename.java | 5 +- .../recorder/postprocessing/Script.java | 3 +- .../recorder/postprocessing/Webhook.java | 2 +- 19 files changed, 183 insertions(+), 29 deletions(-) create mode 100644 common/src/main/java/ctbrec/io/UrlUtil.java diff --git a/client/src/main/java/ctbrec/ui/JavaFxRecording.java b/client/src/main/java/ctbrec/ui/JavaFxRecording.java index f74f666c..f4e7b705 100644 --- a/client/src/main/java/ctbrec/ui/JavaFxRecording.java +++ b/client/src/main/java/ctbrec/ui/JavaFxRecording.java @@ -1,11 +1,15 @@ package ctbrec.ui; import java.io.File; +import java.time.Duration; import java.time.Instant; +import java.util.Optional; +import java.util.Set; import ctbrec.Config; import ctbrec.Model; import ctbrec.Recording; +import ctbrec.recorder.download.Download; import javafx.beans.property.LongProperty; import javafx.beans.property.SimpleLongProperty; import javafx.beans.property.SimpleStringProperty; @@ -158,6 +162,8 @@ public class JavaFxRecording extends Recording { setProgress(updated.getProgress()); setSizeInByte(updated.getSizeInByte()); setSingleFile(updated.isSingleFile()); + getAssociatedFiles().clear(); + getAssociatedFiles().addAll(updated.getAssociatedFiles()); } @Override @@ -246,5 +252,59 @@ public class JavaFxRecording extends Recording { delegate.setId(id); } + @Override + public void setStatusWithEvent(State status) { + delegate.setStatusWithEvent(status); + } + + @Override + public File getPostProcessedFile() { + return delegate.getPostProcessedFile(); + } + + @Override + public void setPostProcessedFile(File postProcessedFile) { + delegate.setPostProcessedFile(postProcessedFile); + } + + @Override + public Download getDownload() { + return delegate.getDownload(); + } + + @Override + public void setDownload(Download download) { + delegate.setDownload(download); + } + + @Override + public Duration getLength() { + return delegate.getLength(); + } + + @Override + public void refresh() { + delegate.refresh(); + } + + @Override + public boolean canBePostProcessed() { + return delegate.canBePostProcessed(); + } + + @Override + public Set getAssociatedFiles() { + return delegate.getAssociatedFiles(); + } + + @Override + public boolean hasContactSheet() { + return delegate.hasContactSheet(); + } + + @Override + public Optional getContactSheet() { + return delegate.getContactSheet(); + } } diff --git a/client/src/main/java/ctbrec/ui/Player.java b/client/src/main/java/ctbrec/ui/Player.java index af88b945..abf5b024 100644 --- a/client/src/main/java/ctbrec/ui/Player.java +++ b/client/src/main/java/ctbrec/ui/Player.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; -import java.net.URL; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; @@ -23,11 +22,11 @@ import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; import ctbrec.Config; -import ctbrec.Hmac; import ctbrec.Model; import ctbrec.OS; import ctbrec.Recording; import ctbrec.io.StreamRedirectThread; +import ctbrec.io.UrlUtil; import ctbrec.recorder.download.StreamSource; import ctbrec.ui.controls.Dialogs; import javafx.scene.Scene; @@ -208,14 +207,7 @@ public class Player { String hlsBase = Config.getInstance().getServerUrl() + "/hls"; String recUrl = hlsBase + '/' + rec.getId() + (rec.isSingleFile() ? "" : "/playlist.m3u8"); if (cfg.getSettings().requireAuthentication) { - URL u = new URL(recUrl); - String path = u.getPath(); - if (!cfg.getContextPath().isEmpty()) { - path = path.substring(cfg.getContextPath().length()); - } - byte[] key = cfg.getSettings().key; - String hmac = Hmac.calculate(path, key); - recUrl = recUrl + "?hmac=" + hmac; + recUrl = UrlUtil.addHmac(recUrl, cfg); } return recUrl; } diff --git a/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java b/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java index 3db557a0..c97da77a 100644 --- a/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java +++ b/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java @@ -15,7 +15,8 @@ public class DownloadPostprocessor extends AbstractPlaceholderAwarePostProcessor } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { // nothing really to do in here, we just inherit from AbstractPlaceholderAwarePostProcessor to use fillInPlaceHolders + return true; } } diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index d905f303..b6df182a 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -33,6 +33,7 @@ import ctbrec.Recording.State; import ctbrec.StringUtil; import ctbrec.event.EventBusHolder; import ctbrec.event.RecordingStateChangedEvent; +import ctbrec.io.UrlUtil; import ctbrec.recorder.ProgressListener; import ctbrec.recorder.Recorder; import ctbrec.recorder.RecordingPinnedException; @@ -386,11 +387,16 @@ public class RecordingsTab extends Tab implements TabSelectionListener { JavaFxRecording first = recordings.get(0); MenuItem openInPlayer = new MenuItem("Open in Player"); - openInPlayer.setOnAction(e -> play(recordings.get(0))); + openInPlayer.setOnAction(e -> play(first)); if(first.getStatus() == FINISHED || Config.getInstance().getSettings().localRecording) { contextMenu.getItems().add(openInPlayer); } + MenuItem openContactSheet = new MenuItem("Open contact sheet"); + openContactSheet.setOnAction(e -> openContactSheet(first)); + openContactSheet.setDisable(!first.hasContactSheet()); + contextMenu.getItems().add(openContactSheet); + // TODO find a way to reenable this // MenuItem stopRecording = new MenuItem("Stop recording"); // stopRecording.setOnAction((e) -> { @@ -451,6 +457,32 @@ public class RecordingsTab extends Tab implements TabSelectionListener { return contextMenu; } + private void openContactSheet(JavaFxRecording recording) { + if (config.getSettings().localRecording) { + recording.getContactSheet().ifPresent(f -> new Thread(() -> DesktopIntegration.open(f)).start()); + } else { + recording.getContactSheet().ifPresent(f -> new Thread(() -> { + File target; + try { + target = File.createTempFile("cs_", ".jpg"); + target.deleteOnExit(); + FileDownload download = new FileDownload(CamrecApplication.httpClient, (p) -> { + if (p == 100) { + DesktopIntegration.open(target); + } + }); + String url = config.getServerUrl() + "/hls/" + recording.getId() + "/contactsheet.jpg"; + if (config.getSettings().requireAuthentication) { + url = UrlUtil.addHmac(url, config); + } + download.start(new URL(url), target); + } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | IllegalStateException e) { + Dialogs.showError(getTabPane().getScene(), "Download Error", "An error occurred while downloading the contact sheet", e); + } + }).start()); + } + } + private void notes(JavaFxRecording recording) { Node source = getTabPane(); String notes = recording.getNote(); diff --git a/common/src/main/java/ctbrec/Recording.java b/common/src/main/java/ctbrec/Recording.java index b95a10a3..548ab81b 100644 --- a/common/src/main/java/ctbrec/Recording.java +++ b/common/src/main/java/ctbrec/Recording.java @@ -18,6 +18,7 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.EnumSet; import java.util.HashSet; +import java.util.Optional; import java.util.Set; import org.slf4j.Logger; @@ -312,4 +313,15 @@ public class Recording implements Serializable { public Set getAssociatedFiles() { return associatedFiles; } + + public boolean hasContactSheet() { + return getAssociatedFiles().stream().anyMatch(path -> path.endsWith("contactsheet.jpg")); + } + + public Optional getContactSheet() { + return getAssociatedFiles().stream() + .filter(path -> path.endsWith("contactsheet.jpg")) + .findFirst() + .map(File::new); + } } diff --git a/common/src/main/java/ctbrec/io/UrlUtil.java b/common/src/main/java/ctbrec/io/UrlUtil.java new file mode 100644 index 00000000..5db200cc --- /dev/null +++ b/common/src/main/java/ctbrec/io/UrlUtil.java @@ -0,0 +1,29 @@ +package ctbrec.io; + +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import ctbrec.Config; +import ctbrec.Hmac; + +public class UrlUtil { + + private UrlUtil() {} + + public static String addHmac(String url, Config config) throws MalformedURLException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException, UnsupportedEncodingException { + URL u = new URL(url); + String path = u.getPath(); + if (!config.getContextPath().isEmpty()) { + path = path.substring(config.getContextPath().length()); + } + byte[] key = config.getSettings().key; + String hmac = Hmac.calculate(path, key); + url = url + "?hmac=" + hmac; + return url; + } + + +} diff --git a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java index 136e9e16..c63dfdbe 100644 --- a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java @@ -164,7 +164,10 @@ public class NextGenLocalRecorder implements Recorder { List postProcessors = config.getSettings().postProcessors; for (PostProcessor postProcessor : postProcessors) { LOG.debug("Running post-processor: {}", postProcessor.getName()); - postProcessor.postprocess(recording, recordingManager, config); + boolean continuePP = postProcessor.postprocess(recording, recordingManager, config); + if (!continuePP) { + break; + } } setRecordingStatus(recording, State.FINISHED); recordingManager.saveRecording(recording); @@ -632,6 +635,7 @@ public class NextGenLocalRecorder implements Recorder { download.init(Config.getInstance(), other.getModel(), other.getStartDate()); other.setDownload(download); other.setPostProcessedFile(null); + other.setStatus(State.WAITING); submitPostProcessingJob(other); return; } diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/Copy.java b/common/src/main/java/ctbrec/recorder/postprocessing/Copy.java index a5fe0c54..9ffeb315 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/Copy.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/Copy.java @@ -22,7 +22,7 @@ public class Copy extends AbstractPostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { File orig = rec.getPostProcessedFile(); String copyFilename = getFilenameForCopy(orig); File copy = new File(orig.getParentFile(), copyFilename); @@ -34,6 +34,7 @@ public class Copy extends AbstractPostProcessor { } rec.setPostProcessedFile(copy); rec.getAssociatedFiles().add(copy.getCanonicalPath()); + return true; } private String getFilenameForCopy(File orig) { diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/CreateContactSheet.java b/common/src/main/java/ctbrec/recorder/postprocessing/CreateContactSheet.java index 574cfac0..e99eb4a8 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/CreateContactSheet.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/CreateContactSheet.java @@ -35,7 +35,7 @@ public class CreateContactSheet extends AbstractPlaceholderAwarePostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { int totalWidth = Integer.parseInt(getConfig().getOrDefault(TOTAL_SIZE, "1920")); int padding = Integer.parseInt(getConfig().getOrDefault(PADDING, "4")); int cols = Integer.parseInt(getConfig().getOrDefault(COLS, "8")); @@ -73,13 +73,16 @@ public class CreateContactSheet extends AbstractPlaceholderAwarePostProcessor { "0", "-qscale:v", "3", + "-y", + "-frames:v", + "1", output.getCanonicalPath() }; String[] cmdline = OS.getFFmpegCommand(args); LOG.info("Executing {} in working directory {}", Arrays.toString(cmdline), executionDir); Process ffmpeg = Runtime.getRuntime().exec(cmdline, new String[0], executionDir); int exitCode = 1; - File ffmpegLog = File.createTempFile("create_contact_sheet_" + input.getName(), ".log"); + File ffmpegLog = File.createTempFile("create_contact_sheet_" + rec.getId() + '_', ".log"); try (FileOutputStream mergeLogStream = new FileOutputStream(ffmpegLog)) { Thread stdout = new Thread(new StreamRedirectThread(ffmpeg.getInputStream(), mergeLogStream)); Thread stderr = new Thread(new StreamRedirectThread(ffmpeg.getErrorStream(), mergeLogStream)); @@ -91,12 +94,13 @@ public class CreateContactSheet extends AbstractPlaceholderAwarePostProcessor { stderr.join(); mergeLogStream.flush(); } + rec.getAssociatedFiles().add(output.getCanonicalPath()); if (exitCode != 1) { - rec.getAssociatedFiles().add(output.getCanonicalPath()); if (ffmpegLog.exists()) { Files.delete(ffmpegLog.toPath()); } } + return true; } private File getInputFile(Recording rec) { diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/CreateTimelineThumbs.java b/common/src/main/java/ctbrec/recorder/postprocessing/CreateTimelineThumbs.java index 1adc5f49..46cb7240 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/CreateTimelineThumbs.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/CreateTimelineThumbs.java @@ -15,7 +15,9 @@ public class CreateTimelineThumbs extends AbstractPlaceholderAwarePostProcessor } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + // create 1 thumb every second with a width of 360 pixels and save it as jpeg with a 5-digit sequence number + // ffmpeg -i -vf 'fps=1,scale=360:-1' thumbs/out%05d.jpg throw new NotImplementedExcetion(); } } diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/DeleteOriginal.java b/common/src/main/java/ctbrec/recorder/postprocessing/DeleteOriginal.java index e73a57a8..7edf92fb 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/DeleteOriginal.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/DeleteOriginal.java @@ -17,7 +17,7 @@ public class DeleteOriginal extends AbstractPostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { if (rec.getAbsoluteFile().isFile()) { Files.deleteIfExists(rec.getAbsoluteFile().toPath()); deleteEmptyParents(rec.getAbsoluteFile().getParentFile()); @@ -27,5 +27,6 @@ public class DeleteOriginal extends AbstractPostProcessor { } rec.setAbsoluteFile(rec.getPostProcessedFile()); rec.getAssociatedFiles().remove(rec.getAbsoluteFile().getCanonicalPath()); + return true; } } diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/DeleteTooShort.java b/common/src/main/java/ctbrec/recorder/postprocessing/DeleteTooShort.java index 5d2ed49b..7e5cab21 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/DeleteTooShort.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/DeleteTooShort.java @@ -21,14 +21,16 @@ public class DeleteTooShort extends AbstractPostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException { Duration minimumLengthInSeconds = Duration.ofSeconds(Integer.parseInt(getConfig().getOrDefault(MIN_LEN_IN_SECS, "0"))); if (minimumLengthInSeconds.getSeconds() > 0) { Duration recordingLength = rec.getLength(); if (!(recordingLength.isNegative() || recordingLength.isZero()) && recordingLength.compareTo(minimumLengthInSeconds) < 0) { LOG.info("Deleting too short recording {} [{} < {}]", rec, recordingLength, minimumLengthInSeconds); recordingManager.delete(rec); + return false; } } + return true; } } diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/Move.java b/common/src/main/java/ctbrec/recorder/postprocessing/Move.java index 894faee3..8070a080 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/Move.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/Move.java @@ -25,14 +25,14 @@ public class Move extends AbstractPlaceholderAwarePostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException { String pathTemplate = getConfig().getOrDefault(PATH_TEMPLATE, DEFAULT); String path = fillInPlaceHolders(pathTemplate, rec, config); File src = rec.getPostProcessedFile(); boolean isFile = src.isFile(); File target = new File(path, src.getName()); if (Objects.equals(src, target)) { - return; + return true; } LOG.info("Moving {} to {}", src.getName(), target.getParentFile().getCanonicalPath()); Files.createDirectories(target.getParentFile().toPath()); @@ -48,6 +48,7 @@ public class Move extends AbstractPlaceholderAwarePostProcessor { } else { deleteEmptyParents(src); } + return true; } @Override diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/PostProcessor.java b/common/src/main/java/ctbrec/recorder/postprocessing/PostProcessor.java index fe484e2f..66a84591 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/PostProcessor.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/PostProcessor.java @@ -11,7 +11,16 @@ import ctbrec.recorder.RecordingManager; public interface PostProcessor extends Serializable { String getName(); - void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException; + /** + * Runs the post-processing code on the given recording + * @param rec the recording to post-process + * @param recordingManager + * @param config + * @return false to stop futher post-processing, true to continue + * @throws IOException + * @throws InterruptedException + */ + boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException; Map getConfig(); void setConfig(Map conf); diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/RemoveKeepFile.java b/common/src/main/java/ctbrec/recorder/postprocessing/RemoveKeepFile.java index 55fda725..5e47b7c7 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/RemoveKeepFile.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/RemoveKeepFile.java @@ -14,8 +14,9 @@ public class RemoveKeepFile extends AbstractPostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { recordingManager.remove(rec); rec.setMetaDataFile(null); + return true; } } diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/Remux.java b/common/src/main/java/ctbrec/recorder/postprocessing/Remux.java index d09daadc..bc811a54 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/Remux.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/Remux.java @@ -31,7 +31,7 @@ public class Remux extends AbstractPostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { String fileExt = getConfig().get(FILE_EXT); String[] args = getConfig().get(FFMPEG_ARGS).split(" "); String[] argsPlusFile = new String[args.length + 3]; @@ -67,6 +67,7 @@ public class Remux extends AbstractPostProcessor { IoUtils.deleteEmptyParents(inputFile.getParentFile()); rec.getAssociatedFiles().remove(inputFile.getCanonicalPath()); rec.getAssociatedFiles().add(remuxedFile.getCanonicalPath()); + return true; } private void setupLogging(Process ffmpeg, Recording rec) throws IOException, InterruptedException { diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/Rename.java b/common/src/main/java/ctbrec/recorder/postprocessing/Rename.java index 28e44b86..17871e39 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/Rename.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/Rename.java @@ -24,14 +24,14 @@ public class Rename extends AbstractPlaceholderAwarePostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException { String defaultTemplate = rec.isSingleFile() ? DEFAULT : DEFAULT_DIR; String filenameTemplate = getConfig().getOrDefault(FILE_NAME_TEMPLATE, defaultTemplate); String filename = fillInPlaceHolders(filenameTemplate, rec, config); File src = rec.getPostProcessedFile(); File target = new File(src.getParentFile(), filename); if (Objects.equals(src, target)) { - return; + return true; } LOG.info("Renaming {} to {}", src.getName(), target.getName()); Files.move(rec.getPostProcessedFile().toPath(), target.toPath()); @@ -41,6 +41,7 @@ public class Rename extends AbstractPlaceholderAwarePostProcessor { } rec.getAssociatedFiles().remove(src.getCanonicalPath()); rec.getAssociatedFiles().add(target.getCanonicalPath()); + return true; } @Override diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/Script.java b/common/src/main/java/ctbrec/recorder/postprocessing/Script.java index a07b9bfc..9ae144e0 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/Script.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/Script.java @@ -27,7 +27,7 @@ public class Script extends AbstractPlaceholderAwarePostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { List cmdline = buildCommandLine(rec, config); Runtime rt = Runtime.getRuntime(); String[] args = cmdline.toArray(new String[0]); @@ -41,6 +41,7 @@ public class Script extends AbstractPlaceholderAwarePostProcessor { if (exitCode != 0) { throw new ProcessExitedUncleanException("Script finished with exit code " + exitCode); } + return true; } private List buildCommandLine(Recording rec, Config config) throws IOException { diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/Webhook.java b/common/src/main/java/ctbrec/recorder/postprocessing/Webhook.java index 819d2f0b..4765736a 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/Webhook.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/Webhook.java @@ -25,7 +25,7 @@ public class Webhook extends AbstractPlaceholderAwarePostProcessor { } @Override - public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + public boolean postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { throw new NotImplementedExcetion(); }