getStreams method

Future<List<StreamInfo>> getStreams(
  1. int trackId
)

Gets a list of streams for the track with the specified trackId.

Implementation

Future<List<StreamInfo>> getStreams(int trackId) async {
  final trackJson = await _getTrackResponse(trackId);

  final transcodingsJson = trackJson['media']?['transcodings'];

  if (transcodingsJson == null) throw TrackResolutionException('No streams available for the specified track ID: $trackId');

  final clientId = await _controller.getClientId();
  final streams = <StreamInfo>[];

  for (final transcoding in transcodingsJson) {
    final isSnipped = transcoding['snipped'] as bool;

    final String? mimeType = transcoding['format']?['mime_type'];
    final container = mimeType?.split(';')[0].split('/')[1] ?? '';

    final String protocol = transcoding['format']?['protocol'] ?? '';
    // Skip AES-encrypted streams as they cannot be resolved without an account.
    if (protocol.contains('encrypted')) continue;

    final quality = switch (transcoding['quality']) {
      'sq' => Quality.standardQuality,
      'hq' => Quality.highQuality,
      _ => Quality.unknown,
    };

    final transcodingUrl = '${transcoding['url']}?client_id=$clientId';
    final response = await _http.get(Uri.parse(transcodingUrl));
    if (response.statusCode != 200) continue;
    final json = jsonDecode(response.body);
    final streamUrl = json['url'] as String;

    streams.add(
      StreamInfo(
        url: streamUrl,
        isSnipped: isSnipped,
        container: container,
        protocol: protocol,
        quality: quality
      )
    );
  }

  return streams;
}