diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index d8faceadb2..6afcf567a8 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -21,14 +21,6 @@ namespace Emby.Server.Implementations.Images public abstract class BaseDynamicImageProvider : IHasItemChangeMonitor, IForcedProvider, ICustomMetadataProvider, IHasOrder where T : BaseItem { - protected virtual IReadOnlyCollection SupportedImages { get; } - = new ImageType[] { ImageType.Primary }; - - protected IFileSystem FileSystem { get; private set; } - protected IProviderManager ProviderManager { get; private set; } - protected IApplicationPaths ApplicationPaths { get; private set; } - protected IImageProcessor ImageProcessor { get; set; } - protected BaseDynamicImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor) { ApplicationPaths = applicationPaths; @@ -37,6 +29,24 @@ namespace Emby.Server.Implementations.Images ImageProcessor = imageProcessor; } + protected IFileSystem FileSystem { get; } + + protected IProviderManager ProviderManager { get; } + + protected IApplicationPaths ApplicationPaths { get; } + + protected IImageProcessor ImageProcessor { get; set; } + + protected virtual IReadOnlyCollection SupportedImages { get; } + = new ImageType[] { ImageType.Primary }; + + /// + public string Name => "Dynamic Image Provider"; + + protected virtual int MaxImageAgeDays => 7; + + public int Order => 0; + protected virtual bool Supports(BaseItem _) => true; public async Task FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken) @@ -85,7 +95,8 @@ namespace Emby.Server.Implementations.Images return FetchToFileInternal(item, items, imageType, cancellationToken); } - protected async Task FetchToFileInternal(BaseItem item, + protected async Task FetchToFileInternal( + BaseItem item, IReadOnlyList itemsWithImages, ImageType imageType, CancellationToken cancellationToken) @@ -181,8 +192,6 @@ namespace Emby.Server.Implementations.Images return outputPath; } - public string Name => "Dynamic Image Provider"; - protected virtual string CreateImage(BaseItem item, IReadOnlyCollection itemsWithImages, string outputPathWithoutExtension, @@ -214,8 +223,6 @@ namespace Emby.Server.Implementations.Images throw new ArgumentException("Unexpected image type", nameof(imageType)); } - protected virtual int MaxImageAgeDays => 7; - public bool HasChanged(BaseItem item, IDirectoryService directoryServicee) { if (!Supports(item)) @@ -263,15 +270,9 @@ namespace Emby.Server.Implementations.Images protected virtual bool HasChangedByDate(BaseItem item, ItemImageInfo image) { var age = DateTime.UtcNow - image.DateModified; - if (age.TotalDays <= MaxImageAgeDays) - { - return false; - } - return true; + return age.TotalDays > MaxImageAgeDays; } - public int Order => 0; - protected string CreateSingleImage(IEnumerable itemsWithImages, string outputPathWithoutExtension, ImageType imageType) { var image = itemsWithImages diff --git a/MediaBrowser.Controller/LiveTv/IListingsProvider.cs b/MediaBrowser.Controller/LiveTv/IListingsProvider.cs index c719ad81ca..2ea0a748e1 100644 --- a/MediaBrowser.Controller/LiveTv/IListingsProvider.cs +++ b/MediaBrowser.Controller/LiveTv/IListingsProvider.cs @@ -10,10 +10,15 @@ namespace MediaBrowser.Controller.LiveTv public interface IListingsProvider { string Name { get; } + string Type { get; } + Task> GetProgramsAsync(ListingsProviderInfo info, string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken); + Task Validate(ListingsProviderInfo info, bool validateLogin, bool validateListings); + Task> GetLineups(ListingsProviderInfo info, string country, string location); + Task> GetChannels(ListingsProviderInfo info, CancellationToken cancellationToken); } } diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs b/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs index 5cd0a6ab8c..4abe6a943f 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvDbClientManager.cs @@ -14,11 +14,12 @@ namespace MediaBrowser.Providers.TV.TheTVDB { public class TvDbClientManager { + private const string DefaultLanguage = "en"; + private readonly SemaphoreSlim _cacheWriteLock = new SemaphoreSlim(1, 1); private readonly IMemoryCache _cache; private readonly TvDbClient _tvDbClient; private DateTime _tokenCreatedAt; - private const string DefaultLanguage = "en"; public TvDbClientManager(IMemoryCache memoryCache) { @@ -102,39 +103,50 @@ namespace MediaBrowser.Providers.TV.TheTVDB return episodes; } - public Task> GetSeriesByImdbIdAsync(string imdbId, string language, + public Task> GetSeriesByImdbIdAsync( + string imdbId, + string language, CancellationToken cancellationToken) { var cacheKey = GenerateKey("series", imdbId, language); return TryGetValue(cacheKey, language,() => TvDbClient.Search.SearchSeriesByImdbIdAsync(imdbId, cancellationToken)); } - public Task> GetSeriesByZap2ItIdAsync(string zap2ItId, string language, + public Task> GetSeriesByZap2ItIdAsync( + string zap2ItId, + string language, CancellationToken cancellationToken) { var cacheKey = GenerateKey("series", zap2ItId, language); - return TryGetValue( cacheKey, language,() => TvDbClient.Search.SearchSeriesByZap2ItIdAsync(zap2ItId, cancellationToken)); + return TryGetValue(cacheKey, language, () => TvDbClient.Search.SearchSeriesByZap2ItIdAsync(zap2ItId, cancellationToken)); } - public Task> GetActorsAsync(int tvdbId, string language, + public Task> GetActorsAsync( + int tvdbId, + string language, CancellationToken cancellationToken) { var cacheKey = GenerateKey("actors", tvdbId, language); - return TryGetValue(cacheKey, language,() => TvDbClient.Series.GetActorsAsync(tvdbId, cancellationToken)); + return TryGetValue(cacheKey, language, () => TvDbClient.Series.GetActorsAsync(tvdbId, cancellationToken)); } - public Task> GetImagesAsync(int tvdbId, ImagesQuery imageQuery, string language, + public Task> GetImagesAsync( + int tvdbId, + ImagesQuery imageQuery, + string language, CancellationToken cancellationToken) { var cacheKey = GenerateKey("images", tvdbId, language, imageQuery); - return TryGetValue(cacheKey, language,() => TvDbClient.Series.GetImagesAsync(tvdbId, imageQuery, cancellationToken)); + return TryGetValue(cacheKey, language, () => TvDbClient.Series.GetImagesAsync(tvdbId, imageQuery, cancellationToken)); } public Task> GetLanguagesAsync(CancellationToken cancellationToken) { - return TryGetValue("languages", null,() => TvDbClient.Languages.GetAllAsync(cancellationToken)); + return TryGetValue("languages", null, () => TvDbClient.Languages.GetAllAsync(cancellationToken)); } - public Task> GetSeriesEpisodeSummaryAsync(int tvdbId, string language, + public Task> GetSeriesEpisodeSummaryAsync( + int tvdbId, + string language, CancellationToken cancellationToken) { var cacheKey = GenerateKey("seriesepisodesummary", tvdbId, language); @@ -142,8 +154,12 @@ namespace MediaBrowser.Providers.TV.TheTVDB () => TvDbClient.Series.GetEpisodesSummaryAsync(tvdbId, cancellationToken)); } - public Task> GetEpisodesPageAsync(int tvdbId, int page, EpisodeQuery episodeQuery, - string language, CancellationToken cancellationToken) + public Task> GetEpisodesPageAsync( + int tvdbId, + int page, + EpisodeQuery episodeQuery, + string language, + CancellationToken cancellationToken) { var cacheKey = GenerateKey(language, tvdbId, episodeQuery); @@ -151,7 +167,9 @@ namespace MediaBrowser.Providers.TV.TheTVDB () => TvDbClient.Series.GetEpisodesAsync(tvdbId, page, episodeQuery, cancellationToken)); } - public Task GetEpisodeTvdbId(EpisodeInfo searchInfo, string language, + public Task GetEpisodeTvdbId( + EpisodeInfo searchInfo, + string language, CancellationToken cancellationToken) { searchInfo.SeriesProviderIds.TryGetValue(MetadataProviders.Tvdb.ToString(), @@ -187,7 +205,9 @@ namespace MediaBrowser.Providers.TV.TheTVDB return GetEpisodeTvdbId(Convert.ToInt32(seriesTvdbId), episodeQuery, language, cancellationToken); } - public async Task GetEpisodeTvdbId(int seriesTvdbId, EpisodeQuery episodeQuery, + public async Task GetEpisodeTvdbId( + int seriesTvdbId, + EpisodeQuery episodeQuery, string language, CancellationToken cancellationToken) { @@ -197,8 +217,11 @@ namespace MediaBrowser.Providers.TV.TheTVDB return episodePage.Data.FirstOrDefault()?.Id.ToString(); } - public Task> GetEpisodesPageAsync(int tvdbId, EpisodeQuery episodeQuery, - string language, CancellationToken cancellationToken) + public Task> GetEpisodesPageAsync( + int tvdbId, + EpisodeQuery episodeQuery, + string language, + CancellationToken cancellationToken) { return GetEpisodesPageAsync(tvdbId, 1, episodeQuery, language, cancellationToken); }