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