|
|
@ -3,73 +3,110 @@ import 'dart:math';
|
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
import 'package:http/http.dart' as http;
|
|
|
|
|
|
|
|
|
|
|
|
class Api {
|
|
|
|
class Api {
|
|
|
|
var clientId = '7ceb49d874b9404492246027e4d68cf8';
|
|
|
|
//from dashboard
|
|
|
|
var clientSecret = '98f9cb960bf54ebbb9ad306e7ff919cb';
|
|
|
|
final _clientId = '7ceb49d874b9404492246027e4d68cf8';
|
|
|
|
var redirectUri = 'https://daflmusic.000webhostapp.com/callback/';
|
|
|
|
final _clientSecret = '98f9cb960bf54ebbb9ad306e7ff919cb'; // TODO : hide it
|
|
|
|
var state;
|
|
|
|
|
|
|
|
String scopes = 'user-read-playback-state user-read-currently-playing';
|
|
|
|
|
|
|
|
var code;
|
|
|
|
|
|
|
|
var urlAuthorize;
|
|
|
|
|
|
|
|
String? access_token;
|
|
|
|
|
|
|
|
String token_type = 'Bearer ';
|
|
|
|
|
|
|
|
int? expires_in;
|
|
|
|
|
|
|
|
String? refresh_token;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var client = http.Client();
|
|
|
|
//for web api
|
|
|
|
|
|
|
|
get redirectUri => 'https://daflmusic.000webhostapp.com/callback/';
|
|
|
|
|
|
|
|
final _scopes = 'user-read-playback-state user-read-currently-playing';
|
|
|
|
|
|
|
|
String? _state;
|
|
|
|
|
|
|
|
String? _encodedLogs;
|
|
|
|
|
|
|
|
final _tokenType = 'Bearer ';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//from web api
|
|
|
|
|
|
|
|
String? _code;
|
|
|
|
|
|
|
|
int? _expiresIn;
|
|
|
|
|
|
|
|
String? _refreshToken;
|
|
|
|
|
|
|
|
String? _accessToken; //use _getToken() as kind of a private getter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//other
|
|
|
|
|
|
|
|
final _client = http.Client();
|
|
|
|
|
|
|
|
Uri? _urlAuthorize;
|
|
|
|
|
|
|
|
get urlAuthorize => _urlAuthorize;
|
|
|
|
|
|
|
|
DateTime? _tokenEnd;
|
|
|
|
|
|
|
|
|
|
|
|
Api() {
|
|
|
|
Api() {
|
|
|
|
state = generateRandomString();
|
|
|
|
_state = _generateRandomString();
|
|
|
|
urlAuthorize = Uri.https('accounts.spotify.com', 'authorize', {
|
|
|
|
_encodedLogs = base64.encode(utf8.encode("$_clientId:$_clientSecret"));
|
|
|
|
'client_id': clientId,
|
|
|
|
_urlAuthorize = Uri.https('accounts.spotify.com', 'authorize', {
|
|
|
|
|
|
|
|
'client_id': _clientId,
|
|
|
|
'response_type': 'code',
|
|
|
|
'response_type': 'code',
|
|
|
|
'redirect_uri': redirectUri,
|
|
|
|
'redirect_uri': redirectUri,
|
|
|
|
'state': state,
|
|
|
|
'state': _state,
|
|
|
|
'scope': scopes,
|
|
|
|
'scope': _scopes,
|
|
|
|
'show_dialog': 'true'
|
|
|
|
'show_dialog': 'true'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
requestUserAuthorization(Uri url) {
|
|
|
|
// for state value
|
|
|
|
if (url.queryParameters['state'] == state.toString()) {
|
|
|
|
String _generateRandomString() {
|
|
|
|
code = url.queryParameters['code'];
|
|
|
|
var r = Random();
|
|
|
|
requestAccessToken();
|
|
|
|
return String.fromCharCodes(
|
|
|
|
|
|
|
|
List.generate(16, (index) => r.nextInt(33) + 89));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//session management
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
requestUserAuthorization(Uri url) async {
|
|
|
|
|
|
|
|
if (url.queryParameters['state'] == _state.toString()) {
|
|
|
|
|
|
|
|
_code = url.queryParameters['code'];
|
|
|
|
|
|
|
|
await _requestAccessToken();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// TODO : implement the else
|
|
|
|
// TODO : implement the else
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
requestAccessToken() async {
|
|
|
|
_requestAccessToken() async {
|
|
|
|
var urlToken = Uri.https('accounts.spotify.com', 'api/token', {
|
|
|
|
var urlToken = Uri.https('accounts.spotify.com', 'api/token', {
|
|
|
|
'code': code,
|
|
|
|
'code': _code,
|
|
|
|
'redirect_uri': redirectUri,
|
|
|
|
'redirect_uri': redirectUri,
|
|
|
|
'grant_type': 'authorization_code'
|
|
|
|
'grant_type': 'authorization_code'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
String credentials = "$clientId:$clientSecret";
|
|
|
|
var response = await _client.post(urlToken, headers: <String, String>{
|
|
|
|
String encodedLogs = base64.encode(utf8.encode(credentials));
|
|
|
|
'Authorization': 'Basic $_encodedLogs',
|
|
|
|
var response = await client.post(urlToken, headers: <String, String>{
|
|
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
|
|
'Authorization': 'Basic $encodedLogs',
|
|
|
|
});
|
|
|
|
|
|
|
|
var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
|
|
|
|
|
|
|
|
_accessToken = decodedResponse['access_token'];
|
|
|
|
|
|
|
|
_expiresIn = decodedResponse['expires_in'];
|
|
|
|
|
|
|
|
_tokenEnd = DateTime.now().add(Duration(seconds: _expiresIn!));
|
|
|
|
|
|
|
|
_refreshToken = decodedResponse['refresh_token'];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Future<String?> _getToken() async {
|
|
|
|
|
|
|
|
await _tokenValidity();
|
|
|
|
|
|
|
|
return _accessToken;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_tokenValidity() async {
|
|
|
|
|
|
|
|
if (DateTime.now().isAfter(_tokenEnd!)) {
|
|
|
|
|
|
|
|
await _getRefreshedAccessToken();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_getRefreshedAccessToken() async {
|
|
|
|
|
|
|
|
var urlToken = Uri.https('accounts.spotify.com', 'api/token',
|
|
|
|
|
|
|
|
{'grant_type': 'refresh_token', 'refresh_token': '$_refreshToken'});
|
|
|
|
|
|
|
|
var response = await _client.post(urlToken, headers: <String, String>{
|
|
|
|
|
|
|
|
'Authorization': 'Basic $_encodedLogs',
|
|
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
|
|
'Content-Type': 'application/x-www-form-urlencoded'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
|
|
|
|
var decodedResponse = jsonDecode(utf8.decode(response.bodyBytes)) as Map;
|
|
|
|
access_token = decodedResponse['access_token'];
|
|
|
|
_accessToken = decodedResponse['access_token'];
|
|
|
|
expires_in = decodedResponse['expires_in'];
|
|
|
|
_expiresIn = decodedResponse['expires_in'];
|
|
|
|
refresh_token = decodedResponse['refresh_token'];
|
|
|
|
_tokenEnd = DateTime.now().add(Duration(seconds: _expiresIn!));
|
|
|
|
getCurrentlyPlayingTrack();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//functional methods
|
|
|
|
|
|
|
|
|
|
|
|
getCurrentlyPlayingTrack() async {
|
|
|
|
getCurrentlyPlayingTrack() async {
|
|
|
|
var url = Uri.https('api.spotify.com', 'v1/me/player/currently-playing');
|
|
|
|
var url = Uri.https('api.spotify.com', 'v1/me/player/currently-playing');
|
|
|
|
var response = await client.get(url, headers: <String, String>{
|
|
|
|
var token = await _getToken();
|
|
|
|
'Authorization': '$token_type $access_token',
|
|
|
|
var response = await _client.get(url, headers: <String, String>{
|
|
|
|
|
|
|
|
'Authorization': '$_tokenType $token',
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
});
|
|
|
|
});
|
|
|
|
// Implement traitement of datas
|
|
|
|
// Implement treatment of data's
|
|
|
|
print(response.body);
|
|
|
|
//print(response.body);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for state value
|
|
|
|
|
|
|
|
String generateRandomString() {
|
|
|
|
|
|
|
|
var r = Random();
|
|
|
|
|
|
|
|
return String.fromCharCodes(
|
|
|
|
|
|
|
|
List.generate(16, (index) => r.nextInt(33) + 89));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|