protected override void Scan_Executing(object oFolders = null) { TriggerStatusUpdated("Searching for TV Episodes..."); string[] Folders = oFolders as string[]; if (Folders == null) { Folders = Settings.TvFolders; } string[] extensions = Settings.VideoExtensions; #region get files List <Meta> newItems = new List <Meta>(); // tv shows must be in the format: [Show]\[Season \d]\[Episodes] Regex rgxTvShow = new Regex(Settings.TvRegularExpression, RegexOptions.IgnoreCase); foreach (string folder in Folders) { try { List <string> knownFiles = new List <string>(); foreach (List <Metadata.TvFileMeta> eplist in Shows.Values) { knownFiles.AddRange(from ep in eplist select ep.Filename.ToLower()); } string[] files = System.IO.Directory.GetFiles(folder, "*", System.IO.SearchOption.AllDirectories); foreach (string file in files) { if (this.Items.ContainsKey(file.ToLower()) || knownFiles.Contains(file.ToLower())) { continue; } string ext = file.Substring(file.LastIndexOf(".") + 1).ToLower(); if (!extensions.Contains(ext)) { continue; } FileInfo fileInfo = new FileInfo(file); // incase the year is in the file remove it, as the year can be picked up as the season and ep number string strRgxfiletest = Regex.Replace(file, @"([\d]{4}\-[\d]{2}\-[\d]{2})|(720p)|(1080p)|(480p)", ""); if (!rgxTvShow.IsMatch(strRgxfiletest)) { continue; } Metadata.TvFileMeta meta = new Metadata.TvFileMeta(file); newItems.Add(meta); AddItem(meta); if (!Shows.ContainsKey(meta.ShowTitle)) { Shows.Add(meta.ShowTitle, new List <TvFileMeta>()); } Shows[meta.ShowTitle].Add(meta); } } catch (Exception ex) { Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } } #endregion foreach (string key in Shows.Keys) { Shows[key].Sort(delegate(Metadata.TvFileMeta a, Metadata.TvFileMeta b) { if (a == null && b == null) { return(0); } else if (a == null) { return(1); } else if (b == null) { return(-1); } if (a.Season != b.Season) { return(a.Season.CompareTo(b.Season)); } return(a.EpisodeNumbers[0].CompareTo(b.EpisodeNumbers[0])); }); } TriggerAllItemsFound(newItems.ToArray()); #region constructor TheTvdb Handler string cacheDirectory = Path.Combine(Settings.CachePath, "TheTvDb"); if (!Directory.Exists(cacheDirectory)) { Directory.CreateDirectory(cacheDirectory); } TvdbLib.Cache.ICacheProvider cacheProvider = new TvdbLib.Cache.XmlCacheProvider(cacheDirectory); TvdbLib.TvdbHandler tvdbHandler = new TvdbLib.TvdbHandler(cacheProvider, Settings.TvdbApiKey); #endregion foreach (Metadata.TvFileMeta meta in newItems.OrderBy(x => ((TvFileMeta)x).ExistingNfoFile ? 1 : 0)) { TriggerScanningItem(meta); int result = meta.Load(); TriggerUpdated(meta, result); } TriggerCompleted(); }
private bool LoadFromTheTvDb() { FileInfo fileInfo = new FileInfo(Filename); #region constructor TheTvdb Handler string cacheDirectory = Path.Combine(Settings.CachePath, "TheTvDb"); if (!Directory.Exists(cacheDirectory)) Directory.CreateDirectory(cacheDirectory); TvdbLib.Cache.ICacheProvider cacheProvider = new TvdbLib.Cache.XmlCacheProvider(cacheDirectory); TvdbLib.TvdbHandler tvdbHandler = new TvdbLib.TvdbHandler(cacheProvider, Settings.TvdbApiKey); #endregion LoadShowMeta(tvdbHandler); if (this.TvShow == null) { Trace.WriteLine(String.Format("Failed to find tv show '{0}' for file: {1}", this.ShowTitle, this.Filename)); return false; } TvdbLib.Data.TvdbEpisode.EpisodeOrdering ordering = TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DefaultOrder; if (this.Filename.ToUpper().Contains("[DVD]") && this.Season > 0) // specials dont use dvd order... i think... ordering = TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DvdOrder; int epbookmark = 0; int episodeLength = 0; if(this.FileInfo != null && this.FileInfo.Video != null) episodeLength = this.FileInfo.Video.DurationInSeconds / this.EpisodeNumbers.Length; if(this.Episodes== null || this.Episodes.Length != this.EpisodeNumbers.Length) this.Episodes = new TvEpisodeMeta[this.EpisodeNumbers.Length]; int index = 0; foreach (int epNumber in this.EpisodeNumbers) { TvdbLib.Data.TvdbEpisode tvdbEpisode = null; try { tvdbEpisode = tvdbHandler.GetEpisode(this.TvShow.Id, this.Season, epNumber, ordering, TvdbLib.Data.TvdbLanguage.DefaultLanguage); } catch (Exception) { if(ordering == TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DvdOrder) // fail back to default ordering, incase there is no dvd ordering available (eg Sliders Season 3) tvdbEpisode = tvdbHandler.GetEpisode(this.TvShow.Id, this.Season, epNumber, TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DefaultOrder, TvdbLib.Data.TvdbLanguage.DefaultLanguage); } if (tvdbEpisode == null) continue; if(this.Episodes[index] == null) this.Episodes[index] = new TvEpisodeMeta(this.Filename); TvEpisodeMeta meta = this.Episodes[index]; meta.TvdbId = tvdbEpisode.Id; meta.TvdbSeriesId = tvdbEpisode.SeriesId; meta.Actors = (from gs in tvdbEpisode.GuestStars select new KeyValuePair<string, string>(gs, null)).ToArray(); meta.Aired = tvdbEpisode.FirstAired; meta.Directors = tvdbEpisode.Directors.ToArray(); meta.DisplayEpisode = tvdbEpisode.AirsBeforeEpisode >= 0 ? tvdbEpisode.AirsBeforeEpisode : -1; meta.DisplaySeason = tvdbEpisode.AirsBeforeSeason >= 0 ? tvdbEpisode.AirsBeforeSeason : -1; meta.Episode = tvdbEpisode.EpisodeNumber; meta.Season = tvdbEpisode.SeasonNumber; meta.Plot = tvdbEpisode.Overview; meta.Premiered = tvdbEpisode.FirstAired; meta.Rating = (float)tvdbEpisode.Rating; meta.ShowTitle = this.TvShow.Title; meta.Mpaa = this.TvShow.Mpaa; meta.Studio = this.TvShow.Studio; meta.EpBookmark = epbookmark; if (!String.IsNullOrEmpty(tvdbEpisode.BannerPath)) meta.Thumb = "http://thetvdb.com/banners/" + tvdbEpisode.BannerPath; meta.Title = tvdbEpisode.EpisodeName; meta.Writers = tvdbEpisode.Writer.ToArray(); epbookmark += episodeLength; // not perfect, but good starting point. if (ordering == TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DvdOrder) { meta.Episode = (int)tvdbEpisode.DvdEpisodeNumber; meta.Season = tvdbEpisode.DvdSeason; } index++; } return true; }
private bool LoadFromTheTvDb() { FileInfo fileInfo = new FileInfo(Filename); #region constructor TheTvdb Handler string cacheDirectory = Path.Combine(Settings.CachePath, "TheTvDb"); if (!Directory.Exists(cacheDirectory)) { Directory.CreateDirectory(cacheDirectory); } TvdbLib.Cache.ICacheProvider cacheProvider = new TvdbLib.Cache.XmlCacheProvider(cacheDirectory); TvdbLib.TvdbHandler tvdbHandler = new TvdbLib.TvdbHandler(cacheProvider, Settings.TvdbApiKey); #endregion LoadShowMeta(tvdbHandler); if (this.TvShow == null) { Trace.WriteLine(String.Format("Failed to find tv show '{0}' for file: {1}", this.ShowTitle, this.Filename)); return(false); } TvdbLib.Data.TvdbEpisode.EpisodeOrdering ordering = TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DefaultOrder; if (this.Filename.ToUpper().Contains("[DVD]") && this.Season > 0) // specials dont use dvd order... i think... { ordering = TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DvdOrder; } int epbookmark = 0; int episodeLength = 0; if (this.FileInfo != null && this.FileInfo.Video != null) { episodeLength = this.FileInfo.Video.DurationInSeconds / this.EpisodeNumbers.Length; } if (this.Episodes == null || this.Episodes.Length != this.EpisodeNumbers.Length) { this.Episodes = new TvEpisodeMeta[this.EpisodeNumbers.Length]; } int index = 0; foreach (int epNumber in this.EpisodeNumbers) { TvdbLib.Data.TvdbEpisode tvdbEpisode = null; try { tvdbEpisode = tvdbHandler.GetEpisode(this.TvShow.Id, this.Season, epNumber, ordering, TvdbLib.Data.TvdbLanguage.DefaultLanguage); } catch (Exception) { if (ordering == TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DvdOrder) // fail back to default ordering, incase there is no dvd ordering available (eg Sliders Season 3) { tvdbEpisode = tvdbHandler.GetEpisode(this.TvShow.Id, this.Season, epNumber, TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DefaultOrder, TvdbLib.Data.TvdbLanguage.DefaultLanguage); } } if (tvdbEpisode == null) { continue; } if (this.Episodes[index] == null) { this.Episodes[index] = new TvEpisodeMeta(this.Filename); } TvEpisodeMeta meta = this.Episodes[index]; meta.TvdbId = tvdbEpisode.Id; meta.TvdbSeriesId = tvdbEpisode.SeriesId; meta.Actors = (from gs in tvdbEpisode.GuestStars select new KeyValuePair <string, string>(gs, null)).ToArray(); meta.Aired = tvdbEpisode.FirstAired; meta.Directors = tvdbEpisode.Directors.ToArray(); meta.DisplayEpisode = tvdbEpisode.AirsBeforeEpisode >= 0 ? tvdbEpisode.AirsBeforeEpisode : -1; meta.DisplaySeason = tvdbEpisode.AirsBeforeSeason >= 0 ? tvdbEpisode.AirsBeforeSeason : -1; meta.Episode = tvdbEpisode.EpisodeNumber; meta.Season = tvdbEpisode.SeasonNumber; meta.Plot = tvdbEpisode.Overview; meta.Premiered = tvdbEpisode.FirstAired; meta.Rating = (float)tvdbEpisode.Rating; meta.ShowTitle = this.TvShow.Title; meta.Mpaa = this.TvShow.Mpaa; meta.Studio = this.TvShow.Studio; meta.EpBookmark = epbookmark; if (!String.IsNullOrEmpty(tvdbEpisode.BannerPath)) { meta.Thumb = "http://thetvdb.com/banners/" + tvdbEpisode.BannerPath; } meta.Title = tvdbEpisode.EpisodeName; meta.Writers = tvdbEpisode.Writer.ToArray(); epbookmark += episodeLength; // not perfect, but good starting point. if (ordering == TvdbLib.Data.TvdbEpisode.EpisodeOrdering.DvdOrder) { meta.Episode = (int)tvdbEpisode.DvdEpisodeNumber; meta.Season = tvdbEpisode.DvdSeason; } index++; } return(true); }
protected override void Scan_Executing(object oFolders = null) { TriggerStatusUpdated("Searching for TV Episodes..."); string[] Folders = oFolders as string[]; if (Folders == null) Folders = Settings.TvFolders; string[] extensions = Settings.VideoExtensions; #region get files List<Meta> newItems = new List<Meta>(); // tv shows must be in the format: [Show]\[Season \d]\[Episodes] Regex rgxTvShow = new Regex(Settings.TvRegularExpression, RegexOptions.IgnoreCase); foreach (string folder in Folders) { try { List<string> knownFiles = new List<string>(); foreach (List<Metadata.TvFileMeta> eplist in Shows.Values) knownFiles.AddRange(from ep in eplist select ep.Filename.ToLower()); string[] files = System.IO.Directory.GetFiles(folder, "*", System.IO.SearchOption.AllDirectories); foreach (string file in files) { if (this.Items.ContainsKey(file.ToLower()) || knownFiles.Contains(file.ToLower())) continue; string ext = file.Substring(file.LastIndexOf(".") + 1).ToLower(); if (!extensions.Contains(ext)) continue; FileInfo fileInfo = new FileInfo(file); // incase the year is in the file remove it, as the year can be picked up as the season and ep number string strRgxfiletest = Regex.Replace(file, @"([\d]{4}\-[\d]{2}\-[\d]{2})|(720p)|(1080p)|(480p)", ""); if (!rgxTvShow.IsMatch(strRgxfiletest)) continue; Metadata.TvFileMeta meta = new Metadata.TvFileMeta(file); newItems.Add(meta); AddItem(meta); if(!Shows.ContainsKey(meta.ShowTitle)) Shows.Add(meta.ShowTitle, new List<TvFileMeta>()); Shows[meta.ShowTitle].Add(meta); } } catch (Exception ex) { Trace.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace); } } #endregion foreach(string key in Shows.Keys) { Shows[key].Sort(delegate(Metadata.TvFileMeta a, Metadata.TvFileMeta b) { if(a == null && b == null) return 0; else if (a == null) return 1; else if (b == null) return -1; if(a.Season != b.Season) return a.Season.CompareTo(b.Season); return a.EpisodeNumbers[0].CompareTo(b.EpisodeNumbers[0]); }); } TriggerAllItemsFound(newItems.ToArray()); #region constructor TheTvdb Handler string cacheDirectory = Path.Combine(Settings.CachePath, "TheTvDb"); if (!Directory.Exists(cacheDirectory)) Directory.CreateDirectory(cacheDirectory); TvdbLib.Cache.ICacheProvider cacheProvider = new TvdbLib.Cache.XmlCacheProvider(cacheDirectory); TvdbLib.TvdbHandler tvdbHandler = new TvdbLib.TvdbHandler(cacheProvider, Settings.TvdbApiKey); #endregion foreach (Metadata.TvFileMeta meta in newItems.OrderBy(x => ((TvFileMeta)x).ExistingNfoFile ? 1 : 0)) { TriggerScanningItem(meta); int result = meta.Load(); TriggerUpdated(meta, result); } TriggerCompleted(); }