浏览代码

update default image providers

Luke Pulverenti 10 年之前
父节点
当前提交
caadb4f374
共有 63 个文件被更改,包括 756 次插入584 次删除
  1. 45 0
      MediaBrowser.Controller/MediaBrowser.Controller.csproj
  2. 28 0
      MediaBrowser.Controller/Providers/AlbumInfo.cs
  3. 14 0
      MediaBrowser.Controller/Providers/ArtistInfo.cs
  4. 7 0
      MediaBrowser.Controller/Providers/BookInfo.cs
  5. 7 0
      MediaBrowser.Controller/Providers/BoxSetInfo.cs
  6. 11 0
      MediaBrowser.Controller/Providers/ChannelItemLookupInfo.cs
  7. 0 10
      MediaBrowser.Controller/Providers/DirectoryService.cs
  8. 10 0
      MediaBrowser.Controller/Providers/DynamicImageInfo.cs
  9. 35 0
      MediaBrowser.Controller/Providers/DynamicImageResponse.cs
  10. 12 0
      MediaBrowser.Controller/Providers/EpisodeIdentity.cs
  11. 34 0
      MediaBrowser.Controller/Providers/EpisodeInfo.cs
  12. 15 0
      MediaBrowser.Controller/Providers/ExtraInfo.cs
  13. 9 0
      MediaBrowser.Controller/Providers/ExtraSource.cs
  14. 11 0
      MediaBrowser.Controller/Providers/GameInfo.cs
  15. 11 0
      MediaBrowser.Controller/Providers/GameSystemInfo.cs
  16. 0 5
      MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs
  17. 15 0
      MediaBrowser.Controller/Providers/IDirectoryService.cs
  18. 27 0
      MediaBrowser.Controller/Providers/IDynamicImageProvider.cs
  19. 0 19
      MediaBrowser.Controller/Providers/IExtrasProvider.cs
  20. 0 12
      MediaBrowser.Controller/Providers/IHasChangeMonitor.cs
  21. 14 0
      MediaBrowser.Controller/Providers/IHasIdentities.cs
  22. 16 0
      MediaBrowser.Controller/Providers/IHasItemChangeMonitor.cs
  23. 8 0
      MediaBrowser.Controller/Providers/IHasLookupInfo.cs
  24. 7 0
      MediaBrowser.Controller/Providers/IHasOrder.cs
  25. 20 0
      MediaBrowser.Controller/Providers/IImageFileSaver.cs
  26. 1 19
      MediaBrowser.Controller/Providers/IImageSaver.cs
  27. 7 0
      MediaBrowser.Controller/Providers/IItemIdentity.cs
  28. 4 0
      MediaBrowser.Controller/Providers/IItemIdentityConverter.cs
  29. 4 0
      MediaBrowser.Controller/Providers/IItemIdentityProvider.cs
  30. 10 0
      MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs
  31. 1 74
      MediaBrowser.Controller/Providers/ILocalImageProvider.cs
  32. 0 27
      MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs
  33. 0 11
      MediaBrowser.Controller/Providers/IMetadataProvider.cs
  34. 7 0
      MediaBrowser.Controller/Providers/IPreRefreshProvider.cs
  35. 1 30
      MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs
  36. 17 0
      MediaBrowser.Controller/Providers/IRemoteSearchProvider.cs
  37. 0 11
      MediaBrowser.Controller/Providers/ISeriesOrderManager.cs
  38. 10 0
      MediaBrowser.Controller/Providers/ISeriesOrderProvider.cs
  39. 25 0
      MediaBrowser.Controller/Providers/ImageRefreshMode.cs
  40. 29 0
      MediaBrowser.Controller/Providers/ImageRefreshOptions.cs
  41. 1 20
      MediaBrowser.Controller/Providers/ItemIdentities.cs
  42. 9 0
      MediaBrowser.Controller/Providers/ItemInfo.cs
  43. 1 205
      MediaBrowser.Controller/Providers/ItemLookupInfo.cs
  44. 11 0
      MediaBrowser.Controller/Providers/LocalImageInfo.cs
  45. 24 0
      MediaBrowser.Controller/Providers/LocalMetadataResult.cs
  46. 25 0
      MediaBrowser.Controller/Providers/MetadataRefreshMode.cs
  47. 1 73
      MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs
  48. 8 0
      MediaBrowser.Controller/Providers/MetadataResult.cs
  49. 7 0
      MediaBrowser.Controller/Providers/MovieInfo.cs
  50. 7 0
      MediaBrowser.Controller/Providers/MusicVideoInfo.cs
  51. 7 0
      MediaBrowser.Controller/Providers/PersonLookupInfo.cs
  52. 19 0
      MediaBrowser.Controller/Providers/RemoteSearchQuery.cs
  53. 11 0
      MediaBrowser.Controller/Providers/SeasonIdentity.cs
  54. 32 0
      MediaBrowser.Controller/Providers/SeasonInfo.cs
  55. 9 0
      MediaBrowser.Controller/Providers/SeriesIdentity.cs
  56. 25 0
      MediaBrowser.Controller/Providers/SeriesInfo.cs
  57. 7 0
      MediaBrowser.Controller/Providers/SeriesOrderTypes.cs
  58. 17 0
      MediaBrowser.Controller/Providers/SongInfo.cs
  59. 7 0
      MediaBrowser.Controller/Providers/TrailerInfo.cs
  60. 11 2
      MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs
  61. 3 3
      MediaBrowser.Providers/Manager/ItemImageProvider.cs
  62. 41 62
      MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
  63. 1 1
      MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs

+ 45 - 0
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -247,22 +247,67 @@
     <Compile Include="Persistence\MediaStreamQuery.cs" />
     <Compile Include="Persistence\MediaStreamQuery.cs" />
     <Compile Include="Playlists\IPlaylistManager.cs" />
     <Compile Include="Playlists\IPlaylistManager.cs" />
     <Compile Include="Playlists\Playlist.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\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\ICustomMetadataProvider.cs" />
+    <Compile Include="Providers\IDirectoryService.cs" />
+    <Compile Include="Providers\IDynamicImageProvider.cs" />
     <Compile Include="Providers\IExternalId.cs" />
     <Compile Include="Providers\IExternalId.cs" />
     <Compile Include="Providers\IExtrasProvider.cs" />
     <Compile Include="Providers\IExtrasProvider.cs" />
     <Compile Include="Providers\IForcedProvider.cs" />
     <Compile Include="Providers\IForcedProvider.cs" />
     <Compile Include="Providers\IHasChangeMonitor.cs" />
     <Compile Include="Providers\IHasChangeMonitor.cs" />
     <Compile Include="Entities\IHasMetadata.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\IImageProvider.cs" />
     <Compile Include="Providers\IImageSaver.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\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\IProviderRepository.cs" />
     <Compile Include="Providers\IRemoteImageProvider.cs" />
     <Compile Include="Providers\IRemoteImageProvider.cs" />
     <Compile Include="Providers\ILocalImageProvider.cs" />
     <Compile Include="Providers\ILocalImageProvider.cs" />
     <Compile Include="Providers\IMetadataProvider.cs" />
     <Compile Include="Providers\IMetadataProvider.cs" />
     <Compile Include="Providers\IMetadataService.cs" />
     <Compile Include="Providers\IMetadataService.cs" />
     <Compile Include="Providers\IRemoteMetadataProvider.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="Providers\VideoContentType.cs" />
     <Compile Include="RelatedMedia\IRelatedMediaProvider.cs" />
     <Compile Include="RelatedMedia\IRelatedMediaProvider.cs" />
     <Compile Include="Security\AuthenticationInfo.cs" />
     <Compile Include="Security\AuthenticationInfo.cs" />

+ 28 - 0
MediaBrowser.Controller/Providers/AlbumInfo.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>();
+        }
+    }
+}

+ 14 - 0
MediaBrowser.Controller/Providers/ArtistInfo.cs

@@ -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>();
+        }
+    }
+}

+ 7 - 0
MediaBrowser.Controller/Providers/BookInfo.cs

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

+ 7 - 0
MediaBrowser.Controller/Providers/BoxSetInfo.cs

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

+ 11 - 0
MediaBrowser.Controller/Providers/ChannelItemLookupInfo.cs

@@ -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; }
+    }
+}

+ 0 - 10
MediaBrowser.Controller/Providers/DirectoryService.cs

