浏览代码

support display of channel images

Luke Pulverenti 11 年之前
父节点
当前提交
01a9c07dd8

+ 25 - 1
MediaBrowser.Api/Images/ImageService.cs

@@ -5,6 +5,7 @@ using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Persistence;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Drawing;
@@ -67,6 +68,19 @@ namespace MediaBrowser.Api.Images
         public string Id { get; set; }
     }
 
+    [Route("/LiveTV/Channels/{Id}/Images/{Type}", "GET")]
+    [Route("/LiveTV/Channels/{Id}/Images/{Type}/{Index}", "GET")]
+    [Api(Description = "Gets an item image")]
+    public class GetChannelImage : ImageRequest
+    {
+        /// <summary>
+        /// Gets or sets the id.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "Id", Description = "Channel Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string Id { get; set; }
+    }
+    
     /// <summary>
     /// Class UpdateItemImageIndex
     /// </summary>
@@ -341,10 +355,12 @@ namespace MediaBrowser.Api.Images
         private readonly IDtoService _dtoService;
         private readonly IImageProcessor _imageProcessor;
 
+        private readonly ILiveTvManager _liveTv;
+        
         /// <summary>
         /// Initializes a new instance of the <see cref="ImageService" /> class.
         /// </summary>
-        public ImageService(IUserManager userManager, ILibraryManager libraryManager, IApplicationPaths appPaths, IProviderManager providerManager, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor)
+        public ImageService(IUserManager userManager, ILibraryManager libraryManager, IApplicationPaths appPaths, IProviderManager providerManager, IItemRepository itemRepo, IDtoService dtoService, IImageProcessor imageProcessor, ILiveTvManager liveTv)
         {
             _userManager = userManager;
             _libraryManager = libraryManager;
@@ -353,6 +369,7 @@ namespace MediaBrowser.Api.Images
             _itemRepo = itemRepo;
             _dtoService = dtoService;
             _imageProcessor = imageProcessor;
+            _liveTv = liveTv;
         }
 
         /// <summary>
@@ -492,6 +509,13 @@ namespace MediaBrowser.Api.Images
             }
         }
 
+        public object Get(GetChannelImage request)
+        {
+            var item = _liveTv.GetChannel(request.Id);
+
+            return GetImage(request, item);
+        }
+
         /// <summary>
         /// Gets the specified request.
         /// </summary>

+ 19 - 0
MediaBrowser.Api/LiveTv/LiveTvService.cs

@@ -30,6 +30,18 @@ namespace MediaBrowser.Api.LiveTv
         public string UserId { get; set; }
     }
 
+    [Route("/LiveTv/Channels/{Id}", "GET")]
+    [Api(Description = "Gets a live tv channel")]
+    public class GetChannel : IReturn<ChannelInfoDto>
+    {
+        /// <summary>
+        /// Gets or sets the id.
+        /// </summary>
+        /// <value>The id.</value>
+        [ApiMember(Name = "Id", Description = "Channel Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+        public string Id { get; set; }
+    }
+    
     [Route("/LiveTv/Recordings", "GET")]
     [Api(Description = "Gets available live tv recordings.")]
     public class GetRecordings : IReturn<List<RecordingInfo>>
@@ -101,6 +113,13 @@ namespace MediaBrowser.Api.LiveTv
             return ToOptimizedResult(result.ToList());
         }
 
+        public object Get(GetChannel request)
+        {
+            var result = _liveTvManager.GetChannel(request.Id);
+
+            return ToOptimizedResult(_liveTvManager.GetChannelInfoDto(result));
+        }
+
         public object Get(GetRecordings request)
         {
             var result = GetRecordingsAsync(request).Result;

+ 1 - 1
MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs

@@ -307,7 +307,7 @@ namespace MediaBrowser.Api.Playback.Progressive
                 }
             }
 
-            return new ImageService(UserManager, LibraryManager, ApplicationPaths, null, ItemRepository, DtoService, ImageProcessor)
+            return new ImageService(UserManager, LibraryManager, ApplicationPaths, null, ItemRepository, DtoService, ImageProcessor, null)
             {
                 Logger = Logger,
                 RequestContext = RequestContext,

+ 2 - 3
MediaBrowser.Controller/LiveTv/ILiveTvManager.cs

@@ -37,9 +37,8 @@ namespace MediaBrowser.Controller.LiveTv
         /// <summary>
         /// Gets the channel.
         /// </summary>
-        /// <param name="serviceName">Name of the service.</param>
-        /// <param name="channelId">The channel identifier.</param>
+        /// <param name="id">The identifier.</param>
         /// <returns>Channel.</returns>
-        Channel GetChannel(string serviceName, string channelId);
+        Channel GetChannel(string id);
     }
 }

