diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs | 152 |
1 files changed, 64 insertions, 88 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs b/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs index f5b5db3fd..ce939aeb4 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs @@ -1,10 +1,11 @@ -using MediaBrowser.Common.Extensions; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Common.Progress; using MediaBrowser.Common.ScheduledTasks; +using MediaBrowser.Common.Security; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Channels; using MediaBrowser.Model.Configuration; @@ -12,8 +13,10 @@ using MediaBrowser.Model.Dto; using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Querying; +using MoreLinq; using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Linq; using System.Threading; @@ -30,8 +33,9 @@ namespace MediaBrowser.Server.Implementations.Channels private readonly IFileSystem _fileSystem; private readonly ILibraryManager _libraryManager; private readonly IUserManager _userManager; + private readonly ISecurityManager _security; - public ChannelDownloadScheduledTask(IChannelManager manager, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem, ILibraryManager libraryManager, IUserManager userManager) + public ChannelDownloadScheduledTask(IChannelManager manager, IServerConfigurationManager config, ILogger logger, IHttpClient httpClient, IFileSystem fileSystem, ILibraryManager libraryManager, IUserManager userManager, ISecurityManager security) { _manager = manager; _config = config; @@ -40,6 +44,7 @@ namespace MediaBrowser.Server.Implementations.Channels _fileSystem = fileSystem; _libraryManager = libraryManager; _userManager = userManager; + _security = security; } public string Name @@ -61,7 +66,10 @@ namespace MediaBrowser.Server.Implementations.Channels { CleanChannelContent(cancellationToken); - var users = _userManager.Users.Select(i => i.Id.ToString("N")).ToList(); + var users = _userManager.Users + .DistinctBy(GetUserDistinctValue) + .Select(i => i.Id.ToString("N")) + .ToList(); var numComplete = 0; @@ -85,6 +93,15 @@ namespace MediaBrowser.Server.Implementations.Channels progress.Report(100); } + public static string GetUserDistinctValue(User user) + { + var channels = user.Policy.BlockedChannels + .OrderBy(i => i) + .ToList(); + + return string.Join("|", channels.ToArray()); + } + private async Task DownloadContent(string user, CancellationToken cancellationToken, IProgress<double> progress) @@ -104,7 +121,7 @@ namespace MediaBrowser.Server.Implementations.Channels CancellationToken cancellationToken, IProgress<double> progress) { - var result = await _manager.GetLatestChannelItems(new AllChannelMediaQuery + var result = await _manager.GetLatestChannelItemsInternal(new AllChannelMediaQuery { UserId = userId @@ -124,7 +141,7 @@ namespace MediaBrowser.Server.Implementations.Channels CancellationToken cancellationToken, IProgress<double> progress) { - var result = await _manager.GetAllMedia(new AllChannelMediaQuery + var result = await _manager.GetAllMediaInternal(new AllChannelMediaQuery { UserId = userId @@ -140,7 +157,7 @@ namespace MediaBrowser.Server.Implementations.Channels await DownloadChannelContent(result, path, cancellationToken, innerProgress).ConfigureAwait(false); } - private async Task DownloadChannelContent(QueryResult<BaseItemDto> result, + private async Task DownloadChannelContent(QueryResult<BaseItem> result, string path, CancellationToken cancellationToken, IProgress<double> progress) @@ -151,7 +168,8 @@ namespace MediaBrowser.Server.Implementations.Channels foreach (var item in result.Items) { - if (options.DownloadingChannels.Contains(item.ChannelId)) + var channelItem = (IChannelItem)item; + if (options.DownloadingChannels.Contains(channelItem.ChannelId)) { try { @@ -161,6 +179,10 @@ namespace MediaBrowser.Server.Implementations.Channels { break; } + catch (ChannelDownloadException) + { + // Logged at lower levels + } catch (Exception ex) { _logger.ErrorException("Error downloading channel content for {0}", ex, item.Name); @@ -176,25 +198,31 @@ namespace MediaBrowser.Server.Implementations.Channels progress.Report(100); } - private async Task DownloadChannelItem(BaseItemDto item, + private double? GetDownloadLimit(ChannelOptions channelOptions) + { + return channelOptions.DownloadSizeLimit; + } + + private async Task DownloadChannelItem(BaseItem item, ChannelOptions channelOptions, CancellationToken cancellationToken, string path) { - if (channelOptions.DownloadSizeLimit.HasValue) + var limit = GetDownloadLimit(channelOptions); + + if (limit.HasValue) { - if (IsSizeLimitReached(path, channelOptions.DownloadSizeLimit.Value)) + if (IsSizeLimitReached(path, limit.Value)) { return; - } + } } - var sources = await _manager.GetChannelItemMediaSources(item.Id, cancellationToken) + var itemId = item.Id.ToString("N"); + var sources = await _manager.GetChannelItemMediaSources(itemId, false, cancellationToken) .ConfigureAwait(false); - var list = sources.ToList(); - - var cachedVersions = list.Where(i => i.Protocol == MediaProtocol.File).ToList(); + var cachedVersions = sources.Where(i => i.Protocol == MediaProtocol.File).ToList(); if (cachedVersions.Count > 0) { @@ -202,65 +230,34 @@ namespace MediaBrowser.Server.Implementations.Channels return; } - var source = list.FirstOrDefault(i => i.Protocol == MediaProtocol.Http); + var channelItem = (IChannelMediaItem)item; - if (source == null) - { - return; - } + var destination = Path.Combine(path, channelItem.ChannelId, itemId); - var options = new HttpRequestOptions - { - CancellationToken = cancellationToken, - Url = source.Path, - Progress = new Progress<double>() - }; + await _manager.DownloadChannelItem(channelItem, destination, new Progress<double>(), cancellationToken) + .ConfigureAwait(false); - foreach (var header in source.RequiredHttpHeaders) - { - options.RequestHeaders[header.Key] = header.Value; - } - - var destination = Path.Combine(path, item.ChannelId, item.Id); - Directory.CreateDirectory(Path.GetDirectoryName(destination)); - - // Determine output extension - var response = await _httpClient.GetTempFileResponse(options).ConfigureAwait(false); - - if (item.IsVideo && response.ContentType.StartsWith("video/", StringComparison.OrdinalIgnoreCase)) - { - var extension = response.ContentType.Split('/') - .Last() - .Replace("quicktime", "mov", StringComparison.OrdinalIgnoreCase); - - destination += "." + extension; - } - else if (item.IsAudio && response.ContentType.StartsWith("audio/", StringComparison.OrdinalIgnoreCase)) - { - var extension = response.ContentType.Replace("audio/mpeg", "audio/mp3", StringComparison.OrdinalIgnoreCase) - .Split('/') - .Last(); + await RefreshMediaSourceItem(destination, cancellationToken).ConfigureAwait(false); + } - destination += "." + extension; - } - else + private async Task RefreshMediaSourceItems(IEnumerable<MediaSourceInfo> items, CancellationToken cancellationToken) + { + foreach (var item in items) { - File.Delete(response.TempFilePath); - - throw new ApplicationException("Unexpected response type encountered: " + response.ContentType); + await RefreshMediaSourceItem(item.Path, cancellationToken).ConfigureAwait(false); } + } - File.Copy(response.TempFilePath, destination, true); - - await RefreshMediaSourceItem(destination, cancellationToken).ConfigureAwait(false); + private async Task RefreshMediaSourceItem(string path, CancellationToken cancellationToken) + { + var item = _libraryManager.ResolvePath(new FileInfo(path)); - try - { - File.Delete(response.TempFilePath); - } - catch + if (item != null) { - + // Get the version from the database + item = _libraryManager.GetItemById(item.Id) ?? item; + + await item.RefreshMetadata(cancellationToken).ConfigureAwait(false); } } @@ -290,32 +287,11 @@ namespace MediaBrowser.Server.Implementations.Channels } } - private async Task RefreshMediaSourceItems(IEnumerable<MediaSourceInfo> items, CancellationToken cancellationToken) - { - foreach (var item in items) - { - await RefreshMediaSourceItem(item.Path, cancellationToken).ConfigureAwait(false); - } - } - - private async Task RefreshMediaSourceItem(string path, CancellationToken cancellationToken) - { - var item = _libraryManager.ResolvePath(new FileInfo(path)); - - if (item != null) - { - // Get the version from the database - item = _libraryManager.GetItemById(item.Id) ?? item; - - await item.RefreshMetadata(cancellationToken).ConfigureAwait(false); - } - } - public IEnumerable<ITaskTrigger> GetDefaultTriggers() { return new ITaskTrigger[] { - new IntervalTrigger{ Interval = TimeSpan.FromHours(6)}, + new IntervalTrigger{ Interval = TimeSpan.FromHours(3)}, }; } |
