package io.github.rowak.nanoleafdesktop.discovery; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.github.kevinsawicki.http.HttpRequest; import io.github.rowak.nanoleafapi.Effect; public class Discovery { private static final String BASE_ENDPOINT = "https://my.nanoleaf.me/api/v1"; public static EffectMetadata[] getTopEffects(int page, List<String> tags) { JSONObject topEffects = getEffectsData("top", page, tags); return getEffectsList(topEffects); } public static EffectMetadata[] getRecentEffects(int page, List<String> tags) { JSONObject recentEffects = getEffectsData("recent", page, tags); return getEffectsList(recentEffects); } public static EffectMetadata[] getEffectsByType(String type, int page, List<String> tags) { JSONObject effectsData = getEffectsData(type, page, tags); return getEffectsList(effectsData); } public static JSONObject getEffectsData(String type, int page, List<String> tags) { JSONObject json = null; while (json == null) { try { HttpRequest request = HttpRequest.get(String.format( "%s/effects/%s?page=%d&tags=%s", BASE_ENDPOINT, type, page, tagsToString(tags))); request.connectTimeout(20000); request.readTimeout(20000); return new JSONObject(request.body()); } catch (JSONException je) { // do nothing, get json again } } return null; } private static EffectMetadata[] getEffectsList(JSONObject data) { if (data == null) { return new EffectMetadata[0]; } int numItems = data.getInt("items"); JSONArray items = data.getJSONArray("data"); EffectMetadata[] effects = new EffectMetadata[numItems]; for (int i = 0; i < numItems; i++) { effects[i] = new EffectMetadata(items.getJSONObject(i)); } return effects; } public static Effect downloadEffect(String key) { HttpRequest request = HttpRequest.get(String.format("%s/effects/download/%s", BASE_ENDPOINT, key)); request.connectTimeout(10000); request.readTimeout(10000); return Effect.fromJSON(request.body()); } private static String tagsToString(List<String> tags) { StringBuilder sb = new StringBuilder(); for (String tag : tags) { sb.append(tag); if (tags.indexOf(tag) < tags.size() - 1) { sb.append(","); } } return sb.toString().toLowerCase(); } }