diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs new file mode 100644 index 000000000..a65b46f64 --- /dev/null +++ b/MediaBrowser.Server.Implementations/ScheduledTasks/RefreshIntrosTask.cs @@ -0,0 +1,103 @@ +using MediaBrowser.Common.IO; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Logging; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.ScheduledTasks +{ + /// <summary> + /// Class RefreshIntrosTask + /// </summary> + public class RefreshIntrosTask : ILibraryPostScanTask + { + /// <summary> + /// The _library manager + /// </summary> + private readonly ILibraryManager _libraryManager; + /// <summary> + /// The _logger + /// </summary> + private readonly ILogger _logger; + + private readonly IFileSystem _fileSystem; + + /// <summary> + /// Initializes a new instance of the <see cref="RefreshIntrosTask" /> class. + /// </summary> + /// <param name="libraryManager">The library manager.</param> + /// <param name="logger">The logger.</param> + /// <param name="fileSystem">The file system.</param> + public RefreshIntrosTask(ILibraryManager libraryManager, ILogger logger, IFileSystem fileSystem) + { + _libraryManager = libraryManager; + _logger = logger; + _fileSystem = fileSystem; + } + + /// <summary> + /// Runs the specified progress. + /// </summary> + /// <param name="progress">The progress.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + public async Task Run(IProgress<double> progress, CancellationToken cancellationToken) + { + var files = _libraryManager.GetAllIntroFiles().ToList(); + + var numComplete = 0; + + foreach (var file in files) + { + cancellationToken.ThrowIfCancellationRequested(); + + try + { + await RefreshIntro(file, cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException) + { + throw; + } + catch (Exception ex) + { + _logger.ErrorException("Error refreshing intro {0}", ex, file); + } + + numComplete++; + double percent = numComplete; + percent /= files.Count; + progress.Report(percent * 100); + } + } + + /// <summary> + /// Refreshes the intro. + /// </summary> + /// <param name="path">The path.</param> + /// <param name="cancellationToken">The cancellation token.</param> + /// <returns>Task.</returns> + private async Task RefreshIntro(string path, CancellationToken cancellationToken) + { + var item = _libraryManager.ResolvePath(_fileSystem.GetFileSystemInfo(path)); + + if (item == null) + { + _logger.Error("Intro resolver returned null for {0}", path); + return; + } + + var dbItem = _libraryManager.GetItemById(item.Id); + + if (dbItem != null) + { + item = dbItem; + } + + // Force the save if it's a new item + await item.RefreshMetadata(cancellationToken).ConfigureAwait(false); + } + } +} |
