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; } }
void FindSeries(SeriesFileInfo info) { Series series; info.State = SeriesFileInfoState.None; info.TVDBID = null; info.SeriesID = null; using(var db = new EpisodeTrackerDBContext()) { var seriesName = info.SuggestedName ?? info.SeriesName; if(db.SeriesIgnore.Any(s => s.Name == seriesName)) { info.State = SeriesFileInfoState.Ignored; info.Status = "Ignored"; return; } series = db.Series.SingleOrDefault(s => s.Name == seriesName || s.Aliases.Any(a => a.Name == seriesName)); if(series == null || !series.TVDBID.HasValue) { info.Status = "Searching for series on TVDB..."; TVDBSearchResult tvdbResult; try { tvdbResult = TVDBSeriesSearcher.Search(seriesName); } catch(Exception e) { info.Status = "Error searching TVDB for series: " + e.Message; info.State = SeriesFileInfoState.Error; Logger.Error("Error searching for series: " + seriesName + " - " + e); return; } if(tvdbResult == null) { info.Status = "Series does not exist on TVDB"; info.State = SeriesFileInfoState.NotFound; return; } if(series == null) { series = db.Series.SingleOrDefault(s => s.Name == tvdbResult.Name || s.Aliases.Any(a => a.Name == tvdbResult.Name)); if(series != null) info.SeriesID = series.ID; } info.SuggestedName = tvdbResult.Name; info.TVDBID = tvdbResult.ID; } else { info.SuggestedName = series.Name; info.TVDBID = series.TVDBID; info.SeriesID = series.ID; // Confirmed series, check if there's any new files var episodes = series.Episodes.ToList(); List<EpisodeFileSearchResult> newFiles = new List<EpisodeFileSearchResult>(); foreach(var f in info.Results) { var eps = episodes.WhereTVMatch(f.Match); if(eps.Any(ep => ep.FileName != f.FileName)) { newFiles.Add(f); } } info.Results = newFiles; if(!newFiles.Any()) { info.State = SeriesFileInfoState.Ignored; return; } } info.Status = "Found series info: " + info.TVDBID; info.State = SeriesFileInfoState.Found; } }