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); }
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(); }
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]+\. ))(.*?)</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); } }
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(); }