update default image providers

pull/702/head
Luke Pulverenti 9 years ago
parent e7d5532bee
commit caadb4f374

@ -247,22 +247,67 @@
<Compile Include="Persistence\MediaStreamQuery.cs" />
<Compile Include="Playlists\IPlaylistManager.cs" />
<Compile Include="Playlists\Playlist.cs" />
<Compile Include="Providers\AlbumInfo.cs" />
<Compile Include="Providers\ArtistInfo.cs" />
<Compile Include="Providers\BookInfo.cs" />
<Compile Include="Providers\BoxSetInfo.cs" />
<Compile Include="Providers\ChannelItemLookupInfo.cs" />
<Compile Include="Providers\DirectoryService.cs" />
<Compile Include="Providers\DynamicImageInfo.cs" />
<Compile Include="Providers\DynamicImageResponse.cs" />
<Compile Include="Providers\EpisodeIdentity.cs" />
<Compile Include="Providers\EpisodeInfo.cs" />
<Compile Include="Providers\ExtraInfo.cs" />
<Compile Include="Providers\ExtraSource.cs" />
<Compile Include="Providers\GameInfo.cs" />
<Compile Include="Providers\GameSystemInfo.cs" />
<Compile Include="Providers\ICustomMetadataProvider.cs" />
<Compile Include="Providers\IDirectoryService.cs" />
<Compile Include="Providers\IDynamicImageProvider.cs" />
<Compile Include="Providers\IExternalId.cs" />
<Compile Include="Providers\IExtrasProvider.cs" />
<Compile Include="Providers\IForcedProvider.cs" />
<Compile Include="Providers\IHasChangeMonitor.cs" />
<Compile Include="Entities\IHasMetadata.cs" />
<Compile Include="Providers\IHasIdentities.cs" />
<Compile Include="Providers\IHasItemChangeMonitor.cs" />
<Compile Include="Providers\IHasLookupInfo.cs" />
<Compile Include="Providers\IHasOrder.cs" />
<Compile Include="Providers\IImageFileSaver.cs" />
<Compile Include="Providers\IImageProvider.cs" />
<Compile Include="Providers\IImageSaver.cs" />
<Compile Include="Providers\IItemIdentity.cs" />
<Compile Include="Providers\IItemIdentityConverter.cs" />
<Compile Include="Providers\IItemIdentityProvider.cs" />
<Compile Include="Providers\ILocalImageFileProvider.cs" />
<Compile Include="Providers\ILocalMetadataProvider.cs" />
<Compile Include="Providers\ImageRefreshMode.cs" />
<Compile Include="Providers\ImageRefreshOptions.cs" />
<Compile Include="Providers\IPreRefreshProvider.cs" />
<Compile Include="Providers\IProviderRepository.cs" />
<Compile Include="Providers\IRemoteImageProvider.cs" />
<Compile Include="Providers\ILocalImageProvider.cs" />
<Compile Include="Providers\IMetadataProvider.cs" />
<Compile Include="Providers\IMetadataService.cs" />
<Compile Include="Providers\IRemoteMetadataProvider.cs" />
<Compile Include="Providers\IRemoteSearchProvider.cs" />
<Compile Include="Providers\ISeriesOrderProvider.cs" />
<Compile Include="Providers\ItemInfo.cs" />
<Compile Include="Providers\LocalImageInfo.cs" />
<Compile Include="Providers\LocalMetadataResult.cs" />
<Compile Include="Providers\MetadataRefreshMode.cs" />
<Compile Include="Providers\MetadataResult.cs" />
<Compile Include="Providers\MovieInfo.cs" />
<Compile Include="Providers\MusicVideoInfo.cs" />
<Compile Include="Providers\PersonLookupInfo.cs" />
<Compile Include="Providers\RemoteSearchQuery.cs" />
<Compile Include="Providers\SeasonIdentity.cs" />
<Compile Include="Providers\SeasonInfo.cs" />
<Compile Include="Providers\SeriesIdentity.cs" />
<Compile Include="Providers\SeriesInfo.cs" />
<Compile Include="Providers\SeriesOrderTypes.cs" />
<Compile Include="Providers\SongInfo.cs" />
<Compile Include="Providers\TrailerInfo.cs" />
<Compile Include="Providers\VideoContentType.cs" />
<Compile Include="RelatedMedia\IRelatedMediaProvider.cs" />
<Compile Include="Security\AuthenticationInfo.cs" />

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
namespace MediaBrowser.Controller.Providers
{
public class AlbumInfo : ItemLookupInfo
{
/// <summary>
/// Gets or sets the album artist.
/// </summary>
/// <value>The album artist.</value>
public List<string> AlbumArtists { get; set; }
/// <summary>
/// Gets or sets the artist provider ids.
/// </summary>
/// <value>The artist provider ids.</value>
public Dictionary<string, string> ArtistProviderIds { get; set; }
public List<SongInfo> SongInfos { get; set; }
public AlbumInfo()
{
ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
SongInfos = new List<SongInfo>();
AlbumArtists = new List<string>();
}
}
}

