Exemple #1
0
        private async void FetchContributors(XElement episode, ReduxEntities data, string pid)
        {
            XNamespace ion          = "http://bbc.co.uk/2008/iplayer/ion";
            var        contributors = episode.Elements(ion + "blocklist")
                                      .Elements(ion + "episode_detail")
                                      .Elements(ion + "contributors")
                                      .Elements(ion + "contributor");
            var ctx = new ReduxEntities();

            foreach (var contributor in contributors)
            {
                var ct = new contributor
                {
                    character_name = contributor.Element(ion + "character_name").Value,
                    family_name    = contributor.Element(ion + "family_name").Value,
                    given_name     = contributor.Element(ion + "given_name").Value,
                    role           = contributor.Element(ion + "role").Value,
                    role_name      = contributor.Element(ion + "role_name").Value,
                    type           = contributor.Element(ion + "type").Value,
                    contributor_id = Convert.ToInt32(contributor.Element(ion + "id").Value),
                    pid            = pid
                };
                Debug.WriteLine("{0} {1} {2} {3} {4} {5} {6}", ct.character_name, ct.contributor_id, ct.family_name, ct.given_name, ct.role, ct.role_name, ct.type);
                ctx.contributors.AddObject(ct);
            }
            ctx.SaveChanges();
            //data.SaveChanges();
        }
Exemple #2
0
        async private void RunAsyncFetches()
        {
            Progress progress = new Progress();

            progress.Show();

            int genrecount = await TaskEx.Run <int>(() =>
            {
                var ctx = new ReduxEntities();
                return(ctx.genres.Count());
            });

            progress.WriteLine("We have {0} genres", genrecount);

            WebClient client = new WebClient();

            progress.WriteLine("Fetching daily schedule");
            var result = await client.DownloadStringTaskAsync("http://www.bbc.co.uk/bbcone/programmes/schedules/london/today.xml");

            progress.WriteLine("Got Schedule");
            var doc = XElement.Parse(result);

            var pids = from pid in doc.XPathSelectElements("./day/broadcasts/broadcast/programme[@type='episode']/pid")
                       select pid.Value;
            await TaskEx.WhenAll((from p in pids select FetchPidDataAsync(p, progress)));

            progress.WriteLine("Finished");
        }
Exemple #3
0
        private void FetchContributors(XElement episode, ReduxEntities data, string pid)
        {
            XNamespace ion          = "http://bbc.co.uk/2008/iplayer/ion";
            var        contributors = episode.Elements(ion + "blocklist")
                                      .Elements(ion + "episode_detail")
                                      .Elements(ion + "contributors")
                                      .Elements(ion + "contributor");

            foreach (var contributor in contributors)
            {
                var ct = new contributor
                {
                    character_name = contributor.Element(ion + "character_name").Value,
                    family_name    = contributor.Element(ion + "family_name").Value,
                    given_name     = contributor.Element(ion + "given_name").Value,
                    role           = contributor.Element(ion + "role").Value,
                    role_name      = contributor.Element(ion + "role_name").Value,
                    type           = contributor.Element(ion + "type").Value,
                    contributor_id = Convert.ToInt32(contributor.Element(ion + "id").Value),
                    pid            = pid
                };
                data.AddObject("contributors", ct);
            }
            //data.SaveChanges();
        }
Exemple #4
0
        private async void FetchTags(XElement episode, ReduxEntities data, string pid)
        {
            XNamespace ion  = "http://bbc.co.uk/2008/iplayer/ion";
            var        tags = episode.Elements(ion + "blocklist")
                              .Elements(ion + "episode_detail")
                              .Elements(ion + "tag_schemes")
                              .Elements(ion + "tag_scheme")
                              .Elements(ion + "tags")
                              .Elements(ion + "tag");
            var ctx = new ReduxEntities();

            foreach (var tag in tags)
            {
                var tg = new tag
                {
                    tag_id = tag.Element(ion + "id").Value,
                    name   = tag.Element(ion + "name").Value,
                    value  = tag.Element(ion + "value").Value,
                    pid    = pid
                };
                Debug.WriteLine("{0} {1} {2} {3}", tg.name, tg.pid, tg.tag_id, tg.value);
                ctx.tags.AddObject(tg);
            }
            ctx.SaveChanges();
        }
Exemple #5
0
        private async void GetPipsForNewReduxData(object sender, RoutedEventArgs e)
        {
            Thumbnail thumbnail = new Thumbnail();

            thumbnail.Show();
            Progress progress = new Progress();

            progress.Show();
            var itemStore  = new ReduxEntities();
            var notmatched = (from r in itemStore.redux_items
                              from rp in itemStore.redux_to_pips
                              where r.id == rp.redux_id && rp.pips_id == 0
                              select r.aired).ToList().Select(d => d.Date).Distinct().OrderBy(d => d).ToList();

            Fetcher fetcher = new Fetcher();

            notmatched = notmatched.Where(d => d >= new DateTime(2011, 02, 04)).ToList();

            var earliest = notmatched.First();  //itemStore.redux_items.Min(r => r.aired).Date;

            var latest = notmatched.Last();     //itemStore.redux_items.Max(r => r.aired).Date;

            foreach (DateTime dt in notmatched)
            {
                await fetcher.GetDayScheduleAsync(dt, progress, thumbnail);

                if (progress.IsCancelled)
                {
                    break;
                }
            }
        }
Exemple #6
0
        private async void StartFetching()
        {
            var ctx       = new ReduxEntities();
            var thumbnail = new Thumbnail();

            thumbnail.Show();
            while (IsCancelled == false)
            {
                var nextSixteen = (from item in ctx.scan_pips_contributors
                                   where item.scanned == false
                                   select item).Take(16).ToList();
                if (nextSixteen.Count == 0)
                {
                    IsCancelled = true;
                }
                else
                {
                    await TaskEx.WhenAll(from item in nextSixteen select FetchItemGenreAndIonAsync(item, thumbnail, this, IsTags, IsIonContributors, IsCategories));

                    ctx.SaveChanges();
                }
            }
            IsRunning   = false;
            IsCancelled = false;
        }
