public override IMetacriticData Parse(UrlResponsePair urlResponsePair)
        {
            SearchData data     = new SearchData();
            string     response = urlResponsePair.Response;

            if (!string.IsNullOrEmpty(response))
            {
                int lowerBound = 0;
                int upperBound = 20;

                if (Urls.Count > 1)
                {
                    // First in sequence
                    if (urlResponsePair.SequenceNo == 1)
                    {
                        lowerBound = 20 - urlResponsePair.SearchItemCount;
                    }
                    // Last in sequence
                    else if (urlResponsePair.SequenceNo == Urls.Count)
                    {
                        upperBound = urlResponsePair.SearchItemCount;
                    }
                }
                else
                {
                    string offsetStr = m_parameterData.GetParameterValue("offset");
                    int.TryParse(offsetStr, out int offset);
                    int pageAdjustedOffset = 0;
                    if (offset > 0)
                    {
                        pageAdjustedOffset = (offset % 20) - 1;
                    }

                    lowerBound = pageAdjustedOffset;
                    upperBound = pageAdjustedOffset + urlResponsePair.SearchItemCount;
                }

                if (urlResponsePair.SequenceNo == 1)
                {
                    int idx = response.IndexOf(@"class=""query_results""");
                    if (idx >= 0)
                    {
                        response = response.Substring(idx);
                        if (response.Contains(@"Showing 1 to 20 of "))
                        {
                            data.TotalResultCount = int.Parse(ParseItem(ref response, @" of ", @" results"));
                        }
                    }
                    // No result
                    else
                    {
                        return(data);
                    }
                }

                int startIdx = response.IndexOf(@"class=""search_results");
                if (startIdx != -1)
                {
                    response = response.Substring(startIdx);
                    int idx = 1;
                    while (response.Contains(@"class=""result_wrap""") && idx <= upperBound)
                    {
                        SearchData.SearchItem item = new SearchData.SearchItem();
                        string id = ParseItem(ref response, @"href=""", @""">");

                        // Album url has different format
                        string[] parts = id.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
                        if (parts.Length > 0 && parts[0] == "music")
                        {
                            id = TrimAlbumUrl(id);
                        }
                        else if (parts.Length > 0 && parts[0] == "tv")
                        {
                            id = id.Replace("tv/", "tvshow/");
                        }

                        item.Id    = id;
                        item.Title = ParseItem(ref response, @""">", "</a>");
                        string criticScoreStr = ParseItem(ref response, @""">", "</span>");
                        short.TryParse(criticScoreStr, out short criticScore);
                        item.Rating      = new Rating(criticScore);
                        item.ReleaseDate = ParseItem(ref response, @"<span class=""data"">", "</span>");

                        if (response.Contains(@"class=""stat genre"""))
                        {
                            response = response.Substring(response.IndexOf(@"class=""stat genre"""));
                            string genre = ParseItem(ref response, @"<span class=""data"">", "</span>");
                            Regex  rgx   = new Regex("\\s+");
                            item.Genre = rgx.Replace(genre, " ");
                        }

                        if (idx > lowerBound)
                        {
                            data.AddItem(item);
                        }

                        idx++;
                    }
                }
            }

            return(data);
        }