Fix bug in MyFreeCams online detection

This commit is contained in:
0xb00bface 2022-06-11 19:18:23 +02:00
parent 73598fa590
commit cdd8ae0d7a
2 changed files with 52 additions and 70 deletions

View File

@ -22,12 +22,12 @@ import org.slf4j.LoggerFactory;
import javax.xml.bind.JAXBException; import javax.xml.bind.JAXBException;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import static ctbrec.io.HttpConstants.*; import static ctbrec.io.HttpConstants.*;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Optional.ofNullable; import static java.util.Optional.ofNullable;
public class MyFreeCamsModel extends AbstractModel { 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 * This constructor exists only for deserialization. Please don't call it directly
*/ */
public MyFreeCamsModel() {} @SuppressWarnings("unused")
public MyFreeCamsModel() {
}
MyFreeCamsModel(MyFreeCams site) { MyFreeCamsModel(MyFreeCams site) {
this.site = site; this.site = site;
@ -62,6 +64,7 @@ public class MyFreeCamsModel extends AbstractModel {
List<ctbrec.Model> searchResult = MyFreeCamsClient.getInstance().search(getName()); List<ctbrec.Model> searchResult = MyFreeCamsClient.getInstance().search(getName());
if (!searchResult.isEmpty()) { if (!searchResult.isEmpty()) {
MyFreeCamsModel m = (MyFreeCamsModel) searchResult.get(0); MyFreeCamsModel m = (MyFreeCamsModel) searchResult.get(0);
this.state = m.state;
this.onlineState = m.getOnlineState(true); this.onlineState = m.getOnlineState(true);
} }
} }
@ -83,7 +86,7 @@ public class MyFreeCamsModel extends AbstractModel {
} }
} }
switch(state) { switch (state) {
case ONLINE, RECORDING: case ONLINE, RECORDING:
return ctbrec.Model.State.ONLINE; return ctbrec.Model.State.ONLINE;
case AWAY: case AWAY:
@ -125,7 +128,7 @@ public class MyFreeCamsModel extends AbstractModel {
@Override @Override
public void receiveTip(Double tokens) throws IOException { public void receiveTip(Double tokens) throws IOException {
String tipUrl = MyFreeCams.baseUrl + "/php/tip.php"; 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() Request req = new Request.Builder()
.url(initUrl) .url(initUrl)
.header(ACCEPT, "*/*") .header(ACCEPT, "*/*")
@ -162,8 +165,8 @@ public class MyFreeCamsModel extends AbstractModel {
.header(CONNECTION, KEEP_ALIVE) .header(CONNECTION, KEEP_ALIVE)
.header(REFERER, initUrl) .header(REFERER, initUrl)
.build(); .build();
try(Response response = site.getHttpClient().execute(req)) { try (Response response = site.getHttpClient().execute(req)) {
if(!response.isSuccessful()) { if (!response.isSuccessful()) {
throw new HttpException(response.code(), response.message()); throw new HttpException(response.code(), response.message());
} }
} }
@ -181,7 +184,7 @@ public class MyFreeCamsModel extends AbstractModel {
List<StreamSource> streamSources = getStreamSources(); List<StreamSource> streamSources = getStreamSources();
Collections.sort(streamSources); Collections.sort(streamSources);
StreamSource best = streamSources.get(streamSources.size() - 1); 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) { } catch (JAXBException | ParseException | PlaylistException e) {
LOG.warn("Couldn't determine stream resolution - {}", e.getMessage()); LOG.warn("Couldn't determine stream resolution - {}", e.getMessage());
} catch (ExecutionException | IOException e) { } catch (ExecutionException | IOException e) {
@ -219,7 +222,7 @@ public class MyFreeCamsModel extends AbstractModel {
@Override @Override
public void setName(String name) { 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); LOG.debug("Model name changed {} -> {}", getName(), name);
setUrl("https://profiles.myfreecams.com/" + name); setUrl("https://profiles.myfreecams.com/" + name);
} }
@ -237,31 +240,21 @@ public class MyFreeCamsModel extends AbstractModel {
// preview // preview
String uidString = state.getUid().toString(); String uidString = state.getUid().toString();
String uidStart = uidString.substring(0, 3); String uidStart = uidString.substring(0, 3);
String previewUrl = "https://img.mfcimg.com/photos2/"+uidStart+'/'+uidString+"/avatar.300x300.jpg"; String previewUrl = "https://img.mfcimg.com/photos2/" + uidStart + '/' + uidString + "/avatar.300x300.jpg";
if(MyFreeCamsModel.this.state == ctbrec.sites.mfc.State.ONLINE) { if (MyFreeCamsModel.this.state == ctbrec.sites.mfc.State.ONLINE) {
try { try {
previewUrl = getLivePreviewUrl(state); previewUrl = getLivePreviewUrl(state);
} catch(Exception e) { } catch (Exception e) {
LOG.error("Couldn't get live preview. Falling back to avatar", e); LOG.error("Couldn't get live preview. Falling back to avatar", e);
} }
} }
setPreview(previewUrl); setPreview(previewUrl);
// tags // tags
ofNullable(state.getM()).map(Model::getTags).ifPresent(tags -> { ofNullable(state.getM()).map(Model::getTags).ifPresent(tags -> setTags(new ArrayList<>(tags)));
ArrayList<String> t = new ArrayList<>();
t.addAll(tags);
setTags(t);
});
// description // description
ofNullable(state.getM()).map(Model::getTopic).ifPresent(topic -> { ofNullable(state.getM()).map(Model::getTopic).ifPresent(topic -> setDescription(URLDecoder.decode(topic, UTF_8)));
try {
setDescription(URLDecoder.decode(topic, "utf-8"));
} catch (UnsupportedEncodingException e) {
LOG.warn("Couldn't url decode topic", e);
}
});
viewerCount = ofNullable(state.getM()).map(Model::getRc).orElse(0); viewerCount = ofNullable(state.getM()).map(Model::getRc).orElse(0);
} }
@ -271,22 +264,22 @@ public class MyFreeCamsModel extends AbstractModel {
int userChannel = 100000000 + state.getUid(); int userChannel = 100000000 + state.getUid();
int camserv = state.getU().getCamserv(); int camserv = state.getU().getCamserv();
String server; String server;
ServerConfig sc = ((MyFreeCams)site).getClient().getServerConfig(); ServerConfig sc = ((MyFreeCams) site).getClient().getServerConfig();
String phase = state.getU().getPhase(); String phase = state.getU().getPhase();
if(sc.isOnNgServer(state)) { if (sc.isOnNgServer(state)) {
server = sc.ngVideoServers.get(Integer.toString(camserv)); server = sc.ngVideoServers.get(Integer.toString(camserv));
camserv = toCamServ(server); camserv = toCamServ(server);
previewUrl = toPreviewUrl(camserv, phase, userChannel); previewUrl = toPreviewUrl(camserv, phase, userChannel);
} else if(sc.isOnWzObsVideoServer(state)) { } else if (sc.isOnWzObsVideoServer(state)) {
server = sc.wzobsServers.get(Integer.toString(camserv)); server = sc.wzobsServers.get(Integer.toString(camserv));
camserv = toCamServ(server); camserv = toCamServ(server);
previewUrl = toPreviewUrl(camserv, phase, userChannel); previewUrl = toPreviewUrl(camserv, phase, userChannel);
} else if(sc.isOnHtml5VideoServer(state)) { } else if (sc.isOnHtml5VideoServer(state)) {
server = sc.h5Servers.get(Integer.toString(camserv)); server = sc.h5Servers.get(Integer.toString(camserv));
camserv = toCamServ(server); camserv = toCamServ(server);
previewUrl = toPreviewUrl(camserv, userChannel); previewUrl = toPreviewUrl(camserv, userChannel);
} else { } else {
if(camserv > 500) camserv -= 500; if (camserv > 500) camserv -= 500;
previewUrl = toPreviewUrl(camserv, userChannel); previewUrl = toPreviewUrl(camserv, userChannel);
} }
return previewUrl; return previewUrl;
@ -306,12 +299,12 @@ public class MyFreeCamsModel extends AbstractModel {
@Override @Override
public boolean follow() { public boolean follow() {
return ((MyFreeCams)site).getClient().follow(getUid()); return ((MyFreeCams) site).getClient().follow(getUid());
} }
@Override @Override
public boolean unfollow() { public boolean unfollow() {
return ((MyFreeCams)site).getClient().unfollow(getUid()); return ((MyFreeCams) site).getClient().unfollow(getUid());
} }
public int getUid() { public int getUid() {
@ -343,7 +336,7 @@ public class MyFreeCamsModel extends AbstractModel {
@Override @Override
public Download createDownload() { public Download createDownload() {
if(streamUrl == null) { if (streamUrl == null) {
updateStreamUrl(); updateStreamUrl();
} }
return super.createDownload(); return super.createDownload();

View File

@ -15,38 +15,27 @@ public enum State {
OFFLINE("offline"), OFFLINE("offline"),
UNKNOWN("unknown"); UNKNOWN("unknown");
String literal; final String literal;
State(String literal) { State(String literal) {
this.literal = literal; this.literal = literal;
} }
public static State of(Integer vs) { public static State of(Integer vs) {
Integer s = Optional.ofNullable(vs).orElse(Integer.MAX_VALUE); Integer s = Optional.ofNullable(vs).orElse(Integer.MAX_VALUE);
switch (s) { return switch (s) {
case 0: case 0 -> ONLINE;
return ONLINE; case 90 -> CAMOFF;
case 90: case -4 -> RECORDING;
return CAMOFF; case -3 -> INCLUDE;
case -4: case -2 -> EXCLUDE;
return RECORDING; case -1 -> DELETE;
case -3: case 2 -> AWAY;
return INCLUDE; case 12, 91 -> PRIVATE;
case -2: case 13 -> GROUP_SHOW;
return EXCLUDE; case 127 -> OFFLINE;
case -1: default -> UNKNOWN;
return DELETE; };
case 2:
return AWAY;
case 12:
case 91:
return PRIVATE;
case 13:
return GROUP_SHOW;
case 127:
return OFFLINE;
default:
return UNKNOWN;
}
} }
@Override @Override