+ 12 - 0
MediaBrowser.Model/LiveTv/ChannelInfoDto.cs

@@ -19,6 +19,12 @@ namespace MediaBrowser.Model.LiveTv
         /// <value>The identifier.</value>
         public string Id { get; set; }
 
+        /// <summary>
+        /// Gets or sets the channel identifier.
+        /// </summary>
+        /// <value>The channel identifier.</value>
+        public string ChannelId { get; set; }
+        
         /// <summary>
         /// Gets or sets the logo image tag.
         /// </summary>
@@ -42,5 +48,11 @@ namespace MediaBrowser.Model.LiveTv
         /// </summary>
         /// <value>The type of the channel.</value>
         public ChannelType ChannelType { get; set; }
+
+        /// <summary>
+        /// Gets or sets the type.
+        /// </summary>
+        /// <value>The type.</value>
+        public string Type { get; set; }
     }
 }

+ 1 - 6
MediaBrowser.Server.Implementations/LiveTv/ChannelImageProvider.cs

@@ -33,12 +33,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
         protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
         {
-            if (item.HasImage(ImageType.Primary))
-            {
-                return false;
-            }
-
-            return base.NeedsRefreshInternal(item, providerInfo);
+            return !item.HasImage(ImageType.Primary);
         }
 
         public override async Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)

+ 36 - 24
MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -70,9 +70,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
                 Name = info.Name,
                 ServiceName = info.ServiceName,
                 ChannelType = info.ChannelType,
-                Id = info.ChannelId,
+                ChannelId = info.ChannelId,
                 Number = info.ChannelNumber,
-                PrimaryImageTag = GetLogoImageTag(info)
+                PrimaryImageTag = GetLogoImageTag(info),
+                Type = info.GetType().Name,
+                Id = info.Id.ToString("N")
             };
         }
 
@@ -113,9 +115,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
             }).ThenBy(i => i.Name);
         }
 
-        public Channel GetChannel(string serviceName, string channelId)
+        public Channel GetChannel(string id)
         {
-            return _channels.FirstOrDefault(i => string.Equals(i.ServiceName, serviceName, StringComparison.OrdinalIgnoreCase) && string.Equals(i.ChannelId, channelId, StringComparison.OrdinalIgnoreCase));
+            var guid = new Guid(id);
+
+            return _channels.FirstOrDefault(i => i.Id == guid);
         }
 
         internal async Task RefreshChannels(IProgress<double> progress, CancellationToken cancellationToken)
@@ -125,36 +129,44 @@ namespace MediaBrowser.Server.Implementations.LiveTv
 
             var tasks = _services.Select(i => i.GetChannelsAsync(currentCancellationToken));
 
-            var results = await Task.WhenAll(tasks).ConfigureAwait(false);
+            progress.Report(10);
 
-            var allChannels = results.SelectMany(i => i);
+            var results = await Task.WhenAll(tasks).ConfigureAwait(false);
 
-            var channnelTasks = allChannels.Select(i => GetChannel(i, cancellationToken));
+            var allChannels = results.SelectMany(i => i).ToList();
 
-            var channelEntities = await Task.WhenAll(channnelTasks).ConfigureAwait(false);
+            var list = new List<Channel>();
 
-            _channels = channelEntities.ToList();
-        }
+            var numComplete = 0;
 
-        private async Task<Channel> GetChannel(ChannelInfo channelInfo, CancellationToken cancellationToken)
-        {
-            try
-            {
-                return await GetChannelInternal(channelInfo, cancellationToken).ConfigureAwait(false);
-            }
-            catch (OperationCanceledException)
-            {
-                throw;
-            }
-            catch (Exception ex)
+            foreach (var channel in allChannels)
             {
-                _logger.ErrorException("Error getting channel information for {0}", ex, channelInfo.Name);
+                try
+                {
+                    var item = await GetChannel(channel, cancellationToken).ConfigureAwait(false);
 
-                return null;
+                    list.Add(item);
+                }
+                catch (OperationCanceledException)
+                {
+                    throw;
+                }
+                catch (Exception ex)
+                {
+                    _logger.ErrorException("Error getting channel information for {0}", ex, channel.Name);
+                }
+
+                numComplete++;
+                double percent = numComplete;
+                percent /= allChannels.Count;
+
+                progress.Report(90 * percent + 10);
             }
+
+            _channels = list;
         }
 
-        private async Task<Channel> GetChannelInternal(ChannelInfo channelInfo, CancellationToken cancellationToken)
+        private async Task<Channel> GetChannel(ChannelInfo channelInfo, CancellationToken cancellationToken)
         {
             var path = Path.Combine(_appPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.ServiceName), _fileSystem.GetValidFilename(channelInfo.Name));