From 5fa72eaaa0d932e01496a908d9eb05d4a16930c0 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sat, 26 Sep 2020 19:52:09 +0200 Subject: [PATCH] Add setting to define the download file name --- .../java/ctbrec/ui/settings/SettingsTab.java | 4 ++++ .../ctbrec/ui/tabs/DownloadPostprocessor.java | 21 +++++++++++++++++++ .../java/ctbrec/ui/tabs/RecordingsTab.java | 12 +++++------ common/src/main/java/ctbrec/Settings.java | 1 + .../java/ctbrec/recorder/RemoteRecorder.java | 13 ++++++++++++ ...AbstractPlaceholderAwarePostProcessor.java | 5 +++-- 6 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 812f1b33..02cb7e2e 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -93,6 +93,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { private SimpleStringProperty server; private SimpleIntegerProperty port; private SimpleStringProperty path; + private SimpleStringProperty downloadFilename; private SimpleBooleanProperty requireAuthentication; private SimpleBooleanProperty transportLayerSecurity; private ExclusiveSelectionProperty recordLocal; @@ -140,6 +141,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { server = new SimpleStringProperty(null, "httpServer", settings.httpServer); port = new SimpleIntegerProperty(null, "httpPort", settings.httpPort); path = new SimpleStringProperty(null, "servletContext", settings.servletContext); + downloadFilename = new SimpleStringProperty(null, "downloadFilename", settings.downloadFilename); requireAuthentication = new SimpleBooleanProperty(null, "requireAuthentication", settings.requireAuthentication); requireAuthentication.addListener(this::requireAuthenticationChanged); transportLayerSecurity = new SimpleBooleanProperty(null, "transportLayerSecurity", settings.transportLayerSecurity); @@ -196,6 +198,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { Setting.of("Server", server), Setting.of("Port", port), Setting.of("Path", path, "Leave empty, if you didn't change the servletContext in the server config"), + Setting.of("Download Filename", downloadFilename, "File name pattern for downloads"), Setting.of("Require authentication", requireAuthentication), Setting.of("Use Secure Communication (TLS)", transportLayerSecurity) ) @@ -241,6 +244,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { prefs.getSetting("minimumLengthInSeconds").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); prefs.getSetting("concurrentRecordings").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); prefs.getSetting("concurrentRecordings").ifPresent(s -> bindEnabledProperty(s, recordLocal.not())); + prefs.getSetting("downloadFilename").ifPresent(s -> bindEnabledProperty(s, recordLocal)); postProcessingStepPanel.disableProperty().bind(recordLocal.not()); } diff --git a/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java b/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java new file mode 100644 index 00000000..3db557a0 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/tabs/DownloadPostprocessor.java @@ -0,0 +1,21 @@ +package ctbrec.ui.tabs; + +import java.io.IOException; + +import ctbrec.Config; +import ctbrec.Recording; +import ctbrec.recorder.RecordingManager; +import ctbrec.recorder.postprocessing.AbstractPlaceholderAwarePostProcessor; + +public class DownloadPostprocessor extends AbstractPlaceholderAwarePostProcessor { + + @Override + public String getName() { + return "download renamer"; + } + + @Override + public void postprocess(Recording rec, RecordingManager recordingManager, Config config) throws IOException, InterruptedException { + // nothing really to do in here, we just inherit from AbstractPlaceholderAwarePostProcessor to use fillInPlaceHolders + } +} diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 1583606e..d905f303 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -581,15 +581,15 @@ public class RecordingsTab extends Tab implements TabSelectionListener { String filename = proposeTargetFilename(recording); FileChooser chooser = new FileChooser(); chooser.setInitialFileName(filename); - if(config.getSettings().lastDownloadDir != null && !config.getSettings().lastDownloadDir.equals("")) { + if (config.getSettings().lastDownloadDir != null && !config.getSettings().lastDownloadDir.equals("")) { File dir = new File(config.getSettings().lastDownloadDir); - while(!dir.exists()) { + while (!dir.exists()) { dir = dir.getParentFile(); } chooser.setInitialDirectory(dir); } File target = chooser.showSaveDialog(null); - if(target != null) { + if (target != null) { config.getSettings().lastDownloadDir = target.getParent(); startDownloadThread(target, recording); recording.setStatus(DOWNLOADING); @@ -598,12 +598,12 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private String proposeTargetFilename(Recording recording) { - String path = recording.getAbsoluteFile().getAbsolutePath().substring(1); if(recording.isSingleFile()) { - return new File(path).getName(); + return recording.getAbsoluteFile().getName(); } else { + String downloadFilename = config.getSettings().downloadFilename; String fileSuffix = config.getSettings().ffmpegFileSuffix; - String filename = path.replace("/", "-").replace(".mp4", "") + '.' + fileSuffix; + String filename = new DownloadPostprocessor().fillInPlaceHolders(downloadFilename, recording, config) + '.' + fileSuffix; return filename; } } diff --git a/common/src/main/java/ctbrec/Settings.java b/common/src/main/java/ctbrec/Settings.java index d95a50eb..2fc2f41c 100644 --- a/common/src/main/java/ctbrec/Settings.java +++ b/common/src/main/java/ctbrec/Settings.java @@ -48,6 +48,7 @@ public class Settings { public int concurrentRecordings = 0; public boolean determineResolution = false; public List disabledSites = new ArrayList<>(); + public String downloadFilename = "${modelSanitizedName}-${localDateTime}"; public List eventHandlers = new ArrayList<>(); public String fc2livePassword = ""; public String fc2liveUsername = ""; diff --git a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java index 321bf46c..4b473772 100644 --- a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java +++ b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java @@ -350,6 +350,19 @@ public class RemoteRecorder implements Recorder { } recordings = newRecordings; + + // assign a site to the model + for (Site site : sites) { + for (Recording recording : recordings) { + Model m = recording.getModel(); + if (m.getSite() == null) { + if (site.isSiteForModel(m)) { + m.setSite(site); + continue; + } + } + } + } } else { LOG.error(SERVER_RETURNED_ERROR, resp.status, resp.msg); } diff --git a/common/src/main/java/ctbrec/recorder/postprocessing/AbstractPlaceholderAwarePostProcessor.java b/common/src/main/java/ctbrec/recorder/postprocessing/AbstractPlaceholderAwarePostProcessor.java index 5007d97f..b83a1790 100644 --- a/common/src/main/java/ctbrec/recorder/postprocessing/AbstractPlaceholderAwarePostProcessor.java +++ b/common/src/main/java/ctbrec/recorder/postprocessing/AbstractPlaceholderAwarePostProcessor.java @@ -11,6 +11,7 @@ import java.util.regex.Pattern; import ctbrec.Config; import ctbrec.Recording; +import ctbrec.sites.Site; public abstract class AbstractPlaceholderAwarePostProcessor extends AbstractPostProcessor { @@ -36,7 +37,7 @@ public abstract class AbstractPlaceholderAwarePostProcessor extends AbstractPost .replace("${modelName}", ofNullable(rec.getModel().getName()).orElse("modelName")) .replace("${modelDisplayName}", ofNullable(rec.getModel().getDisplayName()).orElse("displayName")) .replace("${modelSanitizedName}", ofNullable(rec.getModel().getSanitizedNamed()).orElse("sanitizedName")) - .replace("${siteName}", rec.getModel().getSite().getName()) + .replace("${siteName}", ofNullable(rec.getModel().getSite()).map(Site::getName).orElse("site")) .replace("${siteSanitizedName}", getSanitizedSiteName(rec)) .replace("${fileSuffix}", getFileSuffix(rec)) .replace("${epochSecond}", Long.toString(rec.getStartDate().getEpochSecond())) @@ -91,7 +92,7 @@ public abstract class AbstractPlaceholderAwarePostProcessor extends AbstractPost } private CharSequence getSanitizedSiteName(Recording rec) { - return rec.getModel().getSite().getName().replace(' ', '_').replace('\\', '_').replace('/', '_'); + return ofNullable(rec.getModel().getSite()).map(Site::getName).orElse("").replace(' ', '_').replace('\\', '_').replace('/', '_'); } }