From 47d8101ce89327ec0a2ed6e7abc19e092d627dc3 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 15:21:36 +0100 Subject: [PATCH 01/12] Avoid NPE in onError --- client/src/main/java/ctbrec/ui/controls/StreamPreview.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/controls/StreamPreview.java b/client/src/main/java/ctbrec/ui/controls/StreamPreview.java index 2dd21c52..a7b5911f 100644 --- a/client/src/main/java/ctbrec/ui/controls/StreamPreview.java +++ b/client/src/main/java/ctbrec/ui/controls/StreamPreview.java @@ -3,6 +3,7 @@ package ctbrec.ui.controls; import java.io.InterruptedIOException; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -161,8 +162,9 @@ public class StreamPreview extends StackPane { private void onError(MediaPlayer videoPlayer) { LOG.error("Error while starting preview stream", videoPlayer.getError()); - if(videoPlayer.getError().getCause() != null) { - LOG.error("Error while starting preview stream root cause:", videoPlayer.getError().getCause()); + Optional cause = Optional.ofNullable(videoPlayer).map(v -> v.getError()).map(e -> e.getCause()); + if(cause.isPresent()) { + LOG.error("Error while starting preview stream root cause:", cause.get()); } showTestImage(); } From e362980028b3bbd6c72a024141fe9cd6189cbaa1 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:11:45 +0100 Subject: [PATCH 02/12] Make live previews experimental Add a setting to toggle live previews. When switched off, the thumbnails won't show the trigger and the recording table won't show the column. I did this, because the MediaPlayer sometimes bugs out. It then opens a lot of connections and further tries to open a stream end in an exception in the playlist parser. --- .../main/java/ctbrec/ui/RecordedModelsTab.java | 3 +++ client/src/main/java/ctbrec/ui/ThumbCell.java | 2 +- .../main/java/ctbrec/ui/settings/SettingsTab.java | 15 ++++++++------- common/src/main/java/ctbrec/Settings.java | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/RecordedModelsTab.java b/client/src/main/java/ctbrec/ui/RecordedModelsTab.java index ab693d3f..020512c5 100644 --- a/client/src/main/java/ctbrec/ui/RecordedModelsTab.java +++ b/client/src/main/java/ctbrec/ui/RecordedModelsTab.java @@ -118,6 +118,9 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener { preview.setCellValueFactory(cdf -> new SimpleStringProperty(" ▶ ")); preview.setEditable(false); preview.setId("preview"); + if(!Config.getInstance().getSettings().livePreviews) { + preview.setVisible(false); + } TableColumn name = new TableColumn<>("Model"); name.setPrefWidth(200); name.setCellValueFactory(new PropertyValueFactory("displayName")); diff --git a/client/src/main/java/ctbrec/ui/ThumbCell.java b/client/src/main/java/ctbrec/ui/ThumbCell.java index fa3d4746..4f1cecc8 100644 --- a/client/src/main/java/ctbrec/ui/ThumbCell.java +++ b/client/src/main/java/ctbrec/ui/ThumbCell.java @@ -174,7 +174,7 @@ public class ThumbCell extends StackPane { StackPane.setAlignment(pausedIndicator, Pos.TOP_LEFT); getChildren().add(pausedIndicator); - if(Config.getInstance().getSettings().previewInThumbnails) { + if(Config.getInstance().getSettings().livePreviews) { getChildren().add(createPreviewTrigger()); } diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 4585978f..6ced7598 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -64,7 +64,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { private CheckBox chooseStreamQuality = new CheckBox(); private CheckBox multiplePlayers = new CheckBox(); private CheckBox updateThumbnails = new CheckBox(); - private CheckBox previewInThumbnails = new CheckBox(); + private CheckBox livePreviews = new CheckBox(); private CheckBox showPlayerStarting = new CheckBox(); private RadioButton recordLocal; private RadioButton recordRemote; @@ -462,16 +462,17 @@ public class SettingsTab extends Tab implements TabSelectionListener { GridPane.setMargin(updateThumbnails, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN)); layout.add(updateThumbnails, 1, row++); - l = new Label("Preview in thumbnails"); + l = new Label("Enable live previews (experimental)"); layout.add(l, 0, row); - previewInThumbnails.setSelected(Config.getInstance().getSettings().previewInThumbnails); - previewInThumbnails.setOnAction((e) -> { - Config.getInstance().getSettings().previewInThumbnails = previewInThumbnails.isSelected(); + livePreviews.setSelected(Config.getInstance().getSettings().livePreviews); + livePreviews.setOnAction((e) -> { + Config.getInstance().getSettings().livePreviews = livePreviews.isSelected(); saveConfig(); + showRestartRequired(); }); GridPane.setMargin(l, new Insets(3, 0, 0, 0)); - GridPane.setMargin(previewInThumbnails, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN)); - layout.add(previewInThumbnails, 1, row++); + GridPane.setMargin(livePreviews, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN)); + layout.add(livePreviews, 1, row++); l = new Label("Start Tab"); layout.add(l, 0, row); diff --git a/common/src/main/java/ctbrec/Settings.java b/common/src/main/java/ctbrec/Settings.java index eb480855..c96cf985 100644 --- a/common/src/main/java/ctbrec/Settings.java +++ b/common/src/main/java/ctbrec/Settings.java @@ -69,7 +69,7 @@ public class Settings { public List models = new ArrayList<>(); public List eventHandlers = new ArrayList<>(); public boolean determineResolution = false; - public boolean previewInThumbnails = true; + public boolean livePreviews = false; public boolean requireAuthentication = false; public boolean chooseStreamQuality = false; public int maximumResolution = 0; From 9958e04ef86d119f55165e8ec978058f8f241435 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:13:15 +0100 Subject: [PATCH 03/12] Make sure, that the model ID is set When a Streamate model is added by URL, make sure, that the ID is loaded, so that saving and loading works properly, since the ID is saved as site specific data. --- .../main/java/ctbrec/sites/streamate/Streamate.java | 8 +++++++- .../java/ctbrec/sites/streamate/StreamateModel.java | 10 +++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/streamate/Streamate.java b/common/src/main/java/ctbrec/sites/streamate/Streamate.java index a86eb91b..d8870509 100644 --- a/common/src/main/java/ctbrec/sites/streamate/Streamate.java +++ b/common/src/main/java/ctbrec/sites/streamate/Streamate.java @@ -193,7 +193,13 @@ public class Streamate extends AbstractSite { Matcher m = Pattern.compile("https?://.*?streamate.com/cam/([^/]*?)/?").matcher(url); if (m.matches()) { String modelName = m.group(1); - return createModel(modelName); + StreamateModel model = (StreamateModel) createModel(modelName); + try { + model.loadModelInfo(); + } catch (IOException e) { + LOG.error("Couldn't load model info. This can cause problems with saving / loading the model"); + } + return model; } else { return super.createModelFromUrl(url); } diff --git a/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java b/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java index 55497e8a..cda334bb 100644 --- a/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java +++ b/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java @@ -37,6 +37,7 @@ public class StreamateModel extends AbstractModel { private List streamSources = new ArrayList<>(); private int[] resolution; private Long id; + private String streamId; @Override public boolean isOnline(boolean ignoreCache) throws IOException, ExecutionException, InterruptedException { @@ -218,6 +219,11 @@ public class StreamateModel extends AbstractModel { } private String getStreamId() throws IOException { + loadModelInfo(); + return streamId; + } + + void loadModelInfo() throws IOException { String url = "https://hybridclient.naiadsystems.com/api/v1/config/?name=" + getName() + "&sabasic=&sakey=&sk=www.streamate.com&userid=0&version=6.3.17&ajax=1"; Request request = new Request.Builder() @@ -232,7 +238,9 @@ public class StreamateModel extends AbstractModel { if(response.isSuccessful()) { JSONObject json = new JSONObject(response.body().string()); JSONObject stream = json.getJSONObject("stream"); - return stream.getString("streamId"); + streamId = stream.getString("streamId"); + JSONObject performer = json.getJSONObject("performer"); + id = performer.getLong("id"); } else { throw new HttpException(response.code(), response.message()); } From 8a8327a2a5ec2069e2f1050a24410bc4d2e07b33 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:13:54 +0100 Subject: [PATCH 04/12] If loading site specific fails, print out the model name --- common/src/main/java/ctbrec/io/ModelJsonAdapter.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/ctbrec/io/ModelJsonAdapter.java b/common/src/main/java/ctbrec/io/ModelJsonAdapter.java index 5296f3e6..54794087 100644 --- a/common/src/main/java/ctbrec/io/ModelJsonAdapter.java +++ b/common/src/main/java/ctbrec/io/ModelJsonAdapter.java @@ -5,6 +5,9 @@ import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonReader.Token; @@ -16,6 +19,8 @@ import ctbrec.sites.chaturbate.ChaturbateModel; public class ModelJsonAdapter extends JsonAdapter { + private static final transient Logger LOG = LoggerFactory.getLogger(ModelJsonAdapter.class); + private List sites; public ModelJsonAdapter() { @@ -62,7 +67,12 @@ public class ModelJsonAdapter extends JsonAdapter { model.setSuspended(suspended); } else if(key.equals("siteSpecific")) { reader.beginObject(); - model.readSiteSpecificData(reader); + try { + model.readSiteSpecificData(reader); + } catch(Exception e) { + LOG.error("Couldn't read site specific data for model {}", model.getName()); + throw e; + } reader.endObject(); } } else { From eedb2379234ff9faba63d8ff3c035a40b6120052 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:22:21 +0100 Subject: [PATCH 05/12] Make sure, that the model ID is set --- .../src/main/java/ctbrec/sites/streamate/Streamate.java | 8 +------- .../main/java/ctbrec/sites/streamate/StreamateModel.java | 7 +++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/streamate/Streamate.java b/common/src/main/java/ctbrec/sites/streamate/Streamate.java index d8870509..a86eb91b 100644 --- a/common/src/main/java/ctbrec/sites/streamate/Streamate.java +++ b/common/src/main/java/ctbrec/sites/streamate/Streamate.java @@ -193,13 +193,7 @@ public class Streamate extends AbstractSite { Matcher m = Pattern.compile("https?://.*?streamate.com/cam/([^/]*?)/?").matcher(url); if (m.matches()) { String modelName = m.group(1); - StreamateModel model = (StreamateModel) createModel(modelName); - try { - model.loadModelInfo(); - } catch (IOException e) { - LOG.error("Couldn't load model info. This can cause problems with saving / loading the model"); - } - return model; + return createModel(modelName); } else { return super.createModelFromUrl(url); } diff --git a/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java b/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java index cda334bb..519bce2c 100644 --- a/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java +++ b/common/src/main/java/ctbrec/sites/streamate/StreamateModel.java @@ -330,6 +330,13 @@ public class StreamateModel extends AbstractModel { @Override public void writeSiteSpecificData(JsonWriter writer) throws IOException { + if(id == null) { + try { + loadModelInfo(); + } catch (IOException e) { + LOG.error("Couldn't load model ID for {}. This can cause problems with saving / loading the model", getName()); + } + } writer.name("id").value(id); } } \ No newline at end of file From b473782b9225d125a134fc51d895c951dc23e0b9 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:38:55 +0100 Subject: [PATCH 06/12] Don't list recordings, which currently get deleted --- common/src/main/java/ctbrec/recorder/LocalRecorder.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/ctbrec/recorder/LocalRecorder.java b/common/src/main/java/ctbrec/recorder/LocalRecorder.java index 5dafee65..6c9ab6df 100644 --- a/common/src/main/java/ctbrec/recorder/LocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/LocalRecorder.java @@ -554,8 +554,10 @@ public class LocalRecorder implements Recorder { if (rec.listFiles().length == 0) { continue; } - - // TODO don't list recordings, which currently get deleted + // don't list recordings, which currently get deleted + if (deleteInProgress.contains(rec)) { + continue; + } Date startDate = sdf.parse(rec.getName()); Recording recording = new Recording(); From cef3ca351e408b444515227da46dcc2a2bcc18ea Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:52:13 +0100 Subject: [PATCH 07/12] Update changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41422077..2d401867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ 1.16.0 ======================== -* Thumbnails can show a live preview. Can be switched off in the settings. +* Thumbnails can show a live preview. Can be switched on in the settings. +* Live preview is experimental for now, because I noticed some funky behavior + of the the internal media player. You can use it on your own risk. * Added Streamate (metcams, xhamstercams, pornhublive) * Maximum resolution can be an arbitrary value now * Added setting for minimal recording length. Recordings, which are shorter From 2a1dc77a89d92b36b28877ab601ae88c119ca3ab Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 17:53:53 +0100 Subject: [PATCH 08/12] Increase version number to 1.16.0 --- client/pom.xml | 2 +- common/pom.xml | 2 +- master/pom.xml | 2 +- server/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/pom.xml b/client/pom.xml index 9ea0e01e..435967b8 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -8,7 +8,7 @@ ctbrec master - 1.15.0 + 1.16.0 ../master diff --git a/common/pom.xml b/common/pom.xml index 4f20e4fa..4308d633 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -8,7 +8,7 @@ ctbrec master - 1.15.0 + 1.16.0 ../master diff --git a/master/pom.xml b/master/pom.xml index 78ea5606..bc994b4a 100644 --- a/master/pom.xml +++ b/master/pom.xml @@ -6,7 +6,7 @@ ctbrec master pom - 1.15.0 + 1.16.0 ../common diff --git a/server/pom.xml b/server/pom.xml index 24075158..4b71406f 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -8,7 +8,7 @@ ctbrec master - 1.15.0 + 1.16.0 ../master From 6dd7de9762ab25d2bfe57d4c2832f86745a31f36 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 18:10:55 +0100 Subject: [PATCH 09/12] Fix: BongaCams search fails with JSON exceptions --- .../java/ctbrec/sites/bonga/BongaCams.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/bonga/BongaCams.java b/common/src/main/java/ctbrec/sites/bonga/BongaCams.java index 573c4d67..52b2d084 100644 --- a/common/src/main/java/ctbrec/sites/bonga/BongaCams.java +++ b/common/src/main/java/ctbrec/sites/bonga/BongaCams.java @@ -157,15 +157,17 @@ public class BongaCams extends AbstractSite { JSONArray results = json.getJSONArray("models"); for (int i = 0; i < results.length(); i++) { JSONObject result = results.getJSONObject(i); - Model model = createModel(result.getString("username")); - String thumb = result.getString("thumb_image"); - if(thumb != null) { - model.setPreview("https:" + thumb); + if(result.has("username")) { + Model model = createModel(result.getString("username")); + String thumb = result.getString("thumb_image"); + if(thumb != null) { + model.setPreview("https:" + thumb); + } + if(result.has("display_name")) { + model.setDisplayName(result.getString("display_name")); + } + models.add(model); } - if(result.has("display_name")) { - model.setDisplayName(result.getString("display_name")); - } - models.add(model); } return models; } else { From 75fedfcddd16fbfcb182cdbe002d680e27be8446 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 18:28:29 +0100 Subject: [PATCH 10/12] Disable minimum length in remote mode --- client/src/main/java/ctbrec/ui/settings/SettingsTab.java | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 6ced7598..68c797b3 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -529,6 +529,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { onlineCheckIntervalInSecs.setDisable(!local); leaveSpaceOnDevice.setDisable(!local); postProcessing.setDisable(!local); + minimumLengthInSecs.setDisable(!local); } @Override From ad71f0cf11a9389a5b4a9089e1af13e985c47d77 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 19:04:57 +0100 Subject: [PATCH 11/12] Make sure to not download segments multiple times For some reason streamate playlists can go back in time. This change makes sure, that we don't download segments multiple times as a consequence of the time travelling ;) --- CHANGELOG.md | 1 + .../recorder/download/AbstractHlsDownload.java | 3 +++ .../ctbrec/recorder/download/HlsDownload.java | 16 ++++++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d401867..773b637e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ than this value, get deleted automatically. * Double-click in Recording tab starts the player * Fix: BongaCams friends tab not working +* Fix: BongaCams search fails with JSON exception * Fix: In some cases MFC models got confused 1.15.0 diff --git a/common/src/main/java/ctbrec/recorder/download/AbstractHlsDownload.java b/common/src/main/java/ctbrec/recorder/download/AbstractHlsDownload.java index 1fb6333d..b4ab0507 100644 --- a/common/src/main/java/ctbrec/recorder/download/AbstractHlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/AbstractHlsDownload.java @@ -52,6 +52,9 @@ public abstract class AbstractHlsDownload implements Download { Request request = new Request.Builder().url(segmentsUrl).addHeader("connection", "keep-alive").build(); try(Response response = client.execute(request)) { if(response.isSuccessful()) { + // String body = response.body().string(); + // InputStream inputStream = new ByteArrayInputStream(body.getBytes("utf-8")); + // LOG.debug("Segments {}", body); InputStream inputStream = response.body().byteStream(); PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8, ParsingMode.LENIENT); Playlist playlist = parser.parse(); diff --git a/common/src/main/java/ctbrec/recorder/download/HlsDownload.java b/common/src/main/java/ctbrec/recorder/download/HlsDownload.java index f682acda..9eef5d7c 100644 --- a/common/src/main/java/ctbrec/recorder/download/HlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/HlsDownload.java @@ -76,13 +76,13 @@ public class HlsDownload extends AbstractHlsDownload { } int lastSegment = 0; int nextSegment = 0; - boolean sleep = true; // this enables sleeping between playlist requests. once we miss a segment, this is set to false, so that no sleeping happens anymore + int waitFactor = 1; while(running) { SegmentPlaylist lsp = getNextSegments(segments); if(nextSegment > 0 && lsp.seq > nextSegment) { // TODO switch to a lower bitrate/resolution ?!? - LOG.warn("Missed segments {} < {} in download for {}", nextSegment, lsp.seq, model); - sleep = false; + waitFactor *= 2; + LOG.warn("Missed segments {} < {} in download for {} - setting wait factor to 1/{}", nextSegment, lsp.seq, model, waitFactor); } int skip = nextSegment - lsp.seq; for (String segment : lsp.segments) { @@ -97,9 +97,9 @@ public class HlsDownload extends AbstractHlsDownload { } long wait = 0; - if(sleep && lastSegment == lsp.seq) { + if(lastSegment == lsp.seq) { // playlist didn't change -> wait for at least half the target duration - wait = (long) lsp.targetDuration * 1000 / 2; + wait = (long) lsp.targetDuration * 1000 / waitFactor; LOG.trace("Playlist didn't change... waiting for {}ms", wait); } else { // playlist did change -> wait for at least last segment duration @@ -115,8 +115,12 @@ public class HlsDownload extends AbstractHlsDownload { } } + // this if check makes sure, that we don't decrease nextSegment. for some reason + // streamate playlists sometimes jump back. e.g. max sequence = 79 -> 80 -> 79 lastSegment = lsp.seq; - nextSegment = lastSegment + lsp.segments.size(); + if(lastSegment + lsp.segments.size() > nextSegment) { + nextSegment = lastSegment + lsp.segments.size(); + } } } else { throw new IOException("Couldn't determine segments uri"); From 32807a2fde35b0baf2b9bce4039ae84d70cfc99e Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Mon, 17 Dec 2018 22:06:13 +0100 Subject: [PATCH 12/12] Let models create their download Add createDownload to Model. This method is called by the recorder to create and then start a download. It is a method of Model so that each site and each download can create a specialized download. --- client/src/main/java/ctbrec/ui/JavaFxModel.java | 6 ++++++ common/src/main/java/ctbrec/AbstractModel.java | 12 ++++++++++++ common/src/main/java/ctbrec/Model.java | 3 ++- .../src/main/java/ctbrec/recorder/LocalRecorder.java | 10 +--------- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/JavaFxModel.java b/client/src/main/java/ctbrec/ui/JavaFxModel.java index 0f9019d4..f60ce99d 100644 --- a/client/src/main/java/ctbrec/ui/JavaFxModel.java +++ b/client/src/main/java/ctbrec/ui/JavaFxModel.java @@ -10,6 +10,7 @@ import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; import ctbrec.Model; +import ctbrec.recorder.download.Download; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.Site; import javafx.beans.property.BooleanProperty; @@ -212,4 +213,9 @@ public class JavaFxModel implements Model { public int compareTo(Model o) { return delegate.compareTo(o); } + + @Override + public Download createDownload() { + return delegate.createDownload(); + } } diff --git a/common/src/main/java/ctbrec/AbstractModel.java b/common/src/main/java/ctbrec/AbstractModel.java index 53198b05..6f34272c 100644 --- a/common/src/main/java/ctbrec/AbstractModel.java +++ b/common/src/main/java/ctbrec/AbstractModel.java @@ -9,6 +9,9 @@ import java.util.concurrent.ExecutionException; import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; +import ctbrec.recorder.download.Download; +import ctbrec.recorder.download.HlsDownload; +import ctbrec.recorder.download.MergedHlsDownload; import ctbrec.sites.Site; public abstract class AbstractModel implements Model { @@ -184,4 +187,13 @@ public abstract class AbstractModel implements Model { public Site getSite() { return site; } + + @Override + public Download createDownload() { + if(Config.isServerMode()) { + return new HlsDownload(getSite().getHttpClient()); + } else { + return new MergedHlsDownload(getSite().getHttpClient()); + } + } } diff --git a/common/src/main/java/ctbrec/Model.java b/common/src/main/java/ctbrec/Model.java index feb73817..70ddee51 100644 --- a/common/src/main/java/ctbrec/Model.java +++ b/common/src/main/java/ctbrec/Model.java @@ -9,6 +9,7 @@ import com.iheartradio.m3u8.PlaylistException; import com.squareup.moshi.JsonReader; import com.squareup.moshi.JsonWriter; +import ctbrec.recorder.download.Download; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.Site; @@ -101,6 +102,6 @@ public interface Model extends Comparable { public void setSuspended(boolean suspended); - + public Download createDownload(); } \ No newline at end of file diff --git a/common/src/main/java/ctbrec/recorder/LocalRecorder.java b/common/src/main/java/ctbrec/recorder/LocalRecorder.java index 6c9ab6df..97982b94 100644 --- a/common/src/main/java/ctbrec/recorder/LocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/LocalRecorder.java @@ -61,8 +61,6 @@ import ctbrec.io.HttpClient; import ctbrec.io.StreamRedirectThread; import ctbrec.recorder.PlaylistGenerator.InvalidPlaylistException; import ctbrec.recorder.download.Download; -import ctbrec.recorder.download.HlsDownload; -import ctbrec.recorder.download.MergedHlsDownload; public class LocalRecorder implements Recorder { @@ -194,13 +192,7 @@ public class LocalRecorder implements Recorder { } LOG.debug("Starting recording for model {}", model.getName()); - Download download; - if (Config.isServerMode()) { - download = new HlsDownload(client); - } else { - download = new MergedHlsDownload(client); - } - + Download download = model.createDownload(); recordingProcesses.put(model, download); new Thread() { @Override