Как анализировать JSON данных из разных API и объединять их в один список с помощью Flutter - PullRequest
0 голосов
/ 01 марта 2020

Я застрял на чем-то и понятия не имею, как это сделать. Я работаю с 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"
  },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...