sendRequest method

  1. @override
Future<JsonMap> sendRequest(
  1. String endpoint,
  2. JsonMap body, {
  3. String additionalParams = '',
})
override

Send a POST request to YouTube Music.

Implementation

@override
Future<JsonMap> sendRequest(
  String endpoint,
  JsonMap body, {
  String additionalParams = '',
}) async {
  body.addAll(_context);
  final fullHeaders = JsonMap.from(await headers);
  fullHeaders['Cookie'] = _cookies;

  final response = await _session.post(
    '$YTM_BASE_API$endpoint$_params$additionalParams',
    data: body,
    options: Options(headers: fullHeaders, responseType: ResponseType.bytes),
  );
  final String responseBody;
  if ((response.data! as List)[0] == 0x1F &&
      (response.data! as List)[1] == 0x8B) {
    // decompress gzip
    final List<int> decompressed = GZipCodec().decode(
      response.data! as List<int>,
    );
    responseBody = utf8.decode(decompressed);
  } else {
    // treat as normal UTF-8 text
    responseBody = utf8.decode(response.data! as List<int>);
  }
  response.data = responseBody;

  final responseText =
      response.data.runtimeType == String
          ? jsonDecode(response.data as String)
          : response.data;
  if (response.statusCode != null && response.statusCode! >= 400) {
    final message =
        'Server returned HTTP ${response.statusCode}: ${response.statusMessage}.\n';
    final error = ((responseText as JsonMap)['error'] as JsonMap)['message'];
    throw YTMusicServerError('$message$error');
  }
  return responseText as JsonMap;
}