Exemple #7
0
        void Chart_Loaded(object sender, RoutedEventArgs e)
        {
            var ctx = new ReduxEntities();
            //var genres = (from item in ctx.genres
            //             group item by item.path into grouped
            //             select new { grouped.Key, Count = grouped.Count() }).ToList();

            //paths = (from item in genres
            //            let path = item.Key
            //            select new GenrePath
            //            {
            //                Path = path,
            //                Count = item.Count,
            //                Parent = path.Contains("/") ?
            //                            path.Substring(0, path.LastIndexOf('/'))
            //                        :
            //                            "",
            //                Level = path.Count(c=>c == '/')
            //            }).ToList();

            var genres = (from item in ctx.genres
                          group item by item.path into grouped
                          select new
            {
                Path = grouped.Key,
                Count = grouped.Count(),
                Pid =
                    (from ge in ctx.genre_pids
                     where ge.path == grouped.Key
                     select ge.pid).FirstOrDefault(),
                TotalDur =
                    (from ge in ctx.genres
                     from p in ctx.pips_programmes
                     where ge.pips_id == p.id && ge.path == grouped.Key
                     select p.duration).Sum()
            }).ToList();

            paths = (from item in genres
                     select new GenrePath
            {
                Path = item.Path,
                Count = item.TotalDur,
                Parent = item.Path.Contains("/") ?
                         item.Path.Substring(0, item.Path.LastIndexOf('/'))
                                                                        :
                         "",
                Level = item.Path.Count(c => c == '/'),
                Pid = item.Pid
            }).ToList();

            foreach (var gp in paths)
            {
                gp.Children = (from p in paths where p.Parent == gp.Path select p).ToList();
            }
            treeMap.ItemsSource = (from p in paths where p.Parent == "" select p).ToList();
        }
Exemple #8
0
        public async Task AddGenresAsync(string pid, int pips_id, IProgress progress, IThumbnail thumbnail)
        {
            //progress.WriteLine("Start Fetching for {0}", pid);
            if (progress.IsCancelled)
            {
                return;
            }
            try
            {
                thumbnail.ShowImage("http://node2.bbcimg.co.uk/iplayer/images/episode/" + pid + "_314_176.jpg");
                var waitIon  = LoadXmlAsync("http://www.bbc.co.uk/iplayer/ion/episodedetail/episode/" + pid + "/format/xml");
                var waitPips = LoadXmlAsync("http://www.bbc.co.uk/programmes/" + pid + ".xml");
                var pages    = await TaskEx.WhenAll(waitIon, waitPips);

                var progpage = pages[1];
                var ionPage  = pages[0];
                //var progpage = await LoadXmlAsync("http://www.bbc.co.uk/programmes/" + pid + ".xml");
                var genres = (from cat in progpage.XPathSelectElements("categories//category[ancestor-or-self::category[@type='genre']]")
                              let cats = from c in cat.XPathSelectElements("./descendant-or-self::category") select c.Attribute("key").Value
                                         select new
                {
                    pips_id = pips_id,
                    title = cat.Element("title").Value,
                    name = cat.Attribute("key").Value,
                    //Cats = cats,
                    path = string.Join("/", cats.Reverse().ToArray())
                }
                              ).Distinct();
                var data = new ReduxEntities();
                foreach (var g in genres)
                {
                    data.genres.AddObject(new genre
                    {
                        pips_id = g.pips_id,
                        name    = g.name,
                        title   = g.title,
                        path    = g.path
                    });
                }
                try
                {
                    data.SaveChanges();
                }
                catch (Exception exp)
                {
                    var msg4 = exp.Message;
                    throw;
                }
                FetchContributors(ionPage, data, pid);
                FetchTags(ionPage, data, pid);
                FetchCategories(ionPage, data, pid);
            }
            catch (WebException)
            {
            }
        }
        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var g    = ((ListBox)sender).SelectedItem as GenrePid;
            var ctx  = new ReduxEntities();
            var path = ctx.genre_pids.First(ge => ge.path == GenrePath.Path);

            path.pid = g.Pid;
            ctx.SaveChanges();
            GenrePath.Pid = g.Pid;
        }
Exemple #10
0
        private void TestThumbnails(object sender, RoutedEventArgs e)
        {
            Thumbnail thumbnail = new Thumbnail();

            thumbnail.Show();
            ReduxEntities ctx  = new ReduxEntities();
            var           pids = from p in ctx.pips_programmes.OrderByDescending(p => p.start_gmt).Take(50)
                                 select p.pid;

            foreach (var pid in pids)
            {
                thumbnail.ShowImage("http://node2.bbcimg.co.uk/iplayer/images/episode/" + pid + "_314_176.jpg");
            }
        }
Exemple #11
0
        private void FetchCategories(XElement root, ReduxEntities data, string pid)
        {
            var cats = from cat in root.XPathSelectElements("categories/category[@type != 'genre']")
                       select new category()
            {
                pid    = pid,
                type   = cat.Attribute("type").Value,
                catkey = cat.Attribute("key").Value,
                title  = cat.Element("title").Value
            };

            foreach (var c in cats)
            {
                data.categories.AddObject(c);
            }
        }
Exemple #12
0
 private void Eliminate_Click(object sender, RoutedEventArgs e)
 {
     using (var data = new ReduxEntities())
     {
         var gaps = data.gaps.ToList();
         gaps = (from gap in gaps
                 where ((gap.service_id == 5 && gap.gapend.ToLocalTime().TimeOfDay == new TimeSpan(07, 00, 00)) ||
                        (gap.service_id == 4 && gap.gapend.ToLocalTime().TimeOfDay == new TimeSpan(06, 00, 00)) ||
                        (gap.service_id == 1 && gap.gapend.ToLocalTime().TimeOfDay == new TimeSpan(19, 00, 00)) ||
                        (gap.service_id == 2 && gap.gapend.ToLocalTime().TimeOfDay == new TimeSpan(06, 00, 00)) ||
                        (gap.service_id == 3 && gap.gapend.ToLocalTime().TimeOfDay == new TimeSpan(06, 00, 00)) ||
                        (gap.service_id == 6 && gap.gapend.ToLocalTime().TimeOfDay == new TimeSpan(19, 00, 00))
                        ) == false
                 select gap).ToList();
         gapGrid.ItemsSource = gaps;
     }
 }
        private async void InitializePidList(string genrePath)
        {
            var             ctx  = new ReduxEntities();
            List <GenrePid> pids = await TaskEx.Run <List <GenrePid> >(() =>
            {
                return((from p in ctx.pips_programmes
                        from g in ctx.genres
                        where p.id == g.pips_id &&
                        g.path == genrePath
                        select new GenrePid
                {
                    Pid = p.pid
                }).ToList());
            });

            GenrePids = pids;
        }