@ -0,0 +1,14 @@
using System.Collections.Generic;
namespace MediaBrowser.Controller.Providers
{
public class ArtistInfo : ItemLookupInfo
{
public List<SongInfo> SongInfos { get; set; }
public ArtistInfo()
{
SongInfos = new List<SongInfo>();
}
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public class BookInfo : ItemLookupInfo
{
public string SeriesName { get; set; }
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public class BoxSetInfo : ItemLookupInfo
{
}
}

@ -0,0 +1,11 @@
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public class ChannelItemLookupInfo : ItemLookupInfo
{
public ChannelMediaContentType ContentType { get; set; }
public ExtraType ExtraType { get; set; }
}
}

@ -7,16 +7,6 @@ using System.Linq;
namespace MediaBrowser.Controller.Providers
{
public interface IDirectoryService
{
IEnumerable<FileSystemInfo> GetFileSystemEntries(string path);
IEnumerable<FileSystemInfo> GetFiles(string path);
IEnumerable<FileSystemInfo> GetDirectories(string path);
IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache);
FileSystemInfo GetFile(string path);
Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path);
}
public class DirectoryService : IDirectoryService
{
private readonly ILogger _logger;

@ -0,0 +1,10 @@
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public class DynamicImageInfo
{
public string ImageId { get; set; }
public ImageType Type { get; set; }
}
}

@ -0,0 +1,35 @@
using System;
using System.IO;
using MediaBrowser.Model.Drawing;
namespace MediaBrowser.Controller.Providers
{
public class DynamicImageResponse
{
public string Path { get; set; }
public Stream Stream { get; set; }
public ImageFormat Format { get; set; }
public bool HasImage { get; set; }
public string InternalCacheKey { get; set; }
public void SetFormatFromMimeType(string mimeType)
{
if (mimeType.EndsWith("gif", StringComparison.OrdinalIgnoreCase))
{
Format = ImageFormat.Gif;
}
else if (mimeType.EndsWith("bmp", StringComparison.OrdinalIgnoreCase))
{
Format = ImageFormat.Bmp;
}
else if (mimeType.EndsWith("png", StringComparison.OrdinalIgnoreCase))
{
Format = ImageFormat.Png;
}
else
{
Format = ImageFormat.Jpg;
}
}
}
}

@ -0,0 +1,12 @@
namespace MediaBrowser.Controller.Providers
{
public class EpisodeIdentity : IItemIdentity
{
public string Type { get; set; }
public string SeriesId { get; set; }
public int? SeasonIndex { get; set; }
public int IndexNumber { get; set; }
public int? IndexNumberEnd { get; set; }
}
}

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
public class EpisodeInfo : ItemLookupInfo, IHasIdentities<EpisodeIdentity>
{
private List<EpisodeIdentity> _identities = new List<EpisodeIdentity>();
public Dictionary<string, string> SeriesProviderIds { get; set; }
public int? IndexNumberEnd { get; set; }
public int? AnimeSeriesIndex { get; set; }
public EpisodeInfo()
{
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
public IEnumerable<EpisodeIdentity> Identities
{
get { return _identities; }
}
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
{
var identifier = new ItemIdentifier<EpisodeInfo, EpisodeIdentity>();
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
}
}
}

@ -0,0 +1,15 @@
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public class ExtraInfo
{
public string Path { get; set; }
public LocationType LocationType { get; set; }
public bool IsDownloadable { get; set; }
public ExtraType ExtraType { get; set; }
}
}

@ -0,0 +1,9 @@
namespace MediaBrowser.Controller.Providers
{
public enum ExtraSource
{
Local = 1,
Metadata = 2,
Remote = 3
}
}

@ -0,0 +1,11 @@
namespace MediaBrowser.Controller.Providers
{
public class GameInfo : ItemLookupInfo
{
/// <summary>
/// Gets or sets the game system.
/// </summary>
/// <value>The game system.</value>
public string GameSystem { get; set; }
}
}

@ -0,0 +1,11 @@
namespace MediaBrowser.Controller.Providers
{
public class GameSystemInfo : ItemLookupInfo
{
/// <summary>
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
public string Path { get; set; }
}
}

@ -21,9 +21,4 @@ namespace MediaBrowser.Controller.Providers
/// <returns>Task{ItemUpdateType}.</returns>
Task<ItemUpdateType> FetchAsync(TItemType item, MetadataRefreshOptions options, CancellationToken cancellationToken);
}
public interface IPreRefreshProvider : ICustomMetadataProvider
{
}
}