@@ -7,16 +7,6 @@ using System.Linq;
 
 
 namespace MediaBrowser.Controller.Providers
 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
     public class DirectoryService : IDirectoryService
     {
     {
         private readonly ILogger _logger;
         private readonly ILogger _logger;

+ 10 - 0
MediaBrowser.Controller/Providers/DynamicImageInfo.cs

@@ -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; }
+    }
+}

+ 35 - 0
MediaBrowser.Controller/Providers/DynamicImageResponse.cs

@@ -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;
+            }
+        }
+    }
+}

+ 12 - 0
MediaBrowser.Controller/Providers/EpisodeIdentity.cs

@@ -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; }
+    }
+}

+ 34 - 0
MediaBrowser.Controller/Providers/EpisodeInfo.cs

@@ -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();
+        }
+    }
+}

+ 15 - 0
MediaBrowser.Controller/Providers/ExtraInfo.cs

@@ -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; }
+    }
+}

+ 9 - 0
MediaBrowser.Controller/Providers/ExtraSource.cs

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

+ 11 - 0
MediaBrowser.Controller/Providers/GameInfo.cs

@@ -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; }
+    }
+}

+ 11 - 0
MediaBrowser.Controller/Providers/GameSystemInfo.cs

@@ -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; }
+    }
+}

+ 0 - 5
MediaBrowser.Controller/Providers/ICustomMetadataProvider.cs

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

+ 15 - 0
MediaBrowser.Controller/Providers/IDirectoryService.cs

@@ -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);
+    }
+}

+ 27 - 0
MediaBrowser.Controller/Providers/IDynamicImageProvider.cs

@@ -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);
+    }
+}

+ 0 - 19
MediaBrowser.Controller/Providers/IExtrasProvider.cs

@@ -1,5 +1,4 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Entities;
 
 
 namespace MediaBrowser.Controller.Providers
 namespace MediaBrowser.Controller.Providers
 {
 {
@@ -18,22 +17,4 @@ namespace MediaBrowser.Controller.Providers
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
         bool Supports(IHasMetadata item);
         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; }
-    }
 }
 }

+ 0 - 12
MediaBrowser.Controller/Providers/IHasChangeMonitor.cs

@@ -14,16 +14,4 @@ namespace MediaBrowser.Controller.Providers
         /// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns>
         /// <returns><c>true</c> if the specified item has changed; otherwise, <c>false</c>.</returns>
         bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date);
         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);
-    }
 }
 }

+ 14 - 0
MediaBrowser.Controller/Providers/IHasIdentities.cs

@@ -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);
+    }
+}

+ 16 - 0
MediaBrowser.Controller/Providers/IHasItemChangeMonitor.cs

@@ -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);
+    }
+}

+ 8 - 0
MediaBrowser.Controller/Providers/IHasLookupInfo.cs

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

+ 7 - 0
MediaBrowser.Controller/Providers/IHasOrder.cs

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

+ 20 - 0
MediaBrowser.Controller/Providers/IImageFileSaver.cs

@@ -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 - 19
MediaBrowser.Controller/Providers/IImageSaver.cs

@@ -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
     public interface IImageSaver
     {
     {
@@ -13,17 +8,4 @@ namespace MediaBrowser.Controller.Providers
         /// <value>The name.</value>
         /// <value>The name.</value>
         string Name { get; }
         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);
-    }
 }
 }

+ 7 - 0
MediaBrowser.Controller/Providers/IItemIdentity.cs

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

+ 4 - 0
MediaBrowser.Controller/Providers/IItemIdentityConverter.cs

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

+ 4 - 0
MediaBrowser.Controller/Providers/IItemIdentityProvider.cs

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

+ 10 - 0
MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs

@@ -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 - 74
MediaBrowser.Controller/Providers/ILocalImageProvider.cs

@@ -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>
     /// <summary>
     /// This is just a marker interface
     /// This is just a marker interface
@@ -15,68 +6,4 @@ namespace MediaBrowser.Controller.Providers
     public interface ILocalImageProvider : IImageProvider
     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;
-            }
-        }
-    }
 }
 }

+ 0 - 27
MediaBrowser.Controller/Providers/ILocalMetadataProvider.cs

@@ -1,6 +1,4 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
-using MediaBrowser.Model.Entities;
-using System.Collections.Generic;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
@@ -24,29 +22,4 @@ namespace MediaBrowser.Controller.Providers
             IDirectoryService directoryService,
             IDirectoryService directoryService,
             CancellationToken cancellationToken);
             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>();
-        }
-    }
 }
 }

+ 0 - 11
MediaBrowser.Controller/Providers/IMetadataProvider.cs

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

+ 7 - 0
MediaBrowser.Controller/Providers/IPreRefreshProvider.cs

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

+ 1 - 30
MediaBrowser.Controller/Providers/IRemoteMetadataProvider.cs

@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Providers;
 using MediaBrowser.Model.Providers;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Threading;
 using System.Threading;
@@ -18,37 +17,9 @@ namespace MediaBrowser.Controller.Providers
         Task<MetadataResult<TItemType>> GetMetadata(TLookupInfoType info, CancellationToken cancellationToken);
         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
     public interface IRemoteSearchProvider<in TLookupInfoType> : IRemoteSearchProvider
         where TLookupInfoType : ItemLookupInfo
         where TLookupInfoType : ItemLookupInfo
     {
     {
         Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TLookupInfoType searchInfo, CancellationToken cancellationToken);
         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; }
-    }
 }
 }

+ 17 - 0
MediaBrowser.Controller/Providers/IRemoteSearchProvider.cs

@@ -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);
+    }
+}

+ 0 - 11
MediaBrowser.Controller/Providers/ISeriesOrderManager.cs

@@ -7,17 +7,6 @@ using MediaBrowser.Common;
 
 
 namespace MediaBrowser.Controller.Providers
 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
     public interface ISeriesOrderManager
     {
     {
         Task<int?> FindSeriesIndex(string orderType, string seriesName);
         Task<int?> FindSeriesIndex(string orderType, string seriesName);

+ 10 - 0
MediaBrowser.Controller/Providers/ISeriesOrderProvider.cs

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

+ 25 - 0
MediaBrowser.Controller/Providers/ImageRefreshMode.cs

@@ -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
+    }
+}

+ 29 - 0
MediaBrowser.Controller/Providers/ImageRefreshOptions.cs

@@ -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 - 20
MediaBrowser.Controller/Providers/ItemIdentities.cs

@@ -1,24 +1,7 @@
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Controller.Providers
 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
     public interface IItemIdentityProvider<in TLookupInfo, TIdentity> : IItemIdentityProvider
         where TLookupInfo : ItemLookupInfo
         where TLookupInfo : ItemLookupInfo
         where TIdentity : IItemIdentity
         where TIdentity : IItemIdentity
@@ -26,8 +9,6 @@ namespace MediaBrowser.Controller.Providers
         Task<TIdentity> FindIdentity(TLookupInfo info);
         Task<TIdentity> FindIdentity(TLookupInfo info);
     }
     }
 
 
-    public interface IItemIdentityConverter : IHasOrder { }
-
     public interface IItemIdentityConverter<TIdentity> : IItemIdentityConverter
     public interface IItemIdentityConverter<TIdentity> : IItemIdentityConverter
         where TIdentity : IItemIdentity
         where TIdentity : IItemIdentity
     {
     {

+ 9 - 0
MediaBrowser.Controller/Providers/ItemInfo.cs

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

+ 1 - 205
MediaBrowser.Controller/Providers/ItemLookupInfo.cs

@@ -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;
 using System.Collections.Generic;
 using System.Collections.Generic;
 
 
@@ -43,204 +39,4 @@ namespace MediaBrowser.Controller.Providers
             ProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
             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; }
-    }
 }
 }

+ 11 - 0
MediaBrowser.Controller/Providers/LocalImageInfo.cs

@@ -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; }
+    }
+}

+ 24 - 0
MediaBrowser.Controller/Providers/LocalMetadataResult.cs

@@ -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>();
+        }
+    }
+}

+ 25 - 0
MediaBrowser.Controller/Providers/MetadataRefreshMode.cs

@@ -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 - 73
MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs

@@ -1,6 +1,4 @@
-using MediaBrowser.Model.Entities;
-using System.Collections.Generic;
-using System.Linq;
+using System.Linq;
 
 
 namespace MediaBrowser.Controller.Providers
 namespace MediaBrowser.Controller.Providers
 {
 {
@@ -40,74 +38,4 @@ namespace MediaBrowser.Controller.Providers
             ReplaceImages = copy.ReplaceImages.ToList();
             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
-    }
 }
 }

