package ctbrec.ui.sites.streamate; import static ctbrec.Model.State.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPathExpressionException; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; import ctbrec.Model; import ctbrec.io.HttpException; import ctbrec.sites.streamate.Streamate; import ctbrec.sites.streamate.StreamateHttpClient; import ctbrec.sites.streamate.StreamateModel; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; import okhttp3.Response; public class StreamateUpdateService extends PaginatedScheduledService { private static final Logger LOG = LoggerFactory.getLogger(StreamateUpdateService.class); private static final int MODELS_PER_PAGE = 48; private Streamate streamate; private StreamateHttpClient httpClient; private String url; public StreamateUpdateService(Streamate streamate, String url) { this.streamate = streamate; this.url = url; this.httpClient = (StreamateHttpClient) streamate.getHttpClient(); } @Override protected Task> createTask() { return new Task>() { @Override public List call() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException { int from = (page - 1) * MODELS_PER_PAGE; String pageUrl = url + "&from=" + from + "&size=" + MODELS_PER_PAGE; LOG.debug("Fetching page {}", pageUrl); Request request = httpClient.newRequestBuilder().url(pageUrl).build(); try (Response response = httpClient.execute(request)) { if (response.isSuccessful()) { List models = new ArrayList<>(); String content = response.body().string(); JSONObject json = new JSONObject(content); JSONArray performers = json.getJSONArray("performers"); for (int i = 0; i < performers.length(); i++) { JSONObject p = performers.getJSONObject(i); String nickname = p.getString("nickname"); StreamateModel model = (StreamateModel) streamate.createModel(nickname); model.setId(p.getLong("id")); //model.setPreview(p.getString("thumbnail")); model.setPreview("https://cdn.nsimg.net/snap/320x240/" + model.getId() + ".jpg"); model.setDescription(p.optString("headlineMessage")); boolean online = p.optBoolean("online"); model.setOnline(online); model.setOnlineState(online ? ONLINE : OFFLINE); // TODO figure out, what all the states mean // liveState {…} // exclusiveShow false // goldShow true // onBreak false // partyChat true // preGoldShow true // privateChat false // specialShow false if (p.optBoolean("onBreak")) { model.setOnlineState(AWAY); } else if (p.optBoolean("goldShow") || p.optBoolean("privateChat") || p.optBoolean("exclusiveShow")) { model.setOnlineState(PRIVATE); } models.add(model); } return models; } else { throw new HttpException(response.code(), response.message()); } } } }; } }