@ -0,0 +1,15 @@
using System.Collections.Generic;
using System.IO;
namespace MediaBrowser.Controller.Providers
{
public interface IDirectoryService
{
IEnumerable<FileSystemInfo> GetFileSystemEntries(string path);
IEnumerable<FileSystemInfo> GetFiles(string path);
IEnumerable<FileSystemInfo> GetDirectories(string path);
IEnumerable<FileSystemInfo> GetFiles(string path, bool clearCache);
FileSystemInfo GetFile(string path);
Dictionary<string, FileSystemInfo> GetFileSystemDictionary(string path);
}
}

@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public interface IDynamicImageProvider : IImageProvider
{
/// <summary>
/// Gets the supported images.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>IEnumerable{ImageType}.</returns>
IEnumerable<ImageType> GetSupportedImages(IHasImages item);
/// <summary>
/// Gets the image.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="type">The type.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{DynamicImageResponse}.</returns>
Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken);
}
}

@ -1,5 +1,4 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
@ -18,22 +17,4 @@ namespace MediaBrowser.Controller.Providers
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
bool Supports(IHasMetadata item);
}
public enum ExtraSource
{
Local = 1,
Metadata = 2,
Remote = 3
}
public class ExtraInfo
{
public string Path { get; set; }
public LocationType LocationType { get; set; }
public bool IsDownloadable { get; set; }
public ExtraType ExtraType { get; set; }
}
}

@ -14,16 +14,4 @@ namespace MediaBrowser.Controller.Providers
/// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns>
bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date);
}
public interface IHasItemChangeMonitor
{
/// <summary>
/// Determines whether the specified item has changed.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="status">The status.</param>
/// <param name="directoryService">The directory service.</param>
/// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns>
bool HasChanged(IHasMetadata item, MetadataStatus status, IDirectoryService directoryService);
}
}

@ -0,0 +1,14 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
public interface IHasIdentities<out TIdentity>
where TIdentity : IItemIdentity
{
IEnumerable<TIdentity> Identities { get; }
Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken);
}
}

@ -0,0 +1,16 @@
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers
{
public interface IHasItemChangeMonitor
{
/// <summary>
/// Determines whether the specified item has changed.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="status">The status.</param>
/// <param name="directoryService">The directory service.</param>
/// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns>
bool HasChanged(IHasMetadata item, MetadataStatus status, IDirectoryService directoryService);
}
}

@ -0,0 +1,8 @@
namespace MediaBrowser.Controller.Providers
{
public interface IHasLookupInfo<out TLookupInfoType>
where TLookupInfoType : ItemLookupInfo, new()
{
TLookupInfoType GetLookupInfo();
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public interface IHasOrder
{
int Order { get; }
}
}

@ -0,0 +1,20 @@
using System.Collections.Generic;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public interface IImageFileSaver : IImageSaver
{
/// <summary>
/// Gets the save paths.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="type">The type.</param>
/// <param name="format">The format.</param>
/// <param name="index">The index.</param>
/// <returns>IEnumerable{System.String}.</returns>
IEnumerable<string> GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index);
}
}

@ -1,9 +1,4 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
using System.Collections.Generic;
namespace MediaBrowser.Controller.Providers
namespace MediaBrowser.Controller.Providers
{
public interface IImageSaver
{
@ -13,17 +8,4 @@ namespace MediaBrowser.Controller.Providers
/// <value>The name.</value>
string Name { get; }
}
public interface IImageFileSaver : IImageSaver
{
/// <summary>
/// Gets the save paths.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="type">The type.</param>
/// <param name="format">The format.</param>
/// <param name="index">The index.</param>
/// <returns>IEnumerable{System.String}.</returns>
IEnumerable<string> GetSavePaths(IHasImages item, ImageType type, ImageFormat format, int index);
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public interface IItemIdentity
{
string Type { get; }
}
}

@ -0,0 +1,4 @@
namespace MediaBrowser.Controller.Providers
{
public interface IItemIdentityConverter : IHasOrder { }
}

@ -0,0 +1,4 @@
namespace MediaBrowser.Controller.Providers
{
public interface IItemIdentityProvider : IHasOrder { }
}

@ -0,0 +1,10 @@
using System.Collections.Generic;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Providers
{
public interface ILocalImageFileProvider : ILocalImageProvider
{
List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService);
}
}

