72 lines
2.4 KiB
Java
72 lines
2.4 KiB
Java
package ctbrec.sites.secretfriends;
|
|
|
|
import ctbrec.Model;
|
|
import org.jsoup.nodes.Element;
|
|
|
|
import java.util.Objects;
|
|
import java.util.Set;
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
public class SecretFriendsModelParser {
|
|
private SecretFriendsModelParser() {
|
|
}
|
|
|
|
public static SecretFriendsModel parse(SecretFriends site, Element modelWrapper) {
|
|
String name = parseName(modelWrapper);
|
|
SecretFriendsModel model = site.createModel(name);
|
|
model.setPreview(parsePreview(modelWrapper));
|
|
model.setOnlineState(extractOnlineState(modelWrapper));
|
|
return model;
|
|
}
|
|
|
|
private static String parsePreview(Element div) {
|
|
Element wrapper = div.selectFirst("div.placeholder-wrapper");
|
|
if (wrapper == null) {
|
|
return null;
|
|
}
|
|
String style = wrapper.attr("style");
|
|
Pattern p = Pattern.compile("background-image: url\\('(.*?)'\\)");
|
|
Matcher m = p.matcher(style);
|
|
if (m.find()) {
|
|
return m.group(1);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private static String parseName(Element div) {
|
|
Element bioLink = Objects.requireNonNull(div.selectFirst("a[href*=/friend]"), "a[href*=/friend] not found");
|
|
bioLink.setBaseUri(SecretFriends.BASE_URI);
|
|
String href = bioLink.attr("href");
|
|
String name = href.substring(href.lastIndexOf('/') + 1);
|
|
if (name.indexOf('?') >= 0) {
|
|
name = name.substring(0, name.indexOf('?'));
|
|
}
|
|
if (name.indexOf('#') >= 0) {
|
|
name = name.substring(0, name.indexOf('#'));
|
|
}
|
|
return name;
|
|
}
|
|
|
|
private static Model.State extractOnlineState(Element div) {
|
|
Element modelTag = Objects.requireNonNull(div.selectFirst("div[class~=model-tag]"), "div.model-tag not found");
|
|
Set<String> cssClasses = modelTag.classNames();
|
|
for (String cssClass : cssClasses) {
|
|
switch (cssClass) {
|
|
case "model-online":
|
|
return Model.State.ONLINE;
|
|
case "model-private":
|
|
case "model-show":
|
|
case "model-vip":
|
|
return Model.State.PRIVATE;
|
|
case "model-offline":
|
|
return Model.State.OFFLINE;
|
|
default:
|
|
// keep going
|
|
}
|
|
}
|
|
return Model.State.OFFLINE;
|
|
}
|
|
}
|