Я застрял на чем-то и понятия не имею, как это сделать. Я работаю с SoundCloud API, я проанализировал все необходимые данные JSON. Проблема с API заключается в том, что мне нужно сделать три разных метода GET, чтобы достичь того, что мне нужно.
По сути, я использую один URL для получения списка моих треков JSON данных. В этом списке есть track_id
. Я использую это значение для вставки в другой URL, который дает мне еще один JSON со ссылкой stream_url
, который я затем использую для другого URL, который дает мне нужное значение stream_link
.
Все работает отлично, моя проблема в том, что я могу получить значение stream_link
, только запустив метод внутри в on_tap
для этой позиции index
. Я пытаюсь сделать так, чтобы все происходило одновременно, без on _tap
, поэтому у меня есть один list
со всеми необходимыми мне значениями, включая stream_link
для каждой позиции в. список уже загружен на `set_state.
Мой код ниже, у меня есть три класса ... Класс TracksInfo
возвращает мне значения каждого трека. (Здесь я тоже пытаюсь добавить stream_link
.). Классы StreamURL
и Data
используются для сортировки по JSON и получения мне необходимого URL.
Класс информации о дорожке
class TracksInfo {
String title;
String artwork_url;
String release_month;
String release_day;
String id;
String release_year;
String user_id;
String stream_url;
TracksInfo({this.title, this.artwork_url, this.release_month, this.release_day,
this.id, this.release_year, this.user_id, this.stream_url});
TracksInfo.fromJson(Map<String, dynamic> json){
title = json['title'];
artwork_url = json['artwork_url'];
release_month = json['release_month'].toString();
release_day = json['release_day'].toString();
id = json['id'].toString();
release_year = json['release_year'].toString();
user_id = json['user_id'].toString();
stream_url = json['stream_url'];
}
}
Поток и класс данных
class StreamURL {
List<Data> data;
StreamURL({this.data});
factory StreamURL.fromJson(Map<String, dynamic> parsedJson){
var list = parsedJson['media']['transcodings'] as List;
List<Data> data = list.map((i) => Data.fromJson(i)).toList();
return StreamURL(
data: data
);
}
}
class Data{
String url;
String format;
Data({this.url, this.format}); // add others
factory Data.fromJson(Map<String, dynamic> parsedJson){
return Data(
url: parsedJson['url'],
format: parsedJson['format']['protocol'] ,
);
}
}
Код списка дорожек
List<TracksInfo> _tracks = List<TracksInfo>();
var clientID = "my id";
Future<List<TracksInfo>> fetchTracks() async {
var url = "https://api.soundcloud.com/users/track/tracks.json?client_id=${clientID}";
clientID + "&limit=100";
var response = await http.get(url);
var tracks = List<TracksInfo>();
if (response.statusCode == 200) {
var tracksJSON = json.decode(response.body);
for (var trackJSON in tracksJSON) {
tracks.add(TracksInfo.fromJson(trackJSON));
}
}
return tracks;
}
@override
void initState() {
fetchTracks().then((value) {
setState(() {
_tracks.addAll(value);
});
});
super.initState();
}
Получить код ссылки на поток
Future getStreamURL(String client_id, String track_id) async {
var url = "https://api-v2.soundcloud.com/tracks/"+track_id+"?client_id="+client_id;
var response = await http.get(url);
if (response.statusCode == 200) {
var streamJSON = json.decode(response.body);
StreamURL streamURL = new StreamURL.fromJson(streamJSON);
for (var i = 0; i < 2; i++) {
if (streamURL.data[i].format == "progressive"){
var _url = streamURL.data[i].url + "?client_id=" + client_id;
var _response = await http.get(_url);
if (_response.statusCode == 200) {
var _streamURL = json.decode(_response.body);
return _streamURL["url"]);
}
}
JSON Код: ищем более простой способ фильтрации прогрессивных файлов, чтобы я мог получить только эту ссылку URL
{
"media": {
"transcodings": [
{
"url": "https://api-v2.soundcloud.com/media/soundcloud:tracks:761750554/4834ffc0-17ed-4b29-
9468/stream/hls",
"preset": "mp3_0_1",
"duration": 4240353,
"snipped": false,
"format": {
"protocol": "hls",
"mime_type": "audio/mpeg"
},
"quality": "sq"
},
{
"url": "https://api-v2.soundcloud.com/media/soundcloud:tracks:761750554/4834ffc0-17ed-4b29-9468
/stream/progressive",
"preset": "mp3_0_1",
"duration": 4240353,
"snipped": false,
"format": {
"protocol": "progressive",
"mime_type": "audio/mpeg"
},
"quality": "sq"
},