Exemple #14
0
        private static void MakeMatch(ReduxEntities ctx, UnmatchedItem item, pips_programmes p)
        {
            var rp = new redux_to_pips
            {
                duration_match = item.rp.duration_match,
                ischecked      = item.rp.ischecked,
                partial_match  = (item.r.programme_name == p.display_title) == false,
                pips_id        = p.id,
                redux_id       = item.rp.redux_id,
                start_match    = true,
                title_match    = (item.r.programme_name == p.display_title)
            };

            ctx.redux_to_pips.DeleteObject(item.rp);
            ctx.redux_to_pips.AddObject(rp);
            item.rp = rp;
            ctx.SaveChanges();
        }
Exemple #15
0
        // This is a quick(ish) way to scan all the programmes in pips_programmes
        // and find all gaps in the schedule.
        // Note that this process will find all actual gaps where
        // the channel is not transmitting
        private void ScanGaps_Click(object sender, RoutedEventArgs e)
        {
            List <Gap> gaps = new List <Gap>();

            Task.Factory.StartNew(() =>
            {
                StringBuilder sql = new StringBuilder();
                sql.AppendLine("insert into gaps (programme_id, service_id, gapstart,gapend)");                        // VALUES(1234,1,"2007-06-28 03:00","2007-06-28 06:00")
                using (var data = new ReduxEntities())
                {
                    var programmes = (from prog in data.pips_programmes
                                      //orderby prog.ServiceId, prog.StartTime
                                      select prog).ToList();
                    programmes = (from prog in programmes
                                  orderby prog.service_id, prog.start_gmt
                                  select prog).ToList();
                    pips_programmes prev = null;
                    using (var newdata = new ReduxEntities())
                    {
                        foreach (var prog in programmes)
                        {
                            if (prev != null && prev.service_id == prog.service_id && prev.end_gmt < prog.start_gmt)
                            {
                                gap gap = new gap
                                {
                                    programme_id = prog.id,
                                    service_id   = prog.service_id,
                                    gapstart     = prev.end_gmt,
                                    gapend       = prog.start_gmt
                                };
                                newdata.gaps.AddObject(gap);
                                Dispatcher.Invoke((MyDelegate) delegate { gapLabel.Content = string.Format("{0}", gap.gapstart); });
                            }
                            if (prev == null || prog.service_id != prev.service_id || prog.end_gmt > prev.end_gmt)
                            {
                                prev = prog;
                            }
                        }
                        newdata.SaveChanges();
                    }
                    Dispatcher.Invoke((MyDelegate) delegate { gapGrid.ItemsSource = data.gaps; });
                }
            });
        }
Exemple #16
0
        private async void MissingGenres(object sender, RoutedEventArgs e)
        {
            Thumbnail thumbnail = new Thumbnail();

            thumbnail.Show();
            Progress progress = new Progress();

            progress.Show();
            var itemStore = new ReduxEntities();
            var nogenres  = from p in itemStore.pips_programmes
                            join g in itemStore.genres on p.id equals g.pips_id into joined
                            from j in joined.DefaultIfEmpty()
                            where j == null
                            select p;
            var    ng  = nogenres.ToList();
            Random rnd = new Random();

            for (int i = ng.Count; i == 0; i--)
            {
                int             pos = rnd.Next(i);
                pips_programmes tmp = ng[i - 1];
                ng[i - 1] = ng[pos];
                ng[pos]   = tmp;
            }
            List <Task> tasks   = new List <Task>();
            Fetcher     fetcher = new Fetcher();

            foreach (var prog in ng)
            {
                tasks.Add(fetcher.AddGenresAsync(prog.pid, prog.id, progress, thumbnail));
                if (tasks.Count >= 16)
                {
                    await TaskEx.WhenAll(tasks);

                    tasks.Clear();
                    if (progress.IsCancelled)
                    {
                        break;
                    }
                }
            }
        }
Exemple #17
0
        private async Task FetchCategories(XElement root, ReduxEntities data, string pid)
        {
            var cats = from cat in root.XPathSelectElements("categories/category[@type != 'genre']")
                       select new category()
            {
                pid    = pid,
                type   = cat.Attribute("type").Value,
                catkey = cat.Attribute("key").Value,
                title  = cat.Element("title").Value
            };
            var ctx = new ReduxEntities();

            foreach (var c in cats)
            {
                Debug.WriteLine("{0} {1} {2} {3}", c.catkey, c.pid, c.type, c.title);
                //data.categories.AddObject(c);
                ctx.categories.AddObject(c);
            }
            ctx.SaveChanges();
        }
Exemple #18
0
        private void GetData(object sender, RoutedEventArgs e)
        {
            //programmesEntities entities = new programmesEntities();
            //var result = (from item in entities.redux_items
            //              where item.programme_name == "Doctor Who"
            //             select item);
            //dataGrid.ItemsSource = result;

            //using (var items = new ReduxItems())
            //{
            //    var top = items.PipsProgrammes.Take(100);
            //    dataGrid.ItemsSource = top;
            //}

            using (var items = new ReduxEntities())
            {
                var top = items.redux_items.Take(100);
                dataGrid.ItemsSource = top;
            }
        }
