public void SearchAllMusic(string pattern, Action <IEnumerable <SynoTrack> > callback, Action <Exception> callbackError) { string urlBase = string.Format("http://{0}:{1}", this.Host, this.Port); // var url = urlBase + "/webman/modules/AudioStation/webUI/audio_browse.cgi"; var url = urlBase + this.versionDependentResourcesProvider.GetAudioSearchWebserviceRelativePath(this.DsmVersion); HttpWebRequest request = BuildRequest(url); int limit = 100; string postString = string.Format(@"action=search&target=musiclib_root&server=musiclib_root&category=all&keyword={0}&start=0&limit={1}", pattern, limit); byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postString); request.BeginGetRequestStream(ar => { // Just make sure we retrieve the right web request : no access to modified closure. HttpWebRequest webRequest = (HttpWebRequest)ar.AsyncState; var requestStream = webRequest.EndGetRequestStream(ar); requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); request.BeginGetResponse( responseAr => { // Just make sure we retrieve the right web request : no access to modified closure. var httpWebRequest = responseAr.AsyncState; var webResponse = webRequest.EndGetResponse(responseAr); var responseStream = webResponse.GetResponseStream(); var reader = new StreamReader(responseStream); var content = reader.ReadToEnd(); long count; IEnumerable <SynoTrack> tracks; SynologyJsonDeserializationHelper.ParseSynologyTracks(content, out tracks, out count, urlBase); var isOnUiThread = Deployment.Current.Dispatcher.CheckAccess(); if (isOnUiThread) { if (count > limit) { // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", count, limit)); } callback(tracks); } else { Deployment.Current.Dispatcher.BeginInvoke(() => { if (count > limit) { // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", count, limit)); } callback(tracks); }); } }, webRequest); }, request); }
public void GetTracksForAlbum(SynoItem album, Action <IEnumerable <SynoTrack>, long, SynoItem> callback, Action <Exception> callbackError) { string urlBase = string.Format("http://{0}:{1}", this.Host, this.Port); var url = urlBase + this.versionDependentResourcesProvider.GetAudioSearchWebserviceRelativePath(this.DsmVersion); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Accept = "*/*"; request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; // Not supported yet, but that would decrease the bandwidth usage from 1.3 Mb to 83 Kb ... Pretty dramatic, ain't it ? //request.Headers["Accept-Encoding"] = "gzip, deflate"; request.UserAgent = "OpenSyno"; request.CookieContainer = new CookieContainer(); request.CookieContainer.SetCookies(new Uri(url), this.Token); request.Method = "POST"; int limit = 10000; string postString = string.Format(@"action=browse&target={0}&server=musiclib_music_aa&category=&keyword=&start=0&sort=title&dir=ASC&limit={1}", HttpUtility.UrlEncode(album.ItemID), limit); byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postString); request.BeginGetRequestStream(ar => { // Just make sure we retrieve the right web request : no access to modified closure. HttpWebRequest webRequest = (HttpWebRequest)ar.AsyncState; var requestStream = webRequest.EndGetRequestStream(ar); requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); request.BeginGetResponse( responseAr => { // Just make sure we retrieve the right web request : no access to modified closure. var httpWebRequest = responseAr.AsyncState; WebResponse webResponse; try { webResponse = webRequest.EndGetResponse(responseAr); } catch (WebException exception) { throw new SynoNetworkException("The remote server did not respond to our request. Please, check that the sinal is strong enough and try again.", exception); } var responseStream = webResponse.GetResponseStream(); var reader = new StreamReader(responseStream); var content = reader.ReadToEnd(); long total; IEnumerable <SynoTrack> tracks; SynologyJsonDeserializationHelper.ParseSynologyTracks(content, out tracks, out total, urlBase); tracks = tracks.OrderBy(o => o.Track); var isOnUiThread = Deployment.Current.Dispatcher.CheckAccess(); if (isOnUiThread) { if (total > limit) { // FIXME : Use an error handling service // MessageBox.Show(string.Format("number of available albums ({0}) exceeds supported limit ({1})", total, limit)); } callback(tracks, total, album); } else { Deployment.Current.Dispatcher.BeginInvoke(() => { if (total > limit) { // FIXME : Use an error handling service // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", total, limit)); } callback(tracks, total, album); }); } }, webRequest); }, request); }
public Task <IEnumerable <SynoTrack> > GetTracksForAlbumAsync(SynoItem album) { var tcs = new TaskCompletionSource <IEnumerable <SynoTrack> >(album); string urlBase = string.Format("http://{0}:{1}", this.Host, this.Port); // var url = urlBase + "/webman/modules/AudioStation/webUI/audio_browse.cgi"; var url = urlBase + this.versionDependentResourcesProvider.GetAudioSearchWebserviceRelativePath(this.DsmVersion); HttpWebRequest request = BuildRequest(url); int limit = 100; string postString = string.Format(@"action=browse&target={0}&server=musiclib_music_aa&category=&keyword=&start=0&sort=title&dir=ASC&limit={1}", HttpUtility.UrlEncode(album.ItemID), limit); byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postString); var requestStreamAr = request.BeginGetRequestStream(ar => { // Just make sure we retrieve the right web request : no access to modified closure. HttpWebRequest webRequest = (HttpWebRequest)ar.AsyncState; var requestStream = webRequest.EndGetRequestStream(ar); requestStream.Write(postBytes, 0, postBytes.Length); requestStream.Close(); var getResponseAr = webRequest.BeginGetResponse( responseAr => { // Just make sure we retrieve the right web request : no access to modified closure. var httpWebRequest = responseAr.AsyncState; var webResponse = webRequest.EndGetResponse(responseAr); var responseStream = webResponse.GetResponseStream(); var reader = new StreamReader(responseStream); var content = reader.ReadToEnd(); long count; IEnumerable <SynoTrack> tracks; SynologyJsonDeserializationHelper.ParseSynologyTracks(content, out tracks, out count, urlBase); tracks = tracks.OrderBy(o => o.Track); var isOnUiThread = Deployment.Current.Dispatcher.CheckAccess(); if (isOnUiThread) { if (count > limit) { // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", count, limit)); } tcs.SetResult(tracks); // callback(tracks); } else { Deployment.Current.Dispatcher.BeginInvoke( () => { if (count > limit) { // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", count, limit)); } tcs.SetResult(tracks); }); } }, webRequest); }, request); //var getRequestStreamTask = Task.Factory.FromAsync( // requestStreamAr, // ar => // , // TaskCreationOptions.None, // TaskScheduler.FromCurrentSynchronizationContext()); return(tcs.Task); }