public void ParseAll(XDocument doc) { if (!db.FeatureTypes.Any()) { FillFeatureTypes(); } IEnumerable <XElement> channels_in_xml = doc.Root.Elements("channel"); InitGuideUpdate(channels_in_xml.First().Element("url").Value); ParseChannels(channels_in_xml); //programy LogService.Log($"parsing programmes"); IEnumerable <XElement> programmes_in_xml = doc.Root.Elements("programme").ToList(); LogService.Log($"{programmes_in_xml.Count()} found"); if (programmes_in_xml.Count() > 0) { LogService.Log($"first at {programmes_in_xml.First().Attribute("start")}"); } List <Programme> new_programmes = new List <Programme>(); long new_id = GetNewId(db.Programmes); List <Emission> new_emissions = new List <Emission>(); long em_id = GetNewId(db.Emissions); List <Description> new_descriptions = new List <Description>(); long desc_id = GetNewId(db.Descriptions); List <Feature> new_features = new List <Feature>(); long feat_id = GetNewId(db.Features); List <ProgrammesFeature> new_feature_examples = new List <ProgrammesFeature>(); foreach (XElement programme in programmes_in_xml) { string new_title = programme.Elements("title").First().Value; if (new_title.Length > 180) { new_title = new_title.Substring(0, 180); int last_space = new_title.LastIndexOf(' '); new_title = new_title.Substring(0, last_space); new_title += "..."; } Programme new_prog = null; if (db.Programmes.Any()) { new_prog = db.Programmes.SingleOrDefault(prog => prog.Title.ToLower() == new_title.ToLower()); } if (new_prog == null) { new_prog = new_programmes.SingleOrDefault(prog => prog.Title.ToLower() == new_title.ToLower()); } if (new_prog == null) { new_prog = new Programme() { Id = new_id, Title = new_title, IconUrl = programme.Element("icon")?.Attribute("src").Value }; new_programmes.Add(new_prog); new_id++; } Emission new_em = null; if (programme.Attribute("start") == null || programme.Attribute("stop") == null) { throw new DataException($"Missing emission hours ({new_prog.Title})"); } DateTime em_start = ParseDateTime(programme.Attribute("start").Value); DateTime em_stop = ParseDateTime(programme.Attribute("stop").Value); Channel em_channel = db.Channels.Where(ch => ch.Name == programme.Attribute("channel").Value).Single(); if (db.Emissions.Any()) { new_em = db.Emissions.FirstOrDefault(e => e.Start == em_start && e.Stop == em_stop && e.ChannelId == em_channel.Id); } if (new_em == null) { new_em = new_prog.Emissions.FirstOrDefault(e => e.Start == em_start && e.Stop == em_stop && e.ChannelId == em_channel.Id); } if (new_em == null) { new_em = new Emission() { ChannelEmitted = em_channel, ChannelId = em_channel.Id, Start = em_start, Stop = em_stop, RelProgramme = new_prog, ProgrammeId = new_prog.Id }; if (!new_prog.Emissions.Contains(new_em)) { new_prog.Emissions.Add(new_em); em_id++; } } Description new_desc = db.Descriptions.Any() ? db.Descriptions.FirstOrDefault(desc => desc.ProgrammeId == new_prog.Id) : null; if (new_desc == null) { new_desc = new Description() { Id = desc_id, ProgrammeId = new_prog.Id, RelProgramme = new_prog, Content = programme.Element("desc")?.Value ?? "" }; if (new_prog.Descriptions.Where(description => description.Content == new_desc.Content).Count() == 0) { new_prog.Descriptions.Add(new_desc); desc_id++; } } string[] feat_names = { "date", "category", "country" }; List <XElement> features = programme.Elements().Where(elem => feat_names.Contains(elem.Name.LocalName)).ToList(); if (programme.Element("credits") != null) { features.AddRange(programme.Element("credits").Elements()); } if (features.Where(el => el.Name.LocalName == "date").Count() == 0) { features.Add(new XElement("date", $"{DateTime.Now.Year}")); } foreach (XElement feat in features) { string type = feat.Name.LocalName; long type_id = db.FeatureTypes .FirstOrDefault(ft => ft.TypeName == type) .Id; string value = feat.Value; Feature new_feat = null; if (db.Features != null && db.Features.Count() > 0) { new_feat = db.Features.SingleOrDefault(f => f.Type == type_id && f.Value.ToLower() == value.ToLower()); } if (new_feat == null) { new_feat = new_features.SingleOrDefault(f => f.Type == type_id && f.Value.ToLower() == value.ToLower()); } if (new_feat == null) { new_feat = new Feature() { Id = feat_id, RelType = db.FeatureTypes.Single(ft => ft.TypeName == type), Type = type_id, Value = value }; new_features.Add(new_feat); feat_id++; } ProgrammesFeature pf_value_found = null; if (db.ProgrammesFeatures != null && db.ProgrammesFeatures.Any()) { pf_value_found = db.ProgrammesFeatures.SingleOrDefault(fe => fe.FeatureId == new_feat.Id && fe.ProgrammeId == new_prog.Id); } if (new_prog.ProgrammesFeatures != null && new_prog.ProgrammesFeatures.Any()) { pf_value_found = new_prog.ProgrammesFeatures.SingleOrDefault(fe => fe.FeatureId == new_feat.Id && fe.ProgrammeId == new_prog.Id); } if (pf_value_found == null) { new_prog.ProgrammesFeatures.Add(new ProgrammesFeature() { FeatureId = new_feat.Id, ProgrammeId = new_prog.Id, }); } } } db.Features.AddRange(new_features); db.Programmes.AddRange(new_programmes); LogService.Log($"saving programmes"); db.SaveChanges(); LogService.Log($"programmes done"); Cleanup(); FinishGuideUpdate(); }
public FeatureDTO(ProgrammesFeature fe) { Id = (int)fe.RelFeature.Id; Value = fe.RelFeature.Value; Type = fe.RelFeature.RelType.TypeName; }