Exemple #19
0
 private void FetchCurrent_Click(object sender, RoutedEventArgs e)
 {
     if (datePicker.SelectedDate != null)
     {
         DateTime date = StartDate.Date;
         DateTime end  = EndDate.Date.AddDays(1);
         using (var data = new ReduxEntities())
         {
             var programmes = (from prog in data.pips_programmes
                               where prog.start_gmt >= date &&
                               prog.start_gmt < end &&
                               prog.service_id == ServiceId
                               select new { DisplayTitle = prog.display_title,
                                            Description = prog.description,
                                            StartGmt = prog.start_gmt,
                                            EndGmt = prog.end_gmt,
                                            ServiceName = prog.service_name }).ToList();
             gapGrid.ItemsSource = programmes;
         }
     }
 }
Exemple #20
0
        private void FetchTags(XElement episode, ReduxEntities data, string pid)
        {
            XNamespace ion  = "http://bbc.co.uk/2008/iplayer/ion";
            var        tags = episode.Elements(ion + "blocklist")
                              .Elements(ion + "episode_detail")
                              .Elements(ion + "tag_schemes")
                              .Elements(ion + "tag_scheme")
                              .Elements(ion + "tags")
                              .Elements(ion + "tag");

            foreach (var tag in tags)
            {
                var tg = new tag
                {
                    tag_id = tag.Element(ion + "id").Value,
                    name   = tag.Element(ion + "name").Value,
                    value  = tag.Element(ion + "value").Value,
                    pid    = pid
                };
                data.AddObject("tags", tg);
            }
        }
Exemple #21
0
        private void IngestNewReduxData(object sender, RoutedEventArgs e)
        {
            Services services = new Services();
            var      context  = new ReduxEntities();

            XElement doc      = XElement.Load(@"D:\Docs\prog.txt");
            var      diskrefs = (from item in context.redux_items select item.disk_reference).ToArray();
            var      remapped = from row in doc.Elements("row")
                                select new Dictionary <string, string>(
                (from field in row.Elements("field")
                 select new { Key = field.Attribute("name").Value, Value = field.Value }).ToDictionary(vp => vp.Key, vp => vp.Value));

            var joined = from row in doc.Elements("row")
                         join dr in diskrefs on row.Elements("field").First(f => f.Attribute("name").Value == "disk_reference").Value equals dr into j
                         from j2 in j.DefaultIfEmpty()
                             where j2 == null
                         select row;

            CultureInfo provider = CultureInfo.InvariantCulture;
            var         items    = from row in joined
                                   select new redux_items
            {
                aired             = DateTime.Parse(row.Elements("field").First(f => f.Attribute("name").Value == "start").Value, provider, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal),
                disk_reference    = row.Elements("field").First(f => f.Attribute("name").Value == "disk_reference").Value,
                programme_crid    = row.Elements("field").First(f => f.Attribute("name").Value == "pcrid").Value,
                series_crid       = row.Elements("field").First(f => f.Attribute("name").Value == "scrid").Value,
                programme_name    = row.Elements("field").First(f => f.Attribute("name").Value == "title").Value,
                short_description = row.Elements("field").First(f => f.Attribute("name").Value == "description").Value,
                duration          = Convert.ToInt32(row.Elements("field").First(f => f.Attribute("name").Value == "duration").Value),
                service_id        = services.GetServiceByReduxId(row.Elements("field").First(f => f.Attribute("name").Value == "channel_id").Value).Id
            };

            foreach (var item in items)
            {
                context.redux_items.AddObject(item);
            }
            context.SaveChanges();
        }
Exemple #22
0
        //private Task<int> GetMaxIdScanned()
        //{
        //    TaskCompletionSource<int> tcs = new TaskCompletionSource<int>();
        //    TaskEx.Run(() =>
        //        {
        //            var ctx = new ReduxEntities();
        //            tcs.SetResult(ctx.genres.Max(g => g.pips_id));
        //        });
        //    return tcs.Task;
        //}

        //private Task<bool> CountGenres()
        //{
        //    TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
        //    TaskEx.Ru
        //}

        private void AddGenres(string pid, int pips_id, Progress progress)
        {
            try
            {
                var progpage = XElement.Load("http://www.bbc.co.uk/programmes/" + pid + ".xml");
                var genres   = (from cat in progpage.XPathSelectElements("categories//category[ancestor-or-self::category[@type='genre']]")
                                let cats = from c in cat.XPathSelectElements("./descendant-or-self::category") select c.Attribute("key").Value
                                           select new
                {
                    pips_id = pips_id,
                    title = cat.Element("title").Value,
                    name = cat.Attribute("key").Value,
                    //Cats = cats,
                    path = string.Join("/", cats.Reverse().ToArray())
                }
                                ).Distinct();
                progress.WriteLine("");
                progress.WriteLine("Fetching genres for {0} ({1})", pid, pips_id);
                var data = new ReduxEntities();
                foreach (var g in genres)
                {
                    progress.WriteLine("{0}, {1}, {2}", g.title, g.name, g.path);
                    data.genres.AddObject(new genre
                    {
                        pips_id = g.pips_id,
                        name    = g.name,
                        title   = g.title,
                        path    = g.path
                    });
                }
                data.SaveChanges();
            }
            catch (WebException)
            {
            }
        }
