using System.Collections.Generic; using System.Linq; using System; using NLog; using Ninject; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; namespace NzbDrone.Core.Jobs { public class RefreshEpisodeMetadata : IJob { private readonly MediaFileProvider _mediaFileProvider; private readonly SeriesProvider _seriesProvider; private readonly MetadataProvider _metadataProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); [Inject] public RefreshEpisodeMetadata(MediaFileProvider mediaFileProvider, SeriesProvider seriesProvider, MetadataProvider metadataProvider) { _mediaFileProvider = mediaFileProvider; _seriesProvider = seriesProvider; _metadataProvider = metadataProvider; } public string Name { get { return "Refresh Episode Metadata"; } } public TimeSpan DefaultInterval { get { return TimeSpan.FromTicks(0); } } public void Start(ProgressNotification notification, int targetId, int secondaryTargetId) { if (targetId <= 0) { var allSeries = _seriesProvider.GetAllSeries(); foreach(var s in allSeries) { RefreshMetadata(notification, s); } } var series = _seriesProvider.GetSeries(targetId); RefreshMetadata(notification, series); } private void RefreshMetadata(ProgressNotification notification, Series series) { notification.CurrentMessage = String.Format("Refreshing episode metadata for '{0}'", series.Title); Logger.Debug("Getting episodes from database for series: {0}", series.SeriesId); var episodeFiles = _mediaFileProvider.GetSeriesFiles(series.SeriesId); if (episodeFiles == null || episodeFiles.Count == 0) { Logger.Warn("No episodes in database found for series: {0}", series.SeriesId); return; } try { _metadataProvider.CreateForEpisodeFiles(episodeFiles.ToList()); } catch (Exception e) { Logger.WarnException("An error has occurred while refreshing episode metadata", e); } notification.CurrentMessage = String.Format("Epsiode metadata refresh completed for {0}", series.Title); } } }