private List <ContextTrack> GetPage(int index) { if (index == -1) { throw new Exception("You must call nextPage() first!"); } if (index == 0 && !_pages.Any() && _resolveUrl != null) { var m = _session.Mercury().SendSync(MercuryRequests.ResolveContext(_resolveUrl)); var x = ProtoUtils.JsonToContextPages(JObject.Parse(m)["pages"] as JArray); _pages.AddRange(x); } _resolveUrl = null; if (index < _pages.Count) { var page = _pages[index]; var tracks = ResolvePage(page); page.ClearPageUrl(); page.Tracks.Clear(); page.Tracks.Add(tracks); _pages[index] = page; return(tracks); } else { if (index > _pages.Count) { throw new IndexOutOfRangeException(); } var prev = _pages[index - 1]; if (!prev.HasNextPageUrl) { throw new Exception("Illegal State"); } var nextPageUrl = prev.NextPageUrl; prev.ClearNextPageUrl(); _pages[index - 1] = prev; var tracks = FetchTracks(nextPageUrl); var tr = new ContextPage(); tr.Tracks.AddRange(tracks); _pages.Add(tr); return(tracks); } }