ChannelImageProvider.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using MediaBrowser.Controller.Configuration;
  2. using MediaBrowser.Controller.Entities;
  3. using MediaBrowser.Controller.Library;
  4. using MediaBrowser.Controller.LiveTv;
  5. using MediaBrowser.Controller.Providers;
  6. using MediaBrowser.Model.Entities;
  7. using MediaBrowser.Model.Logging;
  8. using MediaBrowser.Model.Net;
  9. using System;
  10. using System.Linq;
  11. using System.Net;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. namespace MediaBrowser.Server.Implementations.LiveTv
  15. {
  16. public class ChannelImageProvider : BaseMetadataProvider
  17. {
  18. private readonly ILiveTvManager _liveTvManager;
  19. private readonly IProviderManager _providerManager;
  20. public ChannelImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager, ILiveTvManager liveTvManager, IProviderManager providerManager)
  21. : base(logManager, configurationManager)
  22. {
  23. _liveTvManager = liveTvManager;
  24. _providerManager = providerManager;
  25. }
  26. public override bool Supports(BaseItem item)
  27. {
  28. return item is Channel;
  29. }
  30. protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
  31. {
  32. return !item.HasImage(ImageType.Primary);
  33. }
  34. public override async Task<bool> FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
  35. {
  36. if (item.HasImage(ImageType.Primary))
  37. {
  38. SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
  39. return true;
  40. }
  41. try
  42. {
  43. await DownloadImage(item, cancellationToken).ConfigureAwait(false);
  44. }
  45. catch (HttpException ex)
  46. {
  47. // Don't fail the provider on a 404
  48. if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
  49. {
  50. throw;
  51. }
  52. }
  53. SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
  54. return true;
  55. }
  56. private async Task DownloadImage(BaseItem item, CancellationToken cancellationToken)
  57. {
  58. var channel = (Channel)item;
  59. var service = _liveTvManager.Services.FirstOrDefault(i => string.Equals(i.Name, channel.ServiceName, StringComparison.OrdinalIgnoreCase));
  60. if (service != null)
  61. {
  62. var response = await service.GetChannelImageAsync(channel.ChannelId, cancellationToken).ConfigureAwait(false);
  63. // Dummy up the original url
  64. var url = channel.ServiceName + channel.ChannelId;
  65. await _providerManager.SaveImage(channel, response.Stream, response.MimeType, ImageType.Primary, null, url, cancellationToken).ConfigureAwait(false);
  66. }
  67. }
  68. public override MetadataProviderPriority Priority
  69. {
  70. get { return MetadataProviderPriority.Second; }
  71. }
  72. public override ItemUpdateType ItemUpdateType
  73. {
  74. get
  75. {
  76. return ItemUpdateType.ImageUpdate;
  77. }
  78. }
  79. }
  80. }