From bc40c16000253cf213886aacb74d73bf6a047282 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 31 Oct 2018 13:55:03 +0100 Subject: [PATCH 1/4] Add possibility to safe site specific data Extend the json serialization to allow to write site specific data for each model. --- src/main/java/ctbrec/AbstractModel.java | 12 ++++ src/main/java/ctbrec/Model.java | 4 ++ src/main/java/ctbrec/io/ModelJsonAdapter.java | 70 +++++++++++-------- src/main/java/ctbrec/ui/JavaFxModel.java | 12 ++++ 4 files changed, 68 insertions(+), 30 deletions(-) diff --git a/src/main/java/ctbrec/AbstractModel.java b/src/main/java/ctbrec/AbstractModel.java index 267f9661..28220312 100644 --- a/src/main/java/ctbrec/AbstractModel.java +++ b/src/main/java/ctbrec/AbstractModel.java @@ -8,6 +8,8 @@ import java.util.concurrent.ExecutionException; import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.recorder.download.StreamSource; @@ -93,6 +95,16 @@ public abstract class AbstractModel implements Model { return url; } + @Override + public void readSiteSpecificData(JsonReader reader) throws IOException { + // noop default implementation, can be overriden by concrete models + } + + @Override + public void writeSiteSpecificData(JsonWriter writer) throws IOException { + // noop default implementation, can be overriden by concrete models + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/ctbrec/Model.java b/src/main/java/ctbrec/Model.java index 68d9646b..2db582a3 100644 --- a/src/main/java/ctbrec/Model.java +++ b/src/main/java/ctbrec/Model.java @@ -6,6 +6,8 @@ import java.util.concurrent.ExecutionException; import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.recorder.download.StreamSource; import ctbrec.sites.Site; @@ -35,4 +37,6 @@ public interface Model { public boolean unfollow() throws IOException; public void setSite(Site site); public Site getSite(); + public void writeSiteSpecificData(JsonWriter writer) throws IOException; + public void readSiteSpecificData(JsonReader reader) throws IOException; } \ No newline at end of file diff --git a/src/main/java/ctbrec/io/ModelJsonAdapter.java b/src/main/java/ctbrec/io/ModelJsonAdapter.java index fdaefc39..804c77fa 100644 --- a/src/main/java/ctbrec/io/ModelJsonAdapter.java +++ b/src/main/java/ctbrec/io/ModelJsonAdapter.java @@ -32,45 +32,51 @@ public class ModelJsonAdapter extends JsonAdapter { String url = null; String type = null; int streamUrlIndex = -1; + + Model model = null; while(reader.hasNext()) { - Token token = reader.peek(); - if(token == Token.NAME) { - String key = reader.nextName(); - if(key.equals("name")) { - name = reader.nextString(); - } else if(key.equals("description")) { - description = reader.nextString(); - } else if(key.equals("url")) { - url = reader.nextString(); - } else if(key.equals("type")) { - type = reader.nextString(); - } else if(key.equals("streamUrlIndex")) { - streamUrlIndex = reader.nextInt(); + try { + Token token = reader.peek(); + if(token == Token.NAME) { + String key = reader.nextName(); + if(key.equals("name")) { + name = reader.nextString(); + model.setName(name); + } else if(key.equals("description")) { + description = reader.nextString(); + model.setDescription(description); + } else if(key.equals("url")) { + url = reader.nextString(); + model.setUrl(url); + } else if(key.equals("type")) { + type = reader.nextString(); + Class modelClass = Class.forName(Optional.ofNullable(type).orElse(ChaturbateModel.class.getName())); + model = (Model) modelClass.newInstance(); + } else if(key.equals("streamUrlIndex")) { + streamUrlIndex = reader.nextInt(); + model.setStreamUrlIndex(streamUrlIndex); + } else if(key.equals("siteSpecific")) { + reader.beginObject(); + model.readSiteSpecificData(reader); + reader.endObject(); + } + } else { + reader.skipValue(); } - } else { - reader.skipValue(); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { + throw new IOException("Couldn't instantiate model class [" + type + "]", e); } } reader.endObject(); - try { - Class modelClass = Class.forName(Optional.ofNullable(type).orElse(ChaturbateModel.class.getName())); - Model model = (Model) modelClass.newInstance(); - model.setName(name); - model.setDescription(description); - model.setUrl(url); - model.setStreamUrlIndex(streamUrlIndex); - if(sites != null) { - for (Site site : sites) { - if(site.isSiteForModel(model)) { - model.setSite(site); - } + if(sites != null) { + for (Site site : sites) { + if(site.isSiteForModel(model)) { + model.setSite(site); } } - return model; - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { - throw new IOException("Couldn't instantiate model class [" + type + "]", e); } + return model; } @Override @@ -81,6 +87,10 @@ public class ModelJsonAdapter extends JsonAdapter { writeValueIfSet(writer, "description", model.getDescription()); writeValueIfSet(writer, "url", model.getUrl()); writer.name("streamUrlIndex").value(model.getStreamUrlIndex()); + writer.name("siteSpecific"); + writer.beginObject(); + model.writeSiteSpecificData(writer); + writer.endObject(); writer.endObject(); } diff --git a/src/main/java/ctbrec/ui/JavaFxModel.java b/src/main/java/ctbrec/ui/JavaFxModel.java index 1ede0c64..105da296 100644 --- a/src/main/java/ctbrec/ui/JavaFxModel.java +++ b/src/main/java/ctbrec/ui/JavaFxModel.java @@ -7,6 +7,8 @@ import java.util.concurrent.ExecutionException; import com.iheartradio.m3u8.ParseException; import com.iheartradio.m3u8.PlaylistException; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.AbstractModel; import ctbrec.Model; @@ -147,4 +149,14 @@ public class JavaFxModel extends AbstractModel { public Site getSite() { return delegate.getSite(); } + + @Override + public void readSiteSpecificData(JsonReader reader) throws IOException { + delegate.readSiteSpecificData(reader); + } + + @Override + public void writeSiteSpecificData(JsonWriter writer) throws IOException { + delegate.writeSiteSpecificData(writer); + } } From 07dee1a631939b13c89d7d236daf8ffc8820d87d Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 31 Oct 2018 13:57:04 +0100 Subject: [PATCH 2/4] Add detection of model name changes for MyFreeCams MyFreeCamsModel now also takes the uid into account instead of only using the the name. To support this feature between sessions, the uid is saved as site specific data. --- .../ctbrec/sites/mfc/MyFreeCamsClient.java | 2 +- .../ctbrec/sites/mfc/MyFreeCamsModel.java | 25 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java b/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java index 188f2378..7013dfd8 100644 --- a/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCamsClient.java @@ -484,7 +484,7 @@ public class MyFreeCamsClient { lock.lock(); try { for (SessionState state : sessionStates.values()) { - if(Objects.equals(state.getNm(), model.getName())) { + if(Objects.equals(state.getNm(), model.getName()) || Objects.equals(model.getUid(), state.getUid())) { model.update(state, getStreamUrl(state)); return; } diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java b/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java index 36a24da6..db794ae2 100644 --- a/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java @@ -23,6 +23,8 @@ import com.iheartradio.m3u8.PlaylistParser; import com.iheartradio.m3u8.data.MasterPlaylist; import com.iheartradio.m3u8.data.Playlist; import com.iheartradio.m3u8.data.PlaylistData; +import com.squareup.moshi.JsonReader; +import com.squareup.moshi.JsonWriter; import ctbrec.AbstractModel; import ctbrec.recorder.download.StreamSource; @@ -37,7 +39,7 @@ public class MyFreeCamsModel extends AbstractModel { private static final transient Logger LOG = LoggerFactory.getLogger(MyFreeCamsModel.class); - private int uid; + private int uid = -1; // undefined private String hlsUrl; private double camScore; private int viewerCount; @@ -207,7 +209,17 @@ public class MyFreeCamsModel extends AbstractModel { this.state = state; } + @Override + public void setName(String name) { + if(getName() != null && name != null && !getName().equals(name)) { + LOG.debug("Model name changed {} -> {}", getName(), name); + } + super.setName(name); + } + public void update(SessionState state, String streamUrl) { + uid = Integer.parseInt(state.getUid().toString()); + setName(state.getNm()); setCamScore(state.getM().getCamscore()); setState(State.of(state.getVs())); setStreamUrl(streamUrl); @@ -308,4 +320,15 @@ public class MyFreeCamsModel extends AbstractModel { public Site getSite() { return site; } + + @Override + public void readSiteSpecificData(JsonReader reader) throws IOException { + reader.nextName(); + uid = reader.nextInt(); + } + + @Override + public void writeSiteSpecificData(JsonWriter writer) throws IOException { + writer.name("uid").value(uid); + } } From 625b7727d01112d649b13055f54972c6d7f5c7e0 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 31 Oct 2018 14:17:47 +0100 Subject: [PATCH 3/4] Add affiliate link to MyFreeCams --- src/main/java/ctbrec/sites/mfc/MyFreeCams.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ctbrec/sites/mfc/MyFreeCams.java b/src/main/java/ctbrec/sites/mfc/MyFreeCams.java index c8544740..c06c1218 100644 --- a/src/main/java/ctbrec/sites/mfc/MyFreeCams.java +++ b/src/main/java/ctbrec/sites/mfc/MyFreeCams.java @@ -55,7 +55,7 @@ public class MyFreeCams extends AbstractSite { @Override public String getAffiliateLink() { - return ""; + return BASE_URI + "/?baf=8127165"; } @Override @@ -93,7 +93,7 @@ public class MyFreeCams extends AbstractSite { @Override public String getBuyTokensLink() { - return "https://www.myfreecams.com/php/purchase.php?request=tokens"; + return BASE_URI + "/php/purchase.php?request=tokens"; } @Override @@ -149,7 +149,7 @@ public class MyFreeCams extends AbstractSite { layout.add(password, 1, 1); Button createAccount = new Button("Create new Account"); - createAccount.setOnAction((e) -> DesktopIntergation.open(BASE_URI + "/php/signup.php?request=register")); + createAccount.setOnAction((e) -> DesktopIntergation.open(getAffiliateLink())); layout.add(createAccount, 1, 2); GridPane.setColumnSpan(createAccount, 2); GridPane.setMargin(username, new Insets(0, 0, 0, SettingsTab.CHECKBOX_MARGIN)); From 3f84f94873f061e4687a28a3855c58bb9836646b Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Wed, 31 Oct 2018 14:18:12 +0100 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3b95ef4..2638c346 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +1.6.2 +======================== +* Added detection of model name changes for MyFreeCams + + 1.6.1 ======================== * Fixed UI freeze, which occured for a high number of recorded models