private async Task <Tuple <string, string> > LoadData() { Car = null; CarSkin = null; Track = null; string uri; if (EventId.Contains(@"/")) { var splitted = EventId.Split('/'); uri = $"http://www.radiators-champ.com/RSRLiveTiming/index.php?page=rank&track={splitted[0]}&car={splitted[1]}"; } else { uri = $"http://www.radiators-champ.com/RSRLiveTiming/index.php?page=event_rank&eventId={EventId}"; } string page; using (var client = new WebClient { Headers = { [HttpRequestHeader.UserAgent] = InternalUtils.GetKunosUserAgent(), [@"X-User-Agent"] = CmApiProvider.UserAgent } }) { page = await client.DownloadStringTaskAsync(uri); } var carIdMatch = Regex.Match(page, @"\bdata-car=""([\w-]+)"""); var trackIdMatch = Regex.Match(page, @"\bdata-track=""([\w-]+)"""); var trackLayoutIdMatch = Regex.Match(page, @"\bdata-track-layout=""([\w-]+)"""); if (!carIdMatch.Success || !trackIdMatch.Success) { return(null); } var carId = carIdMatch.Groups[1].Value; var trackId = trackIdMatch.Groups[1].Value; var trackLayoutId = trackLayoutIdMatch.Success ? trackLayoutIdMatch.Groups[1].Value : null; if (trackLayoutId == trackId) { trackLayoutId = null; // TODO: temporary fix } Car = CarsManager.Instance.GetById(carId); CarSkin = Car?.SelectedSkin; Track = TracksManager.Instance.GetLayoutById(trackId, trackLayoutId); return(new Tuple <string, string>(carId, trackId)); }