@ -1,13 +1,4 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
namespace MediaBrowser.Controller.Providers
{
/// <summary>
/// This is just a marker interface
@ -15,68 +6,4 @@ namespace MediaBrowser.Controller.Providers
public interface ILocalImageProvider : IImageProvider
{
}
public interface ILocalImageFileProvider : ILocalImageProvider
{
List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService);
}
public class LocalImageInfo
{
public FileSystemInfo FileInfo { get; set; }
public ImageType Type { get; set; }
}
public interface IDynamicImageProvider : IImageProvider
{
/// <summary>
/// Gets the supported images.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>IEnumerable{ImageType}.</returns>
IEnumerable<ImageType> GetSupportedImages(IHasImages item);
/// <summary>
/// Gets the image.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="type">The type.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{DynamicImageResponse}.</returns>
Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken);
}
public class DynamicImageInfo
{
public string ImageId { get; set; }
public ImageType Type { get; set; }
}
public class DynamicImageResponse
{
public string Path { get; set; }
public Stream Stream { get; set; }
public ImageFormat Format { get; set; }
public bool HasImage { get; set; }
public void SetFormatFromMimeType(string mimeType)
{
if (mimeType.EndsWith("gif", StringComparison.OrdinalIgnoreCase))
{
Format = ImageFormat.Gif;
}
else if (mimeType.EndsWith("bmp", StringComparison.OrdinalIgnoreCase))
{
Format = ImageFormat.Bmp;
}
else if (mimeType.EndsWith("png", StringComparison.OrdinalIgnoreCase))
{
Format = ImageFormat.Png;
}
else
{
Format = ImageFormat.Jpg;
}
}
}
}

@ -1,6 +1,4 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@ -24,29 +22,4 @@ namespace MediaBrowser.Controller.Providers
IDirectoryService directoryService,
CancellationToken cancellationToken);
}
public class ItemInfo
{
public string Path { get; set; }
public bool IsInMixedFolder { get; set; }
}
public class LocalMetadataResult<T>
where T : IHasMetadata
{
public bool HasMetadata { get; set; }
public T Item { get; set; }
public List<LocalImageInfo> Images { get; set; }
public List<ChapterInfo> Chapters { get; set; }
public List<UserItemData> UserDataLIst { get; set; }
public LocalMetadataResult()
{
Images = new List<LocalImageInfo>();
Chapters = new List<ChapterInfo>();
UserDataLIst = new List<UserItemData>();
}
}
}

@ -19,15 +19,4 @@ namespace MediaBrowser.Controller.Providers
where TItemType : IHasMetadata
{
}
public interface IHasOrder
{
int Order { get; }
}
public class MetadataResult<T>
{
public bool HasMetadata { get; set; }
public T Item { get; set; }
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public interface IPreRefreshProvider : ICustomMetadataProvider
{
}
}

@ -1,5 +1,4 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Providers;
using System.Collections.Generic;
using System.Threading;
@ -18,37 +17,9 @@ namespace MediaBrowser.Controller.Providers
Task<MetadataResult<TItemType>> GetMetadata(TLookupInfoType info, CancellationToken cancellationToken);
}
public interface IRemoteSearchProvider : IMetadataProvider
{
/// <summary>
/// Gets the image response.
/// </summary>
/// <param name="url">The URL.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{HttpResponseInfo}.</returns>
Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken);
}
public interface IRemoteSearchProvider<in TLookupInfoType> : IRemoteSearchProvider
where TLookupInfoType : ItemLookupInfo
{
Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TLookupInfoType searchInfo, CancellationToken cancellationToken);
}
public class RemoteSearchQuery<T>
where T : ItemLookupInfo
{
public T SearchInfo { get; set; }
/// <summary>
/// If set will only search within the given provider
/// </summary>
public string SearchProviderName { get; set; }
/// <summary>
/// Gets or sets a value indicating whether [include disabled providers].
/// </summary>
/// <value><c>true</c> if [include disabled providers]; otherwise, <c>false</c>.</value>
public bool IncludeDisabledProviders { get; set; }
}
}

@ -0,0 +1,17 @@
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Common.Net;
namespace MediaBrowser.Controller.Providers
{
public interface IRemoteSearchProvider : IMetadataProvider
{
/// <summary>
/// Gets the image response.
/// </summary>
/// <param name="url">The URL.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{HttpResponseInfo}.</returns>
Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken);
}
}

