mirror of
https://github.com/sascha-hemi/SpotifyEsp32.git
synced 2026-03-21 03:03:58 +01:00
Migrated from HTTPClient to WiFiClientSecure
This commit is contained in:
@@ -63,7 +63,65 @@ std::function<void()> callback_fn(Spotify *spotify) {
|
|||||||
return spotify->server_on_root();
|
return spotify->server_on_root();
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
bool Spotify::get_refresh_token() {
|
||||||
|
bool reply = false;
|
||||||
|
if (!_client.connect("accounts.spotify.com", 443)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String authorization = String(_client_id) + ":" + String(_client_secret);
|
||||||
|
authorization.trim();
|
||||||
|
authorization = "Basic " + base64::encode(authorization);
|
||||||
|
|
||||||
|
String payload = "grant_type=authorization_code&code=" + String(_auth_code) + "&redirect_uri=" + String(_redirect_uri);
|
||||||
|
|
||||||
|
_client.println("POST /api/token HTTP/1.1");
|
||||||
|
_client.println("Host: accounts.spotify.com");
|
||||||
|
_client.println("User-Agent: ESP32");
|
||||||
|
_client.println("Connection: close");
|
||||||
|
_client.println("Content-Type: application/x-www-form-urlencoded");
|
||||||
|
_client.println("Authorization: " + authorization);
|
||||||
|
_client.println("Content-Length: " + String(payload.length()));
|
||||||
|
_client.println();
|
||||||
|
_client.println(payload);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
int http_code = -1;
|
||||||
|
while (_client.connected()) {
|
||||||
|
line = _client.readStringUntil('\n');
|
||||||
|
if (line.startsWith("HTTP/1.1")) {
|
||||||
|
http_code = line.substring(9, 12).toInt();
|
||||||
|
}
|
||||||
|
if (line == "\r") {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String response;
|
||||||
|
while (_client.available()) {
|
||||||
|
response += _client.readStringUntil('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_debug_on) {
|
||||||
|
Serial.printf("POST \"Refresh token\" Status: %d \n", http_code);
|
||||||
|
Serial.printf("Reply: %s\n", response.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (http_code >= 200 && http_code <= 299) {
|
||||||
|
JsonDocument doc;
|
||||||
|
deserializeJson(doc, response);
|
||||||
|
const char* temp = doc["refresh_token"];
|
||||||
|
strncpy(_refresh_token, temp, sizeof(_refresh_token));
|
||||||
|
Serial.printf("Refresh Token: %s\n", _refresh_token);
|
||||||
|
reply = true;
|
||||||
|
} else {
|
||||||
|
reply = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_client.stop();
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
/*
|
||||||
bool Spotify::get_refresh_token(){
|
bool Spotify::get_refresh_token(){
|
||||||
char url[40] = "https://accounts.spotify.com/api/token";
|
char url[40] = "https://accounts.spotify.com/api/token";
|
||||||
HTTPClient http;
|
HTTPClient http;
|
||||||
@@ -93,7 +151,7 @@ bool Spotify::get_refresh_token(){
|
|||||||
}
|
}
|
||||||
http.end();
|
http.end();
|
||||||
return strcmp(_refresh_token, "") != 0;
|
return strcmp(_refresh_token, "") != 0;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
void Spotify::server_on_root() {
|
void Spotify::server_on_root() {
|
||||||
if (strcmp(_refresh_token, "") == 0) {
|
if (strcmp(_refresh_token, "") == 0) {
|
||||||
@@ -129,6 +187,7 @@ void Spotify::server_on_root() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Spotify::begin(){
|
void Spotify::begin(){
|
||||||
|
_client.setCACert(_spotify_root_ca);
|
||||||
if(strcmp(_refresh_token, "") == 0){
|
if(strcmp(_refresh_token, "") == 0){
|
||||||
if(_port == 80){
|
if(_port == 80){
|
||||||
snprintf(_redirect_uri,sizeof(_redirect_uri), "http://%s/", WiFi.localIP().toString().c_str());
|
snprintf(_redirect_uri,sizeof(_redirect_uri), "http://%s/", WiFi.localIP().toString().c_str());
|
||||||
@@ -168,37 +227,59 @@ bool Spotify::is_auth(){
|
|||||||
//Basic functions
|
//Basic functions
|
||||||
response Spotify::RestApi(char* rest_url, char* type, int payload_size, char* payload){
|
response Spotify::RestApi(char* rest_url, char* type, int payload_size, char* payload){
|
||||||
response response_obj;
|
response response_obj;
|
||||||
init_response(&response_obj);
|
|
||||||
|
|
||||||
HTTPClient http;
|
|
||||||
http.begin(rest_url,_spotify_root_ca);
|
|
||||||
http.addHeader("Accept", "application/json");
|
|
||||||
http.addHeader("Content-Type", "application/json");
|
|
||||||
http.addHeader("Authorization","Bearer "+_access_token);
|
|
||||||
int http_code = -1;
|
int http_code = -1;
|
||||||
if(strcmp(type, "GET") == 0){
|
|
||||||
http_code = http.GET();
|
|
||||||
}
|
|
||||||
else if(strcmp(type, "PUT") == 0){
|
|
||||||
http.addHeader("content-Length", String(payload_size));
|
|
||||||
http_code = http.PUT(payload);
|
|
||||||
}
|
|
||||||
else if(strcmp(type, "POST") == 0){
|
|
||||||
http.addHeader("content-Length", String(payload_size));
|
|
||||||
http_code = http.POST(payload);
|
|
||||||
}
|
|
||||||
else if(strcmp(type, "DELETE") == 0){
|
|
||||||
http_code = http.sendRequest("DELETE", payload);
|
|
||||||
}
|
|
||||||
response_obj.status_code = http_code;
|
|
||||||
String reply = "";
|
String reply = "";
|
||||||
JsonDocument doc;
|
JsonDocument doc;
|
||||||
|
init_response(&response_obj);
|
||||||
|
|
||||||
if(http.getSize()>0){
|
if (!_client.connect(_host, 443)) {
|
||||||
reply = http.getString();
|
response_obj.reply = "Connection failed";
|
||||||
deserializeJson(doc, reply);
|
return response_obj;
|
||||||
}
|
}
|
||||||
|
_client.println(String(type) + " " + String(rest_url) + " HTTP/1.1");
|
||||||
|
_client.println("Host: " + String(_host));
|
||||||
|
_client.println("User-Agent: ESP32");
|
||||||
|
_client.println("Connection: close");
|
||||||
|
_client.println("Accept: application/json");
|
||||||
|
|
||||||
|
_client.println("Authorization: Bearer " + String(_access_token));
|
||||||
|
_client.println("Content-Type: application/json");
|
||||||
|
if(strcmp(type, "GET") == 0){
|
||||||
|
_client.println();
|
||||||
|
}
|
||||||
|
else if(strcmp(type, "PUT") == 0){
|
||||||
|
_client.println("Content-Length: " + String(payload_size));
|
||||||
|
_client.println();
|
||||||
|
_client.println(payload);
|
||||||
|
}
|
||||||
|
else if(strcmp(type, "POST") == 0){
|
||||||
|
_client.println("Content-Length: " + String(payload_size));
|
||||||
|
_client.println();
|
||||||
|
_client.println(payload);
|
||||||
|
}
|
||||||
|
else if(strcmp(type, "DELETE") == 0){
|
||||||
|
_client.println();
|
||||||
|
_client.println(payload);
|
||||||
|
}
|
||||||
|
int line_num = 0;
|
||||||
|
while (_client.connected()) {
|
||||||
|
String line = _client.readStringUntil('\n');
|
||||||
|
if(!line_num){
|
||||||
|
http_code = line.substring(9,12).toInt();
|
||||||
|
}
|
||||||
|
if (line == "\r") {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
line_num++;
|
||||||
|
if(_debug_on){
|
||||||
|
Serial.println(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response_obj.status_code = http_code;
|
||||||
|
while(_client.available()){
|
||||||
|
reply = reply + _client.readStringUntil('\n') + "\n";
|
||||||
|
}
|
||||||
|
deserializeJson(doc, reply);
|
||||||
if(_debug_on){
|
if(_debug_on){
|
||||||
const char* endpoint = extract_endpoint(rest_url);
|
const char* endpoint = extract_endpoint(rest_url);
|
||||||
Serial.printf("%s \"%s\" Status: %i\n", type, endpoint, http_code);
|
Serial.printf("%s \"%s\" Status: %i\n", type, endpoint, http_code);
|
||||||
@@ -219,11 +300,11 @@ response Spotify::RestApi(char* rest_url, char* type, int payload_size, char* pa
|
|||||||
response_obj.reply = message;
|
response_obj.reply = message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http.end();
|
|
||||||
_retry = 0;
|
_client.stop();
|
||||||
|
|
||||||
return response_obj;
|
return response_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
response Spotify::RestApiPut(char* rest_url,int payload_size, char* payload){
|
response Spotify::RestApiPut(char* rest_url,int payload_size, char* payload){
|
||||||
return RestApi(rest_url, "PUT", payload_size, payload);
|
return RestApi(rest_url, "PUT", payload_size, payload);
|
||||||
}
|
}
|
||||||
@@ -236,6 +317,62 @@ response Spotify::RestApiPost(char* rest_url,int payload_size, char* payload){
|
|||||||
response Spotify::RestApiDelete(char* rest_url, char* payload){
|
response Spotify::RestApiDelete(char* rest_url, char* payload){
|
||||||
return RestApi(rest_url, "DELETE", 0, payload);
|
return RestApi(rest_url, "DELETE", 0, payload);
|
||||||
}
|
}
|
||||||
|
bool Spotify::get_token() {
|
||||||
|
bool reply = false;
|
||||||
|
if (!_client.connect("accounts.spotify.com", 443)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String authorization = String(_client_id) + ":" + String(_client_secret);
|
||||||
|
authorization.trim();
|
||||||
|
authorization = "Basic " + base64::encode(authorization);
|
||||||
|
|
||||||
|
String payload = "grant_type=refresh_token&refresh_token=" + String(_refresh_token);
|
||||||
|
|
||||||
|
_client.println("POST /api/token HTTP/1.1");
|
||||||
|
_client.println("Host: accounts.spotify.com");
|
||||||
|
_client.println("User-Agent: ESP32");
|
||||||
|
_client.println("Connection: close");
|
||||||
|
_client.println("Content-Type: application/x-www-form-urlencoded");
|
||||||
|
_client.println("Authorization: " + authorization);
|
||||||
|
_client.println("Content-Length: " + String(payload.length()));
|
||||||
|
_client.println();
|
||||||
|
_client.println(payload);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
int http_code = -1;
|
||||||
|
while (_client.connected()) {
|
||||||
|
line = _client.readStringUntil('\n');
|
||||||
|
if (line.startsWith("HTTP/1.1")) {
|
||||||
|
http_code = line.substring(9, 12).toInt();
|
||||||
|
}
|
||||||
|
if (line == "\r") {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String response;
|
||||||
|
while (_client.available()) {
|
||||||
|
response += _client.readStringUntil('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_debug_on) {
|
||||||
|
Serial.printf("POST \"token\" Status: %d \n", http_code);
|
||||||
|
Serial.printf("Reply: %s\n", response.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (http_code >= 200 && http_code <= 299) {
|
||||||
|
JsonDocument doc;
|
||||||
|
deserializeJson(doc, response);
|
||||||
|
_access_token = doc["access_token"].as<String>();
|
||||||
|
reply = true;
|
||||||
|
} else {
|
||||||
|
reply = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_client.stop();
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
/*
|
||||||
bool Spotify::get_token(){
|
bool Spotify::get_token(){
|
||||||
bool reply = false;
|
bool reply = false;
|
||||||
HTTPClient http;
|
HTTPClient http;
|
||||||
@@ -265,7 +402,7 @@ bool Spotify::get_token(){
|
|||||||
}
|
}
|
||||||
http.end();
|
http.end();
|
||||||
return reply;
|
return reply;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
void Spotify::init_response(response* response_obj){
|
void Spotify::init_response(response* response_obj){
|
||||||
response_obj -> status_code = -1;
|
response_obj -> status_code = -1;
|
||||||
|
|||||||
@@ -20,7 +20,6 @@
|
|||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <WiFi.h>
|
#include <WiFi.h>
|
||||||
#include <HTTPClient.h>
|
|
||||||
#include <WiFiClientSecure.h>
|
#include <WiFiClientSecure.h>
|
||||||
#include <WebServer.h>
|
#include <WebServer.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
@@ -679,6 +678,8 @@ class Spotify {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
WebServer _server;
|
WebServer _server;
|
||||||
|
WiFiClientSecure _client;
|
||||||
|
const char* _host = "api.spotify.com";
|
||||||
/// @brief Maximum number of items in one request
|
/// @brief Maximum number of items in one request
|
||||||
static const int _max_num_items = 20;
|
static const int _max_num_items = 20;
|
||||||
/// @brief Maximum size of char array(35 been the size of a uri + comma + 150 as buffer for url etc.)
|
/// @brief Maximum size of char array(35 been the size of a uri + comma + 150 as buffer for url etc.)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ void setup() {
|
|||||||
sp.handle_client();
|
sp.handle_client();
|
||||||
}
|
}
|
||||||
Serial.println("Authenticated");
|
Serial.println("Authenticated");
|
||||||
check_all();
|
Serial.println(sp.current_artist_names());
|
||||||
Serial.println("Done");
|
Serial.println("Done");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,9 +34,9 @@ void connect_to_wifi(){
|
|||||||
Serial.printf("\nConnected to WiFi\n");
|
Serial.printf("\nConnected to WiFi\n");
|
||||||
}
|
}
|
||||||
void check_all(){
|
void check_all(){
|
||||||
/*Serial.println("Player");
|
Serial.println("Player");
|
||||||
check_one(sp.currently_playing());
|
check_one(sp.currently_playing());
|
||||||
check_one(sp.start_resume_playback("spotify:track:6xaMXvpkmVow1RAinlthUT"));
|
/*check_one(sp.start_resume_playback("spotify:track:6xaMXvpkmVow1RAinlthUT"));
|
||||||
check_one(sp.pause_playback());
|
check_one(sp.pause_playback());
|
||||||
check_one(sp.start_resume_playback());
|
check_one(sp.start_resume_playback());
|
||||||
check_one(sp.skip());
|
check_one(sp.skip());
|
||||||
|
|||||||
Reference in New Issue
Block a user