/// <summary> /// Gets a stream url for the provided track /// The stream url expires after 1 minute and only one instance of the stream is allowed /// </summary> /// <param name="deviceId">A device id</param> /// <param name="trackId">Id or StoreId of the track</param> /// <param name="quality">Quality of the stream</param> /// <returns></returns> public async Task <string> GetStreamUrlAsync(string deviceId, string trackId, string quality = "hi") { // Android device ids are now sent in base 10 string deviceIdToSend = deviceId; if (IsAndroidDeviceId(deviceIdToSend)) { if (deviceIdToSend.Contains("0x")) { deviceIdToSend = deviceIdToSend.Replace("0x", ""); } deviceIdToSend = Convert.ToInt64(deviceIdToSend, 16).ToString(); } NameValueCollection additionalHeaders = new NameValueCollection(); additionalHeaders["X-Device-ID"] = deviceIdToSend; NameValueCollection additionalParams = new NameValueCollection(); additionalParams["opt"] = quality; additionalParams["pt"] = "e"; additionalParams["net"] = "mob"; // mobile? additionalParams.Add(GetSaltAndSig(trackId)); // if track is AllAccess, use mjck, else use songid if (trackId.First() == 'T') { additionalParams["mjck"] = trackId; } else { additionalParams["songid"] = trackId; } string finalUrl = BuildRequestUrl(SJ_URL_STREAM_TRACK, additionalParams); return(await requestClient.PerformGetStringAsync(finalUrl, additionalHeaders)); }