From cdd8ae0d7a6996caf7c468e5ca3bbb34dce8f524 Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sat, 11 Jun 2022 19:18:23 +0200 Subject: [PATCH] Fix bug in MyFreeCams online detection --- .../ctbrec/sites/mfc/MyFreeCamsModel.java | 81 +++++++++---------- .../src/main/java/ctbrec/sites/mfc/State.java | 41 ++++------ 2 files changed, 52 insertions(+), 70 deletions(-) diff --git a/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java b/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java index 6ad562f5..84e5700e 100644 --- a/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java +++ b/common/src/main/java/ctbrec/sites/mfc/MyFreeCamsModel.java @@ -22,12 +22,12 @@ import org.slf4j.LoggerFactory; import javax.xml.bind.JAXBException; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.*; import java.util.concurrent.ExecutionException; import static ctbrec.io.HttpConstants.*; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Optional.ofNullable; public class MyFreeCamsModel extends AbstractModel { @@ -44,7 +44,9 @@ public class MyFreeCamsModel extends AbstractModel { /** * This constructor exists only for deserialization. Please don't call it directly */ - public MyFreeCamsModel() {} + @SuppressWarnings("unused") + public MyFreeCamsModel() { + } MyFreeCamsModel(MyFreeCams site) { this.site = site; @@ -62,6 +64,7 @@ public class MyFreeCamsModel extends AbstractModel { List searchResult = MyFreeCamsClient.getInstance().search(getName()); if (!searchResult.isEmpty()) { MyFreeCamsModel m = (MyFreeCamsModel) searchResult.get(0); + this.state = m.state; this.onlineState = m.getOnlineState(true); } } @@ -83,20 +86,20 @@ public class MyFreeCamsModel extends AbstractModel { } } - switch(state) { - case ONLINE, RECORDING: - return ctbrec.Model.State.ONLINE; - case AWAY: - return ctbrec.Model.State.AWAY; - case PRIVATE: - return ctbrec.Model.State.PRIVATE; - case GROUP_SHOW: - return ctbrec.Model.State.GROUP; - case OFFLINE, CAMOFF, UNKNOWN: - return ctbrec.Model.State.OFFLINE; - default: - LOG.debug("State {} is not mapped", this.state); - return ctbrec.Model.State.UNKNOWN; + switch (state) { + case ONLINE, RECORDING: + return ctbrec.Model.State.ONLINE; + case AWAY: + return ctbrec.Model.State.AWAY; + case PRIVATE: + return ctbrec.Model.State.PRIVATE; + case GROUP_SHOW: + return ctbrec.Model.State.GROUP; + case OFFLINE, CAMOFF, UNKNOWN: + return ctbrec.Model.State.OFFLINE; + default: + LOG.debug("State {} is not mapped", this.state); + return ctbrec.Model.State.UNKNOWN; } } @@ -125,7 +128,7 @@ public class MyFreeCamsModel extends AbstractModel { @Override public void receiveTip(Double tokens) throws IOException { String tipUrl = MyFreeCams.baseUrl + "/php/tip.php"; - String initUrl = tipUrl + "?request=tip&username="+getName()+"&broadcaster_id="+getUid(); + String initUrl = tipUrl + "?request=tip&username=" + getName() + "&broadcaster_id=" + getUid(); Request req = new Request.Builder() .url(initUrl) .header(ACCEPT, "*/*") @@ -162,8 +165,8 @@ public class MyFreeCamsModel extends AbstractModel { .header(CONNECTION, KEEP_ALIVE) .header(REFERER, initUrl) .build(); - try(Response response = site.getHttpClient().execute(req)) { - if(!response.isSuccessful()) { + try (Response response = site.getHttpClient().execute(req)) { + if (!response.isSuccessful()) { throw new HttpException(response.code(), response.message()); } } @@ -181,7 +184,7 @@ public class MyFreeCamsModel extends AbstractModel { List streamSources = getStreamSources(); Collections.sort(streamSources); StreamSource best = streamSources.get(streamSources.size() - 1); - resolution = new int[] { best.width, best.height }; + resolution = new int[]{best.width, best.height}; } catch (JAXBException | ParseException | PlaylistException e) { LOG.warn("Couldn't determine stream resolution - {}", e.getMessage()); } catch (ExecutionException | IOException e) { @@ -219,7 +222,7 @@ public class MyFreeCamsModel extends AbstractModel { @Override public void setName(String name) { - if(getName() != null && name != null && !getName().equals(name)) { + if (getName() != null && name != null && !getName().equals(name)) { LOG.debug("Model name changed {} -> {}", getName(), name); setUrl("https://profiles.myfreecams.com/" + name); } @@ -237,31 +240,21 @@ public class MyFreeCamsModel extends AbstractModel { // preview String uidString = state.getUid().toString(); String uidStart = uidString.substring(0, 3); - String previewUrl = "https://img.mfcimg.com/photos2/"+uidStart+'/'+uidString+"/avatar.300x300.jpg"; - if(MyFreeCamsModel.this.state == ctbrec.sites.mfc.State.ONLINE) { + String previewUrl = "https://img.mfcimg.com/photos2/" + uidStart + '/' + uidString + "/avatar.300x300.jpg"; + if (MyFreeCamsModel.this.state == ctbrec.sites.mfc.State.ONLINE) { try { previewUrl = getLivePreviewUrl(state); - } catch(Exception e) { + } catch (Exception e) { LOG.error("Couldn't get live preview. Falling back to avatar", e); } } setPreview(previewUrl); // tags - ofNullable(state.getM()).map(Model::getTags).ifPresent(tags -> { - ArrayList t = new ArrayList<>(); - t.addAll(tags); - setTags(t); - }); + ofNullable(state.getM()).map(Model::getTags).ifPresent(tags -> setTags(new ArrayList<>(tags))); // description - ofNullable(state.getM()).map(Model::getTopic).ifPresent(topic -> { - try { - setDescription(URLDecoder.decode(topic, "utf-8")); - } catch (UnsupportedEncodingException e) { - LOG.warn("Couldn't url decode topic", e); - } - }); + ofNullable(state.getM()).map(Model::getTopic).ifPresent(topic -> setDescription(URLDecoder.decode(topic, UTF_8))); viewerCount = ofNullable(state.getM()).map(Model::getRc).orElse(0); } @@ -271,22 +264,22 @@ public class MyFreeCamsModel extends AbstractModel { int userChannel = 100000000 + state.getUid(); int camserv = state.getU().getCamserv(); String server; - ServerConfig sc = ((MyFreeCams)site).getClient().getServerConfig(); + ServerConfig sc = ((MyFreeCams) site).getClient().getServerConfig(); String phase = state.getU().getPhase(); - if(sc.isOnNgServer(state)) { + if (sc.isOnNgServer(state)) { server = sc.ngVideoServers.get(Integer.toString(camserv)); camserv = toCamServ(server); previewUrl = toPreviewUrl(camserv, phase, userChannel); - } else if(sc.isOnWzObsVideoServer(state)) { + } else if (sc.isOnWzObsVideoServer(state)) { server = sc.wzobsServers.get(Integer.toString(camserv)); camserv = toCamServ(server); previewUrl = toPreviewUrl(camserv, phase, userChannel); - } else if(sc.isOnHtml5VideoServer(state)) { + } else if (sc.isOnHtml5VideoServer(state)) { server = sc.h5Servers.get(Integer.toString(camserv)); camserv = toCamServ(server); previewUrl = toPreviewUrl(camserv, userChannel); } else { - if(camserv > 500) camserv -= 500; + if (camserv > 500) camserv -= 500; previewUrl = toPreviewUrl(camserv, userChannel); } return previewUrl; @@ -306,12 +299,12 @@ public class MyFreeCamsModel extends AbstractModel { @Override public boolean follow() { - return ((MyFreeCams)site).getClient().follow(getUid()); + return ((MyFreeCams) site).getClient().follow(getUid()); } @Override public boolean unfollow() { - return ((MyFreeCams)site).getClient().unfollow(getUid()); + return ((MyFreeCams) site).getClient().unfollow(getUid()); } public int getUid() { @@ -343,7 +336,7 @@ public class MyFreeCamsModel extends AbstractModel { @Override public Download createDownload() { - if(streamUrl == null) { + if (streamUrl == null) { updateStreamUrl(); } return super.createDownload(); diff --git a/common/src/main/java/ctbrec/sites/mfc/State.java b/common/src/main/java/ctbrec/sites/mfc/State.java index 11c3dea7..2d52d732 100644 --- a/common/src/main/java/ctbrec/sites/mfc/State.java +++ b/common/src/main/java/ctbrec/sites/mfc/State.java @@ -15,38 +15,27 @@ public enum State { OFFLINE("offline"), UNKNOWN("unknown"); - String literal; + final String literal; + State(String literal) { this.literal = literal; } public static State of(Integer vs) { Integer s = Optional.ofNullable(vs).orElse(Integer.MAX_VALUE); - switch (s) { - case 0: - return ONLINE; - case 90: - return CAMOFF; - case -4: - return RECORDING; - case -3: - return INCLUDE; - case -2: - return EXCLUDE; - case -1: - return DELETE; - case 2: - return AWAY; - case 12: - case 91: - return PRIVATE; - case 13: - return GROUP_SHOW; - case 127: - return OFFLINE; - default: - return UNKNOWN; - } + return switch (s) { + case 0 -> ONLINE; + case 90 -> CAMOFF; + case -4 -> RECORDING; + case -3 -> INCLUDE; + case -2 -> EXCLUDE; + case -1 -> DELETE; + case 2 -> AWAY; + case 12, 91 -> PRIVATE; + case 13 -> GROUP_SHOW; + case 127 -> OFFLINE; + default -> UNKNOWN; + }; } @Override