getStreams method
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;
}