using System; using System.Collections.Generic; using System.Linq; using NLog; using NzbDrone.Common.Messaging; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Providers { public class XemProvider : IExecute { private readonly IEpisodeService _episodeService; private readonly XemCommunicationProvider _xemCommunicationProvider; private readonly ISeriesRepository _seriesRepository; private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); public XemProvider(IEpisodeService episodeService, XemCommunicationProvider xemCommunicationProvider, ISeriesRepository seriesRepository) { _episodeService = episodeService; _xemCommunicationProvider = xemCommunicationProvider; _seriesRepository = seriesRepository; } public virtual void UpdateMappings() { _logger.Trace("Starting scene numbering update"); try { var ids = _xemCommunicationProvider.GetXemSeriesIds(); var series = _seriesRepository.All(); var wantedSeries = series.Where(s => ids.Contains(s.Id)).ToList(); foreach (var ser in wantedSeries) { PerformUpdate(ser); } _logger.Trace("Completed scene numbering update"); } catch (Exception ex) { _logger.WarnException("Error updating Scene Mappings", ex); throw; } } public virtual void UpdateMappings(int seriesId) { var xemIds = _xemCommunicationProvider.GetXemSeriesIds(); if (!xemIds.Contains(seriesId)) { _logger.Trace("Xem doesn't have a mapping for this series: {0}", seriesId); return; } var series = _seriesRepository.Get(seriesId); if (series == null) { _logger.Trace("Series could not be found: {0}", seriesId); return; } PerformUpdate(series); } public virtual void PerformUpdate(Series series) { _logger.Trace("Updating scene numbering mapping for: {0}", series); try { var episodesToUpdate = new List(); var mappings = _xemCommunicationProvider.GetSceneTvdbMappings(series.Id); if (mappings == null) { _logger.Trace("Mappings for: {0} are null, skipping", series); return; } var episodes = _episodeService.GetEpisodeBySeries(series.Id); foreach (var mapping in mappings) { _logger.Trace("Setting scene numbering mappings for {0} S{1:00}E{2:00}", series, mapping.Tvdb.Season, mapping.Tvdb.Episode); var episode = episodes.SingleOrDefault(e => e.SeasonNumber == mapping.Tvdb.Season && e.EpisodeNumber == mapping.Tvdb.Episode); if (episode == null) { _logger.Trace("Information hasn't been added to TheTVDB yet, skipping."); continue; } episode.AbsoluteEpisodeNumber = mapping.Scene.Absolute; episode.SceneSeasonNumber = mapping.Scene.Season; episode.SceneEpisodeNumber = mapping.Scene.Episode; episodesToUpdate.Add(episode); } _logger.Trace("Committing scene numbering mappings to database for: {0}", series); _episodeService.UpdateEpisodes(episodesToUpdate); _logger.Trace("Setting UseSceneMapping for {0}", series); series.UseSceneNumbering = true; _seriesRepository.Update(series); } catch (Exception ex) { _logger.WarnException("Error updating scene numbering mappings for: " + series, ex); } } public void Execute(UpdateXemMappings message) { UpdateMappings(); } } }