Added setting to move merged files to a separate directory

This commit is contained in:
0xboobface 2018-08-09 14:43:27 +02:00
parent 6357447a4a
commit d6e73aef9a
5 changed files with 121 additions and 22 deletions

View File

@ -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 = "";

View File

@ -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;
}
}

View File

@ -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<Recording> 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;

View File

@ -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");
}
}

View File

@ -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<? super Boolean> createMergeDirectoryFocusListener() {
return new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> 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<? super Boolean> createMpvFocusListener() {
return new ChangeListener<Boolean>() {
@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"));
}
}
}
}
}