Exemple #23
0
        /// <summary>
        /// Scan's a day's schedule and fetches pips data from /programmes
        /// DEPRECATED and replaced by the newer code in MainWindow.GetPipsForNewReduxData
        /// </summary>
        /// <param name="date"></param>
        /// <param name="thumbnail"></param>
        private void ScanWholeDay(DateTime date, Thumbnail thumbnail)
        {
            reduxItems = new ReduxEntities();
            Dispatcher.Invoke((MyDelegate) delegate { dateScanning.Content = date.ToString("dd/MM/yyyy"); });
            Services services = new Services();
            DateTime dayStart = date.Date;
            DateTime dayEnd   = dayStart.AddDays(1);

            //if (reduxItems.Scanned.Any(p => p.DateScanned == dayStart) == false)
            //{
            Dispatcher.Invoke((MyDelegate) delegate { working.Content = "Working..."; });
            List <XElement> programmeElements = new List <XElement>();

            //var dayItems = from item in reduxItems.Items
            //               where item.Aired >= dayStart && item.Aired < dayEnd
            //               select item;
            foreach (var sid in services.Select(s => s.Id))
            {
                Dispatcher.Invoke((MyDelegate) delegate { working.Content = "Working... " + services[sid].Name; });
                string   url      = services.ProgrammesUrl(sid, dayStart);
                XElement schedule = XElement.Load(url);
                var      items    = from element in schedule.Element("day").Element("broadcasts").Elements("broadcast")
                                    select new XElement("programme", new XAttribute("serviceid", sid), element);
                XElement previous = null;
                foreach (var item in items)
                {
                    if (previous != null)
                    {
                        var st = previous.Element("broadcast").GetElementDate("end");
                        var en = item.Element("broadcast").GetElementDate("start");
                        if (st < en)
                        {
                            if ((sid == 1 || sid == 6) && en.Hour == 19 && en.Minute == 0)
                            {
                            }
                            else
                            {
                            }
                        }
                    }
                    previous = item;
                }
                programmeElements.AddRange(items);
            }

            var programmes = from element in programmeElements
                             let broadcast = element.Element("broadcast")
                                             let episode = broadcast.Elements("programme").First(e => e.Attribute("type").Value == "episode")
                                                           select new pips_programmes()
            {
                service_id       = element.GetAttributeInt("serviceid"),
                service_name     = services[element.GetAttributeInt("serviceid")].Name,
                start_gmt        = broadcast.GetElementDate("start"),
                end_gmt          = broadcast.GetElementDate("end"),
                start_time       = broadcast.GetElementDate("start").ToLocalTime(),
                end_time         = broadcast.GetElementDate("end").ToLocalTime(),
                duration         = broadcast.GetElementInt("duration"),
                programme_name   = episode.Element("title").Value,
                display_title    = episode.Element("display_titles").Element("title").Value,
                display_subtitle = episode.Element("display_titles").Element("subtitle").Value,
                pid         = episode.Element("pid").Value,
                description = episode.Element("short_synopsis").Value,
                rawdata     = element.ToString()
            };

            //foreach (var item in dayItems)
            //{
            //    var matched = (from programme in programmeElements
            //                   where programme.GetAttributeInt("serviceid") == item.ServiceId
            //                   && programme.Element("broadcast").GetElementDate("start").ToUniversalTime() == item.Aired
            //                   select programme).FirstOrDefault();
            //    if (matched != null)
            //    {
            //        var broadcast = matched.Element("broadcast");
            //        item.IsStartTimeMatched = true;
            //        int duration = broadcast.GetElementInt("duration");
            //        item.IsDurationMatched = duration == item.DurationSecs;
            //        var episode = (from ep in broadcast.Elements("programme")
            //                       where ep.Attribute("type").Value == "episode"
            //                       select ep).First();
            //        //item.PipsName = episode.Element("display_titles").Element("title").Value;
            //        //item.TitleMatch = item.PipsName == item.ProgrammeName;
            //        //item.Pid = episode.Element("pid").Value;
            //        //item.PipsDurationSecs = broadcast.GetElementInt("duration");
            //    }

            //    item.IsChecked = true;
            //}
            DateTime timerstart = DateTime.Now;
            var      already    = (from p in reduxItems.pips_programmes
                                   where p.start_time >= dayStart && p.start_time < dayEnd
                                   select p).ToList();

            List <pips_programmes> newProgrammes = new List <pips_programmes>();

            foreach (var prog in programmes)
            {
                if (already.Any(p => p.service_id == prog.service_id && p.start_time == prog.start_time) == false)
                {
                    reduxItems.pips_programmes.AddObject(prog);
                    newProgrammes.Add(prog);
                }
            }
            //reduxItems.Scanned.Add(new Scanned() { DateScanned = dayStart });
            reduxItems.SaveChanges();
            DateTime timerend = DateTime.Now;

            Dispatcher.Invoke((MyDelegate) delegate { working.Content = "took " + (timerend - timerstart).ToString(); });
            //}
        }
Exemple #24
0
 private void TestDbConnection(object sender, RoutedEventArgs e)
 {
     var ctx    = new ReduxEntities();
     var titles = ctx.redux_items.Take(50).ToList();
 }
Exemple #25
0
        private void ReadNewReduxDataStream(object sender, RoutedEventArgs e)
        {
            Services    services = new Services();
            redux_items item     = null;
            var         context  = new ReduxEntities();
            int         count    = 0;
            XmlReader   reader   = XmlReader.Create(@"D:\Docs\prog.txt");

            while (reader.Read())
            {
                if (reader.IsStartElement() && reader.Name == "row")
                {
                    if (item != null)
                    {
                        if (context.redux_items.Any(i => i.disk_reference == item.disk_reference) == false)
                        {
                            //context.redux_items.AddObject(item);
                            //count++;
                            //if (count > 100)
                            //{
                            //    context.SaveChanges();
                            //    context = new ReduxEntities();
                            //    count = 0;
                            //}
                        }
                    }
                    item = new redux_items();
                }

                /*
                 * channel_id
                 * disk_reference
                 * title
                 * description
                 * duration
                 * start
                 * pcrid
                 * scrid
                 * end
                 */
                CultureInfo provider = CultureInfo.InvariantCulture;

                if (reader.IsStartElement() && reader.Name == "field")
                {
                    var fieldname = reader.GetAttribute("name");
                    switch (fieldname)
                    {
                    case "channel_id":
                        Service service = services.GetServiceByReduxId(reader.ReadElementContentAsString());
                        item.service_id = service.Id;
                        break;

                    case "disk_reference":
                        item.disk_reference = reader.ReadElementContentAsString();
                        break;

                    case "title":
                        item.programme_name = reader.ReadElementContentAsString();
                        break;

                    case "description":
                        item.short_description = reader.ReadElementContentAsString();
                        break;

                    case "duration":
                        item.duration = reader.ReadElementContentAsInt();
                        break;

                    case "start":
                        string dt = reader.ReadElementContentAsString();
                        item.aired = DateTime.Parse(dt, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal);
                        break;

                    case "pcrid":
                        item.programme_crid = reader.ReadElementContentAsString();
                        break;

                    case "scrid":
                        item.series_crid = reader.ReadElementContentAsString();
                        break;

                    case "end":
                        break;

                    default:
                        break;
                    }
                }
            }
            if (item != null)
            {
                //context.redux_items.AddObject(item);
                //context.SaveChanges();
            }
        }
