/// <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));
        }