diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-09-22 17:56:54 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2014-09-22 17:56:54 -0400 |
| commit | 1afb28b48797ee53442823cfd395e07d219e8ec3 (patch) | |
| tree | 694d2d8a3449a6d8cb46fddeb73ed1f96be634d7 /MediaBrowser.Server.Implementations/Channels | |
| parent | ac201a6cdb22ff158aaca1378361b03b2127686d (diff) | |
add cinema mode feature
Diffstat (limited to 'MediaBrowser.Server.Implementations/Channels')
3 files changed, 169 insertions, 9 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs b/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs index 1d95dbc1b..8c510afd2 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelDownloadScheduledTask.cs @@ -332,7 +332,7 @@ namespace MediaBrowser.Server.Implementations.Channels { return new ITaskTrigger[] { - new IntervalTrigger{ Interval = TimeSpan.FromHours(6)}, + new IntervalTrigger{ Interval = TimeSpan.FromHours(3)}, }; } diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index dfd24a248..12aa670b3 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -62,7 +62,7 @@ namespace MediaBrowser.Server.Implementations.Channels { get { - return TimeSpan.FromHours(12); + return TimeSpan.FromHours(6); } } @@ -663,7 +663,7 @@ namespace MediaBrowser.Server.Implementations.Channels private async Task<IEnumerable<ChannelItemInfo>> GetLatestItems(ISupportsLatestMedia indexable, IChannel channel, string userId, CancellationToken cancellationToken) { - var cacheLength = TimeSpan.FromHours(12); + var cacheLength = CacheLength; var cachePath = GetChannelDataCachePath(channel, userId, "channelmanager-latest", null, false); try @@ -720,7 +720,7 @@ namespace MediaBrowser.Server.Implementations.Channels } } - public async Task<QueryResult<BaseItemDto>> GetAllMedia(AllChannelMediaQuery query, CancellationToken cancellationToken) + public async Task<QueryResult<BaseItem>> GetAllMediaInternal(AllChannelMediaQuery query, CancellationToken cancellationToken) { var user = string.IsNullOrWhiteSpace(query.UserId) ? null @@ -798,19 +798,43 @@ namespace MediaBrowser.Server.Implementations.Channels var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); await RefreshIfNeeded(internalItems, cancellationToken).ConfigureAwait(false); - var returnItemArray = internalItems.Select(i => _dtoService.GetBaseItemDto(i, query.Fields, user)) - .ToArray(); + var returnItemArray = internalItems.ToArray(); - return new QueryResult<BaseItemDto> + return new QueryResult<BaseItem> { TotalRecordCount = totalCount, Items = returnItemArray }; } + + public async Task<QueryResult<BaseItemDto>> GetAllMedia(AllChannelMediaQuery query, CancellationToken cancellationToken) + { + var user = string.IsNullOrWhiteSpace(query.UserId) + ? null + : _userManager.GetUserById(query.UserId); + + var internalResult = await GetAllMediaInternal(query, cancellationToken).ConfigureAwait(false); + + // Get everything + var fields = Enum.GetNames(typeof(ItemFields)) + .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) + .ToList(); + + var returnItems = internalResult.Items.Select(i => _dtoService.GetBaseItemDto(i, fields, user)) + .ToArray(); + + var result = new QueryResult<BaseItemDto> + { + Items = returnItems, + TotalRecordCount = internalResult.TotalRecordCount + }; + + return result; + } private async Task<ChannelItemResult> GetAllItems(IIndexableChannel indexable, IChannel channel, string userId, CancellationToken cancellationToken) { - var cacheLength = TimeSpan.FromHours(12); + var cacheLength = CacheLength; var cachePath = GetChannelDataCachePath(channel, userId, "channelmanager-allitems", null, false); try @@ -1199,7 +1223,6 @@ namespace MediaBrowser.Server.Implementations.Channels item.Genres = info.Genres; item.Studios = info.Studios; item.CommunityRating = info.CommunityRating; - item.OfficialRating = info.OfficialRating; item.Overview = info.Overview; item.IndexNumber = info.IndexNumber; item.ParentIndexNumber = info.ParentIndexNumber; @@ -1207,6 +1230,7 @@ namespace MediaBrowser.Server.Implementations.Channels item.PremiereDate = info.PremiereDate; item.ProductionYear = info.ProductionYear; item.ProviderIds = info.ProviderIds; + item.OfficialRating = info.OfficialRating; item.DateCreated = info.DateCreated.HasValue ? info.DateCreated.Value : diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs b/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs new file mode 100644 index 000000000..b067271c5 --- /dev/null +++ b/MediaBrowser.Server.Implementations/Channels/ChannelPostScanTask.cs @@ -0,0 +1,136 @@ +using System.Collections.Generic; +using MediaBrowser.Common.Progress; +using MediaBrowser.Controller.Channels; +using MediaBrowser.Controller.Library; +using MediaBrowser.Model.Channels; +using MediaBrowser.Model.Logging; +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MediaBrowser.Server.Implementations.Channels +{ + public class ChannelPostScanTask : ILibraryPostScanTask + { + private readonly IChannelManager _channelManager; + private readonly IUserManager _userManager; + private readonly ILogger _logger; + + public ChannelPostScanTask(IChannelManager channelManager, IUserManager userManager, ILogger logger) + { + _channelManager = channelManager; + _userManager = userManager; + _logger = logger; + } + + public async Task Run(IProgress<double> progress, CancellationToken cancellationToken) + { + var users = _userManager.Users + .Select(i => i.Id.ToString("N")) + .ToList(); + + var numComplete = 0; + + foreach (var user in users) + { + double percentPerUser = 1; + percentPerUser /= users.Count; + var startingPercent = numComplete * percentPerUser * 100; + + var innerProgress = new ActionableProgress<double>(); + innerProgress.RegisterAction(p => progress.Report(startingPercent + (percentPerUser * p))); + + await DownloadContent(user, cancellationToken, innerProgress).ConfigureAwait(false); + + numComplete++; + double percent = numComplete; + percent /= users.Count; + progress.Report(percent * 100); + } + + progress.Report(100); + } + + private async Task DownloadContent(string user, CancellationToken cancellationToken, IProgress<double> progress) + { + var channels = await _channelManager.GetChannelsInternal(new ChannelQuery + { + UserId = user + + }, cancellationToken); + + var numComplete = 0; + + foreach (var channel in channels.Items) + { + try + { + await GetAllItems(user, channel.Id.ToString("N"), null, false, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error getting channel content", ex); + } + + numComplete++; + double percent = numComplete; + percent /= channels.Items.Length; + progress.Report(percent * 100); + } + + progress.Report(100); + + } + + private async Task GetAllItems(string user, string channelId, string folderId, bool recursive, CancellationToken cancellationToken) + { + var folderItems = new List<string>(); + + var result = await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + { + ChannelId = channelId, + UserId = user, + FolderId = folderId + + }, cancellationToken); + + folderItems.AddRange(result.Items.Where(i => i.IsFolder).Select(i => i.Id.ToString("N"))); + + var totalRetrieved = result.Items.Length; + var totalCount = result.TotalRecordCount; + + while (totalRetrieved < totalCount) + { + result = await _channelManager.GetChannelItemsInternal(new ChannelItemQuery + { + ChannelId = channelId, + UserId = user, + StartIndex = totalRetrieved, + FolderId = folderId + + }, cancellationToken); + + folderItems.AddRange(result.Items.Where(i => i.IsFolder).Select(i => i.Id.ToString("N"))); + + totalRetrieved += result.Items.Length; + totalCount = result.TotalRecordCount; + } + + if (recursive) + { + foreach (var folder in folderItems) + { + try + { + await GetAllItems(user, channelId, folder, false, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorException("Error getting channel content", ex); + } + } + } + } + } +} |
