You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.5 KiB

#include <HTTPClient.h>
#include <FirebaseJson.h>
#define PLAYER_UPDATE_INTERVAL_MS (500)
#define UI_ENTRIES_TO_LOAD (20)
static unsigned long playerLastUpdateTime = 0;
static ViewMode lastViewMode = (ViewMode)-1;
String httpURL(String path) {
return String(OWNTONE_SERVER_ADDRESS) + "/api/" + path;
}
String httpGET(String path) {
HTTPClient http;
Serial.println(httpURL(path));
http.begin(httpURL(path));
http.GET();
String out = http.getString();
http.end();
return out;
}
void apiDebug(AppState *state) {
}
void apiLoop(AppState *state) {
bool playerNeedsUpdate = (state->sinceBoot - playerLastUpdateTime) > PLAYER_UPDATE_INTERVAL_MS;
playerNeedsUpdate = playerNeedsUpdate || (playerLastUpdateTime > state->sinceBoot);
if (playerNeedsUpdate) {
String playerText = httpGET(String("player"));
FirebaseJson json;
json.setJsonData(playerText);
FirebaseJsonData result;
json.get(result, "volume");
state->volume = result.to<int>();
playerLastUpdateTime = state->sinceBoot;
}
bool viewNeedsUpdate = (state->viewMode != lastViewMode);
if (viewNeedsUpdate) {
String parameters = "?limit=" + String(UI_ENTRIES_TO_LOAD);
lastViewMode = state->viewMode;
if (state->viewMode == ViewModeArtists) {
String artistsText = httpGET(String("library/artists" + parameters));
FirebaseJson json;
json.setJsonData(artistsText);
FirebaseJsonData result;
json.get(result, "items");
FirebaseJsonArray arr;
result.get<FirebaseJsonArray>(arr);
Serial.println(arr.size());
if(state->uiEntries != NULL) {
free(state->uiEntries);
}
state->uiEntries = (UIEntry *)malloc(UI_ENTRIES_TO_LOAD * sizeof(UIEntry));
state->uiEntriesCount = UI_ENTRIES_TO_LOAD;
FirebaseJsonData arrayIndexResult;
for (size_t i = 0; i < arr.size(); i++) {
Serial.println("Processing item...");
String path = "/[" + String(i) + "]/";
String namePath = path + "name";
String idPath = path + "id";
Serial.println("name...");
arr.get(arrayIndexResult, namePath);
String text = arrayIndexResult.to<String>().c_str();
Serial.println("id...");
arr.get(arrayIndexResult, idPath);
int id = arrayIndexResult.to<int>();
Serial.println("setting...");
state->uiEntries[i].text = text;
state->uiEntries[i].id = id;
Serial.println(text);
}
}
}
}
void apiSetup(AppState *state) {
}