@ -7,17 +7,6 @@ using MediaBrowser.Common;
namespace MediaBrowser.Controller.Providers
{
public interface ISeriesOrderProvider
{
string OrderType { get; }
Task<int?> FindSeriesIndex(string seriesName);
}
public static class SeriesOrderTypes
{
public const string Anime = "Anime";
}
public interface ISeriesOrderManager
{
Task<int?> FindSeriesIndex(string orderType, string seriesName);

@ -0,0 +1,10 @@
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
public interface ISeriesOrderProvider
{
string OrderType { get; }
Task<int?> FindSeriesIndex(string seriesName);
}
}

@ -0,0 +1,25 @@
namespace MediaBrowser.Controller.Providers
{
public enum ImageRefreshMode
{
/// <summary>
/// The none
/// </summary>
None = 0,
/// <summary>
/// The default
/// </summary>
Default = 1,
/// <summary>
/// Existing images will be validated
/// </summary>
ValidationOnly = 2,
/// <summary>
/// All providers will be executed to search for new metadata
/// </summary>
FullRefresh = 3
}
}

@ -0,0 +1,29 @@
using System.Collections.Generic;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public class ImageRefreshOptions
{
public ImageRefreshMode ImageRefreshMode { get; set; }
public IDirectoryService DirectoryService { get; private set; }
public bool ReplaceAllImages { get; set; }
public List<ImageType> ReplaceImages { get; set; }
public ImageRefreshOptions(IDirectoryService directoryService)
{
ImageRefreshMode = ImageRefreshMode.Default;
DirectoryService = directoryService;
ReplaceImages = new List<ImageType>();
}
public bool IsReplacingImage(ImageType type)
{
return ImageRefreshMode == ImageRefreshMode.FullRefresh &&
(ReplaceAllImages || ReplaceImages.Contains(type));
}
}
}

@ -1,24 +1,7 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
public interface IItemIdentity
{
string Type { get; }
}
public interface IHasIdentities<out TIdentity>
where TIdentity : IItemIdentity
{
IEnumerable<TIdentity> Identities { get; }
Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken);
}
public interface IItemIdentityProvider : IHasOrder { }
public interface IItemIdentityProvider<in TLookupInfo, TIdentity> : IItemIdentityProvider
where TLookupInfo : ItemLookupInfo
where TIdentity : IItemIdentity
@ -26,8 +9,6 @@ namespace MediaBrowser.Controller.Providers
Task<TIdentity> FindIdentity(TLookupInfo info);
}
public interface IItemIdentityConverter : IHasOrder { }
public interface IItemIdentityConverter<TIdentity> : IItemIdentityConverter
where TIdentity : IItemIdentity
{

@ -0,0 +1,9 @@
namespace MediaBrowser.Controller.Providers
{
public class ItemInfo
{
public string Path { get; set; }
public bool IsInMixedFolder { get; set; }
}
}

@ -1,8 +1,4 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
@ -43,204 +39,4 @@ namespace MediaBrowser.Controller.Providers
ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
}
public interface IHasLookupInfo<out TLookupInfoType>
where TLookupInfoType : ItemLookupInfo, new()
{
TLookupInfoType GetLookupInfo();
}
public class ArtistInfo : ItemLookupInfo
{
public List<SongInfo> SongInfos { get; set; }
public ArtistInfo()
{
SongInfos = new List<SongInfo>();
}
}
public class AlbumInfo : ItemLookupInfo
{
/// <summary>
/// Gets or sets the album artist.
/// </summary>
/// <value>The album artist.</value>
public List<string> AlbumArtists { get; set; }
/// <summary>
/// Gets or sets the artist provider ids.
/// </summary>
/// <value>The artist provider ids.</value>
public Dictionary<string, string> ArtistProviderIds { get; set; }
public List<SongInfo> SongInfos { get; set; }
public AlbumInfo()
{
ArtistProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
SongInfos = new List<SongInfo>();
AlbumArtists = new List<string>();
}
}
public class GameInfo : ItemLookupInfo
{
/// <summary>
/// Gets or sets the game system.
/// </summary>
/// <value>The game system.</value>
public string GameSystem { get; set; }
}
public class GameSystemInfo : ItemLookupInfo
{
/// <summary>
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
public string Path { get; set; }
}
public class EpisodeInfo : ItemLookupInfo, IHasIdentities<EpisodeIdentity>
{
private List<EpisodeIdentity> _identities = new List<EpisodeIdentity>();
public Dictionary<string, string> SeriesProviderIds { get; set; }
public int? IndexNumberEnd { get; set; }
public int? AnimeSeriesIndex { get; set; }
public EpisodeInfo()
{
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
public IEnumerable<EpisodeIdentity> Identities
{
get { return _identities; }
}
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
{
var identifier = new ItemIdentifier<EpisodeInfo, EpisodeIdentity>();
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
}
}
public class EpisodeIdentity : IItemIdentity
{
public string Type { get; set; }
public string SeriesId { get; set; }
public int? SeasonIndex { get; set; }
public int IndexNumber { get; set; }
public int? IndexNumberEnd { get; set; }
}
public class SongInfo : ItemLookupInfo
{
public List<string> AlbumArtists { get; set; }
public string Album { get; set; }
public List<string> Artists { get; set; }
public SongInfo()
{
Artists = new List<string>();
AlbumArtists = new List<string>();
}
}
public class SeriesInfo : ItemLookupInfo, IHasIdentities<SeriesIdentity>
{
private List<SeriesIdentity> _identities = new List<SeriesIdentity>();
public int? AnimeSeriesIndex { get; set; }
public IEnumerable<SeriesIdentity> Identities
{
get { return _identities; }
}
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
{
var identifier = new ItemIdentifier<SeriesInfo, SeriesIdentity>();
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
}
}
public class SeriesIdentity : IItemIdentity
{
public string Type { get; set; }
public string Id { get; set; }
}
public class PersonLookupInfo : ItemLookupInfo
{
}
public class MovieInfo : ItemLookupInfo
{
}
public class BoxSetInfo : ItemLookupInfo
{
}
public class MusicVideoInfo : ItemLookupInfo
{
}
public class TrailerInfo : ItemLookupInfo
{
public bool IsLocalTrailer { get; set; }
}
public class BookInfo : ItemLookupInfo
{
public string SeriesName { get; set; }
}
public class SeasonInfo : ItemLookupInfo, IHasIdentities<SeasonIdentity>
{
private List<SeasonIdentity> _identities = new List<SeasonIdentity>();
public Dictionary<string, string> SeriesProviderIds { get; set; }
public int? AnimeSeriesIndex { get; set; }
public SeasonInfo()
{
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
public IEnumerable<SeasonIdentity> Identities
{
get { return _identities; }
}
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
{
var identifier = new ItemIdentifier<SeasonInfo, SeasonIdentity>();
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
}
}
public class SeasonIdentity : IItemIdentity
{
public string Type { get; set; }
public string SeriesId { get; set; }
public int SeasonIndex { get; set; }
}
public class ChannelItemLookupInfo : ItemLookupInfo
{
public ChannelMediaContentType ContentType { get; set; }
public ExtraType ExtraType { get; set; }
}
}

@ -0,0 +1,11 @@
using System.IO;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public class LocalImageInfo
{
public FileSystemInfo FileInfo { get; set; }
public ImageType Type { get; set; }
}
}