+ 8 - 0
MediaBrowser.Controller/Providers/MetadataResult.cs

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

+ 7 - 0
MediaBrowser.Controller/Providers/MovieInfo.cs

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

+ 7 - 0
MediaBrowser.Controller/Providers/MusicVideoInfo.cs

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

+ 7 - 0
MediaBrowser.Controller/Providers/PersonLookupInfo.cs

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

+ 19 - 0
MediaBrowser.Controller/Providers/RemoteSearchQuery.cs

@@ -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; }
+    }
+}

+ 11 - 0
MediaBrowser.Controller/Providers/SeasonIdentity.cs

@@ -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; }
+    }
+}

+ 32 - 0
MediaBrowser.Controller/Providers/SeasonInfo.cs

@@ -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();
+        }
+    }
+}

+ 9 - 0
MediaBrowser.Controller/Providers/SeriesIdentity.cs

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

+ 25 - 0
MediaBrowser.Controller/Providers/SeriesInfo.cs

@@ -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();
+        }
+    }
+}

+ 7 - 0
MediaBrowser.Controller/Providers/SeriesOrderTypes.cs

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

+ 17 - 0
MediaBrowser.Controller/Providers/SongInfo.cs

@@ -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>();
+        }
+    }
+}

+ 7 - 0
MediaBrowser.Controller/Providers/TrailerInfo.cs

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

+ 11 - 2
MediaBrowser.Providers/FolderImages/DefaultImageProvider.cs

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

+ 3 - 3
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -135,17 +135,17 @@ namespace MediaBrowser.Providers.Manager
                         {
                         {
                             if (!string.IsNullOrEmpty(response.Path))
                             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);
                                 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
                             else
                             {
                             {
                                 var mimeType = "image/" + response.Format.ToString().ToLower();
                                 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);
                             downloadedImages.Add(imageType);

+ 41 - 62
MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs

@@ -2,8 +2,8 @@
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Common.IO;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Drawing;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
@@ -15,7 +15,7 @@ using System.Threading.Tasks;
 
 
 namespace MediaBrowser.Server.Implementations.Photos
 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
         where T : IHasMetadata
     {
     {
         protected IFileSystem FileSystem { get; private set; }
         protected IFileSystem FileSystem { get; private set; }
@@ -29,81 +29,51 @@ namespace MediaBrowser.Server.Implementations.Photos
             FileSystem = fileSystem;
             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 items = await GetItemsWithImages(item).ConfigureAwait(false);
             var cacheKey = GetConfigurationCacheKey(items);
             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,
             List<BaseItem> itemsWithImages,
-            ImageType imageType, 
-            string cacheKey, 
-            MetadataRefreshOptions options, 
+            ImageType imageType,
+            string cacheKey,
             CancellationToken cancellationToken)
             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)
         protected Task<Stream> GetThumbCollage(List<BaseItem> items)
@@ -137,9 +107,9 @@ namespace MediaBrowser.Server.Implementations.Photos
             get { return "Dynamic Image Provider"; }
             get { return "Dynamic Image Provider"; }
         }
         }
 
 
-        public async Task<Stream> CreateImageAsync(IHasImages item, 
+        public async Task<Stream> CreateImageAsync(IHasImages item,
             List<BaseItem> itemsWithImages,
             List<BaseItem> itemsWithImages,
-            ImageType imageType, 
+            ImageType imageType,
             int imageIndex)
             int imageIndex)
         {
         {
             if (itemsWithImages.Count == 0)
             if (itemsWithImages.Count == 0)
@@ -209,5 +179,14 @@ namespace MediaBrowser.Server.Implementations.Photos
 
 
             return weekNo;
             return weekNo;
         }
         }
+
+        public int Order
+        {
+            get
+            {
+                // Run before the default image provider which will download placeholders
+                return 0;
+            }
+        }
     }
     }
 }
 }

+ 1 - 1
MediaBrowser.Server.Implementations/Photos/DynamicImageProvider.cs

@@ -115,7 +115,7 @@ namespace MediaBrowser.Server.Implementations.Photos
             return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary)).ToList());
             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;
             var view = item as UserView;