mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-03 19:17:24 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using MediaBrowser.Common;
 | 
						|
using MediaBrowser.Common.Net;
 | 
						|
using MediaBrowser.Controller.Entities;
 | 
						|
using MediaBrowser.Controller.LiveTv;
 | 
						|
using MediaBrowser.Controller.Providers;
 | 
						|
using MediaBrowser.Model.Entities;
 | 
						|
using MediaBrowser.Model.Logging;
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Linq;
 | 
						|
using System.Threading;
 | 
						|
using System.Threading.Tasks;
 | 
						|
 | 
						|
namespace MediaBrowser.Server.Implementations.LiveTv
 | 
						|
{
 | 
						|
    public class ChannelImageProvider : IDynamicImageProvider, IHasItemChangeMonitor
 | 
						|
    {
 | 
						|
        private readonly ILiveTvManager _liveTvManager;
 | 
						|
        private readonly IHttpClient _httpClient;
 | 
						|
        private readonly ILogger _logger;
 | 
						|
        private readonly IApplicationHost _appHost;
 | 
						|
 | 
						|
        public ChannelImageProvider(ILiveTvManager liveTvManager, IHttpClient httpClient, ILogger logger, IApplicationHost appHost)
 | 
						|
        {
 | 
						|
            _liveTvManager = liveTvManager;
 | 
						|
            _httpClient = httpClient;
 | 
						|
            _logger = logger;
 | 
						|
            _appHost = appHost;
 | 
						|
        }
 | 
						|
 | 
						|
        public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
 | 
						|
        {
 | 
						|
            return new[] { ImageType.Primary };
 | 
						|
        }
 | 
						|
 | 
						|
        public async Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
 | 
						|
        {
 | 
						|
            var liveTvItem = (LiveTvChannel)item;
 | 
						|
 | 
						|
            var imageResponse = new DynamicImageResponse();
 | 
						|
 | 
						|
            if (!string.IsNullOrEmpty(liveTvItem.ProviderImagePath))
 | 
						|
            {
 | 
						|
                imageResponse.Path = liveTvItem.ProviderImagePath;
 | 
						|
                imageResponse.HasImage = true;
 | 
						|
            }
 | 
						|
            else if (!string.IsNullOrEmpty(liveTvItem.ProviderImageUrl))
 | 
						|
            {
 | 
						|
                var options = new HttpRequestOptions
 | 
						|
                {
 | 
						|
                    CancellationToken = cancellationToken,
 | 
						|
                    Url = liveTvItem.ProviderImageUrl,
 | 
						|
 | 
						|
                    // Some image hosts require a user agent to be specified.
 | 
						|
                    UserAgent = "Emby Server/" + _appHost.ApplicationVersion
 | 
						|
                };
 | 
						|
 | 
						|
                var response = await _httpClient.GetResponse(options).ConfigureAwait(false);
 | 
						|
 | 
						|
                var contentType = response.ContentType;
 | 
						|
 | 
						|
                if (contentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
 | 
						|
                {
 | 
						|
                    imageResponse.HasImage = true;
 | 
						|
                    imageResponse.Stream = response.Content;
 | 
						|
                    imageResponse.SetFormatFromMimeType(contentType);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    _logger.Error("Provider did not return an image content type.");
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else if (liveTvItem.HasProviderImage ?? true)
 | 
						|
            {
 | 
						|
                var service = _liveTvManager.Services.FirstOrDefault(i => string.Equals(i.Name, liveTvItem.ServiceName, StringComparison.OrdinalIgnoreCase));
 | 
						|
 | 
						|
                if (service != null)
 | 
						|
                {
 | 
						|
                    try
 | 
						|
                    {
 | 
						|
                        var response = await service.GetChannelImageAsync(liveTvItem.ExternalId, cancellationToken).ConfigureAwait(false);
 | 
						|
 | 
						|
                        if (response != null)
 | 
						|
                        {
 | 
						|
                            imageResponse.HasImage = true;
 | 
						|
                            imageResponse.Stream = response.Stream;
 | 
						|
                            imageResponse.Format = response.Format;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                    catch (NotImplementedException)
 | 
						|
                    {
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            return imageResponse;
 | 
						|
        }
 | 
						|
 | 
						|
        public string Name
 | 
						|
        {
 | 
						|
            get { return "Live TV Service Provider"; }
 | 
						|
        }
 | 
						|
 | 
						|
        public bool Supports(IHasImages item)
 | 
						|
        {
 | 
						|
            return item is LiveTvChannel;
 | 
						|
        }
 | 
						|
 | 
						|
        public int Order
 | 
						|
        {
 | 
						|
            get { return 0; }
 | 
						|
        }
 | 
						|
 | 
						|
        public bool HasChanged(IHasMetadata item, MetadataStatus status, IDirectoryService directoryService)
 | 
						|
        {
 | 
						|
            return GetSupportedImages(item).Any(i => !item.HasImage(i));
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |