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 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<ctbrec.Model> 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<StreamSource> 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<String> 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();

View File

@ -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