diff options
Diffstat (limited to 'MediaBrowser.Server.Implementations/Channels/ChannelManager.cs')
| -rw-r--r-- | MediaBrowser.Server.Implementations/Channels/ChannelManager.cs | 72 |
1 files changed, 57 insertions, 15 deletions
diff --git a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs index b3984bb6c..db2728ebe 100644 --- a/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs +++ b/MediaBrowser.Server.Implementations/Channels/ChannelManager.cs @@ -98,7 +98,7 @@ namespace MediaBrowser.Server.Implementations.Channels { all = all.Take(query.Limit.Value).ToList(); } - + // Get everything var fields = Enum.GetNames(typeof(ItemFields)) .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) @@ -156,6 +156,24 @@ namespace MediaBrowser.Server.Implementations.Channels progress.Report(100); } + public Task<IEnumerable<ChannelMediaInfo>> GetChannelItemMediaSources(string id, CancellationToken cancellationToken) + { + var item = (IChannelMediaItem)_libraryManager.GetItemById(id); + + var channelGuid = new Guid(item.ChannelId); + var channel = _channelEntities.First(i => i.Id == channelGuid); + var channelPlugin = GetChannelProvider(channel); + + var requiresCallback = channelPlugin as IRequiresMediaInfoCallback; + + if (requiresCallback != null) + { + return requiresCallback.GetChannelItemMediaInfo(item.ExternalId, cancellationToken); + } + + return Task.FromResult<IEnumerable<ChannelMediaInfo>>(item.ChannelMediaSources); + } + private async Task<Channel> GetChannel(IChannel channelInfo, CancellationToken cancellationToken) { var path = Path.Combine(_config.ApplicationPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.Name)); @@ -246,7 +264,9 @@ namespace MediaBrowser.Server.Implementations.Channels var channelId = channel.Id.ToString("N"); - var tasks = items.Select(i => GetChannelItemEntity(i, channelId, cancellationToken)); + var channelPlugin = GetChannelProvider(channel); + + var tasks = items.Select(i => GetChannelItemEntity(i, channelPlugin, channelId, cancellationToken)); return await Task.WhenAll(tasks).ConfigureAwait(false); }); @@ -303,10 +323,16 @@ namespace MediaBrowser.Server.Implementations.Channels var query = new InternalChannelItemQuery { - User = user, - CategoryId = categoryId + User = user }; + if (!string.IsNullOrWhiteSpace(categoryId)) + { + var categoryItem = (IChannelItem)_libraryManager.GetItemById(new Guid(categoryId)); + + query.CategoryId = categoryItem.ExternalId; + } + var result = await channel.GetChannelItems(query, cancellationToken).ConfigureAwait(false); CacheResponse(result, cachePath); @@ -339,7 +365,9 @@ namespace MediaBrowser.Server.Implementations.Channels var categoryKey = string.IsNullOrWhiteSpace(categoryId) ? "root" : categoryId.GetMD5().ToString("N"); - return Path.Combine(_config.ApplicationPaths.CachePath, "channels", channelId, categoryKey, user.Id.ToString("N") + ".json"); + var version = string.IsNullOrWhiteSpace(channel.DataVersion) ? "0" : channel.DataVersion; + + return Path.Combine(_config.ApplicationPaths.CachePath, "channels", channelId, version, categoryKey, user.Id.ToString("N") + ".json"); } private async Task<QueryResult<BaseItemDto>> GetReturnItems(IEnumerable<BaseItem> items, User user, ChannelItemQuery query, CancellationToken cancellationToken) @@ -377,21 +405,29 @@ namespace MediaBrowser.Server.Implementations.Channels }; } - private string GetIdToHash(string externalId) + private string GetIdToHash(string externalId, IChannel channelProvider) { // Increment this as needed to force new downloads - return externalId + "4"; + // Incorporate Name because it's being used to convert channel entity to provider + return externalId + (channelProvider.DataVersion ?? string.Empty) + (channelProvider.Name ?? string.Empty) + "11"; } - private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, string internalChannnelId, CancellationToken cancellationToken) + private async Task<BaseItem> GetChannelItemEntity(ChannelItemInfo info, IChannel channelProvider, string internalChannnelId, CancellationToken cancellationToken) { + if (string.IsNullOrEmpty(internalChannnelId)) + { + throw new ArgumentNullException("internalChannnelId"); + } + BaseItem item; Guid id; var isNew = false; + var idToHash = GetIdToHash(info.Id, channelProvider); + if (info.Type == ChannelItemType.Category) { - id = GetIdToHash(info.Id).GetMBId(typeof(ChannelCategoryItem)); + id = idToHash.GetMBId(typeof(ChannelCategoryItem)); item = _libraryManager.GetItemById(id) as ChannelCategoryItem; @@ -403,7 +439,7 @@ namespace MediaBrowser.Server.Implementations.Channels } else if (info.MediaType == ChannelMediaType.Audio) { - id = GetIdToHash(info.Id).GetMBId(typeof(ChannelCategoryItem)); + id = idToHash.GetMBId(typeof(ChannelCategoryItem)); item = _libraryManager.GetItemById(id) as ChannelAudioItem; @@ -415,7 +451,7 @@ namespace MediaBrowser.Server.Implementations.Channels } else { - id = GetIdToHash(info.Id).GetMBId(typeof(ChannelVideoItem)); + id = idToHash.GetMBId(typeof(ChannelVideoItem)); item = _libraryManager.GetItemById(id) as ChannelVideoItem; @@ -429,10 +465,6 @@ namespace MediaBrowser.Server.Implementations.Channels item.Id = id; item.RunTimeTicks = info.RunTimeTicks; - var mediaSource = info.MediaSources.FirstOrDefault(); - - item.Path = mediaSource == null ? null : mediaSource.Path; - if (isNew) { item.Name = info.Name; @@ -459,12 +491,22 @@ namespace MediaBrowser.Server.Implementations.Channels channelItem.ChannelId = internalChannnelId; channelItem.ChannelItemType = info.Type; + if (isNew) + { + channelItem.Tags = info.Tags; + } + var channelMediaItem = item as IChannelMediaItem; if (channelMediaItem != null) { channelMediaItem.IsInfiniteStream = info.IsInfiniteStream; channelMediaItem.ContentType = info.ContentType; + channelMediaItem.ChannelMediaSources = info.MediaSources; + + var mediaSource = info.MediaSources.FirstOrDefault(); + + item.Path = mediaSource == null ? null : mediaSource.Path; } if (isNew) |
