Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }