Add setting to remove recordings after post-processing
This commit is contained in:
parent
0858941b50
commit
258334b637
|
@ -92,6 +92,7 @@ public class SettingsTab extends Tab implements TabSelectionListener {
|
||||||
private CheckBox updateThumbnails = new CheckBox();
|
private CheckBox updateThumbnails = new CheckBox();
|
||||||
private CheckBox livePreviews = new CheckBox();
|
private CheckBox livePreviews = new CheckBox();
|
||||||
private CheckBox showPlayerStarting = new CheckBox();
|
private CheckBox showPlayerStarting = new CheckBox();
|
||||||
|
private CheckBox removeRecordingAfterPp = new CheckBox();
|
||||||
private RadioButton recordLocal;
|
private RadioButton recordLocal;
|
||||||
private ProxySettingsPane proxySettingsPane;
|
private ProxySettingsPane proxySettingsPane;
|
||||||
private TextField maxResolution;
|
private TextField maxResolution;
|
||||||
|
@ -284,7 +285,7 @@ public class SettingsTab extends Tab implements TabSelectionListener {
|
||||||
private Node createRecorderPanel() {
|
private Node createRecorderPanel() {
|
||||||
int row = 0;
|
int row = 0;
|
||||||
GridPane layout = createGridLayout();
|
GridPane layout = createGridLayout();
|
||||||
layout.getColumnConstraints().add(new ColumnConstraints(260));
|
layout.getColumnConstraints().add(new ColumnConstraints(270));
|
||||||
layout.getColumnConstraints().add(new ColumnConstraints(100, 400, Double.MAX_VALUE, Priority.ALWAYS, HPos.LEFT, true));
|
layout.getColumnConstraints().add(new ColumnConstraints(100, 400, Double.MAX_VALUE, Priority.ALWAYS, HPos.LEFT, true));
|
||||||
layout.getColumnConstraints().add(new ColumnConstraints(80));
|
layout.getColumnConstraints().add(new ColumnConstraints(80));
|
||||||
layout.getColumnConstraints().add(new ColumnConstraints(40));
|
layout.getColumnConstraints().add(new ColumnConstraints(40));
|
||||||
|
@ -390,44 +391,6 @@ public class SettingsTab extends Tab implements TabSelectionListener {
|
||||||
GridPane.setColumnSpan(concurrentRecordings, 3);
|
GridPane.setColumnSpan(concurrentRecordings, 3);
|
||||||
GridPane.setMargin(concurrentRecordings, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
GridPane.setMargin(concurrentRecordings, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
||||||
|
|
||||||
layout.add(new Label("Post-Processing"), 0, row);
|
|
||||||
postProcessing = new ProgramSelectionBox(Config.getInstance().getSettings().postProcessing);
|
|
||||||
postProcessing.allowEmptyValue();
|
|
||||||
postProcessing.fileProperty().addListener((obs, o, n) -> {
|
|
||||||
String path = n;
|
|
||||||
if(!Objects.equals(path, Config.getInstance().getSettings().postProcessing)) {
|
|
||||||
Config.getInstance().getSettings().postProcessing = path;
|
|
||||||
saveConfig();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
GridPane.setFillWidth(postProcessing, true);
|
|
||||||
GridPane.setHgrow(postProcessing, Priority.ALWAYS);
|
|
||||||
GridPane.setMargin(postProcessing, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
|
||||||
layout.add(postProcessing, 1, row);
|
|
||||||
|
|
||||||
l = new Label("PP-Threads");
|
|
||||||
layout.add(l, 2, row);
|
|
||||||
GridPane.setMargin(l, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
|
||||||
GridPane.setHalignment(l, HPos.RIGHT);
|
|
||||||
ppThreads = new TextField(Integer.toString(Config.getInstance().getSettings().postProcessingThreads));
|
|
||||||
ppThreads.prefWidth(40);
|
|
||||||
ppThreads.minWidth(40);
|
|
||||||
ppThreads.maxWidth(40);
|
|
||||||
ppThreads.textProperty().addListener((observable, oldValue, newValue) -> {
|
|
||||||
if (!newValue.matches("\\d*")) {
|
|
||||||
ppThreads.setText(newValue.replaceAll(PATTERN_NOT_A_DIGIT, ""));
|
|
||||||
}
|
|
||||||
if (!ppThreads.getText().isEmpty()) {
|
|
||||||
int newPpThreads = Integer.parseInt(ppThreads.getText());
|
|
||||||
if (newPpThreads != Config.getInstance().getSettings().postProcessingThreads) {
|
|
||||||
Config.getInstance().getSettings().postProcessingThreads = newPpThreads;
|
|
||||||
saveConfig();
|
|
||||||
showRestartRequired();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
layout.add(ppThreads, 3, row++);
|
|
||||||
|
|
||||||
tt = new Tooltip("Check every x seconds, if a model came online");
|
tt = new Tooltip("Check every x seconds, if a model came online");
|
||||||
l = new Label("Check online state every (seconds)");
|
l = new Label("Check online state every (seconds)");
|
||||||
l.setTooltip(tt);
|
l.setTooltip(tt);
|
||||||
|
@ -522,7 +485,56 @@ public class SettingsTab extends Tab implements TabSelectionListener {
|
||||||
});
|
});
|
||||||
GridPane.setColumnSpan(fileExtension, 3);
|
GridPane.setColumnSpan(fileExtension, 3);
|
||||||
GridPane.setMargin(fileExtension, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
GridPane.setMargin(fileExtension, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
||||||
layout.add(fileExtension, 1, row);
|
layout.add(fileExtension, 1, row++);
|
||||||
|
|
||||||
|
layout.add(new Label("Post-Processing"), 0, row);
|
||||||
|
postProcessing = new ProgramSelectionBox(Config.getInstance().getSettings().postProcessing);
|
||||||
|
postProcessing.allowEmptyValue();
|
||||||
|
postProcessing.fileProperty().addListener((obs, o, n) -> {
|
||||||
|
String path = n;
|
||||||
|
if(!Objects.equals(path, Config.getInstance().getSettings().postProcessing)) {
|
||||||
|
Config.getInstance().getSettings().postProcessing = path;
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
GridPane.setFillWidth(postProcessing, true);
|
||||||
|
GridPane.setHgrow(postProcessing, Priority.ALWAYS);
|
||||||
|
GridPane.setMargin(postProcessing, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
||||||
|
layout.add(postProcessing, 1, row);
|
||||||
|
|
||||||
|
l = new Label("PP-Threads");
|
||||||
|
layout.add(l, 2, row);
|
||||||
|
GridPane.setMargin(l, new Insets(0, 0, 0, CHECKBOX_MARGIN));
|
||||||
|
GridPane.setHalignment(l, HPos.RIGHT);
|
||||||
|
ppThreads = new TextField(Integer.toString(Config.getInstance().getSettings().postProcessingThreads));
|
||||||
|
ppThreads.prefWidth(40);
|
||||||
|
ppThreads.minWidth(40);
|
||||||
|
ppThreads.maxWidth(40);
|
||||||
|
ppThreads.textProperty().addListener((observable, oldValue, newValue) -> {
|
||||||
|
if (!newValue.matches("\\d*")) {
|
||||||
|
ppThreads.setText(newValue.replaceAll(PATTERN_NOT_A_DIGIT, ""));
|
||||||
|
}
|
||||||
|
if (!ppThreads.getText().isEmpty()) {
|
||||||
|
int newPpThreads = Integer.parseInt(ppThreads.getText());
|
||||||
|
if (newPpThreads != Config.getInstance().getSettings().postProcessingThreads) {
|
||||||
|
Config.getInstance().getSettings().postProcessingThreads = newPpThreads;
|
||||||
|
saveConfig();
|
||||||
|
showRestartRequired();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
layout.add(ppThreads, 3, row++);
|
||||||
|
|
||||||
|
l = new Label("Remove recording after post-processing");
|
||||||
|
layout.add(l, 0, row);
|
||||||
|
removeRecordingAfterPp.setSelected(Config.getInstance().getSettings().removeRecordingAfterPostProcessing);
|
||||||
|
removeRecordingAfterPp.setOnAction(e -> {
|
||||||
|
Config.getInstance().getSettings().removeRecordingAfterPostProcessing = removeRecordingAfterPp.isSelected();
|
||||||
|
saveConfig();
|
||||||
|
});
|
||||||
|
GridPane.setMargin(l, new Insets(4, CHECKBOX_MARGIN, 0, 0));
|
||||||
|
GridPane.setMargin(removeRecordingAfterPp, new Insets(4, 0, 0, CHECKBOX_MARGIN));
|
||||||
|
layout.add(removeRecordingAfterPp, 1, row);
|
||||||
|
|
||||||
TitledPane locations = new TitledPane("Recorder", layout);
|
TitledPane locations = new TitledPane("Recorder", layout);
|
||||||
locations.setCollapsible(false);
|
locations.setCollapsible(false);
|
||||||
|
|
|
@ -107,6 +107,7 @@ public class Settings {
|
||||||
public String recordingsSortColumn = "";
|
public String recordingsSortColumn = "";
|
||||||
public String recordingsSortType = "";
|
public String recordingsSortType = "";
|
||||||
public boolean recordSingleFile = false;
|
public boolean recordSingleFile = false;
|
||||||
|
public boolean removeRecordingAfterPostProcessing = false;
|
||||||
public boolean requireAuthentication = false;
|
public boolean requireAuthentication = false;
|
||||||
public String servletContext = "";
|
public String servletContext = "";
|
||||||
public boolean showPlayerStarting = false;
|
public boolean showPlayerStarting = false;
|
||||||
|
|
|
@ -157,6 +157,9 @@ public class NextGenLocalRecorder implements Recorder {
|
||||||
recordingManager.saveRecording(recording);
|
recordingManager.saveRecording(recording);
|
||||||
deleteIfTooShort(recording);
|
deleteIfTooShort(recording);
|
||||||
LOG.info("Post-processing finished for {}", recording.getModel().getName());
|
LOG.info("Post-processing finished for {}", recording.getModel().getName());
|
||||||
|
if (config.getSettings().removeRecordingAfterPostProcessing) {
|
||||||
|
recordingManager.remove(recording);
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if (e instanceof InterruptedException) { // NOSONAR
|
if (e instanceof InterruptedException) { // NOSONAR
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
|
|
|
@ -102,6 +102,11 @@ public class RecordingManager {
|
||||||
return recordingsMetaDir;
|
return recordingsMetaDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a recording from disk and removes it from ctbrec
|
||||||
|
* @param recording
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
public void delete(Recording recording) throws IOException {
|
public void delete(Recording recording) throws IOException {
|
||||||
if (recording.isPinned()) {
|
if (recording.isPinned()) {
|
||||||
throw new RecordingPinnedException(recording);
|
throw new RecordingPinnedException(recording);
|
||||||
|
@ -137,6 +142,28 @@ public class RecordingManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the recording from ctbrec, but does not touch the actual file
|
||||||
|
* @param recording
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void remove(Recording recording) throws IOException {
|
||||||
|
recordingsLock.lock();
|
||||||
|
try {
|
||||||
|
int idx = recordings.indexOf(recording);
|
||||||
|
recording = recordings.get(idx);
|
||||||
|
File recordingsDir = new File(config.getSettings().recordingsDir);
|
||||||
|
File path = new File(recordingsDir, recording.getPath());
|
||||||
|
deleteEmptyParents(path.getParentFile());
|
||||||
|
// delete the meta data
|
||||||
|
Files.deleteIfExists(new File(recording.getMetaDataFile()).toPath());
|
||||||
|
// remove from data structure
|
||||||
|
recordings.remove(recording);
|
||||||
|
} finally {
|
||||||
|
recordingsLock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public List<Recording> getAll() {
|
public List<Recording> getAll() {
|
||||||
recordingsLock.lock();
|
recordingsLock.lock();
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -46,8 +46,11 @@ public abstract class AbstractDownload implements Download {
|
||||||
err.setDaemon(true);
|
err.setDaemon(true);
|
||||||
err.start();
|
err.start();
|
||||||
|
|
||||||
process.waitFor();
|
int exitCode = process.waitFor();
|
||||||
LOG.debug("Process finished.");
|
LOG.debug("Process finished with exit code {}", exitCode);
|
||||||
|
if (exitCode != 0) {
|
||||||
|
throw new ProcessExitedUncleanException("Post-Processing finished with exit code " + exitCode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue