support display of channel images

This commit is contained in:
Luke Pulverenti 2013-11-24 16:30:38 -05:00
parent 7b6819846d
commit 01a9c07dd8
7 changed files with 98 additions and 37 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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,

View File

@ -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);
}
}

View File

@ -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; }
}
}

View File

@ -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)

View File

@ -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));
progress.Report(10);
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
var allChannels = results.SelectMany(i => i);
var allChannels = results.SelectMany(i => i).ToList();
var channnelTasks = allChannels.Select(i => GetChannel(i, cancellationToken));
var list = new List<Channel>();
var channelEntities = await Task.WhenAll(channnelTasks).ConfigureAwait(false);
var numComplete = 0;
_channels = channelEntities.ToList();
foreach (var channel in allChannels)
{
try
{
var item = await GetChannel(channel, cancellationToken).ConfigureAwait(false);
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> GetChannel(ChannelInfo channelInfo, CancellationToken cancellationToken)
{
try
{
return await GetChannelInternal(channelInfo, cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
_logger.ErrorException("Error getting channel information for {0}", ex, channelInfo.Name);
return null;
}
}
private async Task<Channel> GetChannelInternal(ChannelInfo channelInfo, CancellationToken cancellationToken)
{
var path = Path.Combine(_appPaths.ItemsByNamePath, "channels", _fileSystem.GetValidFilename(channelInfo.ServiceName), _fileSystem.GetValidFilename(channelInfo.Name));