package ctbrec.ui.sites.bonga; import static ctbrec.io.HttpConstants.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.Model; import ctbrec.sites.bonga.BongaCams; import ctbrec.sites.bonga.BongaCamsModel; import ctbrec.ui.tabs.PaginatedScheduledService; import javafx.concurrent.Task; import okhttp3.Request; public class BongaCamsUpdateService extends PaginatedScheduledService { private static final Logger LOG = LoggerFactory.getLogger(BongaCamsUpdateService.class); private BongaCams bongaCams; private String url; public BongaCamsUpdateService(BongaCams bongaCams, String url) { this.bongaCams = bongaCams; this.url = url; } @Override protected Task> createTask() { return new Task>() { @Override public List call() throws IOException { return loadModelList(); } }; } private List loadModelList() throws IOException { String pageUrl = url + ((page-1) * 36); LOG.debug("Fetching page {}", pageUrl); var request = new Request.Builder() .url(pageUrl) .header(USER_AGENT, Config.getInstance().getSettings().httpUserAgent) .header(ACCEPT, MIMETYPE_APPLICATION_JSON) .header(ACCEPT, Locale.ENGLISH.getLanguage()) .header(REFERER, bongaCams.getBaseUrl()) .header(X_REQUESTED_WITH, XML_HTTP_REQUEST) .build(); try (var response = bongaCams.getHttpClient().execute(request)) { if (response.isSuccessful()) { var content = response.body().string(); List models = new ArrayList<>(); var json = new JSONObject(content); if (json.optString("status").equals("success")) { var jsonModels = json.getJSONArray("models"); parseModels(jsonModels, models); } return models; } else { int code = response.code(); throw new IOException("HTTP status " + code); } } } private void parseModels(JSONArray jsonModels, List models) { for (var i = 0; i < jsonModels.length(); i++) { var m = jsonModels.getJSONObject(i); var name = m.optString("username"); if (name.isEmpty()) { continue; } BongaCamsModel model = (BongaCamsModel) bongaCams.createModel(name); model.mapOnlineState(m.optString("room")); model.setOnline(m.optInt("viewers") > 0); model.setPreview("https:" + m.getString("thumb_image").replace("{ext}", "jpg")); if (m.has("display_name")) { model.setDisplayName(m.getString("display_name")); } model.setDescription(m.optString("topic")); models.add(model); } } }