private async Task <IEnumerable <Meeting> > SetMeetingList() { var scraperUtility = new ScraperUtilities(); var textUtility = new TextUtility(); var url = "https://meetings.ca.org/api/v1/meetings?area=Sweden¤t_day=0&order=city"; var handler = new HttpClientHandler(); var httpClient = new HttpClient(handler, false); var response = await httpClient.GetAsync(url); var caMeetings = new List <CAJsonToClass>(); var culture = new CultureInfo("sv-SE"); if (response.IsSuccessStatusCode) { var stream = await response.Content.ReadAsStreamAsync(); var ret = scraperUtility.DeserializeFromStream(stream).ToString(); caMeetings = JsonConvert.DeserializeObject <List <CAJsonToClass> >(ret); } var meetingList = new List <Meeting>(); if (null != caMeetings && caMeetings.Any()) { var dayAndTime = new List <MeetingSpecific>(); foreach (var caMeeting in caMeetings.OrderBy(m => m.group.name, StringComparer.Create(culture, false))) { var meeting = new Meeting(); var meetingExist = false; if (meetingList.Any(m => m.GroupName.Trim() == caMeeting.group.name.Trim())) { meeting = meetingList.Where(m => m.GroupName.Trim() == caMeeting.group.name.Trim()).FirstOrDefault(); meetingExist = true; } if (!meetingExist) { meeting.Id = caMeeting.group.id; meeting.GroupName = caMeeting.group.name.Trim(); meeting.Email = caMeeting.group.email; meeting.Phone = caMeeting.group.phone; meeting.GroupLink = caMeeting.group.web; meeting.Address.City = !string.IsNullOrWhiteSpace(caMeeting.group.location.localized_city) ? caMeeting.group.location.localized_city : caMeeting.group.location.city; meeting.Address.Street = !string.IsNullOrWhiteSpace(caMeeting.group.location.localized_road) ? caMeeting.group.location.localized_road : caMeeting.group.location.road; var district = new District { DistrictName = !string.IsNullOrWhiteSpace(caMeeting.group.location.localized_county) ? caMeeting.group.location.localized_county : caMeeting.group.location.county, Id = caMeeting.group.id }; var districtsList = new List <District> { district }; meeting.Address.Districts = districtsList.AsEnumerable(); var success = double.TryParse(caMeeting.group.location.lng, out double longLat); meeting.Address.Longitude = (success) ? longLat : 0; success = double.TryParse(caMeeting.group.location.lat, out longLat); meeting.Address.Lattitude = (success) ? longLat : 0; meeting.Language = caMeeting.group.location.language; Regex regEx = new Regex(@"(https?://[^\s]+)"); var description = caMeeting.description.Replace("\r\n", "<br>"); description = regEx.Replace(description, "<a href=\"$1\" target=\"_blank\">$1</a>"); meeting.AdditionalInformationHtmlString = description; meeting.Note = caMeeting.group.description; meeting.Address.LocationLink = string.Format("https://maps.google.com/maps?q={0}", caMeeting.group.location.localized_formatted_address); meeting.Address.LocalizedAddress = !string.IsNullOrWhiteSpace(caMeeting.group.location.localized_formatted_address) ? caMeeting.group.location.localized_formatted_address : caMeeting.group.location.formatted_address; } var meetingSpecifics = new MeetingSpecific(); var tags = new List <MeetingTypes>(); foreach (var tag in caMeeting.tags) { var type = scraperUtility.GetMeetingTypesCA(tag.word); if (type == MeetingTypes.NotSet) { continue; } tags.Add(type); } meetingSpecifics.MeetingTypes = tags.AsEnumerable(); if (tags.Any()) { meetingSpecifics.MeetingType = tags[0]; } var meetingDay = (int)Enum.Parse(typeof(WeekdayNames), caMeeting.day); meetingSpecifics.Id = meetingDay; meetingSpecifics.MeetingDay = meetingDay; DateTime.TryParse(caMeeting.time, out DateTime dateTime); TimeSpan startTime = dateTime.TimeOfDay; TimeSpan endTime = dateTime.AddMinutes(caMeeting.duration).TimeOfDay; meetingSpecifics.StartTime = startTime; meetingSpecifics.EndTime = endTime; dayAndTime = (null != meeting.DayAndTime && meeting.DayAndTime.Any()) ? meeting.DayAndTime.ToList() : new List <MeetingSpecific>(); if (null != dayAndTime && !dayAndTime.Any()) { for (var t = 0; t < 7; t++) { dayAndTime.Add(new MeetingSpecific { MeetingDay = t, StartTime = TimeSpan.FromTicks(0), EndTime = TimeSpan.FromTicks(0) }); } } if (null != dayAndTime) { if (dayAndTime.Any() && !dayAndTime.Contains(meetingSpecifics) && null == dayAndTime.FirstOrDefault(d => d.MeetingDay == meetingSpecifics.MeetingDay && meetingSpecifics.StartTime.Ticks == d.StartTime.Ticks) && meetingSpecifics.StartTime.Ticks > 0) { for (var t = 0; t < 7; t++) { dayAndTime.Add(new MeetingSpecific { MeetingDay = t, StartTime = TimeSpan.FromTicks(0), EndTime = TimeSpan.FromTicks(0) }); } } for (var t = 0; t < dayAndTime.Count; t++) { if (dayAndTime.Contains(meetingSpecifics) || meetingSpecifics.StartTime.Ticks <= 0) { continue; } if (dayAndTime[t].MeetingDay == meetingSpecifics.MeetingDay && dayAndTime[t].StartTime.Ticks <= 0 && meetingSpecifics.StartTime.Ticks > 0) { dayAndTime[t] = meetingSpecifics; } } } var lastRow = (dayAndTime.Count > 7) ? dayAndTime.GetRange(dayAndTime.Count - 7, 7).Sum(t => t.StartTime.Ticks) : -1; if (lastRow <= 0) { dayAndTime.RemoveRange(dayAndTime.Count - 7, 7); } meeting.DayAndTime = dayAndTime.AsEnumerable(); if (meetingExist) { var indexMeeting = meetingList.Where(m => m.GroupName.Trim() == caMeeting.group.name.Trim()).FirstOrDefault(); var index = meetingList.IndexOf(indexMeeting); if (index != -1) { meetingList[index] = meeting; } } else { meetingList.Add(meeting); } } } return(meetingList); }
private async Task <IEnumerable <Meeting> > SetMeetingList() { var scraperUtility = new ScraperUtilities(); var textUtility = new TextUtility(); var url = "https://www.nasverige.org/main_server/client_interface/jsonp/?switcher=GetSearchResults&get_used_formats&lang_enum=sv&data_field_key=location_postal_code_1,duration_time,start_time,time_zone,weekday_tinyint,service_body_bigint,longitude,latitude,location_province,location_municipality,location_street,location_info,location_text,location_neighborhood,formats,format_shared_id_list,comments,meeting_name,location_sub_province,worldid_mixed,root_server_uri,id_bigint,meeting_name,location_text,formatted_address,formatted_location_info,virtual_meeting_link,virtual_meeting_link,show_qrcode,virtual_meeting_link,phone_meeting_number,phone_meeting_number,show_qrcode,phone_meeting_number,latitude,longitude,latitude,longitude,map_word,latitude,longitude,contact_name_1,contact_phone_1,contact_email_1,contact_name_2,contact_phone_2,contact_email_2&services[]=2&recursive=1&sort_keys=start_time&callback=jQuery35108984379689974507_1614608665780&_=1614608665781"; var handler = new HttpClientHandler(); var httpClient = new HttpClient(handler, false); var response = await httpClient.GetStringAsync(url); var jsonString = response.Substring(response.IndexOf("(") + 1, response.LastIndexOf(")") - response.IndexOf("(") - 1); var jObject = JObject.Parse(jsonString); var naMeetings = new List <NAMeeting>(); var meetingsList = JsonConvert.DeserializeObject <NAJsonToClass>(jObject.ToString()); var culture = new CultureInfo("sv-SE"); var meetingList = new List <Meeting>(); if (null != meetingsList.meetings && meetingsList.meetings.Any()) { foreach (var naMeeting in meetingsList.meetings.OrderBy(m => HttpUtility.HtmlDecode(m.meeting_name), StringComparer.Create(culture, false))) { var meeting = new Meeting(); var meetingExist = false; var meetingSpecifics = new List <MeetingSpecific>(); if (null != naMeeting.meeting_name.Trim() && meetingList.Any(m => m.GroupName.Trim() == HttpUtility.HtmlDecode(naMeeting.meeting_name.Trim()))) { meeting = meetingList.Where(m => m.GroupName.Trim() == HttpUtility.HtmlDecode(naMeeting.meeting_name.Trim())).FirstOrDefault(); meetingExist = true; } if (!meetingExist) { var dayAndTime = new List <MeetingSpecific>(); meeting.GroupName = naMeeting.meeting_name.Trim(); meeting.Id = Convert.ToInt32(naMeeting.id_bigint); meeting.Address.Street = naMeeting.location_street.Trim(); meeting.Address.City = naMeeting.location_municipality.Trim(); meeting.Address.Zip = naMeeting.location_postal_code_1.Trim(); meeting.Address.FullAddress = string.Format("{0}, {1} {2}", naMeeting.location_street.Trim(), naMeeting.location_postal_code_1.Trim(), naMeeting.location_municipality.Trim()); meeting.Place = naMeeting.location_text.Trim(); meeting.Address.Longitude = double.Parse(naMeeting.longitude.Trim()); meeting.Address.Lattitude = double.Parse(naMeeting.latitude.Trim()); meeting.Address.LocationLink = string.Format("https://www.google.com/maps/search/?api=1&query={0}.0090711&q={1},17.0090711" , meeting.Address.Longitude , meeting.Address.Lattitude); meeting.GroupLink = naMeeting.root_server_uri.Trim(); meeting.Email = naMeeting.contact_email_1.Trim(); meeting.Phone = naMeeting.phone_meeting_number.Trim(); meeting.Note = naMeeting.comments.Trim(); meeting.Language = "sv"; var districts = new List <District> { new District { DistrictName = naMeeting.location_province } }; meeting.Address.Districts = districts.AsEnumerable(); meeting.AdditionalInformationHtmlString = naMeeting.location_info.Trim(); var meetingSpecific = new MeetingSpecific(); DateTime.TryParse(naMeeting.start_time.Trim(), out DateTime dateTime); TimeSpan startTime = dateTime.TimeOfDay; TimeSpan endTime = dateTime.Add(TimeSpan.Parse(naMeeting.duration_time)).TimeOfDay; meeting.OnlineLink = naMeeting.virtual_meeting_link.Trim(); meetingSpecific.MeetingDay = Convert.ToInt32(naMeeting.weekday_tinyint.Trim()) - 1; meetingSpecific.StartTime = startTime; meetingSpecific.EndTime = endTime; var tags = new List <MeetingTypes>(); var typesArray = naMeeting.formats.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).ToList(); foreach (var tag in typesArray) { var type = scraperUtility.GetMeetingTypesCA(tag.Trim()); if (type == MeetingTypes.NotSet) { continue; } tags.Add(type); } meetingSpecific.MeetingTypes = tags.AsEnumerable(); if (tags.Any()) { meetingSpecific.MeetingType = tags[0]; } meeting.HandicapFriendly = meetingSpecific.MeetingTypes.ToList().Contains(MeetingTypes.HandicapFriendly); dayAndTime = (null != meeting.DayAndTime && meeting.DayAndTime.Any()) ? meeting.DayAndTime.ToList() : new List <MeetingSpecific>(); if (null != dayAndTime && !dayAndTime.Any()) { for (var t = 0; t < 7; t++) { dayAndTime.Add(new MeetingSpecific { MeetingDay = t, StartTime = TimeSpan.FromTicks(0), EndTime = TimeSpan.FromTicks(0) }); } } if (null != dayAndTime) { if (dayAndTime.Any() && !dayAndTime.Contains(meetingSpecific) && null == dayAndTime.FirstOrDefault(d => d.MeetingDay == meetingSpecific.MeetingDay && meetingSpecific.StartTime.Ticks == d.StartTime.Ticks) && meetingSpecific.StartTime.Ticks > 0) { for (var t = 0; t < 7; t++) { dayAndTime.Add(new MeetingSpecific { MeetingDay = t, StartTime = TimeSpan.FromTicks(0), EndTime = TimeSpan.FromTicks(0) }); } } for (var t = 0; t < dayAndTime.Count; t++) { if (dayAndTime.Contains(meetingSpecific) || meetingSpecific.StartTime.Ticks <= 0) { continue; } if (dayAndTime[t].MeetingDay == meetingSpecific.MeetingDay && dayAndTime[t].StartTime.Ticks <= 0 && meetingSpecific.StartTime.Ticks > 0) { dayAndTime[t] = meetingSpecific; } } } var lastRow = (dayAndTime.Count > 7) ? dayAndTime.GetRange(dayAndTime.Count - 7, 7).Sum(t => t.StartTime.Ticks) : -1; if (lastRow <= 0) { dayAndTime.RemoveRange(dayAndTime.Count - 7, 7); } meeting.DayAndTime = dayAndTime.AsEnumerable(); if (meetingExist) { var indexMeeting = meetingList.Where(m => m.GroupName.Trim() == naMeeting.meeting_name.Trim()).FirstOrDefault(); var index = meetingList.IndexOf(indexMeeting); if (index != -1) { meetingList[index] = meeting; } } else { meetingList.Add(meeting); } } } } return(meetingList); }