From d6e73aef9a87d1a3c12d5f00bccbbd851afb4c75 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Thu, 9 Aug 2018 14:43:27 +0200 Subject: [PATCH] Added setting to move merged files to a separate directory --- src/main/java/ctbrec/Settings.java | 1 + .../java/ctbrec/recorder/LocalRecorder.java | 56 ++++++++----- src/main/java/ctbrec/recorder/Recorder.java | 3 +- .../java/ctbrec/recorder/RemoteRecorder.java | 3 +- src/main/java/ctbrec/ui/SettingsTab.java | 80 ++++++++++++++++++- 5 files changed, 121 insertions(+), 22 deletions(-) diff --git a/src/main/java/ctbrec/Settings.java b/src/main/java/ctbrec/Settings.java index 0234b40f..17dac090 100644 --- a/src/main/java/ctbrec/Settings.java +++ b/src/main/java/ctbrec/Settings.java @@ -10,6 +10,7 @@ public class Settings { public int httpTimeout = 10; public String httpServer = "localhost"; public String recordingsDir = System.getProperty("user.home") + File.separator + "ctbrec"; + public String mergeDir = ""; public String mediaPlayer = "/usr/bin/mpv"; public String username = ""; public String password = ""; diff --git a/src/main/java/ctbrec/recorder/LocalRecorder.java b/src/main/java/ctbrec/recorder/LocalRecorder.java index cc590d33..e6ef39d4 100644 --- a/src/main/java/ctbrec/recorder/LocalRecorder.java +++ b/src/main/java/ctbrec/recorder/LocalRecorder.java @@ -6,6 +6,7 @@ import static ctbrec.Recording.STATUS.RECORDING; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.text.SimpleDateFormat; import java.time.Instant; import java.util.ArrayList; @@ -73,7 +74,7 @@ public class LocalRecorder implements Recorder { } @Override - public void startRecording(Model model) throws IOException { + public void startRecording(Model model) { lock.lock(); if(!models.contains(model)) { LOG.info("Model {} added", model); @@ -262,20 +263,7 @@ public class LocalRecorder implements Recorder { boolean automerge = Config.getInstance().getSettings().automerge; generatePlaylist(directory); if(local && automerge) { - File mergedFile = merge(directory); - if(mergedFile != null && mergedFile.exists() && mergedFile.length() > 0) { - LOG.debug("Merged file {}", mergedFile.getAbsolutePath()); - if (!Config.getInstance().getSettings().automergeKeepSegments) { - try { - LOG.debug("Deleting directory {}", directory); - delete(directory, mergedFile); - } catch (IOException e) { - LOG.error("Couldn't delete directory {}", directory, e); - } - } - } else { - LOG.error("Merged file not found {}", mergedFile); - } + merge(directory); } } }; @@ -291,6 +279,38 @@ public class LocalRecorder implements Recorder { try { File mergedFile = Recording.mergedFileFromDirectory(recDir); segmentMerger.merge(recDir, mergedFile); + + if(mergedFile != null && mergedFile.exists() && mergedFile.length() > 0) { + LOG.debug("Merged file {}", mergedFile.getAbsolutePath()); + if (Config.getInstance().getSettings().mergeDir.length() > 0) { + File mergeDir = new File(Config.getInstance().getSettings().mergeDir); + if(!mergeDir.exists()) { + boolean created = mergeDir.mkdirs(); + if(!created) { + LOG.error("Couldn't create directory for merged files {}", mergeDir); + } + } + + File finalLocation = new File(mergeDir, mergedFile.getName()); + try { + Files.move(mergedFile.toPath(), finalLocation.toPath(), StandardCopyOption.ATOMIC_MOVE); + } catch (IOException e) { + LOG.error("Couldn't move merged file to merge dirctory {}", mergeDir); + } + } + LOG.debug("Keep segments: {}", Config.getInstance().getSettings().automergeKeepSegments); + if (!Config.getInstance().getSettings().automergeKeepSegments) { + try { + LOG.debug("Deleting directory {}", recDir); + delete(recDir, mergedFile); + } catch (IOException e) { + LOG.error("Couldn't delete directory {}", recDir, e); + } + } + } else { + LOG.error("Merged file not found {}", mergedFile); + } + return mergedFile; } catch (IOException e) { LOG.error("Couldn't generate playlist file", e); @@ -536,13 +556,13 @@ public class LocalRecorder implements Recorder { } @Override - public void merge(Recording rec, boolean keepSegments) throws IOException { + public File merge(Recording rec, boolean keepSegments) throws IOException { File recordingsDir = new File(config.getSettings().recordingsDir); File directory = new File(recordingsDir, rec.getPath()); - merge(directory); + File mergedFile = merge(directory); if(!keepSegments) { - File mergedFile = Recording.mergedFileFromDirectory(directory); delete(directory, mergedFile); } + return mergedFile; } } diff --git a/src/main/java/ctbrec/recorder/Recorder.java b/src/main/java/ctbrec/recorder/Recorder.java index 688ba00b..e4b0a461 100644 --- a/src/main/java/ctbrec/recorder/Recorder.java +++ b/src/main/java/ctbrec/recorder/Recorder.java @@ -1,5 +1,6 @@ package ctbrec.recorder; +import java.io.File; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -23,7 +24,7 @@ public interface Recorder { public List getRecordings() throws IOException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException; - public void merge(Recording recording, boolean keepSegments) throws IOException; + public File merge(Recording recording, boolean keepSegments) throws IOException; public void delete(Recording recording) throws IOException, InvalidKeyException, NoSuchAlgorithmException, IllegalStateException; diff --git a/src/main/java/ctbrec/recorder/RemoteRecorder.java b/src/main/java/ctbrec/recorder/RemoteRecorder.java index 0117eac7..2b17bd6e 100644 --- a/src/main/java/ctbrec/recorder/RemoteRecorder.java +++ b/src/main/java/ctbrec/recorder/RemoteRecorder.java @@ -1,5 +1,6 @@ package ctbrec.recorder; +import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; @@ -235,7 +236,7 @@ public class RemoteRecorder implements Recorder { } @Override - public void merge(Recording recording, boolean keepSegments) throws IOException { + public File merge(Recording recording, boolean keepSegments) throws IOException { throw new RuntimeException("Merging not available for remote recorder"); } } diff --git a/src/main/java/ctbrec/ui/SettingsTab.java b/src/main/java/ctbrec/ui/SettingsTab.java index e912d1dd..55277c26 100644 --- a/src/main/java/ctbrec/ui/SettingsTab.java +++ b/src/main/java/ctbrec/ui/SettingsTab.java @@ -42,6 +42,7 @@ public class SettingsTab extends Tab { private static final transient Logger LOG = LoggerFactory.getLogger(SettingsTab.class); private TextField recordingsDirectory; + private TextField mergeDirectory; private TextField mediaPlayer; private TextField username; private TextField server; @@ -155,11 +156,23 @@ public class SettingsTab extends Tab { l = new Label("Keep segments"); mergeLayout.add(l, 0, 1); + automergeKeepSegments.setSelected(Config.getInstance().getSettings().automergeKeepSegments); automergeKeepSegments.setOnAction((e) -> Config.getInstance().getSettings().automergeKeepSegments = automergeKeepSegments.isSelected()); - GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0)); - GridPane.setMargin(automergeKeepSegments, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN)); + GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, CHECKBOX_MARGIN, 0)); + GridPane.setMargin(automergeKeepSegments, new Insets(CHECKBOX_MARGIN, 0, CHECKBOX_MARGIN, CHECKBOX_MARGIN)); mergeLayout.add(automergeKeepSegments, 1, 1); + l = new Label("Move merged files to"); + mergeLayout.add(l, 0, 2); + mergeDirectory = new TextField(Config.getInstance().getSettings().mergeDir); + mergeDirectory.setOnAction((e) -> Config.getInstance().getSettings().mergeDir = mergeDirectory.getText()); + mergeDirectory.focusedProperty().addListener(createMergeDirectoryFocusListener()); + GridPane.setFillWidth(mergeDirectory, true); + GridPane.setHgrow(mergeDirectory, Priority.ALWAYS); + GridPane.setMargin(mergeDirectory, new Insets(0, 0, 0, CHECKBOX_MARGIN)); + mergeLayout.add(mergeDirectory, 1, 2); + mergeLayout.add(createMergeDirButton(), 3, 2); + mergePane = new TitledPane("Auto-merge", mergeLayout); mergePane.setCollapsible(false); mainLayout.add(mergePane, 0, 3); @@ -287,6 +300,26 @@ public class SettingsTab extends Tab { }; } + private ChangeListener createMergeDirectoryFocusListener() { + return new ChangeListener() { + @Override + public void changed(ObservableValue arg0, Boolean oldPropertyValue, Boolean newPropertyValue) { + if (newPropertyValue) { + mergeDirectory.setBorder(Border.EMPTY); + mergeDirectory.setTooltip(null); + } else { + String input = mergeDirectory.getText(); + if(input.isEmpty()) { + Config.getInstance().getSettings().mergeDir = ""; + } else { + File newDir = new File(input); + setMergeDir(newDir); + } + } + } + }; + } + private ChangeListener createMpvFocusListener() { return new ChangeListener() { @Override @@ -338,6 +371,22 @@ public class SettingsTab extends Tab { return button; } + private Node createMergeDirButton() { + Button button = new Button("Select"); + button.setOnAction((e) -> { + DirectoryChooser chooser = new DirectoryChooser(); + File currentDir = new File(Config.getInstance().getSettings().mergeDir); + if (currentDir.exists() && currentDir.isDirectory()) { + chooser.setInitialDirectory(currentDir); + } + File selectedDir = chooser.showDialog(null); + if(selectedDir != null) { + setMergeDir(selectedDir); + } + }); + return button; + } + private Node createMpvBrowseButton() { Button button = new Button("Select"); button.setOnAction((e) -> { @@ -383,4 +432,31 @@ public class SettingsTab extends Tab { } } + + private void setMergeDir(File dir) { + if (dir != null) { + if (dir.isDirectory()) { + try { + String path = dir.getCanonicalPath(); + Config.getInstance().getSettings().mergeDir = path; + mergeDirectory.setText(path); + } catch (IOException e1) { + LOG.error("Couldn't determine directory path", e1); + Alert alert = new AutosizeAlert(Alert.AlertType.ERROR); + alert.setTitle("Whoopsie"); + alert.setContentText("Couldn't determine directory path"); + alert.showAndWait(); + } + } else { + mergeDirectory.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.DASHED, new CornerRadii(2), new BorderWidths(2)))); + if (!dir.isDirectory()) { + mergeDirectory.setTooltip(new Tooltip("This is not a directory")); + } + if (!dir.exists()) { + mergeDirectory.setTooltip(new Tooltip("Directory does not exist")); + } + + } + } + } }