@ -0,0 +1,24 @@
using System.Collections.Generic;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Controller.Providers
{
public class LocalMetadataResult<T>
where T : IHasMetadata
{
public bool HasMetadata { get; set; }
public T Item { get; set; }
public List<LocalImageInfo> Images { get; set; }
public List<ChapterInfo> Chapters { get; set; }
public List<UserItemData> UserDataLIst { get; set; }
public LocalMetadataResult()
{
Images = new List<LocalImageInfo>();
Chapters = new List<ChapterInfo>();
UserDataLIst = new List<UserItemData>();
}
}
}

@ -0,0 +1,25 @@
namespace MediaBrowser.Controller.Providers
{
public enum MetadataRefreshMode
{
/// <summary>
/// The none
/// </summary>
None = 0,
/// <summary>
/// The validation only
/// </summary>
ValidationOnly = 1,
/// <summary>
/// Providers will be executed based on default rules
/// </summary>
Default = 2,
/// <summary>
/// All providers will be executed to search for new metadata
/// </summary>
FullRefresh = 3
}
}

@ -1,6 +1,4 @@
using MediaBrowser.Model.Entities;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
namespace MediaBrowser.Controller.Providers
{
@ -40,74 +38,4 @@ namespace MediaBrowser.Controller.Providers
ReplaceImages = copy.ReplaceImages.ToList();
}
}
public class ImageRefreshOptions
{
public ImageRefreshMode ImageRefreshMode { get; set; }
public IDirectoryService DirectoryService { get; private set; }
public bool ReplaceAllImages { get; set; }
public List<ImageType> ReplaceImages { get; set; }
public ImageRefreshOptions(IDirectoryService directoryService)
{
ImageRefreshMode = ImageRefreshMode.Default;
DirectoryService = directoryService;
ReplaceImages = new List<ImageType>();
}
public bool IsReplacingImage(ImageType type)
{
return ImageRefreshMode == ImageRefreshMode.FullRefresh &&
(ReplaceAllImages || ReplaceImages.Contains(type));
}
}
public enum MetadataRefreshMode
{
/// <summary>
/// The none
/// </summary>
None = 0,
/// <summary>
/// The validation only
/// </summary>
ValidationOnly = 1,
/// <summary>
/// Providers will be executed based on default rules
/// </summary>
Default = 2,
/// <summary>
/// All providers will be executed to search for new metadata
/// </summary>
FullRefresh = 3
}
public enum ImageRefreshMode
{
/// <summary>
/// The none
/// </summary>
None = 0,
/// <summary>
/// The default
/// </summary>
Default = 1,
/// <summary>
/// Existing images will be validated
/// </summary>
ValidationOnly = 2,
/// <summary>
/// All providers will be executed to search for new metadata
/// </summary>
FullRefresh = 3
}
}

