private Queries BuildQueryFromRequest(IWebQuery query)
        {
            Queries res = GetBasicQuery();

            Query smallquery = new Query();
            res.Query = smallquery;

            switch (query.Type)
            {
                case QueryType.FromAlbumInfo:
                    smallquery.Command = "ALBUM_SEARCH";
                    smallquery.AddSearch(Type: "ARTIST", Value: query.AlbumDescriptor.Artist)
                              .AddSearch(Type: "ALBUM_TITLE", Value: query.AlbumDescriptor.Name);
                    smallquery.RangeDto = new RangeDto(1, query.MaxResult);

                    if (query.NeedCoverArt)
                        smallquery.Mode = "SINGLE_BEST_COVER";

                    smallquery.NeedFullCover();
                    break;

                case QueryType.FromCD:
                    smallquery.Command = "ALBUM_TOC";
                    smallquery.Mode = "SINGLE_BEST_COVER";
                    smallquery.Toc = new Toc(query.CDInfo.Tocs);
                    break;
            }

            return res;
        }
        internal InternetFinder(IWebUserSettings iic, IWebQuery iQuery)
        {
            //_OnResult = new UISafeEvent<InternetFinderResultEventArgs>(this);
            //_OnInternetError = new UISafeEvent<InternetFailedArgs>(this);

            _WSM = iic;
            Query = iQuery;

            _Res = new WebResult();
        }
        public IEnumerable<Match<AlbumDescriptor>> Search(IWebQuery query, CancellationToken iCancellation)
        {
           if (query.Type== QueryType.FromCD)
               return Enumerable.Empty<Match<AlbumDescriptor>>();

            if (query.NeedCoverArt)
                return Enumerable.Empty<Match<AlbumDescriptor>>();

           dynamic res = _RoviClient.Limit(query.MaxResult).SearchAlbum(query.AlbumDescriptor).GetAnswer();
           
            if ((res==null) || (res.searchResponse==null))
                return Enumerable.Empty<Match<AlbumDescriptor>>();

            return GetAlbumDescriptor(res.searchResponse.results, iCancellation);
        }
        public IEnumerable<Match<AlbumDescriptor>> Search(IWebQuery query, CancellationToken iCancellationToken)
        {
            if ((query == null) || (query.Type != QueryType.FromCD))
                yield break;

            //CDInfoQuery cdiq = query as CDInfoQuery;
            //if (cdiq == null)
            //    yield break;

            ICDInfoHandler CDUnit = query.CDInfo;
            if (CDUnit == null)
                yield break;        
            
            string ID = CDUnit.IDs.CDDBQueryString;
            if (ID == null)
                yield break;

            FreedbHelper FDH = new FreedbHelper("test", "abc.company", "FreedbDemo", "1.0");
            if (_WSM != null)
                FDH.MainSiteAdress = _WSM.FreedbServer;

            List<QueryResult> queryResults = null;

            try
            {
                queryResults = FDH.Query(ID);
            }
            catch (Exception ex)
            {
                Trace.WriteLine("Unable to retrieve CD Information. " + ex.Message);
                OnWebExeption(ex);
            }

            if (queryResults == null)
                yield break;

            

            foreach (QueryResult queryResult in queryResults)
            {
                AlbumDescriptor res = FDH.ConvertToAlbumDescriptor(queryResult, this);
                if (res!=null)
                    yield return new Match<AlbumDescriptor>(res, MatchPrecision.Suspition);
            }

            yield break;
        }
        public IEnumerable<Match<AlbumDescriptor>> Search(IWebQuery query, CancellationToken iCancellation)
        {
            if (string.IsNullOrEmpty(_ApplicationID))
                return Enumerable.Empty<Match<AlbumDescriptor>>();

            if (string.IsNullOrEmpty(_DeviceID))
            {
                Responses rr = _GraceNoteClient.Post(GetRegisterQuery());

                if ((rr.Response == null) || (rr.Response.User == null) || (rr.Response.User.Token == null))
                {
                    Trace.WriteLine("Unable to register GraceNote on this device");
                    return Enumerable.Empty<Match<AlbumDescriptor>>();
                }

                _DeviceID = rr.Response.User.Token;
                _IWebUserSettings.GraceNoteDeviceID = _DeviceID;
                _IWebUserSettings.Save();
            }

            Queries q = BuildQueryFromRequest(query);
            Responses r = _GraceNoteClient.Post(q);

            if ((r.Response == null) || (r.Response.AlbumDto == null))
            {
                return Enumerable.Empty<Match<AlbumDescriptor>>();
            }

            IEnumerable<AlbumDto> Final = r.Response.AlbumDto;

            if (query.Type==QueryType.FromCD)
            {
                Final = Final.Where(adto => adto.TrackCount == query.CDInfo.Tocs.Count);
            }

            return Final.Select(adto => new Match<AlbumDescriptor>(AlbumDescriptor.FromGraceNote(adto, query.NeedCoverArt, iCancellation), MatchPrecision.Suspition))
                    .Where(res => res.FindItem != null);
        }
        public IEnumerable<Match<AlbumDescriptor>> Search(IWebQuery query, CancellationToken iCancellationToken)
        {
            if (query == null)
                yield break;

            bool needcovers = query.NeedCoverArt;

            IEnumerable<Match<AlbumDescriptor>> rescoll = null;


            if (query.Type == QueryType.FromCD)
            {
                rescoll = SearchFromCDQuery(query.CDInfo, needcovers, iCancellationToken);
            }
            else
            {
                rescoll = SearchFromDiscQuery(query.AlbumDescriptor, needcovers, iCancellationToken);
            }

            int FoundItem = 0;

            foreach (Match<AlbumDescriptor> res in rescoll)
            {
               

                if (res != null)
                {
                    FoundItem++;
                    yield return res;

                    if (FoundItem == query.MaxResult)
                        break;
                }
          
            }
        }
        public IEnumerable<Match<AlbumDescriptor>> Search(IWebQuery query, CancellationToken iCancellationToken)
        {
            if (_AmazonClient == null)
                yield break;

            if ((query == null) || (query.Type != QueryType.FromAlbumInfo))
                yield break;

            AlbumDescriptorQuery adq = query as AlbumDescriptorQuery;
            if (adq == null)
                yield break;

            IAlbumDescriptor lookingFor = adq.AlbumDescriptor;
            if (lookingFor == null)
                yield break;

            Items[] result = null;

            try
            {
                result = (string.IsNullOrEmpty(lookingFor.IDs.Asin)) ?
                    LookForArtistAndName(lookingFor.Artist, lookingFor.Name) :
                    LookForAsin(lookingFor.IDs.Asin);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.ToString());
                OnWebExeption(ex);
                yield break;
            }

            if (( result == null)  ||  (result.Length==0) ) 
                yield break;

            Item[] Items = result[0].Item;

            if ((Items == null) || (Items.Length == 0))
                yield break;

            //int Sizemax = (query.MaxResult == -1) ? Items.Length : Math.Min(Items.Length, query.MaxResult);
            int Sizemax = Items.Length;
            int FoundNumber=0;

            bool NeedCovers = query.NeedCoverArt;

            for (int i=0;i< Sizemax;i++)
            {
                if (iCancellationToken.IsCancellationRequested)
                    yield break;

                if (FoundNumber == query.MaxResult)
                    break;

                AlbumDescriptor candidat = AlbumDescriptor.FromAmazonItem(Items[i], NeedCovers,iCancellationToken);
                if (candidat != null)
                {
                    FoundNumber++;
                    yield return new Match<AlbumDescriptor>(candidat, MatchPrecision.Suspition);

                    if (FoundNumber == query.MaxResult)
                        break;
                }
            }
       }
        public IEnumerable<Match<AlbumDescriptor>> Search(IWebQuery query, CancellationToken iCancellationToken)
        {
            if (_Activated == false)
                yield break;

            if ( (query==null) || (query.Type!=QueryType.FromAlbumInfo) || (_AuthManager==null))
                yield break;

            IAlbumDescriptor lookingFor = query.AlbumDescriptor;
            if (lookingFor == null)
                yield break;

            Discogs2HttpRequestCreator src = new Discogs2HttpRequestCreator(_UA, _AuthManager, _TOut);

            HttpJsonInterpretor hji = new HttpJsonInterpretor(src.GetSearchRequest(lookingFor));

            dynamic myres = hji.GetObjectResponse(this);
            if (myres == null)
                yield break; 
            
            int Sizemax = myres.results.Count;
            if (Sizemax == 0)
                yield break;
          
            int FoundItem = 0;

            InternetServiceListener isl = new InternetServiceListener();

            bool needcovers = query.NeedCoverArt;

            if (iCancellationToken.IsCancellationRequested)
                yield break;

            for (int i = 0; i < Sizemax; i++)
            {
               Thread.Sleep(1000);

                if (iCancellationToken.IsCancellationRequested)
                    yield break;

                //hji = new HttpJsonInterpretor(src.FromUrl(myres.results[i].resource_url));

                hji = new HttpJsonInterpretor(InternetProvider.InternetHelper.CreateAuthentified((string)myres.results[i].resource_url, Context.UserAgent, _AuthManager));


                dynamic albumresponse = hji.GetObjectResponse(isl);
                if (albumresponse == null)
                   continue;

                AlbumDescriptor res = AlbumDescriptor.FromDiscogs(albumresponse, needcovers, _AuthManager, Context, iCancellationToken);

                if (res != null)
                {
                    FoundItem++;
                    yield return new Match<AlbumDescriptor>(res, MatchPrecision.Suspition);

                    if (FoundItem == query.MaxResult)
                        break;
                }

                if (iCancellationToken.IsCancellationRequested)
                    yield break;

            }

            if (!isl.IsOK)
            {
                FireEvent(InternetFailed.PartialResult(isl.Failures));
            }
        }
 public IInternetFinder GetInternetFinder(IWebQuery iWebQuer)
 {
     return new InternetFinder(_ISFact.WebUserSettings, iWebQuer);
 }