Fix bug in MyFreeCams online detection
This commit is contained in:
parent
73598fa590
commit
cdd8ae0d7a
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue