public IList <TrackData> LoadMoreResults()
        {
            List <TrackData> returnList = new List <TrackData>();



            for (int i = 1; i <= _perpage; i++)
            {
                int trackIdInt = _perpage * _loadedPages + i;

                string trackId = trackIdInt.ToString();

                if (trackIdInt > _total)
                {
                    break;
                }

                TrackData data = new TrackData("PlaceHolderTrackDataSource",
                                               "id" + trackId,
                                               "artist " + trackId,
                                               "title " + trackId,
                                               "mix " + trackId,
                                               "remixer " + trackId,
                                               "release " + trackId,
                                               "producer " + trackId,
                                               "label " + trackId,
                                               "cat no " + trackId,
                                               "genre " + trackId,
                                               KeyEnum.A,
                                               DateTime.Now,
                                               new Uri(@"http://www.google.com"));

                returnList.Add(data);
                _tracks.Add(data);
            }

            if (returnList.Count > 0)
            {
                _loadedPages++;
            }



            return(returnList);
        }
        public TrackData GetTrack(string trackId)
        {
            TrackData data = new TrackData("PlaceHolderTrackDataSource",
                                           "id" + trackId,
                                           "artist " + trackId,
                                           "title " + trackId,
                                           "mix " + trackId,
                                           "remixer " + trackId,
                                           "release " + trackId,
                                           "producer " + trackId,
                                           "label " + trackId,
                                           "cat no " + trackId,
                                           "genre " + trackId,
                                           KeyEnum.A,
                                           DateTime.Now,
                                           new Uri(@"http://www.google.com"));

            return(data);
        }
        private static TrackData ParseResponse(Dictionary <string, dynamic> trackData, Dictionary <string, dynamic> releaseData, string host)
        {
            string   trackId     = trackData["id"].ToString();
            string   title       = trackData["name"];
            string   mix         = trackData["mixName"];
            string   label       = trackData["label"]["name"];
            DateTime releaseDate = ParseReleaseDate(trackData["releaseDate"]);
            string   release     = trackData["release"]["name"];
            Uri      url         = GetUri(trackData["id"], trackData["slug"]);
            string   genre       = GetGenre(trackData["genres"]);
            string   artist      = GetArtist(trackData["artists"], "artist");
            string   remixer     = GetArtist(trackData["artists"], "remixer");
            KeyEnum? key         = GetKey(trackData["key"]);


            string catalogNo = releaseData["catalogNumber"]; //catalog number is the only value I need the releaseData for
            string producer  = null;                         //not sure how to get the producer out of beatport


            TrackData track = new TrackData(host,
                                            trackId,
                                            artist,
                                            title,
                                            mix,
                                            remixer,
                                            release,
                                            producer,
                                            label,
                                            catalogNo,
                                            genre,
                                            key,
                                            releaseDate,
                                            url);

            return(track);
        }
        private static IEnumerable <TrackData> ParseReleaseData(Dictionary <string, dynamic> releaseData, string host)
        {
            //url
            string URL = (string)releaseData["uri"];

            //release
            string Release = (string)releaseData["title"];



            //Label and catalog number
            System.Collections.ArrayList labels = releaseData["labels"];

            List <string> labelNames = new List <string>();
            List <string> catNumbers = new List <string>();

            foreach (Dictionary <string, dynamic> labelData in labels)
            {
                labelNames.Add(labelData["name"]);
                catNumbers.Add(labelData["catno"]);
            }

            string Label         = string.Join(", ", labelNames);
            string CatalogNumber = string.Join(", ", catNumbers);



            //Genre(s)

            string Genre = null;

            if (releaseData.ContainsKey("styles"))
            {
                System.Collections.ArrayList genres = (System.Collections.ArrayList)releaseData["styles"];

                List <string> genreNames = new List <string>();

                foreach (String genre in genres)
                {
                    genreNames.Add(genre);
                }

                string genreStr = string.Join(", ", genreNames);
                if (!String.IsNullOrEmpty(genreStr))
                {
                    Genre = genreStr;
                }
            }


            //Release date
            DateTime?ReleaseDate = null;

            if (releaseData.ContainsKey("released"))
            {
                string releasedString = (string)releaseData["released"];

                var yearMatch = System.Text.RegularExpressions.Regex.Match(releasedString, @"\d{4}$");
                var dateMatch = System.Text.RegularExpressions.Regex.Match(releasedString, @"(\d{4})-(\d{2})-(\d{2})$");

                if (yearMatch.Success)
                {
                    ReleaseDate = new DateTime(System.Convert.ToInt32(releasedString), 1, 1);
                }
                else if (dateMatch.Success)
                {
                    int year  = System.Convert.ToInt32(dateMatch.Groups[1].Value);
                    int month = System.Convert.ToInt32(dateMatch.Groups[2].Value);
                    int day   = System.Convert.ToInt32(dateMatch.Groups[3].Value);

                    if (month == 0 || day == 0)
                    {
                        new DateTime(year, 1, 1);
                    }
                    else
                    {
                        ReleaseDate = new DateTime(year, month, day);
                    }
                }
                else
                {
                    throw new InvalidOperationException("Unexpected release date format:" + releasedString);
                }
            }



            //artists

            List <string> releaseArtists   = new List <string>();
            List <string> releaseRemixers  = new List <string>();
            List <string> releaseProducers = new List <string>();


            foreach (Dictionary <string, object> artist in releaseData["artists"])
            {
                var name = (string)artist["name"];
                var anv  = (string)artist["anv"];
                var role = (string)artist["role"];

                if (name == "Various")
                {
                    continue;
                }

                if (!string.IsNullOrEmpty(anv))
                {
                    name = anv;
                }



                if (!string.IsNullOrEmpty(role))
                {
                    throw new InvalidOperationException("found release artist with a roll: " + role);
                }
                else
                {
                    releaseArtists.Add(name);
                }
            }


            foreach (Dictionary <string, object> trackData in releaseData["tracklist"])
            {
                int    trackIdInt = (int)releaseData["id"];
                string TrackId    = trackIdInt.ToString();


                string Title = null;
                string Mix   = null;

                string titleString = (string)trackData["title"];


                System.Text.RegularExpressions.Regex trackMixRegex = new System.Text.RegularExpressions.Regex(@"^(.*)\((.*)\)");



                var trackMixMatch = trackMixRegex.Match(titleString);

                if (trackMixMatch.Success)
                {
                    Title = trackMixMatch.Groups[1].Value;
                    Mix   = trackMixMatch.Groups[2].Value;
                }
                else
                {
                    Title = titleString;
                }


                //track artists
                List <string> trackArtists   = new List <string>();
                List <string> trackRemixers  = new List <string>();
                List <string> trackProducers = new List <string>();


                if (trackData.ContainsKey("artists"))
                {
                    System.Collections.ArrayList trackArtistsList = (System.Collections.ArrayList)trackData["artists"];

                    foreach (Dictionary <string, object> artist in trackArtistsList)
                    {
                        var name = (string)artist["name"];
                        var anv  = (string)artist["anv"];
                        var role = (string)artist["role"];

                        if (!string.IsNullOrEmpty(anv))
                        {
                            name = anv;
                        }

                        if (string.IsNullOrEmpty(role))
                        {
                            trackArtists.Add(name);
                        }
                        else if (role == "Remix")
                        {
                            trackRemixers.Add(name);
                        }
                        else
                        {
                            throw new InvalidOperationException("found track artist with an unknown roll: " + role);
                        }
                    }
                }


                if (trackData.ContainsKey("extraartists"))
                {
                    System.Collections.ArrayList trackextraArtists = (System.Collections.ArrayList)trackData["extraartists"];

                    foreach (Dictionary <string, object> artist in trackextraArtists)
                    {
                        var name = (string)artist["name"];
                        var anv  = (string)artist["anv"];
                        var role = (string)artist["role"];

                        if (!string.IsNullOrEmpty(anv))
                        {
                            name = anv;
                        }

                        if (string.IsNullOrEmpty(role))
                        {
                            trackArtists.Add(name);
                        }
                        else if (role.Contains("Remix"))
                        {
                            trackRemixers.Add(name);
                        }
                    }
                }


                string Artist     = null;
                var    artistList = releaseArtists.Union(trackArtists);
                string artistStr  = string.Join(", ", artistList);
                if (!String.IsNullOrEmpty(artistStr))
                {
                    Artist = artistStr;
                }

                string Remixer     = null;
                var    remixerList = releaseRemixers.Union(trackRemixers);
                string remixerStr  = string.Join(", ", remixerList);
                if (!String.IsNullOrEmpty(remixerStr))
                {
                    Remixer = remixerStr;
                }


                string Producer     = null;
                var    producerList = releaseProducers.Union(trackProducers);
                string producerStr  = string.Join(", ", producerList);
                if (!String.IsNullOrEmpty(producerStr))
                {
                    Producer = producerStr;
                }


                TrackData track = new TrackData(host, TrackId, Artist, Title, Mix, Remixer, Release, Producer, Label, CatalogNumber, Genre, null, ReleaseDate, new Uri(URL));

                yield return(track);
            }
        }