Beispiel #1
0
        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();
        }
Beispiel #2
0
 public FeatureDTO(ProgrammesFeature fe)
 {
     Id    = (int)fe.RelFeature.Id;
     Value = fe.RelFeature.Value;
     Type  = fe.RelFeature.RelType.TypeName;
 }