@ -0,0 +1,8 @@
namespace MediaBrowser.Controller.Providers
{
public class MetadataResult<T>
{
public bool HasMetadata { get; set; }
public T Item { get; set; }
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public class MovieInfo : ItemLookupInfo
{
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public class MusicVideoInfo : ItemLookupInfo
{
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public class PersonLookupInfo : ItemLookupInfo
{
}
}

@ -0,0 +1,19 @@
namespace MediaBrowser.Controller.Providers
{
public class RemoteSearchQuery<T>
where T : ItemLookupInfo
{
public T SearchInfo { get; set; }
/// <summary>
/// If set will only search within the given provider
/// </summary>
public string SearchProviderName { get; set; }
/// <summary>
/// Gets or sets a value indicating whether [include disabled providers].
/// </summary>
/// <value><c>true</c> if [include disabled providers]; otherwise, <c>false</c>.</value>
public bool IncludeDisabledProviders { get; set; }
}
}

@ -0,0 +1,11 @@
namespace MediaBrowser.Controller.Providers
{
public class SeasonIdentity : IItemIdentity
{
public string Type { get; set; }
public string SeriesId { get; set; }
public int SeasonIndex { get; set; }
}
}

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
public class SeasonInfo : ItemLookupInfo, IHasIdentities<SeasonIdentity>
{
private List<SeasonIdentity> _identities = new List<SeasonIdentity>();
public Dictionary<string, string> SeriesProviderIds { get; set; }
public int? AnimeSeriesIndex { get; set; }
public SeasonInfo()
{
SeriesProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
public IEnumerable<SeasonIdentity> Identities
{
get { return _identities; }
}
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
{
var identifier = new ItemIdentifier<SeasonInfo, SeasonIdentity>();
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
}
}
}

@ -0,0 +1,9 @@
namespace MediaBrowser.Controller.Providers
{
public class SeriesIdentity : IItemIdentity
{
public string Type { get; set; }
public string Id { get; set; }
}
}

@ -0,0 +1,25 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Providers
{
public class SeriesInfo : ItemLookupInfo, IHasIdentities<SeriesIdentity>
{
private List<SeriesIdentity> _identities = new List<SeriesIdentity>();
public int? AnimeSeriesIndex { get; set; }
public IEnumerable<SeriesIdentity> Identities
{
get { return _identities; }
}
public async Task FindIdentities(IProviderManager providerManager, CancellationToken cancellationToken)
{
var identifier = new ItemIdentifier<SeriesInfo, SeriesIdentity>();
_identities = (await identifier.FindIdentities(this, providerManager, cancellationToken)).ToList();
}
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public static class SeriesOrderTypes
{
public const string Anime = "Anime";
}
}

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace MediaBrowser.Controller.Providers
{
public class SongInfo : ItemLookupInfo
{
public List<string> AlbumArtists { get; set; }
public string Album { get; set; }
public List<string> Artists { get; set; }
public SongInfo()
{
Artists = new List<string>();
AlbumArtists = new List<string>();
}
}
}

@ -0,0 +1,7 @@
namespace MediaBrowser.Controller.Providers
{
public class TrailerInfo : ItemLookupInfo
{
public bool IsLocalTrailer { get; set; }
}
}

@ -12,7 +12,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Providers.FolderImages
{
public class DefaultImageProvider : IRemoteImageProvider, IHasItemChangeMonitor
public class DefaultImageProvider : IRemoteImageProvider, IHasItemChangeMonitor, IHasOrder
{
private readonly IHttpClient _httpClient;
@ -123,7 +123,7 @@ namespace MediaBrowser.Providers.FolderImages
public bool Supports(IHasImages item)
{
return item is ICollectionFolder;
return item is ICollectionFolder || item is UserView;
}
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
@ -140,5 +140,14 @@ namespace MediaBrowser.Providers.FolderImages
{
return GetSupportedImages(item).Any(i => !item.HasImage(i));
}
public int Order
{
get
{
// Run after the dynamic image provider
return 1;
}
}
}
}

@ -135,17 +135,17 @@ namespace MediaBrowser.Providers.Manager
{
if (!string.IsNullOrEmpty(response.Path))
{
var mimeType = "image/" + Path.GetExtension(response.Path).TrimStart('.').ToLower();
var mimeType = MimeTypes.GetMimeType(response.Path);
var stream = _fileSystem.GetFileStream(response.Path, FileMode.Open, FileAccess.Read, FileShare.Read, true);
await _providerManager.SaveImage(item, stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
await _providerManager.SaveImage(item, stream, mimeType, imageType, null, response.InternalCacheKey, cancellationToken).ConfigureAwait(false);
}
else
{
var mimeType = "image/" + response.Format.ToString().ToLower();
await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, response.InternalCacheKey, cancellationToken).ConfigureAwait(false);
}
downloadedImages.Add(imageType);

@ -2,8 +2,8 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
@ -15,7 +15,7 @@ using System.Threading.Tasks;
namespace MediaBrowser.Server.Implementations.Photos
{
public abstract class BaseDynamicImageProvider<T> : IHasChangeMonitor, IForcedProvider, ICustomMetadataProvider<T>
public abstract class BaseDynamicImageProvider<T> : IHasChangeMonitor, IForcedProvider, IDynamicImageProvider, IHasOrder
where T : IHasMetadata
{
protected IFileSystem FileSystem { get; private set; }
@ -29,81 +29,51 @@ namespace MediaBrowser.Server.Implementations.Photos
FileSystem = fileSystem;
}
public async Task<ItemUpdateType> FetchAsync(T item, MetadataRefreshOptions options, CancellationToken cancellationToken)
public virtual bool Supports(IHasImages item)
{
if (!Supports(item))
{
return ItemUpdateType.None;
}
var primaryResult = await FetchAsync(item, ImageType.Primary, options, cancellationToken).ConfigureAwait(false);
var thumbResult = await FetchAsync(item, ImageType.Thumb, options, cancellationToken).ConfigureAwait(false);
return primaryResult | thumbResult;
return item is T;
}
protected virtual bool Supports(IHasImages item)
{
return true;
}
protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item);
private const string Version = "3";
protected string GetConfigurationCacheKey(List<BaseItem> items)
public IEnumerable<ImageType> GetSupportedImages(IHasImages item)
{
return (Version + "_" + string.Join(",", items.Select(i => i.Id.ToString("N")).ToArray())).GetMD5().ToString("N");
return new List<ImageType>
{
ImageType.Primary,
ImageType.Thumb
};
}
protected async Task<ItemUpdateType> FetchAsync(IHasImages item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken)
public async Task<DynamicImageResponse> GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken)
{
var items = await GetItemsWithImages(item).ConfigureAwait(false);
var cacheKey = GetConfigurationCacheKey(items);
if (!HasChanged(item, imageType, cacheKey))
var result = await FetchAsyncInternal(item, items, type, cacheKey, cancellationToken).ConfigureAwait(false);
return new DynamicImageResponse
{
return ItemUpdateType.None;
}
HasImage = result != null,
Stream = result,
InternalCacheKey = cacheKey,
Format = ImageFormat.Png
};
}
return await FetchAsyncInternal(item, items, imageType, cacheKey, options, cancellationToken).ConfigureAwait(false);
protected abstract Task<List<BaseItem>> GetItemsWithImages(IHasImages item);
private const string Version = "3";
protected string GetConfigurationCacheKey(List<BaseItem> items)
{
return (Version + "_" + string.Join(",", items.Select(i => i.Id.ToString("N")).ToArray())).GetMD5().ToString("N");
}
protected async Task<ItemUpdateType> FetchAsyncInternal(IHasImages item,
protected Task<Stream> FetchAsyncInternal(IHasImages item,
List<BaseItem> itemsWithImages,
ImageType imageType,
string cacheKey,
MetadataRefreshOptions options,
ImageType imageType,
string cacheKey,
CancellationToken cancellationToken)
{
var stream = await CreateImageAsync(item, itemsWithImages, imageType, 0).ConfigureAwait(false);
if (stream == null)
{
return ItemUpdateType.None;
}
if (stream is MemoryStream)
{
using (stream)
{
stream.Position = 0;
await ProviderManager.SaveImage(item, stream, "image/png", imageType, null, cacheKey, cancellationToken).ConfigureAwait(false);
}
}
else
{
using (var ms = new MemoryStream())
{
await stream.CopyToAsync(ms).ConfigureAwait(false);
ms.Position = 0;
await ProviderManager.SaveImage(item, ms, "image/png", imageType, null, cacheKey, cancellationToken).ConfigureAwait(false);
}
}
return ItemUpdateType.ImageUpdate;
return CreateImageAsync(item, itemsWithImages, imageType, 0);
}
protected Task<Stream> GetThumbCollage(List<BaseItem> items)
@ -137,9 +107,9 @@ namespace MediaBrowser.Server.Implementations.Photos
get { return "Dynamic Image Provider"; }
}
public async Task<Stream> CreateImageAsync(IHasImages item,
public async Task<Stream> CreateImageAsync(IHasImages item,
List<BaseItem> itemsWithImages,
ImageType imageType,
ImageType imageType,
int imageIndex)
{
if (itemsWithImages.Count == 0)
@ -209,5 +179,14 @@ namespace MediaBrowser.Server.Implementations.Photos
return weekNo;
}
public int Order
{
get
{
// Run before the default image provider which will download placeholders
return 0;
}
}
}
}

@ -115,7 +115,7 @@ namespace MediaBrowser.Server.Implementations.Photos
return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary)).ToList());
}
protected override bool Supports(IHasImages item)
public override bool Supports(IHasImages item)
{
var view = item as UserView;

Loading…
Cancel
Save