Exemple #26
0
        private async void RunMatcherClick(object sender, RoutedEventArgs e)
        {
            Thumbnail thumbnails = new Thumbnail();

            thumbnails.Show();
            Progress progress = new Progress();

            progress.Show();
            ReduxEntities ctx = new ReduxEntities();
            //DateTime cutoff = new DateTime(2010, 5, 1);
            var unmatched = (from r in ctx.redux_items
                             from rp in ctx.redux_to_pips
                             where r.id == rp.redux_id && rp.pips_id == 0
                             //&& r.aired >= cutoff
                             select r).ToList();;
            int count = 0;

            foreach (var unmatcheditem in unmatched)
            {
                if (progress.IsCancelled)
                {
                    break;
                }

                var item = new UnmatchedItem(unmatcheditem, ctx.redux_to_pips.FirstOrDefault(rp => rp.redux_id == unmatcheditem.id));
                if (item.rp == null || item.rp.pips_id > 0)
                {
                    continue;
                }

                var rangestart  = item.r.aired.AddMinutes(-5);
                var rangeend    = item.r.aired.AddMinutes(5);
                var pipsmatches = await TaskEx.Run <List <pips_programmes> >(() =>
                {
                    return((from p in ctx.pips_programmes
                            where p.start_gmt == item.r.aired &&
                            p.service_id == item.r.service_id
                            select p).ToList());
                });

                string matchedpid  = null;
                bool   isMatchMade = false;
                if (pipsmatches.Count == 0)
                {
                    //progress.WriteLine("Unmatched: {0} {1} {2}", item.r.disk_reference, item.r.programme_name, item.r.aired);
                }
                else if (pipsmatches.Count == 1)
                {
                    var p = pipsmatches.First();
                    if (PartialMatch.GetSimpleWeighting(item.r, p) > 0)
                    {
                        MakeMatch(ctx, item, p);
                        matchedpid  = p.pid;
                        isMatchMade = true;
                        //progress.WriteLine("Matched: {0} {1} {2} -> {3} {4} {5}", item.r.disk_reference, item.r.programme_name, item.r.aired, p.pid, p.display_title, p.start_gmt);
                    }
                }
                else
                {
                    //progress.WriteLine("Matched: {0} {1} {2} ->", item.r.disk_reference, item.r.programme_name, item.r.aired);
                    //foreach (var pipsmatch in pipsmatches)
                    //{
                    //    var p = pipsmatch;
                    //    progress.WriteLine("         -> {0} {1} {2}", p.pid, p.display_title, p.start_gmt);
                    //}
                    //matchedpid = pipsmatches.First().pid;
                }

                if (isMatchMade == false)
                {
                    pipsmatches = await TaskEx.Run <List <pips_programmes> >(() =>
                    {
                        DateTime fiveminutesbefore = item.r.aired.AddMinutes(-5);
                        DateTime fiveminutesafter  = item.r.aired.AddMinutes(5);
                        return((from p in ctx.pips_programmes
                                join rp in ctx.redux_to_pips on p.id equals rp.pips_id into joined
                                from j in joined.DefaultIfEmpty()
                                where j == null && p.start_gmt >= fiveminutesbefore &&
                                p.start_gmt <= fiveminutesafter &&
                                p.service_id == item.r.service_id
                                select p).ToList());
                    });

                    var suitable = pipsmatches.Where(p => PartialMatch.GetSimpleWeighting(item.r, p) > 0)
                                   .OrderByDescending(p => PartialMatch.GetSimpleWeighting(item.r, p))
                                   .OrderBy(p => Math.Abs((p.start_gmt - item.r.aired).TotalSeconds))
                                   .OrderBy(p => Math.Abs(p.duration - item.r.duration))
                                   .ToList();
                    if (suitable.Count > 0)
                    {
                        pips_programmes matchedpips = suitable.First();
                        MakeMatch(ctx, item, matchedpips);
                        isMatchMade = true;
                        matchedpid  = matchedpips.pid;
                    }
                }

                if (matchedpid != null)
                {
                    thumbnails.ShowImage("http://node2.bbcimg.co.uk/iplayer/images/episode/" + matchedpid + "_314_176.jpg");
                }
                if (isMatchMade == false)
                {
                    progress.WriteLine("Failed to match {0} {1} {2}", item.r.programme_name, item.r.disk_reference, item.r.aired);
                }
            }
            MessageBox.Show("Finished matching unmatched items");
        }
Exemple #27
0
        private async void GetDataAsync(object sender, RoutedEventArgs e)
        {
            Progress progress = new Progress();

            progress.Show();
            Thumbnail thumbnail = new Thumbnail();

            thumbnail.Show();
            var       context = new ReduxEntities();
            Stopwatch watch   = new Stopwatch();

            watch.Start();
            do
            {
                watch.Restart();
                int firstID = 0;

                if (await TaskEx.Run <bool>(() => { return(context.genres.Count() > 0); }))
                {
                    firstID = (from g in context.genres
                               select g.pips_id).Max();
                    //firstID = await TaskEx.Run<int>(() =>
                    //{
                    //    return (from g in context.genres
                    //            select g.pips_id).Max();
                    //});
                }

                var pids = (from p in context.pips_programmes
                            where p.id > firstID
                            select new PidItem {
                    Pid = p.pid, Id = p.id
                }).Take(50).ToList();

                //var pids = await TaskEx.Run<List<PidItem>>(() =>
                //{
                //    return (from p in context.pips_programmes
                //            where p.id > firstID
                //            select new PidItem { Pid = p.pid, Id = p.id }).Take(50).ToList();
                //});
                if (pids.Count == 0)
                {
                    break;
                }

                //foreach (var pid in pids)
                //{
                //    thumbnail.ShowImage("http://node2.bbcimg.co.uk/iplayer/images/episode/" + pid.Pid + "_314_176.jpg");
                //}

                await TaskEx.WhenAll(from pid in pids select AddGenresAsync(pid.Pid, pid.Id, progress, thumbnail));

                //foreach (var pid in pids)
                //{
                //    AddGenresAsync(pid.Pid, pid.Id, progress);
                //    if (progress.IsCancelled)
                //    {
                //        break;
                //    }
                //}
            } while (progress.IsCancelled == false);
            progress.WriteLine("Fetching has been cancelled");
        }
