Added setting to move merged files to a separate directory
This commit is contained in:
parent
6357447a4a
commit
d6e73aef9a
|
@ -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 = "";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue