Esempio n. 1
0
        public TvShowMeta LoadShowMeta(TvdbLib.TvdbHandler tvdbHandler)
        {
            if (this.TvShow == null)
            {
                FileInfo fileInfo = new FileInfo(this.Filename);
                string   showPath = fileInfo.Directory.FullName;
                // get directory of show.
                if (Regex.IsMatch(fileInfo.Directory.Name, "(Season|Series|Specials)", RegexOptions.IgnoreCase))
                {
                    showPath = fileInfo.Directory.Parent.FullName;
                }

                this.TvShow = TvShowMeta.Load(tvdbHandler, this.ShowTitle, Path.Combine(showPath, "tvshow.nfo"));
            }
            return(this.TvShow);
        }
Esempio n. 2
0
        public void InitializeShow(iMetaLibrary.Metadata.TvShowMeta TvShowMeta, iMetaLibrary.Metadata.TvFileMeta[] Episodes)
        {
            /*
            var enumerator = store.GetEnumerator();
            while(enumerator.MoveNext())
            {
                ((GuiComponents.TvEpisodeNodeItem)enumerator.Current).Meta.MetaUpdated -= MetaUpdated;
            }
            */
            /*
            store.Foreach(delegate(TreeModel modelOuter, TreePath pathOuter, TreeIter iterOuter)
                         {
                            TreeIter childIter;
                            modelOuter.IterChildren(out childIter);
                            modelOuter.Foreach(delegate(TreeModel model, TreePath path, TreeIter iter)
                            {
                                GuiComponents.TvEpisodeNodeItem node = model.GetValue(iter, 0) as GuiComponents.TvEpisodeNodeItem;
                                if(node != null)
                                    node.Meta.MetaUpdated -= MetaUpdated;
                                return true;
                            });
                            return true;
                         });
                         */
            store.Clear();
            string showtitle = TvShowMeta == null ? Episodes[0].ShowTitle : TvShowMeta.Title;
            this.TvShowMeta = TvShowMeta;
            this.Episodes = Episodes;
            //lblShowName.Markup = "<span font=\"18\" weight=\"bold\">{0}</span> <span size=\"small\"> [{1} Episode{2}]</span>".FormatStr(showtitle.HtmlEncode(), Episodes.Length, Episodes.Length == 1 ? "" : "s");

            if(Poster != null)
            {
                Poster.Dispose();
                Poster = null;
            }

            System.Drawing.Image poster = Episodes[0].GetPoster();
            if(poster != null)
            {
                Poster = GuiHelper.ImageToPixbufIcon(poster, 230, 320);
                poster.Dispose();
                poster = null;
            }
            SortedList<int, List<iMetaLibrary.Metadata.TvFileMeta>> seasons = new SortedList<int, List<iMetaLibrary.Metadata.TvFileMeta>>();
            foreach(iMetaLibrary.Metadata.TvFileMeta file in Episodes)
            {
                if(!seasons.ContainsKey(file.Season))
                    seasons.Add(file.Season, new List<iMetaLibrary.Metadata.TvFileMeta>());
                seasons[file.Season].Add(file);
            }
            foreach(int season in seasons.Keys)
            {
                var iter = store.AppendValues(new KeyNode(season == 0 ? "Specials" : "Season {0}".FormatStr(season)));
                foreach(iMetaLibrary.Metadata.TvFileMeta meta in seasons[season])
                {
                    store.AppendValues(iter, new GuiComponents.TvEpisodeNodeItem(meta));
                    meta.MetaUpdated += MetaUpdated;
                }
            }
            treeview.ExpandAll();
            //txtShowInfoTvdbId.Buffer.Text = TvShowMeta == null ? "" : TvShowMeta.Id.ToString();
            //txtShowInfoRuntime.Buffer.Text = TvShowMeta == null ? "" : TvShowMeta.Runtime.ToString();
            txtTitle.Text = showtitle;
            txtMpaa.Text = TvShowMeta == null ? "" : TvShowMeta.Mpaa;
            txtPremiered.Text = TvShowMeta == null ? "" : TvShowMeta.Premiered;
            txtStudio.Text = TvShowMeta == null ? "" : TvShowMeta.Studio;
            txtGenres.Text = TvShowMeta == null ? "" : String.Join(", ", TvShowMeta.Genres);
            txtPlot.Buffer.Text = TvShowMeta == null ? "" : TvShowMeta.Plot;
            switch(TvShowMeta == null ? "" : TvShowMeta.Status)
            {
                // Continuing - Series currently still in production this is generally the status that should be set during the initial run of a season
                case "Continuing": cboStatus.Active = 0; break;
                // Ended - For a series which has finished it's run and is not producing any new episodes.
                case "Ended ": cboStatus.Active = 1; break;
                // On Hiatus - For series where the current season has ended and it's return status is unknown.
                case "On Hiatus": cboStatus.Active = 2; break;
                // Other - Not commonly used, potentially for series that are in production and have yet to air at all.
                default: cboStatus.Active = 3; break;
            }
            this.QueueDraw();
        }
Esempio n. 3
0
        public static TvShowMeta Load(TvdbLib.TvdbHandler tvdbHandler, string ShowName, string NfoFile)
        {
            try
            {
                TvShowMeta meta = new TvShowMeta(new FileInfo(NfoFile).Directory.FullName);
                if (!File.Exists(NfoFile))
                {
                    if (tvdbHandler == null)
                    {
                        return(null);
                    }
                    // try download it
                    List <TvdbLib.Data.TvdbSearchResult> results = tvdbHandler.SearchSeries(ShowName);
                    if (results == null || results.Count == 0)
                    {
                        Trace.WriteLine(String.Format("Unable to find show '{0}'", ShowName));
                        return(null);
                    }
                    TvdbLib.Data.TvdbSearchResult showMatch = null;
                    foreach (TvdbLib.Data.TvdbSearchResult result in results)
                    {
                        if (showMatch == null || Regex.Replace(result.SeriesName, "[^a-zA-Z0-9]", "").ToLower() == Regex.Replace(ShowName, "[^a-zA-Z0-9]", "").ToLower())
                        {
                            showMatch = result;
                        }
                    }
                    if (showMatch == null)
                    {
                        return(null);
                    }
                    TvdbLib.Data.TvdbSeries series = tvdbHandler.GetSeries(showMatch.Id, TvdbLib.Data.TvdbLanguage.DefaultLanguage, false, true, true);
                    // save the nfo
                    meta.Id           = series.Id;
                    meta.Title        = series.SeriesName;
                    meta.Plot         = series.Overview;
                    meta.Premiered    = series.FirstAired.ToString("yyyy-MM-dd");
                    meta.Rating       = (float)series.Rating;
                    meta.Status       = series.Status;
                    meta.Genres       = series.Genre.ToArray();
                    meta.Year         = series.FirstAired.Year;
                    meta.Mpaa         = series.ContentRating;
                    meta.Studio       = series.Network;
                    meta.Runtime      = (int)series.Runtime;
                    meta.EpisodeGuide = String.Format("http://www.thetvdb.com/api/{0}/series/{1}/all/en.zip", Settings.TvdbApiKey, series.Id);
                    meta.Actors       = (from a in series.TvdbActors select new KeyValuePair <string, string>(a.Name, a.Role)).ToArray();
                    meta.Thumb        = (from t in series.SeriesBanners orderby t.Rating descending, t.RatingCount descending select String.Format("http://thetvdb.com/banners/{0}", t.BannerPath)).ToArray();

                    foreach (int season in (from t in series.SeasonBanners orderby t.Season select t.Season).Distinct())
                    {
                        meta.SeasonBanners.Add(season, (from t in series.SeasonBanners orderby t.Rating descending, t.RatingCount descending where t.Season == season select String.Format("http://thetvdb.com/banners/{0}", t.BannerPath)).ToArray());
                    }
                    meta.FanArt = (from f in series.FanartBanners
                                   orderby f.Rating descending, f.RatingCount descending
                                   select new FanArtImage()
                    {
                        Colors = String.Format("|{0},{1},{2}|{3},{4},{5}|{6},{7},{8}|", f.Color1.R, f.Color1.G, f.Color1.B, f.Color2.R, f.Color2.G, f.Color2.B, f.Color3.R, f.Color3.G, f.Color3.B),
                        Dimensions = String.Format("{0}x{1}", f.Resolution.X, f.Resolution.Y),
                        Url = f.BannerPath,
                        PreviewUrl = f.ThumbPath
                    }).ToArray();

                    meta.PosterUrl = (from p in series.PosterBanners orderby p.Resolution.X descending, p.Resolution.Y descending, p.Rating descending, p.RatingCount descending select String.Format("http://thetvdb.com/banners/{0}", p.BannerPath)).FirstOrDefault();
                    meta.BannerUrl = (from b in series.SeriesBanners orderby(b.BannerType == TvdbLib.Data.Banner.TvdbSeriesBanner.Type.graphical ? 0 : 1), b.Rating descending, b.RatingCount descending select String.Format("http://thetvdb.com/banners/{0}", b.BannerPath)).FirstOrDefault();
                    meta.FanArtUrl = (from b in series.FanartBanners orderby b.Resolution.Y descending, b.Resolution.X descending, b.Rating descending, b.RatingCount descending select String.Format("http://thetvdb.com/banners/{0}", b.BannerPath)).FirstOrDefault();
                    foreach (int season in (from b in series.SeasonBanners where b.BannerType == TvdbLib.Data.Banner.TvdbSeasonBanner.Type.season select b.Season).Distinct())
                    {
                        meta.SeasonPosters[season] = (from b in series.SeasonBanners where b.Season == season && b.BannerType == TvdbLib.Data.Banner.TvdbSeasonBanner.Type.season orderby b.Rating descending, b.RatingCount descending select String.Format("http://thetvdb.com/banners/{0}", b.BannerPath)).FirstOrDefault();
                    }
                    // get the all seasons season poster
                    meta.SeasonPosters[-1] = (from b in series.PosterBanners orderby b.Rating descending, b.RatingCount descending select String.Format("http://thetvdb.com/banners/{0}", b.BannerPath)).FirstOrDefault();

                    // get the clearart
                    try
                    {
                        XDocument xmlClearArt = XDocument.Load("http://fanart.tv/api/fanart.php?id=" + series.Id);
                        if (xmlClearArt.Element("fanart").Element("clearlogos") != null && xmlClearArt.Element("fanart").Element("clearlogos").Element("clearlogo") != null)
                        {
                            meta.ClearLogoUrl = xmlClearArt.Element("fanart").Element("clearlogos").Element("clearlogo").Attribute("url").Value;
                        }
                        if (xmlClearArt.Element("fanart").Element("cleararts") != null && xmlClearArt.Element("fanart").Element("cleararts").Element("clearart") != null)
                        {
                            meta.ClearArtUrl = xmlClearArt.Element("fanart").Element("cleararts").Element("clearart").Attribute("url").Value;
                        }
                    }
                    catch (Exception) { }

                    // get the tv tune
                    try
                    {
                        string tvTunePage = WebHelper.GetWebResponse(String.Format("http://www.televisiontunes.com/search.php?searWords={0}&search=", meta.Title));
                        string content    = Regex.Match(tvTunePage, "(?<=(<h1>Search</h1>))(.*?)(?=((<a href=\"search)|(</td>)))", RegexOptions.IgnoreCase | RegexOptions.Singleline).Value;
                        Dictionary <string, string> matches = new Dictionary <string, string>();
                        foreach (Match match in Regex.Matches(content, @"(?<=([\d]+\.&nbsp;))(.*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Singleline))
                        {
                            string name = Regex.Match(match.Value, @"(?<=(>))[^<]+").Value;
                            string url  = Regex.Match(match.Value, @"(?<=(href=""))[^""]+").Value;
                            matches.Add(url, name);
                        }
                        string themeUrlPage = null;
                        foreach (string url in matches.Keys)
                        {
                            if (Regex.Replace(meta.Title, "[^0-9a-zA-Z]", "").ToLower() == Regex.Replace(matches[url], "[^0-9a-zA-Z]", "").ToLower())
                            {
                                Trace.WriteLine("Found theme song: " + url);

                                themeUrlPage = url;
                                break;
                            }
                            else if (matches[url].IndexOf(" - ") > 0 && Regex.Replace(meta.Title, "[^0-9a-zA-Z]", "").ToLower() == Regex.Replace(matches[url].Substring(0, matches[url].IndexOf(" - ")), "[^0-9a-zA-Z]", "").ToLower()) // look for a close match, eg "Come fly with Me - Openning"
                            {
                                Trace.WriteLine("Found close theme song: " + url);

                                themeUrlPage = url;
                            }
                        }

                        if (!String.IsNullOrEmpty(themeUrlPage))
                        {
                            string themeSongPage = WebHelper.GetWebResponse(themeUrlPage);
                            Match  themeUrlMatch = Regex.Match(themeSongPage, "/themesongs/(.*?).mp3", RegexOptions.IgnoreCase);
                            if (themeUrlMatch.Success)
                            {
                                meta.TvTuneUrl = "http://www.televisiontunes.com" + themeUrlMatch.Value;
                            }
                        }
                    }
                    catch (Exception) { }

                    meta.Save(new FileInfo(NfoFile).Directory.FullName);
                    return(meta);
                }

                XElement root = XDocument.Load(NfoFile).Element("tvshow");
                int      id   = 0;
                if (int.TryParse(root.Element("id") != null ? root.Element("id").Value : "0", out id))
                {
                    meta.Id = id;
                }
                meta.Title = root.Element("title") != null?root.Element("title").Value : "";

                meta.Tagline = root.Element("tagline") != null?root.Element("tagline").Value : "";

                meta.Outline = root.Element("outline") != null?root.Element("outline").Value : "";

                meta.Plot = root.Element("plot") != null?root.Element("plot").Value : "";

                meta.Premiered = root.Element("premiered") != null?root.Element("premiered").Value : "";

                meta.Mpaa = root.Element("mpaa") != null?root.Element("mpaa").Value : "";

                float rating = 0;
                if (float.TryParse(root.Element("rating") != null ? root.Element("rating").Value : "0", out rating))
                {
                    meta.Rating = rating;
                }
                meta.Status = root.Element("status") != null?root.Element("status").Value : "";

                meta.Studio = root.Element("studio") != null?root.Element("studio").Value : "";

                int year = 0;
                if (int.TryParse(root.Element("year") != null ? root.Element("year").Value : "0", out year))
                {
                    meta.Year = year;
                }
                meta.Genres = (from g in root.Elements("genre") select g.Value).ToArray();
                if (root.Element("episodeguide") != null && root.Element("episodeguide").Element("url") != null)
                {
                    meta.EpisodeGuide = root.Element("episodeguide").Element("url").Value;
                }

                return(meta);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
                return(null);
            }
        }
Esempio n. 4
0
        public void InitializeShow(iMetaLibrary.Metadata.TvShowMeta TvShowMeta, iMetaLibrary.Metadata.TvFileMeta[] Episodes)
        {
            /*
             * var enumerator = store.GetEnumerator();
             * while(enumerator.MoveNext())
             * {
             *      ((GuiComponents.TvEpisodeNodeItem)enumerator.Current).Meta.MetaUpdated -= MetaUpdated;
             * }
             */
            /*
             * store.Foreach(delegate(TreeModel modelOuter, TreePath pathOuter, TreeIter iterOuter)
             *           {
             *                              TreeIter childIter;
             *                              modelOuter.IterChildren(out childIter);
             *                              modelOuter.Foreach(delegate(TreeModel model, TreePath path, TreeIter iter)
             *                  {
             *                                      GuiComponents.TvEpisodeNodeItem node = model.GetValue(iter, 0) as GuiComponents.TvEpisodeNodeItem;
             *                                      if(node != null)
             *                                              node.Meta.MetaUpdated -= MetaUpdated;
             *                                      return true;
             *                              });
             *                              return true;
             *                       });
             */
            store.Clear();
            string showtitle = TvShowMeta == null ? Episodes[0].ShowTitle : TvShowMeta.Title;

            this.TvShowMeta = TvShowMeta;
            this.Episodes   = Episodes;
            //lblShowName.Markup = "<span font=\"18\" weight=\"bold\">{0}</span> <span size=\"small\"> [{1} Episode{2}]</span>".FormatStr(showtitle.HtmlEncode(), Episodes.Length, Episodes.Length == 1 ? "" : "s");

            if (Poster != null)
            {
                Poster.Dispose();
                Poster = null;
            }

            System.Drawing.Image poster = Episodes[0].GetPoster();
            if (poster != null)
            {
                Poster = GuiHelper.ImageToPixbufIcon(poster, 230, 320);
                poster.Dispose();
                poster = null;
            }
            SortedList <int, List <iMetaLibrary.Metadata.TvFileMeta> > seasons = new SortedList <int, List <iMetaLibrary.Metadata.TvFileMeta> >();

            foreach (iMetaLibrary.Metadata.TvFileMeta file in Episodes)
            {
                if (!seasons.ContainsKey(file.Season))
                {
                    seasons.Add(file.Season, new List <iMetaLibrary.Metadata.TvFileMeta>());
                }
                seasons[file.Season].Add(file);
            }
            foreach (int season in seasons.Keys)
            {
                var iter = store.AppendValues(new KeyNode(season == 0 ? "Specials" : "Season {0}".FormatStr(season)));
                foreach (iMetaLibrary.Metadata.TvFileMeta meta in seasons[season])
                {
                    store.AppendValues(iter, new GuiComponents.TvEpisodeNodeItem(meta));
                    meta.MetaUpdated += MetaUpdated;
                }
            }
            treeview.ExpandAll();
            //txtShowInfoTvdbId.Buffer.Text = TvShowMeta == null ? "" : TvShowMeta.Id.ToString();
            //txtShowInfoRuntime.Buffer.Text = TvShowMeta == null ? "" : TvShowMeta.Runtime.ToString();
            txtTitle.Text       = showtitle;
            txtMpaa.Text        = TvShowMeta == null ? "" : TvShowMeta.Mpaa;
            txtPremiered.Text   = TvShowMeta == null ? "" : TvShowMeta.Premiered;
            txtStudio.Text      = TvShowMeta == null ? "" : TvShowMeta.Studio;
            txtGenres.Text      = TvShowMeta == null ? "" : String.Join(", ", TvShowMeta.Genres);
            txtPlot.Buffer.Text = TvShowMeta == null ? "" : TvShowMeta.Plot;
            switch (TvShowMeta == null ? "" : TvShowMeta.Status)
            {
            // Continuing - Series currently still in production this is generally the status that should be set during the initial run of a season
            case "Continuing": cboStatus.Active = 0; break;

            // Ended - For a series which has finished it's run and is not producing any new episodes.
            case "Ended ": cboStatus.Active = 1; break;

            // On Hiatus - For series where the current season has ended and it's return status is unknown.
            case "On Hiatus": cboStatus.Active = 2; break;

            // Other - Not commonly used, potentially for series that are in production and have yet to air at all.
            default: cboStatus.Active = 3; break;
            }
            this.QueueDraw();
        }