Exemple #28
0
        private void FillIn()
        {
            Services services = new Services();
            DateTime date     = StartDate.Date;
            DateTime end      = EndDate.Date.AddDays(1);

            repository = new ReduxEntities();
            var data = repository;
            //var programmes = (from prog in data.PipsProgrammes
            //                  where prog.StartGmt >= date
            //                  && prog.StartGmt < end
            //                  && prog.ServiceId == ServiceId
            //                  select prog).ToList();

            //gapGrid.ItemsSource = programmes;

            List <pips_programmes> programmes = new List <pips_programmes>();

            allSchedule = new List <pips_programmes>();
            for (var sdate = date; sdate < end; sdate = sdate.AddDays(1))
            {
                foreach (var url in services.RegionalUrls(ServiceId, sdate))
                {
                    try
                    {
                        XElement schedule = XElement.Load(url);
                        var      items    = from element in schedule.Element("day").Element("broadcasts").Elements("broadcast")
                                            select new XElement("programme", new XAttribute("serviceid", ServiceId), element);
                        var progs = from element in items
                                    let broadcast = element.Element("broadcast")
                                                    let episode = broadcast.Elements("programme").First(e => e.Attribute("type").Value == "episode")
                                                                  select new pips_programmes()
                        {
                            service_id       = element.GetAttributeInt("serviceid"),
                            service_name     = services[element.GetAttributeInt("serviceid")].Name,
                            start_time       = broadcast.GetElementDate("start").ToLocalTime(),
                            end_time         = broadcast.GetElementDate("end").ToLocalTime(),
                            start_gmt        = broadcast.GetElementDate("start"),
                            end_gmt          = broadcast.GetElementDate("end"),
                            duration         = broadcast.GetElementInt("duration"),
                            programme_name   = episode.Element("title").Value,
                            display_title    = episode.Element("display_titles").Element("title").Value,
                            display_subtitle = episode.Element("display_titles").Element("subtitle").Value,
                            pid         = episode.Element("pid").Value,
                            description = episode.Element("short_synopsis").Value,
                            rawdata     = element.ToString()
                        };
                        allSchedule.AddRange(progs);
                        // filter any that are already there or overlap
                        progs = from prog in progs
                                where programmes.Any(c => c.start_gmt >= prog.start_gmt && c.start_gmt < prog.end_gmt) == false
                                select prog;
                        programmes.AddRange(progs);
                    }
                    catch (WebException)
                    {
                    }
                }
            }
            filteredSchedule = new List <pips_programmes>(programmes);
            programmes       = programmes.Distinct(new CompareProgrammes()).ToList();
            distinctSchedule = programmes;
            programmes       = programmes.Where(p => p.start_gmt >= date && p.start_gmt < end).ToList();
            DateTime prevday = date.AddDays(-1);
            var      current = (from prog in data.pips_programmes
                                where prog.start_gmt <end &&
                                                      prog.start_gmt> prevday &&
                                prog.end_gmt > date &&
                                prog.service_id == ServiceId
                                select prog).ToList();

            currentSchedule = current;
            programmes      = (from prog in programmes
                               where current.Any(c => !(c.end_gmt <= prog.start_gmt || c.start_gmt > prog.end_gmt)) == false
                               select prog).ToList();
            var gridprog = (from prog in programmes
                            select new
            {
                New = true,
                DisplayTitle = prog.display_title,
                Description = prog.description,
                StartGmt = prog.start_gmt,
                EndGmt = prog.end_gmt,
                ServiceName = prog.service_name
            }).Union(from prog in current
                     select new
            {
                New          = false,
                DisplayTitle = prog.display_title,
                Description  = prog.description,
                StartGmt     = prog.start_gmt,
                EndGmt       = prog.end_gmt,
                ServiceName  = prog.service_name
            }).OrderBy(x => x.StartGmt).ToList();

            gapGrid.ItemsSource = gridprog;
            programmesToSave    = programmes;
        }
