|
@@ -1,154 +1,111 @@
|
|
|
-using MediaBrowser.Common.IO;
|
|
|
-using MediaBrowser.Common.Net;
|
|
|
-using MediaBrowser.Controller.Configuration;
|
|
|
+using MediaBrowser.Common.Net;
|
|
|
using MediaBrowser.Controller.Entities;
|
|
|
-using MediaBrowser.Controller.Library;
|
|
|
using MediaBrowser.Controller.LiveTv;
|
|
|
using MediaBrowser.Controller.Providers;
|
|
|
using MediaBrowser.Model.Entities;
|
|
|
using MediaBrowser.Model.Logging;
|
|
|
-using MediaBrowser.Model.Net;
|
|
|
using System;
|
|
|
-using System.IO;
|
|
|
+using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
-using System.Net;
|
|
|
using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace MediaBrowser.Server.Implementations.LiveTv
|
|
|
{
|
|
|
- public class ProgramImageProvider : BaseMetadataProvider
|
|
|
+ public class ProgramImageProvider : IDynamicImageProvider, IHasChangeMonitor
|
|
|
{
|
|
|
private readonly ILiveTvManager _liveTvManager;
|
|
|
- private readonly IProviderManager _providerManager;
|
|
|
- private readonly IFileSystem _fileSystem;
|
|
|
private readonly IHttpClient _httpClient;
|
|
|
+ private readonly ILogger _logger;
|
|
|
|
|
|
- public ProgramImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager, ILiveTvManager liveTvManager, IProviderManager providerManager, IFileSystem fileSystem, IHttpClient httpClient)
|
|
|
- : base(logManager, configurationManager)
|
|
|
+ public ProgramImageProvider(ILiveTvManager liveTvManager, IHttpClient httpClient, ILogger logger)
|
|
|
{
|
|
|
_liveTvManager = liveTvManager;
|
|
|
- _providerManager = providerManager;
|
|
|
- _fileSystem = fileSystem;
|
|
|
_httpClient = httpClient;
|
|
|
+ _logger = logger;
|
|
|
}
|
|
|
|
|
|
- public override bool Supports(BaseItem item)
|
|
|
+ public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
|
|
|
{
|
|
|
- return item is LiveTvProgram;
|
|
|
- }
|
|
|
-
|
|
|
- protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
|
|
|
- {
|
|
|
- return !item.HasImage(ImageType.Primary);
|
|
|
+ return new[] { ImageType.Primary };
|
|
|
}
|
|
|
|
|
|
- public override async Task<bool> FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
|
|
|
+ public async Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
|
|
|
{
|
|
|
- if (item.HasImage(ImageType.Primary))
|
|
|
- {
|
|
|
- SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- var changed = true;
|
|
|
-
|
|
|
- try
|
|
|
- {
|
|
|
- changed = await DownloadImage((LiveTvProgram)item, cancellationToken).ConfigureAwait(false);
|
|
|
- }
|
|
|
- catch (HttpException ex)
|
|
|
- {
|
|
|
- // Don't fail the provider on a 404
|
|
|
- if (!ex.StatusCode.HasValue || ex.StatusCode.Value != HttpStatusCode.NotFound)
|
|
|
- {
|
|
|
- throw;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (changed)
|
|
|
- {
|
|
|
- SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
|
|
|
- }
|
|
|
-
|
|
|
- return changed;
|
|
|
- }
|
|
|
+ var liveTvItem = (LiveTvProgram)item;
|
|
|
|
|
|
- private async Task<bool> DownloadImage(LiveTvProgram item, CancellationToken cancellationToken)
|
|
|
- {
|
|
|
- Stream imageStream = null;
|
|
|
- string contentType = null;
|
|
|
+ var imageResponse = new DynamicImageResponse();
|
|
|
|
|
|
- if (!string.IsNullOrEmpty(item.ProviderImagePath))
|
|
|
+ if (!string.IsNullOrEmpty(liveTvItem.ProviderImagePath))
|
|
|
{
|
|
|
- contentType = "image/" + Path.GetExtension(item.ProviderImagePath).ToLower();
|
|
|
- imageStream = _fileSystem.GetFileStream(item.ProviderImagePath, FileMode.Open, FileAccess.Read, FileShare.Read, true);
|
|
|
+ imageResponse.Path = liveTvItem.ProviderImagePath;
|
|
|
+ imageResponse.HasImage = true;
|
|
|
}
|
|
|
- else if (!string.IsNullOrEmpty(item.ProviderImageUrl))
|
|
|
+ else if (!string.IsNullOrEmpty(liveTvItem.ProviderImageUrl))
|
|
|
{
|
|
|
var options = new HttpRequestOptions
|
|
|
{
|
|
|
CancellationToken = cancellationToken,
|
|
|
- Url = item.ProviderImageUrl
|
|
|
+ Url = liveTvItem.ProviderImageUrl
|
|
|
};
|
|
|
|
|
|
var response = await _httpClient.GetResponse(options).ConfigureAwait(false);
|
|
|
|
|
|
- if (!response.ContentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
|
|
|
+ if (response.ContentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
|
|
|
{
|
|
|
- Logger.Error("Provider did not return an image content type.");
|
|
|
- return false;
|
|
|
+ imageResponse.HasImage = true;
|
|
|
+ imageResponse.Stream = response.Content;
|
|
|
+ imageResponse.SetFormatFromMimeType(response.ContentType);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _logger.Error("Provider did not return an image content type.");
|
|
|
}
|
|
|
-
|
|
|
- imageStream = response.Content;
|
|
|
- contentType = response.ContentType;
|
|
|
}
|
|
|
- else if (item.HasProviderImage ?? true)
|
|
|
+ else if (liveTvItem.HasProviderImage ?? true)
|
|
|
{
|
|
|
- var service = _liveTvManager.Services.FirstOrDefault(i => string.Equals(i.Name, item.ServiceName, StringComparison.OrdinalIgnoreCase));
|
|
|
+ var service = _liveTvManager.Services.FirstOrDefault(i => string.Equals(i.Name, liveTvItem.ServiceName, StringComparison.OrdinalIgnoreCase));
|
|
|
|
|
|
if (service != null)
|
|
|
{
|
|
|
try
|
|
|
{
|
|
|
- var response = await service.GetProgramImageAsync(item.ExternalId, item.ExternalChannelId, cancellationToken).ConfigureAwait(false);
|
|
|
+ var response = await service.GetProgramImageAsync(liveTvItem.ExternalId, liveTvItem.ExternalChannelId, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
if (response != null)
|
|
|
{
|
|
|
- imageStream = response.Stream;
|
|
|
- contentType = "image/" + response.Format.ToString().ToLower();
|
|
|
+ imageResponse.HasImage = true;
|
|
|
+ imageResponse.Stream = response.Stream;
|
|
|
+ imageResponse.Format = response.Format;
|
|
|
}
|
|
|
}
|
|
|
catch (NotImplementedException)
|
|
|
{
|
|
|
- return false;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (imageStream != null)
|
|
|
- {
|
|
|
- // Dummy up the original url
|
|
|
- var url = item.ServiceName + item.ExternalId;
|
|
|
+ return imageResponse;
|
|
|
+ }
|
|
|
|
|
|
- await _providerManager.SaveImage(item, imageStream, contentType, ImageType.Primary, null, url, cancellationToken).ConfigureAwait(false);
|
|
|
- return true;
|
|
|
- }
|
|
|
+ public string Name
|
|
|
+ {
|
|
|
+ get { return "Live TV Service Provider"; }
|
|
|
+ }
|
|
|
|
|
|
- return false;
|
|
|
+ public bool Supports(IHasImages item)
|
|
|
+ {
|
|
|
+ return item is LiveTvProgram;
|
|
|
}
|
|
|
|
|
|
- public override MetadataProviderPriority Priority
|
|
|
+ public int Order
|
|
|
{
|
|
|
- get { return MetadataProviderPriority.Second; }
|
|
|
+ get { return 0; }
|
|
|
}
|
|
|
|
|
|
- public override ItemUpdateType ItemUpdateType
|
|
|
+ public bool HasChanged(IHasMetadata item, DateTime date)
|
|
|
{
|
|
|
- get
|
|
|
- {
|
|
|
- return ItemUpdateType.ImageUpdate;
|
|
|
- }
|
|
|
+ return !item.HasImage(ImageType.Primary) && (DateTime.UtcNow - date).TotalHours >= 12;
|
|
|
}
|
|
|
}
|
|
|
}
|