void CheckUnmonitoredFile(string fileName) { Logger.Debug("File is not monitored: " + fileName); var mon = new MonitoredFile { FileName = fileName, Start = DateTime.Now }; using(var info = new MediaInfo(fileName)) { mon.Length = info.Length; } var name = Path.GetFileName(fileName); var match = new TvMatcher().Match(name); if(match != null) { Logger.Debug("Found episode info: " + match.ToString()); mon.TvMatch = match; // Try and look it up // TODO: movies Series series; using(var db = new EpisodeTrackerDBContext()) { series = db.Series.SingleOrDefault(s => s.Name == match.Name || s.Aliases.Any(a => a.Name == match.Name)); int? tvdbid = null; if(series == null) { var results = new TVDBRequest().Search(match.Name); var first = results.FirstOrDefault(); if(first != null) { Logger.Debug("Found TVDB result: " + first.Name); series = db.Series.SingleOrDefault(s => s.TVDBID == first.ID || s.Name == first.Name || s.Aliases.Any(a => a.Name == first.Name)); tvdbid = first.ID; } }else { tvdbid = series.TVDBID; } if(tvdbid.HasValue) { if(series == null || series.Updated <= DateTime.Now.AddDays(-7)) { var syncer = new TVDBSeriesSyncer { TVDBID = tvdbid.Value, Name = match.Name, DownloadBannersAsync = true }; syncer.Sync(); } // Pull out series again as it might have been updated series = db.Series .Include(s => s.Episodes) .Single(s => s.TVDBID == tvdbid.Value); mon.Series = series; if(match.Season.HasValue) { var eps = series.Episodes.Where(ep => ep.Season == match.Season.Value); if(match.ToEpisode.HasValue) { mon.Episodes = eps.Where(ep => ep.Number >= match.Episode && ep.Number <= match.ToEpisode.Value); } else { mon.Episodes = eps.Where(ep => ep.Number == match.Episode); } } else { mon.Episodes = series.Episodes.Where(ep => ep.AbsoluteNumber == match.Episode); } if(mon.Episodes != null) { Logger.Debug("Found TVDB episodes: " + String.Join(" + ", mon.Episodes.Select(e => e.Name))); } } } } monitored.Add(mon); }
void SyncFiles(SeriesFileInfo info) { Series series; info.State = SeriesFileInfoState.None; using(var db = new EpisodeTrackerDBContext()) { series = db.Series.SingleOrDefault(s => s.ID == info.SeriesID || s.TVDBID == info.TVDBID); if(series == null || series.Updated <= DateTime.Now.AddDays(-7)) { info.Status = "Syncing TVDB series..."; try { var syncer = new TVDBSeriesSyncer { Name = info.SeriesName, TVDBID = info.TVDBID.Value, DownloadBanners = true }; syncer.BannerDownloaded += (o, e) => info.Status = String.Format("Banners downloaded: {0}/{1}", e.Complete, e.Total); syncer.Sync(); } catch(Exception e) { info.Status = "Error syncing with TVDB: " + e.Message; info.State = SeriesFileInfoState.Error; Logger.Error("Error syncing with TVDB: " + info.TVDBID + " - " + e); return; } series = db.Series.SingleOrDefault(s => s.TVDBID == info.TVDBID); info.Status = "Synced"; } else if(!series.Name.Equals(info.SeriesName, StringComparison.OrdinalIgnoreCase)) { // Save alias if(!db.Series.Any(s => s.Name == info.SeriesName) && !db.SeriesAliases.Any(a => a.Name == info.SeriesName)) { db.SeriesAliases.Add(new SeriesAlias { SeriesID = series.ID, Name = info.SeriesName }); } } info.Status = "Updating episodes with file names..."; var episodes = series.Episodes.ToList(); foreach(var f in info.Results) { var eps = episodes.Where(ep => f.Match.Season.HasValue && ep.Season == f.Match.Season && ( ep.Number == f.Match.Episode || f.Match.ToEpisode.HasValue && ep.Number >= f.Match.Episode && ep.Number <= f.Match.ToEpisode ) ); eps.ToList().ForEach(ep => ep.FileName = f.FileName); } try { db.SaveChanges(); } catch(Exception e) { info.Status = "Could not update episodes: " + e.Message; info.State = SeriesFileInfoState.Error; Logger.Error("Error update episodes with file names: " + e.Message); return; } info.Status = "Synced"; info.State = SeriesFileInfoState.Synced; } }