Exemple #29
0
        public async Task GetDayScheduleAsync(DateTime date, IProgress progress, IThumbnail thumbnail)
        {
            if (progress.IsCancelled)
            {
                return;
            }

            var      reduxItems = new ReduxEntities();
            Services services   = new Services();
            DateTime dayStart   = date.Date;
            DateTime dayEnd     = dayStart.AddDays(1);
            //if (reduxItems.Scanned.Any(p => p.DateScanned == dayStart) == false)
            //{
            List <XElement> programmeElements = new List <XElement>();
            //var dayItems = from item in reduxItems.Items
            //               where item.Aired >= dayStart && item.Aired < dayEnd
            //               select item;
            var sids = services.Select(s => s.Id).ToArray();

            var tasks = (from srv in sids
                         select LoadXmlAsync(services.ProgrammesUrl(srv, dayStart))).ToArray();

            var pages = await TaskEx.WhenAll(tasks);

            for (int i = 0; i < sids.Length; i++)
            {
                var      sid      = sids[i];
                string   url      = services.ProgrammesUrl(sid, dayStart);
                XElement schedule = pages[i];
                var      items    = from element in schedule.Element("day").Element("broadcasts").Elements("broadcast")
                                    select new XElement("programme", new XAttribute("serviceid", sid), element);
                XElement previous = null;
                //foreach (var item in items)
                //{
                //    if (previous != null)
                //    {
                //        var st = previous.Element("broadcast").GetElementDate("end");
                //        var en = item.Element("broadcast").GetElementDate("start");
                //        if (st < en)
                //        {
                //            if ((sid == 1 || sid == 6) && en.Hour == 19 && en.Minute == 0)
                //            {
                //            }
                //            else
                //            {

                //            }
                //        }
                //    }
                //    previous = item;
                //}
                programmeElements.AddRange(items);
            }

            var programmes = from element in programmeElements
                             let broadcast = element.Element("broadcast")
                                             let episode = broadcast.Elements("programme").First(e => e.Attribute("type").Value == "episode")
                                                           select new pips_programmes()
            {
                service_id       = element.GetAttributeInt("serviceid"),
                service_name     = services[element.GetAttributeInt("serviceid")].Name,
                start_time       = broadcast.GetElementDate("start").ToLocalTime(),
                end_time         = broadcast.GetElementDate("end").ToLocalTime(),
                start_gmt        = broadcast.GetElementDate("start"),
                end_gmt          = broadcast.GetElementDate("end"),
                duration         = broadcast.GetElementInt("duration"),
                programme_name   = episode.Element("title").Value,
                display_title    = episode.Element("display_titles").Element("title").Value,
                display_subtitle = episode.Element("display_titles").Element("subtitle").Value,
                pid         = episode.Element("pid").Value,
                description = episode.Element("short_synopsis").Value
            };

            DateTime timerstart = DateTime.Now;
            var      start_pad  = dayStart.AddDays(-1);
            var      end_pad    = dayEnd.AddDays(1);
            var      already    = (from p in reduxItems.pips_programmes
                                   where p.start_time >= start_pad && p.start_time < end_pad
                                   orderby p.start_gmt
                                   select p).ToList();

            List <pips_programmes> newProgrammes = new List <pips_programmes>();

            List <Task> pendingTasks = new List <Task>();

            foreach (var prog in programmes)
            {
                if (progress.IsCancelled)
                {
                    break;
                }
                if (already.Any(p => p.service_id == prog.service_id && p.start_gmt == prog.start_gmt) == false)
                {
                    reduxItems.pips_programmes.AddObject(prog);
                    reduxItems.SaveChanges();
                    newProgrammes.Add(prog);
                    progress.WriteLine("Updating {0} on {1}", prog.display_title, prog.start_gmt);
                    pendingTasks.Add(AddGenresAsync(prog.pid, prog.id, progress, thumbnail));
                    if (pendingTasks.Count >= 12)
                    {
                        await TaskEx.WhenAll(pendingTasks);

                        pendingTasks.Clear();
                    }
                }
            }
            if (pendingTasks.Count > 0)
            {
                await TaskEx.WhenAll(pendingTasks);
            }
            //reduxItems.Scanned.Add(new Scanned() { DateScanned = dayStart });

            //}
        }
Exemple #30
0
        private async Task FetchItemGenreAndIonAsync(scan_pips_contributors item, Thumbnail thumbnail, IProgress progress, bool isTags, bool isIonContributors, bool isCategories)
        {
            if (progress.IsCancelled)
            {
                return;
            }
            thumbnail.ShowImage("http://node2.bbcimg.co.uk/iplayer/images/episode/" + item.pid + "_314_176.jpg");

            try
            {
                if (isTags || isIonContributors)
                {
                    WebClient client = new WebClient();
                    string    result = await client.DownloadStringTaskAsync("http://www.bbc.co.uk/iplayer/ion/episodedetail/episode/" + item.pid + "/format/xml");

                    XElement   episode = XElement.Parse(result);
                    XNamespace ion     = "http://bbc.co.uk/2008/iplayer/ion";
                    if (isIonContributors)
                    {
                        await TaskEx.Run(() =>
                        {
                            var contributors = episode.Elements(ion + "blocklist")
                                               .Elements(ion + "episode_detail")
                                               .Elements(ion + "contributors")
                                               .Elements(ion + "contributor");
                            var data = new ReduxEntities();
                            foreach (var contributor in contributors)
                            {
                                var ct = new contributor
                                {
                                    character_name = contributor.Element(ion + "character_name").Value,
                                    family_name    = contributor.Element(ion + "family_name").Value,
                                    given_name     = contributor.Element(ion + "given_name").Value,
                                    role           = contributor.Element(ion + "role").Value,
                                    role_name      = contributor.Element(ion + "role_name").Value,
                                    type           = contributor.Element(ion + "type").Value,
                                    contributor_id = Convert.ToInt32(contributor.Element(ion + "id").Value),
                                    pid            = item.pid
                                };
                                data.AddObject("contributors", ct);
                            }
                            data.SaveChanges();
                        });
                    }
                    if (isTags)
                    {
                        await TaskEx.Run(() =>
                        {
                            var tags = episode.Elements(ion + "blocklist")
                                       .Elements(ion + "episode_detail")
                                       .Elements(ion + "tag_schemes")
                                       .Elements(ion + "tag_scheme")
                                       .Elements(ion + "tags")
                                       .Elements(ion + "tag");
                            var data = new ReduxEntities();
                            foreach (var tag in tags)
                            {
                                var tg = new tag
                                {
                                    tag_id = tag.Element(ion + "id").Value,
                                    name   = tag.Element(ion + "name").Value,
                                    value  = tag.Element(ion + "value").Value,
                                    pid    = item.pid
                                };
                                data.AddObject("tags", tg);
                            }
                            data.SaveChanges();
                        });
                    }
                }
                if (isCategories)
                {
                    WebClient catClient = new WebClient();
                    var       catresult = await catClient.DownloadStringTaskAsync("http://www.bbc.co.uk/programmes/" + item.pid + ".xml");

                    var root = XElement.Parse(catresult);

                    await TaskEx.Run(() =>
                    {
                        var cats = from cat in root.XPathSelectElements("categories/category[@type != 'genre']")
                                   select new category()
                        {
                            pid    = item.pid,
                            type   = cat.Attribute("type").Value,
                            catkey = cat.Attribute("key").Value,
                            title  = cat.Element("title").Value
                        };
                        var db = new ReduxEntities();
                        foreach (var c in cats)
                        {
                            db.AddObject("categories", c);
                        }
                        db.SaveChanges();
                    });
                }
                item.scanned = true;
            }
            catch (WebException wex)
            {
                MessageBox.Show("Can't find programme " + item.pid);
                //throw new Exception("Couldn't find programme " + item.pid, wex);
            }
        }