From 52aeb3c40b3e2f0fdc377ac7c793714add2be0ef Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 7 Aug 2017 17:06:13 -0400 Subject: [PATCH 1/4] consolidate interfaces --- Emby.Drawing/ImageProcessor.cs | 16 +- .../Channels/ChannelImageProvider.cs | 8 +- .../Collections/CollectionImageProvider.cs | 6 +- Emby.Server.Implementations/Dto/DtoService.cs | 4 +- .../Images/BaseDynamicImageProvider.cs | 28 +- .../Library/LibraryManager.cs | 2 +- .../LiveTv/ChannelImageProvider.cs | 6 +- .../LiveTv/LiveTvDtoService.cs | 2 +- .../LiveTv/RecordingImageProvider.cs | 6 +- .../MediaEncoder/EncodingManager.cs | 2 +- .../Photos/PhotoAlbumImageProvider.cs | 4 +- .../Playlists/PlaylistImageProvider.cs | 10 +- .../CollectionFolderImageProvider.cs | 16 +- .../UserViews/DynamicImageProvider.cs | 8 +- MediaBrowser.Api/Images/ImageService.cs | 10 +- .../Drawing/IImageProcessor.cs | 8 +- .../Drawing/ImageHelper.cs | 2 +- .../Drawing/ImageProcessingOptions.cs | 2 +- .../Drawing/ImageProcessorExtensions.cs | 4 +- MediaBrowser.Controller/Dto/IDtoService.cs | 4 +- MediaBrowser.Controller/Entities/BaseItem.cs | 2 +- .../Entities/IHasImages.cs | 260 ------------------ .../Entities/IHasMetadata.cs | 253 ++++++++++++++++- .../Library/ILibraryManager.cs | 2 +- .../LiveTv/ILiveTvRecording.cs | 2 +- .../MediaBrowser.Controller.csproj | 1 - .../Providers/IDynamicImageProvider.cs | 4 +- .../Providers/IImageEnhancer.cs | 8 +- .../Providers/IImageProvider.cs | 2 +- .../Providers/ILocalImageFileProvider.cs | 2 +- .../Providers/IProviderManager.cs | 12 +- .../Providers/IRemoteImageProvider.cs | 4 +- .../Images/CollectionFolderImageProvider.cs | 4 +- .../Images/EpisodeLocalImageProvider.cs | 4 +- .../Images/ImagesByNameImageProvider.cs | 4 +- .../InternalMetadataFolderImageProvider.cs | 4 +- .../Images/LocalImageProvider.cs | 16 +- .../BoxSets/MovieDbBoxSetImageProvider.cs | 6 +- .../ImagesByName/ImageUtils.cs | 2 +- MediaBrowser.Providers/Manager/ImageSaver.cs | 16 +- .../Manager/ItemImageProvider.cs | 30 +- .../Manager/ProviderManager.cs | 24 +- .../MediaInfo/AudioImageProvider.cs | 6 +- .../MediaInfo/VideoImageProvider.cs | 6 +- .../Movies/FanartMovieImageProvider.cs | 6 +- .../Movies/MovieDbImageProvider.cs | 6 +- .../Music/AlbumImageFromSongProvider.cs | 6 +- .../Music/AudioDbAlbumImageProvider.cs | 6 +- .../Music/AudioDbArtistImageProvider.cs | 6 +- .../Music/FanArtAlbumProvider.cs | 6 +- .../Music/FanArtArtistProvider.cs | 6 +- .../Omdb/OmdbImageProvider.cs | 6 +- .../People/MovieDbPersonImageProvider.cs | 6 +- .../People/TvdbPersonImageProvider.cs | 6 +- .../Studios/StudiosImageProvider.cs | 10 +- .../TV/FanArt/FanArtSeasonProvider.cs | 6 +- .../TV/FanArt/FanartSeriesProvider.cs | 6 +- .../TheMovieDb/MovieDbEpisodeImageProvider.cs | 6 +- .../TheMovieDb/MovieDbSeriesImageProvider.cs | 6 +- .../TV/TheTVDB/TvdbEpisodeImageProvider.cs | 6 +- .../TV/TheTVDB/TvdbSeasonImageProvider.cs | 6 +- .../TV/TheTVDB/TvdbSeriesImageProvider.cs | 6 +- 62 files changed, 462 insertions(+), 472 deletions(-) delete mode 100644 MediaBrowser.Controller/Entities/IHasImages.cs diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs index 88ead3a5fc..cc7b77de6d 100644 --- a/Emby.Drawing/ImageProcessor.cs +++ b/Emby.Drawing/ImageProcessor.cs @@ -186,7 +186,7 @@ namespace Emby.Drawing } var originalImage = options.Image; - IHasImages item = options.Item; + IHasMetadata item = options.Item; if (!originalImage.IsLocalFile) { @@ -606,7 +606,7 @@ namespace Emby.Drawing /// The image. /// Guid. /// item - public string GetImageCacheTag(IHasImages item, ItemImageInfo image) + public string GetImageCacheTag(IHasMetadata item, ItemImageInfo image) { if (item == null) { @@ -631,7 +631,7 @@ namespace Emby.Drawing /// The image enhancers. /// Guid. /// item - public string GetImageCacheTag(IHasImages item, ItemImageInfo image, List imageEnhancers) + public string GetImageCacheTag(IHasMetadata item, ItemImageInfo image, List imageEnhancers) { if (item == null) { @@ -672,7 +672,7 @@ namespace Emby.Drawing /// Type of the image. /// Index of the image. /// Task{System.String}. - public async Task GetEnhancedImage(IHasImages item, ImageType imageType, int imageIndex) + public async Task GetEnhancedImage(IHasMetadata item, ImageType imageType, int imageIndex) { var enhancers = GetSupportedEnhancers(item, imageType).ToList(); @@ -684,7 +684,7 @@ namespace Emby.Drawing } private async Task> GetEnhancedImage(ItemImageInfo image, - IHasImages item, + IHasMetadata item, int imageIndex, List enhancers) { @@ -729,7 +729,7 @@ namespace Emby.Drawing /// item /// private async Task GetEnhancedImageInternal(string originalImagePath, - IHasImages item, + IHasMetadata item, ImageType imageType, int imageIndex, IEnumerable supportedEnhancers, @@ -783,7 +783,7 @@ namespace Emby.Drawing /// Type of the image. /// Index of the image. /// Task{EnhancedImage}. - private async Task ExecuteImageEnhancers(IEnumerable imageEnhancers, string inputPath, string outputPath, IHasImages item, ImageType imageType, int imageIndex) + private async Task ExecuteImageEnhancers(IEnumerable imageEnhancers, string inputPath, string outputPath, IHasMetadata item, ImageType imageType, int imageIndex) { // Run the enhancers sequentially in order of priority foreach (var enhancer in imageEnhancers) @@ -868,7 +868,7 @@ namespace Emby.Drawing _logger.Info("Completed creation of image collage and saved to {0}", options.OutputPath); } - public IEnumerable GetSupportedEnhancers(IHasImages item, ImageType imageType) + public IEnumerable GetSupportedEnhancers(IHasMetadata item, ImageType imageType) { return ImageEnhancers.Where(i => { diff --git a/Emby.Server.Implementations/Channels/ChannelImageProvider.cs b/Emby.Server.Implementations/Channels/ChannelImageProvider.cs index f892b1e620..0c363c585f 100644 --- a/Emby.Server.Implementations/Channels/ChannelImageProvider.cs +++ b/Emby.Server.Implementations/Channels/ChannelImageProvider.cs @@ -18,12 +18,12 @@ namespace Emby.Server.Implementations.Channels _channelManager = channelManager; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return GetChannel(item).GetSupportedChannelImages(); } - public Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + public Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) { var channel = GetChannel(item); @@ -35,12 +35,12 @@ namespace Emby.Server.Implementations.Channels get { return "Channel Image Provider"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Channel; } - private IChannel GetChannel(IHasImages item) + private IChannel GetChannel(IHasMetadata item) { var channel = (Channel)item; diff --git a/Emby.Server.Implementations/Collections/CollectionImageProvider.cs b/Emby.Server.Implementations/Collections/CollectionImageProvider.cs index 463d276e5e..c7378956dd 100644 --- a/Emby.Server.Implementations/Collections/CollectionImageProvider.cs +++ b/Emby.Server.Implementations/Collections/CollectionImageProvider.cs @@ -21,7 +21,7 @@ namespace Emby.Server.Implementations.Collections { } - protected override bool Supports(IHasImages item) + protected override bool Supports(IHasMetadata item) { // Right now this is the only way to prevent this image from getting created ahead of internet image providers if (!item.IsLocked) @@ -32,7 +32,7 @@ namespace Emby.Server.Implementations.Collections return base.Supports(item); } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var playlist = (BoxSet)item; @@ -76,7 +76,7 @@ namespace Emby.Server.Implementations.Collections return GetFinalItems(items, 2); } - protected override string CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); } diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index 80576742e2..daa5ff642c 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -1581,12 +1581,12 @@ namespace Emby.Server.Implementations.Dto /// The dto. /// The item. /// Task. - public void AttachPrimaryImageAspectRatio(IItemDto dto, IHasImages item) + public void AttachPrimaryImageAspectRatio(IItemDto dto, IHasMetadata item) { dto.PrimaryImageAspectRatio = GetPrimaryImageAspectRatio(item); } - public double? GetPrimaryImageAspectRatio(IHasImages item) + public double? GetPrimaryImageAspectRatio(IHasMetadata item) { var imageInfo = item.GetImageInfo(ImageType.Primary, 0); diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index b8ce23a42f..8e6f63f722 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -37,12 +37,12 @@ namespace Emby.Server.Implementations.Images ImageProcessor = imageProcessor; } - protected virtual bool Supports(IHasImages item) + protected virtual bool Supports(IHasMetadata item) { return true; } - public virtual IEnumerable GetSupportedImages(IHasImages item) + public virtual IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -51,7 +51,7 @@ namespace Emby.Server.Implementations.Images }; } - private IEnumerable GetEnabledImages(IHasImages item) + private IEnumerable GetEnabledImages(IHasMetadata item) { //var options = ProviderManager.GetMetadataOptions(item); @@ -84,7 +84,7 @@ namespace Emby.Server.Implementations.Images return updateType; } - protected async Task FetchAsync(IHasImages item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken) + protected async Task FetchAsync(IHasMetadata item, ImageType imageType, MetadataRefreshOptions options, CancellationToken cancellationToken) { var image = item.GetImageInfo(imageType, 0); @@ -106,7 +106,7 @@ namespace Emby.Server.Implementations.Images return await FetchToFileInternal(item, items, imageType, cancellationToken).ConfigureAwait(false); } - protected async Task FetchToFileInternal(IHasImages item, + protected async Task FetchToFileInternal(IHasMetadata item, List itemsWithImages, ImageType imageType, CancellationToken cancellationToken) @@ -132,14 +132,14 @@ namespace Emby.Server.Implementations.Images return ItemUpdateType.ImageUpdate; } - protected abstract List GetItemsWithImages(IHasImages item); + protected abstract List GetItemsWithImages(IHasMetadata item); - protected string CreateThumbCollage(IHasImages primaryItem, List items, string outputPath) + protected string CreateThumbCollage(IHasMetadata primaryItem, List items, string outputPath) { return CreateCollage(primaryItem, items, outputPath, 640, 360); } - protected virtual IEnumerable GetStripCollageImagePaths(IHasImages primaryItem, IEnumerable items) + protected virtual IEnumerable GetStripCollageImagePaths(IHasMetadata primaryItem, IEnumerable items) { return items .Select(i => @@ -161,22 +161,22 @@ namespace Emby.Server.Implementations.Images .Where(i => !string.IsNullOrWhiteSpace(i)); } - protected string CreatePosterCollage(IHasImages primaryItem, List items, string outputPath) + protected string CreatePosterCollage(IHasMetadata primaryItem, List items, string outputPath) { return CreateCollage(primaryItem, items, outputPath, 400, 600); } - protected string CreateSquareCollage(IHasImages primaryItem, List items, string outputPath) + protected string CreateSquareCollage(IHasMetadata primaryItem, List items, string outputPath) { return CreateCollage(primaryItem, items, outputPath, 600, 600); } - protected string CreateThumbCollage(IHasImages primaryItem, List items, string outputPath, int width, int height) + protected string CreateThumbCollage(IHasMetadata primaryItem, List items, string outputPath, int width, int height) { return CreateCollage(primaryItem, items, outputPath, width, height); } - private string CreateCollage(IHasImages primaryItem, List items, string outputPath, int width, int height) + private string CreateCollage(IHasMetadata primaryItem, List items, string outputPath, int width, int height) { FileSystem.CreateDirectory(FileSystem.GetDirectoryName(outputPath)); @@ -207,7 +207,7 @@ namespace Emby.Server.Implementations.Images get { return "Dynamic Image Provider"; } } - protected virtual string CreateImage(IHasImages item, + protected virtual string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, @@ -267,7 +267,7 @@ namespace Emby.Server.Implementations.Images return false; } - protected bool HasChanged(IHasImages item, ImageType type) + protected bool HasChanged(IHasMetadata item, ImageType type) { var image = item.GetImageInfo(type, 0); diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 9588b648e7..5c7dc2507c 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -2856,7 +2856,7 @@ namespace Emby.Server.Implementations.Library return ItemRepository.UpdatePeople(item.Id, people); } - public async Task ConvertImageToLocal(IHasImages item, ItemImageInfo image, int imageIndex) + public async Task ConvertImageToLocal(IHasMetadata item, ItemImageInfo image, int imageIndex) { foreach (var url in image.Path.Split('|')) { diff --git a/Emby.Server.Implementations/LiveTv/ChannelImageProvider.cs b/Emby.Server.Implementations/LiveTv/ChannelImageProvider.cs index 95cefd9990..0c8049d8b1 100644 --- a/Emby.Server.Implementations/LiveTv/ChannelImageProvider.cs +++ b/Emby.Server.Implementations/LiveTv/ChannelImageProvider.cs @@ -28,12 +28,12 @@ namespace Emby.Server.Implementations.LiveTv _appHost = appHost; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new[] { ImageType.Primary }; } - public async Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + public async Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) { var liveTvItem = (LiveTvChannel)item; @@ -67,7 +67,7 @@ namespace Emby.Server.Implementations.LiveTv get { return "Live TV Service Provider"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is LiveTvChannel; } diff --git a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs index 5c50721922..f8ebdd05a6 100644 --- a/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs +++ b/Emby.Server.Implementations/LiveTv/LiveTvDtoService.cs @@ -406,7 +406,7 @@ namespace Emby.Server.Implementations.LiveTv return dto; } - internal string GetImageTag(IHasImages info) + internal string GetImageTag(IHasMetadata info) { try { diff --git a/Emby.Server.Implementations/LiveTv/RecordingImageProvider.cs b/Emby.Server.Implementations/LiveTv/RecordingImageProvider.cs index 47663bdbc5..992badbb53 100644 --- a/Emby.Server.Implementations/LiveTv/RecordingImageProvider.cs +++ b/Emby.Server.Implementations/LiveTv/RecordingImageProvider.cs @@ -19,12 +19,12 @@ namespace Emby.Server.Implementations.LiveTv _liveTvManager = liveTvManager; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new[] { ImageType.Primary }; } - public async Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + public async Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) { var liveTvItem = (ILiveTvRecording)item; @@ -58,7 +58,7 @@ namespace Emby.Server.Implementations.LiveTv get { return "Live TV Service Provider"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is ILiveTvRecording; } diff --git a/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs b/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs index 2cfa4601a6..884f46f1fb 100644 --- a/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs +++ b/Emby.Server.Implementations/MediaEncoder/EncodingManager.cs @@ -45,7 +45,7 @@ namespace Emby.Server.Implementations.MediaEncoder /// Gets the chapter images data path. /// /// The chapter images data path. - private string GetChapterImagesPath(IHasImages item) + private string GetChapterImagesPath(IHasMetadata item) { return Path.Combine(item.GetInternalMetadataPath(), "chapters"); } diff --git a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs index 17f9b491dc..e232854251 100644 --- a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs +++ b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs @@ -18,7 +18,7 @@ namespace Emby.Server.Implementations.Photos { } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var photoAlbum = (PhotoAlbum)item; var items = GetFinalItems(photoAlbum.Children.ToList()); @@ -26,7 +26,7 @@ namespace Emby.Server.Implementations.Photos return items; } - protected override string CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); } diff --git a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs index 127ce24ae4..f5d0e314e8 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs @@ -27,7 +27,7 @@ namespace Emby.Server.Implementations.Playlists { } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var playlist = (Playlist)item; @@ -81,7 +81,7 @@ namespace Emby.Server.Implementations.Playlists _libraryManager = libraryManager; } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var items = _libraryManager.GetItemList(new InternalItemsQuery { @@ -98,7 +98,7 @@ namespace Emby.Server.Implementations.Playlists return GetFinalItems(items); } - //protected override Task CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + //protected override Task CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) //{ // return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); //} @@ -113,7 +113,7 @@ namespace Emby.Server.Implementations.Playlists _libraryManager = libraryManager; } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var items = _libraryManager.GetItemList(new InternalItemsQuery { @@ -130,7 +130,7 @@ namespace Emby.Server.Implementations.Playlists return GetFinalItems(items); } - //protected override Task CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + //protected override Task CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) //{ // return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary); //} diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs index 863391eea1..ac5bd128aa 100644 --- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs @@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.UserViews { } - public override IEnumerable GetSupportedImages(IHasImages item) + public override IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -36,7 +36,7 @@ namespace Emby.Server.Implementations.UserViews }; } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var view = (CollectionFolder)item; @@ -94,12 +94,12 @@ namespace Emby.Server.Implementations.UserViews return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); } - protected override bool Supports(IHasImages item) + protected override bool Supports(IHasMetadata item) { return item is CollectionFolder; } - protected override string CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png"); @@ -126,7 +126,7 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable GetSupportedImages(IHasImages item) + public override IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -134,7 +134,7 @@ namespace Emby.Server.Implementations.UserViews }; } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var view = (ManualCollectionsFolder)item; @@ -152,12 +152,12 @@ namespace Emby.Server.Implementations.UserViews return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); } - protected override bool Supports(IHasImages item) + protected override bool Supports(IHasMetadata item) { return item is ManualCollectionsFolder; } - protected override string CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { var outputPath = Path.ChangeExtension(outputPathWithoutExtension, ".png"); diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs index 5230da8a66..6805080aa6 100644 --- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -31,7 +31,7 @@ namespace Emby.Server.Implementations.UserViews _libraryManager = libraryManager; } - public override IEnumerable GetSupportedImages(IHasImages item) + public override IEnumerable GetSupportedImages(IHasMetadata item) { var view = (UserView)item; if (IsUsingCollectionStrip(view)) @@ -48,7 +48,7 @@ namespace Emby.Server.Implementations.UserViews }; } - protected override List GetItemsWithImages(IHasImages item) + protected override List GetItemsWithImages(IHasMetadata item) { var view = (UserView)item; @@ -139,7 +139,7 @@ namespace Emby.Server.Implementations.UserViews return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary)).ToList()); } - protected override bool Supports(IHasImages item) + protected override bool Supports(IHasMetadata item) { var view = item as UserView; if (view != null) @@ -163,7 +163,7 @@ namespace Emby.Server.Implementations.UserViews return collectionStripViewTypes.Contains(view.ViewType ?? string.Empty); } - protected override string CreateImage(IHasImages item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) + protected override string CreateImage(IHasMetadata item, List itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex) { if (itemsWithImages.Count == 0) { diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index f6c97e0919..a360e11833 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -312,7 +312,7 @@ namespace MediaBrowser.Api.Images return list; } - private ImageInfo GetImageInfo(IHasImages item, ItemImageInfo info, int? imageIndex) + private ImageInfo GetImageInfo(IHasMetadata item, ItemImageInfo info, int? imageIndex) { try { @@ -507,7 +507,7 @@ namespace MediaBrowser.Api.Images /// Index of the current. /// The new index. /// Task. - private Task UpdateItemIndex(IHasImages item, ImageType type, int currentIndex, int newIndex) + private Task UpdateItemIndex(IHasMetadata item, ImageType type, int currentIndex, int newIndex) { return item.SwapImages(type, currentIndex, newIndex); } @@ -520,7 +520,7 @@ namespace MediaBrowser.Api.Images /// if set to true [is head request]. /// System.Object. /// - public Task GetImage(ImageRequest request, IHasImages item, bool isHeadRequest) + public Task GetImage(ImageRequest request, IHasMetadata item, bool isHeadRequest) { if (request.PercentPlayed.HasValue) { @@ -603,7 +603,7 @@ namespace MediaBrowser.Api.Images isHeadRequest); } - private async Task GetImageResult(IHasImages item, + private async Task GetImageResult(IHasMetadata item, ImageRequest request, ItemImageInfo image, bool cropwhitespace, @@ -749,7 +749,7 @@ namespace MediaBrowser.Api.Images /// The request. /// The item. /// System.String. - private ItemImageInfo GetImageInfo(ImageRequest request, IHasImages item) + private ItemImageInfo GetImageInfo(ImageRequest request, IHasMetadata item) { var index = request.Index ?? 0; diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs index 2832462a8d..29363f4927 100644 --- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs +++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs @@ -54,7 +54,7 @@ namespace MediaBrowser.Controller.Drawing /// The item. /// Type of the image. /// IEnumerable{IImageEnhancer}. - IEnumerable GetSupportedEnhancers(IHasImages item, ImageType imageType); + IEnumerable GetSupportedEnhancers(IHasMetadata item, ImageType imageType); /// /// Gets the image cache tag. @@ -62,7 +62,7 @@ namespace MediaBrowser.Controller.Drawing /// The item. /// The image. /// Guid. - string GetImageCacheTag(IHasImages item, ItemImageInfo image); + string GetImageCacheTag(IHasMetadata item, ItemImageInfo image); /// /// Gets the image cache tag. @@ -71,7 +71,7 @@ namespace MediaBrowser.Controller.Drawing /// The image. /// The image enhancers. /// Guid. - string GetImageCacheTag(IHasImages item, ItemImageInfo image, List imageEnhancers); + string GetImageCacheTag(IHasMetadata item, ItemImageInfo image, List imageEnhancers); /// /// Processes the image. @@ -95,7 +95,7 @@ namespace MediaBrowser.Controller.Drawing /// Type of the image. /// Index of the image. /// Task{System.String}. - Task GetEnhancedImage(IHasImages item, ImageType imageType, int imageIndex); + Task GetEnhancedImage(IHasMetadata item, ImageType imageType, int imageIndex); /// /// Gets the supported image output formats. diff --git a/MediaBrowser.Controller/Drawing/ImageHelper.cs b/MediaBrowser.Controller/Drawing/ImageHelper.cs index 54f2ff987a..9452446a14 100644 --- a/MediaBrowser.Controller/Drawing/ImageHelper.cs +++ b/MediaBrowser.Controller/Drawing/ImageHelper.cs @@ -48,7 +48,7 @@ namespace MediaBrowser.Controller.Drawing return new ImageSize(widthValue, height); } - private static double GetEstimatedAspectRatio(ImageType type, IHasImages item) + private static double GetEstimatedAspectRatio(ImageType type, IHasMetadata item) { switch (type) { diff --git a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs index cfb3a97eea..fac21c7445 100644 --- a/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs +++ b/MediaBrowser.Controller/Drawing/ImageProcessingOptions.cs @@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Drawing { public string ItemId { get; set; } public string ItemType { get; set; } - public IHasImages Item { get; set; } + public IHasMetadata Item { get; set; } public ItemImageInfo Image { get; set; } diff --git a/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs b/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs index c5601c49f4..5dfa94e1ea 100644 --- a/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs +++ b/MediaBrowser.Controller/Drawing/ImageProcessorExtensions.cs @@ -5,12 +5,12 @@ namespace MediaBrowser.Controller.Drawing { public static class ImageProcessorExtensions { - public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType) + public static string GetImageCacheTag(this IImageProcessor processor, IHasMetadata item, ImageType imageType) { return processor.GetImageCacheTag(item, imageType, 0); } - public static string GetImageCacheTag(this IImageProcessor processor, IHasImages item, ImageType imageType, int imageIndex) + public static string GetImageCacheTag(this IImageProcessor processor, IHasMetadata item, ImageType imageType, int imageIndex) { var imageInfo = item.GetImageInfo(imageType, imageIndex); diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs index a6f807ce9d..963092f522 100644 --- a/MediaBrowser.Controller/Dto/IDtoService.cs +++ b/MediaBrowser.Controller/Dto/IDtoService.cs @@ -24,14 +24,14 @@ namespace MediaBrowser.Controller.Dto /// /// The dto. /// The item. - void AttachPrimaryImageAspectRatio(IItemDto dto, IHasImages item); + void AttachPrimaryImageAspectRatio(IItemDto dto, IHasMetadata item); /// /// Gets the primary image aspect ratio. /// /// The item. /// System.Nullable<System.Double>. - double? GetPrimaryImageAspectRatio(IHasImages item); + double? GetPrimaryImageAspectRatio(IHasMetadata item); /// /// Gets the base item dto. diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index cb345439a5..7c375b9373 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -39,7 +39,7 @@ namespace MediaBrowser.Controller.Entities /// /// Class BaseItem /// - public abstract class BaseItem : IHasProviderIds, IHasImages, IHasUserData, IHasMetadata, IHasLookupInfo + public abstract class BaseItem : IHasMetadata, IHasLookupInfo { protected BaseItem() { diff --git a/MediaBrowser.Controller/Entities/IHasImages.cs b/MediaBrowser.Controller/Entities/IHasImages.cs deleted file mode 100644 index 6d56b1525f..0000000000 --- a/MediaBrowser.Controller/Entities/IHasImages.cs +++ /dev/null @@ -1,260 +0,0 @@ -using MediaBrowser.Controller.Providers; -using MediaBrowser.Model.Entities; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -using MediaBrowser.Controller.IO; -using MediaBrowser.Controller.Library; -using MediaBrowser.Model.IO; - -namespace MediaBrowser.Controller.Entities -{ - public interface IHasImages : IHasProviderIds, IHasUserData - { - /// - /// Gets the name. - /// - /// The name. - string Name { get; set; } - - /// - /// Gets the path. - /// - /// The path. - string Path { get; set; } - - /// - /// Gets the file name without extension. - /// - /// The file name without extension. - string FileNameWithoutExtension { get; } - - /// - /// Gets the type of the location. - /// - /// The type of the location. - LocationType LocationType { get; } - - /// - /// Gets the locked fields. - /// - /// The locked fields. - List LockedFields { get; } - - /// - /// Gets the images. - /// - /// Type of the image. - /// IEnumerable{ItemImageInfo}. - IEnumerable GetImages(ImageType imageType); - - /// - /// Gets the image path. - /// - /// Type of the image. - /// Index of the image. - /// System.String. - string GetImagePath(ImageType imageType, int imageIndex); - - /// - /// Gets the image information. - /// - /// Type of the image. - /// Index of the image. - /// ItemImageInfo. - ItemImageInfo GetImageInfo(ImageType imageType, int imageIndex); - - /// - /// Sets the image. - /// - /// The type. - /// The index. - /// The file. - void SetImagePath(ImageType type, int index, FileSystemMetadata file); - - /// - /// Determines whether the specified type has image. - /// - /// The type. - /// Index of the image. - /// true if the specified type has image; otherwise, false. - bool HasImage(ImageType type, int imageIndex); - - /// - /// Allowses the multiple images. - /// - /// The type. - /// true if XXXX, false otherwise. - bool AllowsMultipleImages(ImageType type); - - /// - /// Swaps the images. - /// - /// The type. - /// The index1. - /// The index2. - /// Task. - Task SwapImages(ImageType type, int index1, int index2); - - /// - /// Gets or sets the primary image path. - /// - /// The primary image path. - string PrimaryImagePath { get; } - - /// - /// Gets the preferred metadata language. - /// - /// System.String. - string GetPreferredMetadataLanguage(); - - /// - /// Validates the images and returns true or false indicating if any were removed. - /// - bool ValidateImages(IDirectoryService directoryService); - - /// - /// Gets a value indicating whether this instance is owned item. - /// - /// true if this instance is owned item; otherwise, false. - bool IsOwnedItem { get; } - - /// - /// Gets the containing folder path. - /// - /// The containing folder path. - string ContainingFolderPath { get; } - - /// - /// Adds the images. - /// - /// Type of the image. - /// The images. - /// true if XXXX, false otherwise. - bool AddImages(ImageType imageType, List images); - - /// - /// Determines whether [is save local metadata enabled]. - /// - /// true if [is save local metadata enabled]; otherwise, false. - bool IsSaveLocalMetadataEnabled(); - - /// - /// Gets a value indicating whether [supports local metadata]. - /// - /// true if [supports local metadata]; otherwise, false. - bool SupportsLocalMetadata { get; } - - bool IsInMixedFolder { get; } - - /// - /// Gets a value indicating whether this instance is locked. - /// - /// true if this instance is locked; otherwise, false. - bool IsLocked { get; } - - /// - /// Gets a value indicating whether [supports remote image downloading]. - /// - /// true if [supports remote image downloading]; otherwise, false. - bool SupportsRemoteImageDownloading { get; } - - /// - /// Gets the internal metadata path. - /// - /// System.String. - string GetInternalMetadataPath(); - - /// - /// Gets a value indicating whether [always scan internal metadata path]. - /// - /// true if [always scan internal metadata path]; otherwise, false. - bool AlwaysScanInternalMetadataPath { get; } - - /// - /// Determines whether [is internet metadata enabled]. - /// - /// true if [is internet metadata enabled]; otherwise, false. - bool IsInternetMetadataEnabled(); - - /// - /// Removes the image. - /// - /// The image. - void RemoveImage(ItemImageInfo image); - - /// - /// Updates to repository. - /// - /// The update reason. - /// The cancellation token. - /// Task. - Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); - - /// - /// Sets the image. - /// - /// The image. - /// The index. - void SetImage(ItemImageInfo image, int index); - - double? GetDefaultPrimaryImageAspectRatio(); - - int? ProductionYear { get; set; } - - List Tags { get; set; } - } - - public static class HasImagesExtensions - { - /// - /// Gets the image path. - /// - /// The item. - /// Type of the image. - /// System.String. - public static string GetImagePath(this IHasImages item, ImageType imageType) - { - return item.GetImagePath(imageType, 0); - } - - public static bool HasImage(this IHasImages item, ImageType imageType) - { - return item.HasImage(imageType, 0); - } - - /// - /// Sets the image path. - /// - /// The item. - /// Type of the image. - /// The file. - public static void SetImagePath(this IHasImages item, ImageType imageType, FileSystemMetadata file) - { - item.SetImagePath(imageType, 0, file); - } - - /// - /// Sets the image path. - /// - /// The item. - /// Type of the image. - /// The file. - public static void SetImagePath(this IHasImages item, ImageType imageType, string file) - { - if (file.StartsWith("http", System.StringComparison.OrdinalIgnoreCase)) - { - item.SetImage(new ItemImageInfo - { - Path = file, - Type = imageType - }, 0); - } - else - { - item.SetImagePath(imageType, BaseItem.FileSystem.GetFileInfo(file)); - } - } - } -} diff --git a/MediaBrowser.Controller/Entities/IHasMetadata.cs b/MediaBrowser.Controller/Entities/IHasMetadata.cs index 1d2e23a6cf..a76f2fec34 100644 --- a/MediaBrowser.Controller/Entities/IHasMetadata.cs +++ b/MediaBrowser.Controller/Entities/IHasMetadata.cs @@ -1,12 +1,18 @@ using System; using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers; +using MediaBrowser.Model.Entities; +using MediaBrowser.Model.IO; namespace MediaBrowser.Controller.Entities { /// /// Interface IHasMetadata /// - public interface IHasMetadata : IHasImages + public interface IHasMetadata : IHasProviderIds, IHasUserData { /// /// Gets the preferred metadata country code. @@ -65,5 +71,250 @@ namespace MediaBrowser.Controller.Entities int InheritedParentalRatingValue { get; set; } List GetInheritedTags(); long? RunTimeTicks { get; set; } + + /// + /// Gets the name. + /// + /// The name. + string Name { get; set; } + + /// + /// Gets the path. + /// + /// The path. + string Path { get; set; } + + /// + /// Gets the file name without extension. + /// + /// The file name without extension. + string FileNameWithoutExtension { get; } + + /// + /// Gets the type of the location. + /// + /// The type of the location. + LocationType LocationType { get; } + + /// + /// Gets the locked fields. + /// + /// The locked fields. + List LockedFields { get; } + + /// + /// Gets the images. + /// + /// Type of the image. + /// IEnumerable{ItemImageInfo}. + IEnumerable GetImages(ImageType imageType); + + /// + /// Gets the image path. + /// + /// Type of the image. + /// Index of the image. + /// System.String. + string GetImagePath(ImageType imageType, int imageIndex); + + /// + /// Gets the image information. + /// + /// Type of the image. + /// Index of the image. + /// ItemImageInfo. + ItemImageInfo GetImageInfo(ImageType imageType, int imageIndex); + + /// + /// Sets the image. + /// + /// The type. + /// The index. + /// The file. + void SetImagePath(ImageType type, int index, FileSystemMetadata file); + + /// + /// Determines whether the specified type has image. + /// + /// The type. + /// Index of the image. + /// true if the specified type has image; otherwise, false. + bool HasImage(ImageType type, int imageIndex); + + /// + /// Allowses the multiple images. + /// + /// The type. + /// true if XXXX, false otherwise. + bool AllowsMultipleImages(ImageType type); + + /// + /// Swaps the images. + /// + /// The type. + /// The index1. + /// The index2. + /// Task. + Task SwapImages(ImageType type, int index1, int index2); + + /// + /// Gets or sets the primary image path. + /// + /// The primary image path. + string PrimaryImagePath { get; } + + /// + /// Gets the preferred metadata language. + /// + /// System.String. + string GetPreferredMetadataLanguage(); + + /// + /// Validates the images and returns true or false indicating if any were removed. + /// + bool ValidateImages(IDirectoryService directoryService); + + /// + /// Gets a value indicating whether this instance is owned item. + /// + /// true if this instance is owned item; otherwise, false. + bool IsOwnedItem { get; } + + /// + /// Gets the containing folder path. + /// + /// The containing folder path. + string ContainingFolderPath { get; } + + /// + /// Adds the images. + /// + /// Type of the image. + /// The images. + /// true if XXXX, false otherwise. + bool AddImages(ImageType imageType, List images); + + /// + /// Determines whether [is save local metadata enabled]. + /// + /// true if [is save local metadata enabled]; otherwise, false. + bool IsSaveLocalMetadataEnabled(); + + /// + /// Gets a value indicating whether [supports local metadata]. + /// + /// true if [supports local metadata]; otherwise, false. + bool SupportsLocalMetadata { get; } + + bool IsInMixedFolder { get; } + + /// + /// Gets a value indicating whether this instance is locked. + /// + /// true if this instance is locked; otherwise, false. + bool IsLocked { get; } + + /// + /// Gets a value indicating whether [supports remote image downloading]. + /// + /// true if [supports remote image downloading]; otherwise, false. + bool SupportsRemoteImageDownloading { get; } + + /// + /// Gets the internal metadata path. + /// + /// System.String. + string GetInternalMetadataPath(); + + /// + /// Gets a value indicating whether [always scan internal metadata path]. + /// + /// true if [always scan internal metadata path]; otherwise, false. + bool AlwaysScanInternalMetadataPath { get; } + + /// + /// Determines whether [is internet metadata enabled]. + /// + /// true if [is internet metadata enabled]; otherwise, false. + bool IsInternetMetadataEnabled(); + + /// + /// Removes the image. + /// + /// The image. + void RemoveImage(ItemImageInfo image); + + /// + /// Updates to repository. + /// + /// The update reason. + /// The cancellation token. + /// Task. + Task UpdateToRepository(ItemUpdateType updateReason, CancellationToken cancellationToken); + + /// + /// Sets the image. + /// + /// The image. + /// The index. + void SetImage(ItemImageInfo image, int index); + + double? GetDefaultPrimaryImageAspectRatio(); + + int? ProductionYear { get; set; } + + List Tags { get; set; } + } + + public static class HasMetadataExtensions + { + /// + /// Gets the image path. + /// + /// The item. + /// Type of the image. + /// System.String. + public static string GetImagePath(this IHasMetadata item, ImageType imageType) + { + return item.GetImagePath(imageType, 0); + } + + public static bool HasImage(this IHasMetadata item, ImageType imageType) + { + return item.HasImage(imageType, 0); + } + + /// + /// Sets the image path. + /// + /// The item. + /// Type of the image. + /// The file. + public static void SetImagePath(this IHasMetadata item, ImageType imageType, FileSystemMetadata file) + { + item.SetImagePath(imageType, 0, file); + } + + /// + /// Sets the image path. + /// + /// The item. + /// Type of the image. + /// The file. + public static void SetImagePath(this IHasMetadata item, ImageType imageType, string file) + { + if (file.StartsWith("http", System.StringComparison.OrdinalIgnoreCase)) + { + item.SetImage(new ItemImageInfo + { + Path = file, + Type = imageType + }, 0); + } + else + { + item.SetImagePath(imageType, BaseItem.FileSystem.GetFileInfo(file)); + } + } } } diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs index b726c267c6..bf2ebac841 100644 --- a/MediaBrowser.Controller/Library/ILibraryManager.cs +++ b/MediaBrowser.Controller/Library/ILibraryManager.cs @@ -520,7 +520,7 @@ namespace MediaBrowser.Controller.Library /// The image. /// Index of the image. /// Task. - Task ConvertImageToLocal(IHasImages item, ItemImageInfo image, int imageIndex); + Task ConvertImageToLocal(IHasMetadata item, ItemImageInfo image, int imageIndex); /// /// Gets the items. diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs index 1bbd1a0082..27ff334ee2 100644 --- a/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs +++ b/MediaBrowser.Controller/LiveTv/ILiveTvRecording.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace MediaBrowser.Controller.LiveTv { - public interface ILiveTvRecording : IHasImages, IHasMediaSources, IHasUserData, IHasStartDate, IHasProgramAttributes + public interface ILiveTvRecording : IHasMetadata, IHasMediaSources, IHasUserData, IHasStartDate, IHasProgramAttributes { string ServiceName { get; set; } string ExternalId { get; set; } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index e5fbf599a0..b72b9027ec 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -99,7 +99,6 @@ - diff --git a/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs b/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs index 9c3f947637..e96a2d65e8 100644 --- a/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs +++ b/MediaBrowser.Controller/Providers/IDynamicImageProvider.cs @@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Providers /// /// The item. /// IEnumerable{ImageType}. - IEnumerable GetSupportedImages(IHasImages item); + IEnumerable GetSupportedImages(IHasMetadata item); /// /// Gets the image. @@ -22,6 +22,6 @@ namespace MediaBrowser.Controller.Providers /// The type. /// The cancellation token. /// Task{DynamicImageResponse}. - Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken); + Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken); } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IImageEnhancer.cs b/MediaBrowser.Controller/Providers/IImageEnhancer.cs index a43941607e..a993f536d9 100644 --- a/MediaBrowser.Controller/Providers/IImageEnhancer.cs +++ b/MediaBrowser.Controller/Providers/IImageEnhancer.cs @@ -13,7 +13,7 @@ namespace MediaBrowser.Controller.Providers /// The item. /// Type of the image. /// true if this enhancer will enhance the supplied image for the supplied item, false otherwise - bool Supports(IHasImages item, ImageType imageType); + bool Supports(IHasMetadata item, ImageType imageType); /// /// Gets the priority or order in which this enhancer should be run. @@ -27,7 +27,7 @@ namespace MediaBrowser.Controller.Providers /// The item. /// Type of the image. /// Cache key relating to the current state of this item and configuration - string GetConfigurationCacheKey(IHasImages item, ImageType imageType); + string GetConfigurationCacheKey(IHasMetadata item, ImageType imageType); /// /// Gets the size of the enhanced image. @@ -37,7 +37,7 @@ namespace MediaBrowser.Controller.Providers /// Index of the image. /// Size of the original image. /// ImageSize. - ImageSize GetEnhancedImageSize(IHasImages item, ImageType imageType, int imageIndex, ImageSize originalImageSize); + ImageSize GetEnhancedImageSize(IHasMetadata item, ImageType imageType, int imageIndex, ImageSize originalImageSize); /// /// Enhances the image async. @@ -49,6 +49,6 @@ namespace MediaBrowser.Controller.Providers /// Index of the image. /// Task{Image}. /// - Task EnhanceImageAsync(IHasImages item, string inputFile, string outputFile, ImageType imageType, int imageIndex); + Task EnhanceImageAsync(IHasMetadata item, string inputFile, string outputFile, ImageType imageType, int imageIndex); } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IImageProvider.cs b/MediaBrowser.Controller/Providers/IImageProvider.cs index 1e5bdfeafc..2b43c9cb8f 100644 --- a/MediaBrowser.Controller/Providers/IImageProvider.cs +++ b/MediaBrowser.Controller/Providers/IImageProvider.cs @@ -18,6 +18,6 @@ namespace MediaBrowser.Controller.Providers /// /// The item. /// true if XXXX, false otherwise - bool Supports(IHasImages item); + bool Supports(IHasMetadata item); } } diff --git a/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs b/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs index 7e5d828437..e93c73a523 100644 --- a/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs +++ b/MediaBrowser.Controller/Providers/ILocalImageFileProvider.cs @@ -5,6 +5,6 @@ namespace MediaBrowser.Controller.Providers { public interface ILocalImageFileProvider : ILocalImageProvider { - List GetImages(IHasImages item, IDirectoryService directoryService); + List GetImages(IHasMetadata item, IDirectoryService directoryService); } } \ No newline at end of file diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs index 0ba573da8b..703666d668 100644 --- a/MediaBrowser.Controller/Providers/IProviderManager.cs +++ b/MediaBrowser.Controller/Providers/IProviderManager.cs @@ -50,7 +50,7 @@ namespace MediaBrowser.Controller.Providers /// Index of the image. /// The cancellation token. /// Task. - Task SaveImage(IHasImages item, string url, ImageType type, int? imageIndex, CancellationToken cancellationToken); + Task SaveImage(IHasMetadata item, string url, ImageType type, int? imageIndex, CancellationToken cancellationToken); /// /// Saves the image. @@ -62,13 +62,13 @@ namespace MediaBrowser.Controller.Providers /// Index of the image. /// The cancellation token. /// Task. - Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken); + Task SaveImage(IHasMetadata item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken); /// /// Saves the image. /// /// Task. - Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken); + Task SaveImage(IHasMetadata item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken); /// /// Adds the metadata providers. @@ -84,14 +84,14 @@ namespace MediaBrowser.Controller.Providers /// The query. /// The cancellation token. /// Task{IEnumerable{RemoteImageInfo}}. - Task> GetAvailableRemoteImages(IHasImages item, RemoteImageQuery query, CancellationToken cancellationToken); + Task> GetAvailableRemoteImages(IHasMetadata item, RemoteImageQuery query, CancellationToken cancellationToken); /// /// Gets the image providers. /// /// The item. /// IEnumerable{ImageProviderInfo}. - IEnumerable GetRemoteImageProviderInfo(IHasImages item); + IEnumerable GetRemoteImageProviderInfo(IHasMetadata item); /// /// Gets all metadata plugins. @@ -135,7 +135,7 @@ namespace MediaBrowser.Controller.Providers /// /// The item. /// MetadataOptions. - MetadataOptions GetMetadataOptions(IHasImages item); + MetadataOptions GetMetadataOptions(IHasMetadata item); /// /// Gets the remote search results. diff --git a/MediaBrowser.Controller/Providers/IRemoteImageProvider.cs b/MediaBrowser.Controller/Providers/IRemoteImageProvider.cs index 6b94547bba..86a7939e60 100644 --- a/MediaBrowser.Controller/Providers/IRemoteImageProvider.cs +++ b/MediaBrowser.Controller/Providers/IRemoteImageProvider.cs @@ -18,7 +18,7 @@ namespace MediaBrowser.Controller.Providers /// /// The item. /// IEnumerable{ImageType}. - IEnumerable GetSupportedImages(IHasImages item); + IEnumerable GetSupportedImages(IHasMetadata item); /// /// Gets the images. @@ -26,7 +26,7 @@ namespace MediaBrowser.Controller.Providers /// The item. /// The cancellation token. /// Task{IEnumerable{RemoteImageInfo}}. - Task> GetImages(IHasImages item, CancellationToken cancellationToken); + Task> GetImages(IHasMetadata item, CancellationToken cancellationToken); /// /// Gets the image response. diff --git a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs index 954e0c3223..4ec2eeeb15 100644 --- a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs @@ -21,7 +21,7 @@ namespace MediaBrowser.LocalMetadata.Images get { return "Collection Folder Images"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is CollectionFolder && item.SupportsLocalMetadata; } @@ -35,7 +35,7 @@ namespace MediaBrowser.LocalMetadata.Images } } - public List GetImages(IHasImages item, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, IDirectoryService directoryService) { var collectionFolder = (CollectionFolder)item; diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs index 2b5858aec4..881d2a85a8 100644 --- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs @@ -31,12 +31,12 @@ namespace MediaBrowser.LocalMetadata.Images get { return 0; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Episode && item.SupportsLocalMetadata; } - public List GetImages(IHasImages item, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, IDirectoryService directoryService) { var parentPath = _fileSystem.GetDirectoryName(item.Path); diff --git a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs index 83554f0447..db57dcbfd7 100644 --- a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.LocalMetadata.Images get { return "Images By Name"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is CollectionFolder; } @@ -39,7 +39,7 @@ namespace MediaBrowser.LocalMetadata.Images } } - public List GetImages(IHasImages item, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, IDirectoryService directoryService) { var name = _fileSystem.GetValidFilename(item.Name); diff --git a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs index 47579f870e..469a31442e 100644 --- a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs @@ -26,7 +26,7 @@ namespace MediaBrowser.LocalMetadata.Images get { return "Internal Images"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { if (item is Photo) { @@ -61,7 +61,7 @@ namespace MediaBrowser.LocalMetadata.Images } } - public List GetImages(IHasImages item, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, IDirectoryService directoryService) { var path = item.GetInternalMetadataPath(); diff --git a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs index 51572d20cd..643c37427b 100644 --- a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs @@ -32,7 +32,7 @@ namespace MediaBrowser.LocalMetadata.Images get { return 0; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { if (item.SupportsLocalMetadata) { @@ -63,7 +63,7 @@ namespace MediaBrowser.LocalMetadata.Images return false; } - private IEnumerable GetFiles(IHasImages item, bool includeDirectories, IDirectoryService directoryService) + private IEnumerable GetFiles(IHasMetadata item, bool includeDirectories, IDirectoryService directoryService) { if (item.LocationType != LocationType.FileSystem) { @@ -85,7 +85,7 @@ namespace MediaBrowser.LocalMetadata.Images .OrderBy(i => BaseItem.SupportedImageExtensionsList.IndexOf(i.Extension ?? string.Empty)); } - public List GetImages(IHasImages item, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, IDirectoryService directoryService) { var files = GetFiles(item, true, directoryService).ToList(); @@ -96,12 +96,12 @@ namespace MediaBrowser.LocalMetadata.Images return list; } - public List GetImages(IHasImages item, string path, bool isPathInMediaFolder, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, string path, bool isPathInMediaFolder, IDirectoryService directoryService) { return GetImages(item, new[] { path }, isPathInMediaFolder, directoryService); } - public List GetImages(IHasImages item, IEnumerable paths, bool arePathsInMediaFolders, IDirectoryService directoryService) + public List GetImages(IHasMetadata item, IEnumerable paths, bool arePathsInMediaFolders, IDirectoryService directoryService) { IEnumerable files; @@ -131,7 +131,7 @@ namespace MediaBrowser.LocalMetadata.Images return list; } - private void PopulateImages(IHasImages item, List images, List files, bool supportParentSeriesFiles, IDirectoryService directoryService) + private void PopulateImages(IHasMetadata item, List images, List files, bool supportParentSeriesFiles, IDirectoryService directoryService) { if (supportParentSeriesFiles) { @@ -179,7 +179,7 @@ namespace MediaBrowser.LocalMetadata.Images PopulateScreenshots(images, files, imagePrefix, isInMixedFolder); } - private void PopulatePrimaryImages(IHasImages item, List images, List files, string imagePrefix, bool isInMixedFolder) + private void PopulatePrimaryImages(IHasMetadata item, List images, List files, string imagePrefix, bool isInMixedFolder) { var names = new List { @@ -231,7 +231,7 @@ namespace MediaBrowser.LocalMetadata.Images } } - private void PopulateBackdrops(IHasImages item, List images, List files, string imagePrefix, bool isInMixedFolder, IDirectoryService directoryService) + private void PopulateBackdrops(IHasMetadata item, List images, List files, string imagePrefix, bool isInMixedFolder, IDirectoryService directoryService) { if (!string.IsNullOrEmpty(item.Path)) { diff --git a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs index 852feab37c..4ee1826ada 100644 --- a/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs +++ b/MediaBrowser.Providers/BoxSets/MovieDbBoxSetImageProvider.cs @@ -33,12 +33,12 @@ namespace MediaBrowser.Providers.BoxSets get { return "TheMovieDb"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is BoxSet; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -47,7 +47,7 @@ namespace MediaBrowser.Providers.BoxSets }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var tmdbId = item.GetProviderId(MetadataProviders.Tmdb); diff --git a/MediaBrowser.Providers/ImagesByName/ImageUtils.cs b/MediaBrowser.Providers/ImagesByName/ImageUtils.cs index 499fd2e0b3..74c01fb5c6 100644 --- a/MediaBrowser.Providers/ImagesByName/ImageUtils.cs +++ b/MediaBrowser.Providers/ImagesByName/ImageUtils.cs @@ -53,7 +53,7 @@ namespace MediaBrowser.Providers.ImagesByName return file; } - public static string FindMatch(IHasImages item, IEnumerable images) + public static string FindMatch(IHasMetadata item, IEnumerable images) { var name = GetComparableName(item.Name); diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs index 2bf2d0ac75..384a911de5 100644 --- a/MediaBrowser.Providers/Manager/ImageSaver.cs +++ b/MediaBrowser.Providers/Manager/ImageSaver.cs @@ -67,12 +67,12 @@ namespace MediaBrowser.Providers.Manager /// The cancellation token. /// Task. /// mimeType - public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken) + public Task SaveImage(IHasMetadata item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken) { return SaveImage(item, source, mimeType, type, imageIndex, null, cancellationToken); } - public async Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken) + public async Task SaveImage(IHasMetadata item, Stream source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(mimeType)) { @@ -274,7 +274,7 @@ namespace MediaBrowser.Providers.Manager /// Type of the MIME. /// if set to true [save locally]. /// IEnumerable{System.String}. - private string[] GetSavePaths(IHasImages item, ImageType type, int? imageIndex, string mimeType, bool saveLocally) + private string[] GetSavePaths(IHasMetadata item, ImageType type, int? imageIndex, string mimeType, bool saveLocally) { if (!saveLocally || (_config.Configuration.ImageSavingConvention == ImageSavingConvention.Legacy)) { @@ -296,7 +296,7 @@ namespace MediaBrowser.Providers.Manager /// or /// imageIndex /// - private ItemImageInfo GetCurrentImage(IHasImages item, ImageType type, int imageIndex) + private ItemImageInfo GetCurrentImage(IHasMetadata item, ImageType type, int imageIndex) { return item.GetImageInfo(type, imageIndex); } @@ -311,7 +311,7 @@ namespace MediaBrowser.Providers.Manager /// imageIndex /// or /// imageIndex - private void SetImagePath(IHasImages item, ImageType type, int? imageIndex, string path) + private void SetImagePath(IHasMetadata item, ImageType type, int? imageIndex, string path) { item.SetImagePath(type, imageIndex ?? 0, _fileSystem.GetFileInfo(path)); } @@ -330,7 +330,7 @@ namespace MediaBrowser.Providers.Manager /// or /// imageIndex /// - private string GetStandardSavePath(IHasImages item, ImageType type, int? imageIndex, string mimeType, bool saveLocally) + private string GetStandardSavePath(IHasMetadata item, ImageType type, int? imageIndex, string mimeType, bool saveLocally) { var season = item as Season; var extension = MimeTypes.ToExtension(mimeType); @@ -483,7 +483,7 @@ namespace MediaBrowser.Providers.Manager /// Type of the MIME. /// IEnumerable{System.String}. /// imageIndex - private string[] GetCompatibleSavePaths(IHasImages item, ImageType type, int? imageIndex, string mimeType) + private string[] GetCompatibleSavePaths(IHasMetadata item, ImageType type, int? imageIndex, string mimeType) { var season = item as Season; @@ -603,7 +603,7 @@ namespace MediaBrowser.Providers.Manager /// The image filename. /// The extension. /// System.String. - private string GetSavePathForItemInMixedFolder(IHasImages item, ImageType type, string imageFilename, string extension) + private string GetSavePathForItemInMixedFolder(IHasMetadata item, ImageType type, string imageFilename, string extension) { if (type == ImageType.Primary) { diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 39715a4497..b360a2fcd6 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -41,7 +41,7 @@ namespace MediaBrowser.Providers.Manager _fileSystem = fileSystem; } - public bool ValidateImages(IHasImages item, IEnumerable providers, IDirectoryService directoryService) + public bool ValidateImages(IHasMetadata item, IEnumerable providers, IDirectoryService directoryService) { var hasChanges = false; @@ -60,7 +60,7 @@ namespace MediaBrowser.Providers.Manager return hasChanges; } - public async Task RefreshImages(IHasImages item, LibraryOptions libraryOptions, IEnumerable imageProviders, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, CancellationToken cancellationToken) + public async Task RefreshImages(IHasMetadata item, LibraryOptions libraryOptions, IEnumerable imageProviders, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, CancellationToken cancellationToken) { if (refreshOptions.IsReplacingImage(ImageType.Backdrop)) { @@ -118,7 +118,7 @@ namespace MediaBrowser.Providers.Manager /// The result. /// The cancellation token. /// Task. - private async Task RefreshFromProvider(IHasImages item, + private async Task RefreshFromProvider(IHasMetadata item, IDynamicImageProvider provider, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, @@ -203,7 +203,7 @@ namespace MediaBrowser.Providers.Manager ImageType.Thumb }; - private bool HasImage(IHasImages item, ImageType type) + private bool HasImage(IHasMetadata item, ImageType type) { var image = item.GetImageInfo(type, 0); @@ -220,7 +220,7 @@ namespace MediaBrowser.Providers.Manager /// The backdrop limit. /// The screenshot limit. /// true if the specified item contains images; otherwise, false. - private bool ContainsImages(IHasImages item, List images, MetadataOptions savedOptions, int backdropLimit, int screenshotLimit) + private bool ContainsImages(IHasMetadata item, List images, MetadataOptions savedOptions, int backdropLimit, int screenshotLimit) { if (_singularImages.Any(i => images.Contains(i) && !HasImage(item, i) && savedOptions.GetLimit(i) > 0)) { @@ -253,7 +253,7 @@ namespace MediaBrowser.Providers.Manager /// The result. /// The cancellation token. /// Task. - private async Task RefreshFromProvider(IHasImages item, LibraryOptions libraryOptions, + private async Task RefreshFromProvider(IHasMetadata item, LibraryOptions libraryOptions, IRemoteImageProvider provider, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, @@ -333,7 +333,7 @@ namespace MediaBrowser.Providers.Manager } } - private bool IsEnabled(MetadataOptions options, ImageType type, IHasImages item) + private bool IsEnabled(MetadataOptions options, ImageType type, IHasMetadata item) { if (type == ImageType.Backdrop) { @@ -360,7 +360,7 @@ namespace MediaBrowser.Providers.Manager return options.IsEnabled(type); } - private void ClearImages(IHasImages item, ImageType type) + private void ClearImages(IHasMetadata item, ImageType type) { var deleted = false; var deletedImages = new List(); @@ -395,7 +395,7 @@ namespace MediaBrowser.Providers.Manager } } - public bool MergeImages(IHasImages item, List images) + public bool MergeImages(IHasMetadata item, List images) { var changed = false; @@ -453,7 +453,7 @@ namespace MediaBrowser.Providers.Manager return changed; } - private bool UpdateMultiImages(IHasImages item, List images, ImageType type) + private bool UpdateMultiImages(IHasMetadata item, List images, ImageType type) { var changed = false; @@ -471,7 +471,7 @@ namespace MediaBrowser.Providers.Manager return changed; } - private async Task DownloadImage(IHasImages item, LibraryOptions libraryOptions, + private async Task DownloadImage(IHasMetadata item, LibraryOptions libraryOptions, IRemoteImageProvider provider, RefreshResult result, IEnumerable images, @@ -517,7 +517,7 @@ namespace MediaBrowser.Providers.Manager return false; } - private bool EnableImageStub(IHasImages item, ImageType type, LibraryOptions libraryOptions) + private bool EnableImageStub(IHasMetadata item, ImageType type, LibraryOptions libraryOptions) { if (item is LiveTvProgram) { @@ -557,14 +557,14 @@ namespace MediaBrowser.Providers.Manager } } - private void SaveImageStub(IHasImages item, ImageType imageType, IEnumerable urls) + private void SaveImageStub(IHasMetadata item, ImageType imageType, IEnumerable urls) { var newIndex = item.AllowsMultipleImages(imageType) ? item.GetImages(imageType).Count() : 0; SaveImageStub(item, imageType, urls, newIndex); } - private void SaveImageStub(IHasImages item, ImageType imageType, IEnumerable urls, int newIndex) + private void SaveImageStub(IHasMetadata item, ImageType imageType, IEnumerable urls, int newIndex) { var path = string.Join("|", urls.Take(1).ToArray()); @@ -576,7 +576,7 @@ namespace MediaBrowser.Providers.Manager }, newIndex); } - private async Task DownloadBackdrops(IHasImages item, LibraryOptions libraryOptions, ImageType imageType, int limit, IRemoteImageProvider provider, RefreshResult result, IEnumerable images, int minWidth, CancellationToken cancellationToken) + private async Task DownloadBackdrops(IHasMetadata item, LibraryOptions libraryOptions, ImageType imageType, int limit, IRemoteImageProvider provider, RefreshResult result, IEnumerable images, int minWidth, CancellationToken cancellationToken) { foreach (var image in images.Where(i => i.Type == imageType)) { diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index ce995fe647..8cdb9a407d 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -128,7 +128,7 @@ namespace MediaBrowser.Providers.Manager return Task.FromResult(ItemUpdateType.None); } - public async Task SaveImage(IHasImages item, string url, ImageType type, int? imageIndex, CancellationToken cancellationToken) + public async Task SaveImage(IHasMetadata item, string url, ImageType type, int? imageIndex, CancellationToken cancellationToken) { var response = await _httpClient.GetResponse(new HttpRequestOptions { @@ -142,12 +142,12 @@ namespace MediaBrowser.Providers.Manager .ConfigureAwait(false); } - public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken) + public Task SaveImage(IHasMetadata item, Stream source, string mimeType, ImageType type, int? imageIndex, CancellationToken cancellationToken) { return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, source, mimeType, type, imageIndex, cancellationToken); } - public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken) + public Task SaveImage(IHasMetadata item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(source)) { @@ -159,7 +159,7 @@ namespace MediaBrowser.Providers.Manager return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, fileStream, mimeType, type, imageIndex, saveLocallyWithMedia, cancellationToken); } - public async Task> GetAvailableRemoteImages(IHasImages item, RemoteImageQuery query, CancellationToken cancellationToken) + public async Task> GetAvailableRemoteImages(IHasMetadata item, RemoteImageQuery query, CancellationToken cancellationToken) { var providers = GetRemoteImageProviders(item, query.IncludeDisabledProviders); @@ -196,7 +196,7 @@ namespace MediaBrowser.Providers.Manager /// The preferred languages. /// The type. /// Task{IEnumerable{RemoteImageInfo}}. - private async Task> GetImages(IHasImages item, CancellationToken cancellationToken, IRemoteImageProvider provider, List preferredLanguages, ImageType? type = null) + private async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken, IRemoteImageProvider provider, List preferredLanguages, ImageType? type = null) { try { @@ -232,7 +232,7 @@ namespace MediaBrowser.Providers.Manager /// /// The item. /// IEnumerable{IImageProvider}. - public IEnumerable GetRemoteImageProviderInfo(IHasImages item) + public IEnumerable GetRemoteImageProviderInfo(IHasMetadata item) { return GetRemoteImageProviders(item, true).Select(i => new ImageProviderInfo { @@ -241,12 +241,12 @@ namespace MediaBrowser.Providers.Manager }); } - public IEnumerable GetImageProviders(IHasImages item, ImageRefreshOptions refreshOptions) + public IEnumerable GetImageProviders(IHasMetadata item, ImageRefreshOptions refreshOptions) { return GetImageProviders(item, GetMetadataOptions(item), refreshOptions, false); } - private IEnumerable GetImageProviders(IHasImages item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled) + private IEnumerable GetImageProviders(IHasMetadata item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled) { // Avoid implicitly captured closure var currentOptions = options; @@ -291,7 +291,7 @@ namespace MediaBrowser.Providers.Manager .ThenBy(GetDefaultOrder); } - private IEnumerable GetRemoteImageProviders(IHasImages item, bool includeDisabled) + private IEnumerable GetRemoteImageProviders(IHasMetadata item, bool includeDisabled) { var options = GetMetadataOptions(item); @@ -339,7 +339,7 @@ namespace MediaBrowser.Providers.Manager return true; } - private bool CanRefresh(IImageProvider provider, IHasImages item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled) + private bool CanRefresh(IImageProvider provider, IHasMetadata item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled) { if (!includeDisabled) { @@ -530,7 +530,7 @@ namespace MediaBrowser.Providers.Manager } private void AddImagePlugins(List list, T item, List imageProviders) - where T : IHasImages + where T : IHasMetadata { // Locals @@ -550,7 +550,7 @@ namespace MediaBrowser.Providers.Manager })); } - public MetadataOptions GetMetadataOptions(IHasImages item) + public MetadataOptions GetMetadataOptions(IHasMetadata item) { var type = item.GetType().Name; diff --git a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs index e406932ed8..3e145e1f02 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs @@ -31,12 +31,12 @@ namespace MediaBrowser.Providers.MediaInfo _fileSystem = fileSystem; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { ImageType.Primary }; } - public Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + public Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) { var audio = (Audio)item; @@ -127,7 +127,7 @@ namespace MediaBrowser.Providers.MediaInfo get { return "Image Extractor"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { var audio = item as Audio; diff --git a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs index 26a795a7db..f666d8b7ff 100644 --- a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs @@ -29,12 +29,12 @@ namespace MediaBrowser.Providers.MediaInfo _fileSystem = fileSystem; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { ImageType.Primary }; } - public Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + public Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) { var video = (Video)item; @@ -129,7 +129,7 @@ namespace MediaBrowser.Providers.MediaInfo get { return "Screen Grabber"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { var video = item as Video; diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs index c3aa87a22f..0214788ab4 100644 --- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs +++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs @@ -60,12 +60,12 @@ namespace MediaBrowser.Providers.Movies get { return "FanArt"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Movie || item is BoxSet || item is MusicVideo; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -79,7 +79,7 @@ namespace MediaBrowser.Providers.Movies }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var baseItem = (BaseItem)item; var list = new List(); diff --git a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs index 215b391817..257ecadd38 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs @@ -41,12 +41,12 @@ namespace MediaBrowser.Providers.Movies get { return "TheMovieDb"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Movie || item is MusicVideo || item is Trailer; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -55,7 +55,7 @@ namespace MediaBrowser.Providers.Movies }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var list = new List(); diff --git a/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs b/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs index 0cb1a7ff13..57e20b8526 100644 --- a/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs +++ b/MediaBrowser.Providers/Music/AlbumImageFromSongProvider.cs @@ -11,12 +11,12 @@ namespace MediaBrowser.Providers.Music { public class AlbumImageFromSongProvider : IDynamicImageProvider { - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { ImageType.Primary }; } - public Task GetImage(IHasImages item, ImageType type, CancellationToken cancellationToken) + public Task GetImage(IHasMetadata item, ImageType type, CancellationToken cancellationToken) { var album = (MusicAlbum)item; @@ -38,7 +38,7 @@ namespace MediaBrowser.Providers.Music get { return "Image Extractor"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is MusicAlbum; } diff --git a/MediaBrowser.Providers/Music/AudioDbAlbumImageProvider.cs b/MediaBrowser.Providers/Music/AudioDbAlbumImageProvider.cs index c13d19c436..0ce221b065 100644 --- a/MediaBrowser.Providers/Music/AudioDbAlbumImageProvider.cs +++ b/MediaBrowser.Providers/Music/AudioDbAlbumImageProvider.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.Providers.Music _json = json; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -34,7 +34,7 @@ namespace MediaBrowser.Providers.Music }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var id = item.GetProviderId(MetadataProviders.MusicBrainzReleaseGroup); @@ -105,7 +105,7 @@ namespace MediaBrowser.Providers.Music } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is MusicAlbum; } diff --git a/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs b/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs index 6ca1d83d8a..dded509e2f 100644 --- a/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs +++ b/MediaBrowser.Providers/Music/AudioDbArtistImageProvider.cs @@ -25,7 +25,7 @@ namespace MediaBrowser.Providers.Music _httpClient = httpClient; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -36,7 +36,7 @@ namespace MediaBrowser.Providers.Music }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var id = item.GetProviderId(MetadataProviders.MusicBrainzArtist); @@ -138,7 +138,7 @@ namespace MediaBrowser.Providers.Music get { return "TheAudioDB"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is MusicArtist; } diff --git a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs index 5700b23866..7a6826d319 100644 --- a/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtAlbumProvider.cs @@ -47,12 +47,12 @@ namespace MediaBrowser.Providers.Music get { return "FanArt"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is MusicAlbum; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -61,7 +61,7 @@ namespace MediaBrowser.Providers.Music }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var album = (MusicAlbum)item; diff --git a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs index eefebed292..6094fd26ec 100644 --- a/MediaBrowser.Providers/Music/FanArtArtistProvider.cs +++ b/MediaBrowser.Providers/Music/FanArtArtistProvider.cs @@ -58,12 +58,12 @@ namespace MediaBrowser.Providers.Music get { return "FanArt"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is MusicArtist; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -75,7 +75,7 @@ namespace MediaBrowser.Providers.Music }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var artist = (MusicArtist)item; diff --git a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs index f8b3ba1551..74bfa6e039 100644 --- a/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs +++ b/MediaBrowser.Providers/Omdb/OmdbImageProvider.cs @@ -32,7 +32,7 @@ namespace MediaBrowser.Providers.Omdb _configurationManager = configurationManager; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -40,7 +40,7 @@ namespace MediaBrowser.Providers.Omdb }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var imdbId = item.GetProviderId(MetadataProviders.Imdb); @@ -91,7 +91,7 @@ namespace MediaBrowser.Providers.Omdb get { return "The Open Movie Database"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Movie || item is Trailer || item is Episode; } diff --git a/MediaBrowser.Providers/People/MovieDbPersonImageProvider.cs b/MediaBrowser.Providers/People/MovieDbPersonImageProvider.cs index 3728137902..78cc72836e 100644 --- a/MediaBrowser.Providers/People/MovieDbPersonImageProvider.cs +++ b/MediaBrowser.Providers/People/MovieDbPersonImageProvider.cs @@ -37,12 +37,12 @@ namespace MediaBrowser.Providers.People get { return "TheMovieDb"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Person; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -50,7 +50,7 @@ namespace MediaBrowser.Providers.People }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var person = (Person)item; var id = person.GetProviderId(MetadataProviders.Tmdb); diff --git a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs index efbf46cd67..2c3ba00c82 100644 --- a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs +++ b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs @@ -48,12 +48,12 @@ namespace MediaBrowser.Providers.People get { return "TheTVDB"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Person; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -61,7 +61,7 @@ namespace MediaBrowser.Providers.People }; } - public Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery { diff --git a/MediaBrowser.Providers/Studios/StudiosImageProvider.cs b/MediaBrowser.Providers/Studios/StudiosImageProvider.cs index 8579bd16b9..f63615430f 100644 --- a/MediaBrowser.Providers/Studios/StudiosImageProvider.cs +++ b/MediaBrowser.Providers/Studios/StudiosImageProvider.cs @@ -37,12 +37,12 @@ namespace MediaBrowser.Providers.Studios get { return "Emby Designs"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Studio; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -51,12 +51,12 @@ namespace MediaBrowser.Providers.Studios }; } - public Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { return GetImages(item, true, true, cancellationToken); } - private async Task> GetImages(IHasImages item, bool posters, bool thumbs, CancellationToken cancellationToken) + private async Task> GetImages(IHasMetadata item, bool posters, bool thumbs, CancellationToken cancellationToken) { var list = new List(); @@ -83,7 +83,7 @@ namespace MediaBrowser.Providers.Studios return list.Where(i => i != null); } - private RemoteImageInfo GetImage(IHasImages item, string filename, ImageType type, string remoteFilename) + private RemoteImageInfo GetImage(IHasMetadata item, string filename, ImageType type, string remoteFilename) { var list = ImageUtils.GetAvailableImages(filename, _fileSystem); diff --git a/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs b/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs index b9f010bb64..002c98e957 100644 --- a/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs +++ b/MediaBrowser.Providers/TV/FanArt/FanArtSeasonProvider.cs @@ -50,12 +50,12 @@ namespace MediaBrowser.Providers.TV get { return "FanArt"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Season; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -66,7 +66,7 @@ namespace MediaBrowser.Providers.TV }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var list = new List(); diff --git a/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs b/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs index 644e9cbb53..583e5900de 100644 --- a/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/FanArt/FanartSeriesProvider.cs @@ -59,12 +59,12 @@ namespace MediaBrowser.Providers.TV get { return "FanArt"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Series; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -77,7 +77,7 @@ namespace MediaBrowser.Providers.TV }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var list = new List(); diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs index 854f9f06b8..474036e7fc 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbEpisodeImageProvider.cs @@ -29,7 +29,7 @@ namespace MediaBrowser.Providers.TV : base(httpClient, configurationManager, jsonSerializer, fileSystem, localization, logManager) {} - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -37,7 +37,7 @@ namespace MediaBrowser.Providers.TV }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var episode = (Controller.Entities.TV.Episode)item; var series = episode.Series; @@ -125,7 +125,7 @@ namespace MediaBrowser.Providers.TV get { return "TheMovieDb"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Controller.Entities.TV.Episode; } diff --git a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs index c746e04880..d4cda15aaa 100644 --- a/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheMovieDb/MovieDbSeriesImageProvider.cs @@ -40,12 +40,12 @@ namespace MediaBrowser.Providers.TV get { return "TheMovieDb"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Series; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -54,7 +54,7 @@ namespace MediaBrowser.Providers.TV }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var list = new List(); diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs index 48e50c2e14..7b6bcc4c7c 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbEpisodeImageProvider.cs @@ -35,12 +35,12 @@ namespace MediaBrowser.Providers.TV get { return "TheTVDB"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Episode; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -48,7 +48,7 @@ namespace MediaBrowser.Providers.TV }; } - public Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var episode = (Episode)item; var series = episode.Series; diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs index 395d419cfc..822664bfd3 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeasonImageProvider.cs @@ -48,12 +48,12 @@ namespace MediaBrowser.Providers.TV get { return "TheTVDB"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Season; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -63,7 +63,7 @@ namespace MediaBrowser.Providers.TV }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { var season = (Season)item; var series = season.Series; diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs index d7eea42267..e720827c53 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesImageProvider.cs @@ -49,12 +49,12 @@ namespace MediaBrowser.Providers.TV get { return "TheTVDB"; } } - public bool Supports(IHasImages item) + public bool Supports(IHasMetadata item) { return item is Series; } - public IEnumerable GetSupportedImages(IHasImages item) + public IEnumerable GetSupportedImages(IHasMetadata item) { return new List { @@ -64,7 +64,7 @@ namespace MediaBrowser.Providers.TV }; } - public async Task> GetImages(IHasImages item, CancellationToken cancellationToken) + public async Task> GetImages(IHasMetadata item, CancellationToken cancellationToken) { if (TvdbSeriesProvider.IsValidSeries(item.ProviderIds)) { From 40442f887ba717ae47620b152315f21b252fe049 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 9 Aug 2017 15:56:38 -0400 Subject: [PATCH 2/4] consolidate emby.server.core into emby.server.implementations --- .../Emby.Common.Implementations.csproj | 8 +- .../Logging/NlogManager.cs | 14 +- .../Networking/NetworkManager.cs | 2 +- .../ScheduledTasks/ScheduledTaskWorker.cs | 6 +- Emby.Common.Implementations/packages.config | 4 +- Emby.Dlna/ContentDirectory/ControlHandler.cs | 36 +- Emby.Dlna/DlnaManager.cs | 10 +- Emby.Dlna/PlayTo/Device.cs | 3 +- Emby.Dlna/Profiles/DefaultProfile.cs | 5 +- Emby.Dlna/Server/DescriptionXmlBuilder.cs | 2 +- Emby.Dlna/Service/BaseControlHandler.cs | 28 +- Emby.Drawing/ImageProcessor.cs | 6 +- Emby.Photos/PhotoProvider.cs | 2 +- Emby.Server.Core/Emby.Server.Core.csproj | 176 --- Emby.Server.Core/Properties/AssemblyInfo.cs | 34 - Emby.Server.Core/app.config | 11 - Emby.Server.Core/packages.config | 6 - .../Activity/ActivityLogEntryPoint.cs | 3 +- .../Activity/ActivityRepository.cs | 9 +- .../ApplicationHost.cs | 171 +- .../ApplicationPathHelper.cs | 2 +- .../Channels/ChannelManager.cs | 39 +- .../ServerConfigurationManager.cs | 5 +- .../Cryptography/ASN1.cs | 0 .../Cryptography/ASN1Convert.cs | 0 .../Cryptography/BitConverterLE.cs | 0 .../Cryptography/CertificateGenerator.cs | 0 .../Cryptography/CryptoConvert.cs | 0 .../Cryptography/PKCS1.cs | 0 .../Cryptography/PKCS12.cs | 0 .../Cryptography/PKCS7.cs | 0 .../Cryptography/PKCS8.cs | 0 .../Cryptography/PfxGenerator.cs | 0 .../Cryptography/X501Name.cs | 0 .../Cryptography/X509Builder.cs | 0 .../Cryptography/X509Certificate.cs | 0 .../Cryptography/X509CertificateBuilder.cs | 0 .../Cryptography/X509CertificateCollection.cs | 0 .../Cryptography/X509Extension.cs | 0 .../Cryptography/X509Extensions.cs | 0 .../Cryptography/X520Attributes.cs | 0 .../Data/BaseSqliteRepository.cs | 25 +- .../Data/SqliteItemRepository.cs | 108 +- Emby.Server.Implementations/Dto/DtoService.cs | 14 +- .../Emby.Server.Implementations.csproj | 84 +- .../EntryPoints/ExternalPortForwarding.cs | 7 +- .../EntryPoints/UsageEntryPoint.cs | 3 +- .../HttpServer/HttpListenerHost.cs | 17 +- .../HttpServer/LoggerUtils.cs | 3 +- .../HttpServer/SocketSharp/HttpUtility.cs | 3 +- .../HttpServerFactory.cs | 4 +- .../IO/LibraryMonitor.cs | 3 +- .../IO/MemoryStreamProvider.cs | 2 +- .../Images/BaseDynamicImageProvider.cs | 10 +- .../Library/LibraryManager.cs | 37 +- .../Library/LocalTrailerPostScanTask.cs | 5 +- .../Library/MusicManager.cs | 22 +- .../Library/Resolvers/BaseVideoResolver.cs | 7 +- .../Library/Resolvers/Movies/MovieResolver.cs | 12 +- .../Library/Resolvers/PhotoResolver.cs | 2 +- .../Library/Resolvers/TV/EpisodeResolver.cs | 9 +- .../Library/Resolvers/VideoResolver.cs | 12 +- .../Library/SearchEngine.cs | 5 +- .../Library/UserViewManager.cs | 5 +- .../Library/Validators/PeopleValidator.cs | 17 +- .../LiveTv/EmbyTV/EncodedRecorder.cs | 2 +- .../LiveTv/LiveTvDtoService.cs | 6 +- .../LiveTv/LiveTvManager.cs | 51 +- .../LiveTv/LiveTvMediaSourceProvider.cs | 3 +- .../Localization/LocalizationManager.cs | 6 +- .../Localization/TextLocalizer.cs | 3 +- .../Logging/ConsoleLogger.cs | 5 +- .../SqliteNotificationsRepository.cs | 13 +- .../Notifications/WebSocketNotifier.cs | 3 +- .../Photos/PhotoAlbumImageProvider.cs | 2 +- .../Playlists/PlaylistImageProvider.cs | 7 +- .../ScheduledTasks/ChapterImagesTask.cs | 3 +- .../Security/AuthenticationRepository.cs | 9 +- .../Services/ServiceController.cs | 8 +- .../Services/ServiceExec.cs | 3 +- .../Services/ServicePath.cs | 11 +- .../Session/SessionManager.cs | 5 +- .../Social/SharingRepository.cs | 3 +- .../SystemEvents.cs | 2 +- .../CollectionFolderImageProvider.cs | 4 +- .../UserViews/DynamicImageProvider.cs | 8 +- Emby.Server.Implementations/packages.config | 5 +- MediaBrowser.Api/ApiEntryPoint.cs | 746 +-------- MediaBrowser.Api/FilterService.cs | 2 +- MediaBrowser.Api/GamesService.cs | 7 +- MediaBrowser.Api/Images/ImageService.cs | 13 +- MediaBrowser.Api/ItemUpdateService.cs | 8 +- MediaBrowser.Api/Library/LibraryService.cs | 20 +- MediaBrowser.Api/LiveTv/LiveTvService.cs | 13 +- .../ProgressiveFileCopier.cs} | 119 +- MediaBrowser.Api/LocalizationService.cs | 4 +- MediaBrowser.Api/MediaBrowser.Api.csproj | 18 +- MediaBrowser.Api/Movies/MoviesService.cs | 44 +- MediaBrowser.Api/Music/InstantMixService.cs | 10 +- .../Playback/BaseStreamingService.cs | 1024 ------------ .../Playback/Hls/BaseHlsService.cs | 331 ---- .../Playback/Hls/DynamicHlsService.cs | 970 ------------ .../Playback/Hls/HlsSegmentService.cs | 163 -- .../Playback/Hls/VideoHlsService.cs | 137 -- MediaBrowser.Api/Playback/MediaInfoService.cs | 614 -------- .../Playback/Progressive/AudioService.cs | 67 - .../BaseProgressiveStreamingService.cs | 429 ----- .../Playback/Progressive/VideoService.cs | 100 -- .../Playback/StaticRemoteStreamWriter.cs | 47 - MediaBrowser.Api/Playback/StreamRequest.cs | 63 - MediaBrowser.Api/Playback/StreamState.cs | 259 --- .../Playback/TranscodingThrottler.cs | 176 --- .../Playback/UniversalAudioService.cs | 349 ----- MediaBrowser.Api/PlaylistService.cs | 7 +- .../Reports/Data/ReportBuilder.cs | 2 +- MediaBrowser.Api/SearchService.cs | 6 +- MediaBrowser.Api/Session/SessionsService.cs | 2 +- MediaBrowser.Api/SimilarItemsHelper.cs | 5 +- MediaBrowser.Api/SuggestionsService.cs | 3 +- MediaBrowser.Api/System/SystemService.cs | 5 +- MediaBrowser.Api/TestService.cs | 77 - MediaBrowser.Api/TvShowsService.cs | 23 +- .../UserLibrary/BaseItemsByNameService.cs | 3 +- .../UserLibrary/BaseItemsRequest.cs | 4 +- MediaBrowser.Api/UserLibrary/ItemsService.cs | 7 +- .../UserLibrary/PlaystateService.cs | 451 ------ .../UserLibrary/UserLibraryService.cs | 6 +- .../Entities/AggregateFolder.cs | 4 +- .../Entities/Audio/MusicArtist.cs | 2 +- MediaBrowser.Controller/Entities/BaseItem.cs | 132 +- .../Entities/CollectionFolder.cs | 4 +- MediaBrowser.Controller/Entities/Folder.cs | 9 +- MediaBrowser.Controller/Entities/Game.cs | 4 +- .../Entities/IHasMetadata.cs | 6 +- MediaBrowser.Controller/Entities/TV/Series.cs | 30 +- .../Entities/TagExtensions.cs | 18 +- .../Entities/UserViewBuilder.cs | 4 +- MediaBrowser.Controller/Entities/Video.cs | 3 +- MediaBrowser.Controller/IO/FileData.cs | 17 +- .../Library/ILibraryManager.cs | 13 +- .../Library/IMusicManager.cs | 10 +- .../LiveTv/ILiveTvManager.cs | 2 +- .../Net/AuthenticatedAttribute.cs | 4 +- .../Persistence/IItemRepository.cs | 2 +- .../Providers/DirectoryService.cs | 55 +- .../Providers/IDirectoryService.cs | 8 +- .../Images/ImagesByNameImageProvider.cs | 58 - .../Images/LocalImageProvider.cs | 18 +- .../MediaBrowser.LocalMetadata.csproj | 1 - .../Parsers/BaseItemXmlParser.cs | 18 +- .../Savers/BaseXmlSaver.cs | 10 +- .../BdInfo/BdInfoExaminer.cs | 201 --- .../EncodingConfigurationFactory.cs | 58 - .../Encoder/AudioEncoder.cs | 62 - .../Encoder/BaseEncoder.cs | 375 ----- .../Encoder/EncoderValidator.cs | 219 --- .../Encoder/EncodingJob.cs | 197 --- .../Encoder/EncodingJobFactory.cs | 305 ---- .../Encoder/EncodingUtils.cs | 70 - .../Encoder/FontConfigLoader.cs | 182 --- .../Encoder/MediaEncoder.cs | 1129 -------------- .../Encoder/VideoEncoder.cs | 66 - .../MediaBrowser.MediaEncoding.csproj | 100 -- .../MediaBrowser.MediaEncoding.nuget.targets | 6 - .../Probing/FFProbeHelpers.cs | 117 -- .../Probing/InternalMediaInfoResult.cs | 341 ---- .../Probing/ProbeResultNormalizer.cs | 1389 ----------------- .../Properties/AssemblyInfo.cs | 33 - .../Subtitles/AssParser.cs | 120 -- .../Subtitles/ConfigurationExtension.cs | 29 - .../Subtitles/ISubtitleParser.cs | 17 - .../Subtitles/ISubtitleWriter.cs | 20 - .../Subtitles/JsonWriter.cs | 28 - .../Subtitles/OpenSubtitleDownloader.cs | 349 ----- .../Subtitles/ParserValues.cs | 7 - .../Subtitles/SrtParser.cs | 90 -- .../Subtitles/SrtWriter.cs | 39 - .../Subtitles/SsaParser.cs | 394 ----- .../Subtitles/SubtitleEncoder.cs | 738 --------- .../Subtitles/TtmlWriter.cs | 60 - .../Subtitles/VttWriter.cs | 44 - MediaBrowser.MediaEncoding/packages.config | 3 - MediaBrowser.Model/Dlna/CodecProfile.cs | 1 - MediaBrowser.Model/Dlna/ConditionProcessor.cs | 1 - MediaBrowser.Model/Dlna/DirectPlayProfile.cs | 1 - MediaBrowser.Model/Dlna/StreamInfo.cs | 4 +- MediaBrowser.Model/Dto/BaseItemDto.cs | 36 +- MediaBrowser.Model/Entities/MediaStream.cs | 4 +- .../Extensions/LinqExtensions.cs | 26 + .../Globalization/ILocalizationManager.cs | 4 +- MediaBrowser.Model/Net/ISocket.cs | 1 - MediaBrowser.Model/Services/IHttpRequest.cs | 1 - MediaBrowser.Model/Services/IHttpResponse.cs | 1 - MediaBrowser.Model/Services/IHttpResult.cs | 1 - .../Services/QueryParamCollection.cs | 3 +- .../Social/ISharingRepository.cs | 6 +- .../Tasks/ScheduledTaskHelpers.cs | 12 +- MediaBrowser.Model/Tasks/TaskInfo.cs | 4 +- .../Books/AudioBookMetadataService.cs | 2 +- .../Books/AudioPodcastMetadataService.cs | 2 +- .../Books/BookMetadataService.cs | 2 +- .../BoxSets/BoxSetMetadataService.cs | 2 +- .../BoxSets/MovieDbBoxSetImageProvider.cs | 6 +- .../Channels/ChannelMetadataService.cs | 2 +- .../CollectionFolderMetadataService.cs | 4 +- .../Folders/FolderMetadataService.cs | 2 +- .../Folders/UserViewMetadataService.cs | 2 +- .../GameGenres/GameGenreMetadataService.cs | 2 +- .../Games/GameMetadataService.cs | 2 +- .../Games/GameSystemMetadataService.cs | 2 +- .../Genres/GenreMetadataService.cs | 2 +- .../LiveTv/AudioRecordingService.cs | 2 +- .../LiveTv/ChannelMetadataService.cs | 2 +- .../LiveTv/ProgramMetadataService.cs | 2 +- .../LiveTv/VideoRecordingService.cs | 2 +- MediaBrowser.Providers/Manager/ImageSaver.cs | 3 +- .../Manager/ItemImageProvider.cs | 12 +- .../Manager/MetadataService.cs | 12 +- .../Manager/ProviderManager.cs | 4 +- .../Manager/ProviderUtils.cs | 18 +- .../MediaInfo/AudioImageProvider.cs | 3 +- .../MediaInfo/FFProbeAudioInfo.cs | 8 +- .../MediaInfo/FFProbeVideoInfo.cs | 9 +- .../MediaInfo/SubtitleResolver.cs | 2 +- .../MediaInfo/SubtitleScheduledTask.cs | 3 +- .../Movies/GenericMovieDbInfo.cs | 9 +- .../Movies/MovieDbImageProvider.cs | 6 +- .../Movies/MovieDbProvider.cs | 3 +- .../Movies/MovieMetadataService.cs | 4 +- .../Music/AlbumMetadataService.cs | 8 +- .../Music/ArtistMetadataService.cs | 4 +- .../Music/AudioMetadataService.cs | 5 +- .../Music/MusicBrainzAlbumProvider.cs | 6 +- .../Music/MusicBrainzArtistProvider.cs | 6 +- .../Music/MusicVideoMetadataService.cs | 5 +- .../MusicGenres/MusicGenreMetadataService.cs | 2 +- .../People/MovieDbPersonImageProvider.cs | 3 +- .../People/MovieDbPersonProvider.cs | 2 +- .../People/PersonMetadataService.cs | 2 +- .../Photos/PhotoAlbumMetadataService.cs | 2 +- .../Photos/PhotoMetadataService.cs | 2 +- .../Playlists/PlaylistMetadataService.cs | 2 +- .../Studios/StudioMetadataService.cs | 2 +- .../Subtitles/SubtitleManager.cs | 3 +- .../TV/EpisodeMetadataService.cs | 2 +- .../TV/SeasonMetadataService.cs | 2 +- .../TV/SeriesMetadataService.cs | 2 +- .../TheMovieDb/MovieDbEpisodeImageProvider.cs | 3 +- .../TheMovieDb/MovieDbSeriesImageProvider.cs | 6 +- .../TV/TheMovieDb/MovieDbSeriesProvider.cs | 3 +- .../TV/TheTVDB/TvdbPrescanTask.cs | 7 +- .../TV/TheTVDB/TvdbSeasonImageProvider.cs | 3 +- .../TV/TheTVDB/TvdbSeriesImageProvider.cs | 3 +- .../TV/TheTVDB/TvdbSeriesProvider.cs | 13 +- .../Users/UserMetadataService.cs | 2 +- .../Videos/VideoMetadataService.cs | 2 +- .../Years/YearMetadataService.cs | 2 +- .../MediaBrowser.Server.Mono.csproj | 22 +- MediaBrowser.Server.Mono/Program.cs | 4 +- MediaBrowser.Server.Mono/packages.config | 8 +- MediaBrowser.ServerApplication/MainStartup.cs | 7 +- .../MediaBrowser.ServerApplication.csproj | 22 +- .../packages.config | 8 +- MediaBrowser.Tests/MediaBrowser.Tests.csproj | 29 +- .../MediaEncoding/Subtitles/AssParserTests.cs | 1 + .../MediaEncoding/Subtitles/SrtParserTests.cs | 2 +- .../MediaEncoding/Subtitles/VttWriterTest.cs | 2 +- .../Api/PackageCreator.cs | 3 +- MediaBrowser.XbmcMetadata/EntryPoint.cs | 2 +- .../Parsers/BaseNfoParser.cs | 15 +- .../Savers/BaseNfoSaver.cs | 4 +- MediaBrowser.sln | 79 +- Mono.Nat/NatUtility.cs | 6 +- Mono.Nat/Pmp/PmpNatDevice.cs | 3 +- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +- SocketHttpListener/Net/WebHeaderCollection.cs | 3 +- 277 files changed, 1064 insertions(+), 14222 deletions(-) delete mode 100644 Emby.Server.Core/Emby.Server.Core.csproj delete mode 100644 Emby.Server.Core/Properties/AssemblyInfo.cs delete mode 100644 Emby.Server.Core/app.config delete mode 100644 Emby.Server.Core/packages.config rename {Emby.Server.Core => Emby.Server.Implementations}/ApplicationHost.cs (97%) rename {Emby.Server.Core => Emby.Server.Implementations}/ApplicationPathHelper.cs (97%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/ASN1.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/ASN1Convert.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/BitConverterLE.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/CertificateGenerator.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/CryptoConvert.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/PKCS1.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/PKCS12.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/PKCS7.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/PKCS8.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/PfxGenerator.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X501Name.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X509Builder.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X509Certificate.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X509CertificateBuilder.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X509CertificateCollection.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X509Extension.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X509Extensions.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/Cryptography/X520Attributes.cs (100%) rename {Emby.Server.Core => Emby.Server.Implementations}/EntryPoints/ExternalPortForwarding.cs (98%) rename {Emby.Server.Core => Emby.Server.Implementations}/HttpServerFactory.cs (97%) rename {Emby.Server.Core => Emby.Server.Implementations}/IO/LibraryMonitor.cs (99%) rename {Emby.Server.Core => Emby.Server.Implementations}/IO/MemoryStreamProvider.cs (97%) rename {Emby.Server.Core => Emby.Server.Implementations}/Localization/TextLocalizer.cs (95%) rename {Emby.Server.Core => Emby.Server.Implementations}/Logging/ConsoleLogger.cs (65%) rename {Emby.Server.Core => Emby.Server.Implementations}/SystemEvents.cs (97%) rename MediaBrowser.Api/{Playback/Progressive/ProgressiveStreamWriter.cs => LiveTv/ProgressiveFileCopier.cs} (59%) delete mode 100644 MediaBrowser.Api/Playback/BaseStreamingService.cs delete mode 100644 MediaBrowser.Api/Playback/Hls/BaseHlsService.cs delete mode 100644 MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs delete mode 100644 MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs delete mode 100644 MediaBrowser.Api/Playback/Hls/VideoHlsService.cs delete mode 100644 MediaBrowser.Api/Playback/MediaInfoService.cs delete mode 100644 MediaBrowser.Api/Playback/Progressive/AudioService.cs delete mode 100644 MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs delete mode 100644 MediaBrowser.Api/Playback/Progressive/VideoService.cs delete mode 100644 MediaBrowser.Api/Playback/StaticRemoteStreamWriter.cs delete mode 100644 MediaBrowser.Api/Playback/StreamRequest.cs delete mode 100644 MediaBrowser.Api/Playback/StreamState.cs delete mode 100644 MediaBrowser.Api/Playback/TranscodingThrottler.cs delete mode 100644 MediaBrowser.Api/Playback/UniversalAudioService.cs delete mode 100644 MediaBrowser.Api/TestService.cs delete mode 100644 MediaBrowser.Api/UserLibrary/PlaystateService.cs delete mode 100644 MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs delete mode 100644 MediaBrowser.MediaEncoding/BdInfo/BdInfoExaminer.cs delete mode 100644 MediaBrowser.MediaEncoding/Configuration/EncodingConfigurationFactory.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/AudioEncoder.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/BaseEncoder.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/EncoderValidator.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/EncodingJob.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/EncodingJobFactory.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/FontConfigLoader.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs delete mode 100644 MediaBrowser.MediaEncoding/Encoder/VideoEncoder.cs delete mode 100644 MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.csproj delete mode 100644 MediaBrowser.MediaEncoding/MediaBrowser.MediaEncoding.nuget.targets delete mode 100644 MediaBrowser.MediaEncoding/Probing/FFProbeHelpers.cs delete mode 100644 MediaBrowser.MediaEncoding/Probing/InternalMediaInfoResult.cs delete mode 100644 MediaBrowser.MediaEncoding/Probing/ProbeResultNormalizer.cs delete mode 100644 MediaBrowser.MediaEncoding/Properties/AssemblyInfo.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/AssParser.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/ConfigurationExtension.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/ISubtitleParser.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/ISubtitleWriter.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/JsonWriter.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/OpenSubtitleDownloader.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/ParserValues.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/SrtParser.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/SrtWriter.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/SsaParser.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/SubtitleEncoder.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/TtmlWriter.cs delete mode 100644 MediaBrowser.MediaEncoding/Subtitles/VttWriter.cs delete mode 100644 MediaBrowser.MediaEncoding/packages.config diff --git a/Emby.Common.Implementations/Emby.Common.Implementations.csproj b/Emby.Common.Implementations/Emby.Common.Implementations.csproj index 00c90d16e4..879e8e82f9 100644 --- a/Emby.Common.Implementations/Emby.Common.Implementations.csproj +++ b/Emby.Common.Implementations/Emby.Common.Implementations.csproj @@ -32,12 +32,10 @@ - ..\packages\NLog.4.4.11\lib\net45\NLog.dll - True + ..\packages\NLog.4.4.12\lib\net45\NLog.dll - - ..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll - True + + ..\packages\ServiceStack.Text.4.5.12\lib\net45\ServiceStack.Text.dll ..\packages\SharpCompress.0.14.0\lib\net45\SharpCompress.dll diff --git a/Emby.Common.Implementations/Logging/NlogManager.cs b/Emby.Common.Implementations/Logging/NlogManager.cs index f7b723e8bc..4446e2cdb9 100644 --- a/Emby.Common.Implementations/Logging/NlogManager.cs +++ b/Emby.Common.Implementations/Logging/NlogManager.cs @@ -152,13 +152,23 @@ namespace Emby.Common.Implementations.Logging RemoveTarget("ApplicationLogFileWrapper"); - var wrapper = new AsyncTargetWrapper(); + // https://github.com/NLog/NLog/wiki/Performance + var wrapper = new AsyncTargetWrapper + { + OverflowAction = AsyncTargetWrapperOverflowAction.Block, + QueueLimit = 10000, + BatchSize = 500, + TimeToSleepBetweenBatches = 50 + }; + wrapper.Name = "ApplicationLogFileWrapper"; var logFile = new FileTarget { FileName = path, - Layout = "${longdate} ${level} ${logger}: ${message}" + Layout = "${longdate} ${level} ${logger}: ${message}", + KeepFileOpen = true, + ConcurrentWrites = false }; logFile.Name = "ApplicationLogFile"; diff --git a/Emby.Common.Implementations/Networking/NetworkManager.cs b/Emby.Common.Implementations/Networking/NetworkManager.cs index 2f218656c9..354107bb7a 100644 --- a/Emby.Common.Implementations/Networking/NetworkManager.cs +++ b/Emby.Common.Implementations/Networking/NetworkManager.cs @@ -506,7 +506,7 @@ namespace Emby.Common.Implementations.Networking public async Task GetHostAddressesAsync(string host) { var addresses = await Dns.GetHostAddressesAsync(host).ConfigureAwait(false); - return addresses.Select(ToIpAddressInfo).ToArray(); + return addresses.Select(ToIpAddressInfo).ToArray(addresses.Length); } /// diff --git a/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs b/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs index c373ffddb9..dd840677a3 100644 --- a/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs +++ b/Emby.Common.Implementations/ScheduledTasks/ScheduledTaskWorker.cs @@ -14,6 +14,7 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.System; using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Extensions; namespace Emby.Common.Implementations.ScheduledTasks { @@ -274,7 +275,8 @@ namespace Emby.Common.Implementations.ScheduledTasks { get { - return InternalTriggers.Select(i => i.Item1).ToArray(); + var triggers = InternalTriggers; + return triggers.Select(i => i.Item1).ToArray(triggers.Length); } set { @@ -288,7 +290,7 @@ namespace Emby.Common.Implementations.ScheduledTasks SaveTriggers(triggerList); - InternalTriggers = triggerList.Select(i => new Tuple(i, GetTrigger(i))).ToArray(); + InternalTriggers = triggerList.Select(i => new Tuple(i, GetTrigger(i))).ToArray(triggerList.Length); } } diff --git a/Emby.Common.Implementations/packages.config b/Emby.Common.Implementations/packages.config index a255465cc7..a9fc75af68 100644 --- a/Emby.Common.Implementations/packages.config +++ b/Emby.Common.Implementations/packages.config @@ -1,7 +1,7 @@  - - + + \ No newline at end of file diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs index 4d82b6b250..4be2dc945c 100644 --- a/Emby.Dlna/ContentDirectory/ControlHandler.cs +++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs @@ -30,6 +30,7 @@ using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.TV; using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Xml; +using MediaBrowser.Model.Extensions; namespace Emby.Dlna.ContentDirectory { @@ -457,14 +458,14 @@ namespace Emby.Dlna.ContentDirectory { Limit = limit, StartIndex = startIndex, - SortBy = sortOrders.ToArray(), + SortBy = sortOrders.ToArray(sortOrders.Count), SortOrder = sort.SortOrder, User = user, Recursive = true, IsMissing = false, ExcludeItemTypes = new[] { typeof(Game).Name, typeof(Book).Name }, IsFolder = isFolder, - MediaTypes = mediaTypes.ToArray(), + MediaTypes = mediaTypes.ToArray(mediaTypes.Count), DtoOptions = GetDtoOptions() }); } @@ -508,12 +509,12 @@ namespace Emby.Dlna.ContentDirectory { ItemId = item.Id - }).ToArray(); + }); var result = new QueryResult { - Items = items.Select(i => new ServerItem(i)).ToArray(), - TotalRecordCount = items.Length + Items = items.Select(i => new ServerItem(i)).ToArray(items.Count), + TotalRecordCount = items.Count }; return ApplyPaging(result, startIndex, limit); @@ -662,7 +663,7 @@ namespace Emby.Dlna.ContentDirectory return new QueryResult { - Items = list.ToArray(), + Items = list.ToArray(list.Count), TotalRecordCount = list.Count }; } @@ -740,7 +741,7 @@ namespace Emby.Dlna.ContentDirectory return new QueryResult { - Items = list.ToArray(), + Items = list.ToArray(list.Count), TotalRecordCount = list.Count }; } @@ -828,7 +829,7 @@ namespace Emby.Dlna.ContentDirectory return new QueryResult { - Items = list.ToArray(), + Items = list.ToArray(list.Count), TotalRecordCount = list.Count }; } @@ -995,7 +996,7 @@ namespace Emby.Dlna.ContentDirectory var result = new QueryResult { TotalRecordCount = genresResult.TotalRecordCount, - Items = genresResult.Items.Select(i => i.Item1).ToArray() + Items = genresResult.Items.Select(i => i.Item1).ToArray(genresResult.Items.Length) }; return ToResult(result); @@ -1013,7 +1014,7 @@ namespace Emby.Dlna.ContentDirectory var result = new QueryResult { TotalRecordCount = genresResult.TotalRecordCount, - Items = genresResult.Items.Select(i => i.Item1).ToArray() + Items = genresResult.Items.Select(i => i.Item1).ToArray(genresResult.Items.Length) }; return ToResult(result); @@ -1031,7 +1032,7 @@ namespace Emby.Dlna.ContentDirectory var result = new QueryResult { TotalRecordCount = artists.TotalRecordCount, - Items = artists.Items.Select(i => i.Item1).ToArray() + Items = artists.Items.Select(i => i.Item1).ToArray(artists.Items.Length) }; return ToResult(result); @@ -1049,7 +1050,7 @@ namespace Emby.Dlna.ContentDirectory var result = new QueryResult { TotalRecordCount = artists.TotalRecordCount, - Items = artists.Items.Select(i => i.Item1).ToArray() + Items = artists.Items.Select(i => i.Item1).ToArray(artists.Items.Length) }; return ToResult(result); @@ -1068,7 +1069,7 @@ namespace Emby.Dlna.ContentDirectory var result = new QueryResult { TotalRecordCount = artists.TotalRecordCount, - Items = artists.Items.Select(i => i.Item1).ToArray() + Items = artists.Items.Select(i => i.Item1).ToArray(artists.Items.Length) }; return ToResult(result); @@ -1196,7 +1197,7 @@ namespace Emby.Dlna.ContentDirectory { var serverItems = result .Select(i => new ServerItem(i)) - .ToArray(); + .ToArray(result.Count); return new QueryResult { @@ -1210,7 +1211,7 @@ namespace Emby.Dlna.ContentDirectory var serverItems = result .Items .Select(i => new ServerItem(i)) - .ToArray(); + .ToArray(result.Items.Length); return new QueryResult { @@ -1227,7 +1228,7 @@ namespace Emby.Dlna.ContentDirectory sortOrders.Add(ItemSortBy.SortName); } - query.SortBy = sortOrders.ToArray(); + query.SortBy = sortOrders.ToArray(sortOrders.Count); query.SortOrder = sort.SortOrder; } @@ -1243,8 +1244,7 @@ namespace Emby.Dlna.ContentDirectory DtoOptions = GetDtoOptions() }); - var serverItems = itemsResult.Items.Select(i => new ServerItem(i)) - .ToArray(); + var serverItems = itemsResult.Items.Select(i => new ServerItem(i)).ToArray(itemsResult.Items.Length); return new QueryResult { diff --git a/Emby.Dlna/DlnaManager.cs b/Emby.Dlna/DlnaManager.cs index 82975ce22b..847f636198 100644 --- a/Emby.Dlna/DlnaManager.cs +++ b/Emby.Dlna/DlnaManager.cs @@ -18,6 +18,7 @@ using System.Text; using System.Text.RegularExpressions; using MediaBrowser.Model.IO; using MediaBrowser.Model.Reflection; +using MediaBrowser.Model.Extensions; namespace Emby.Dlna { @@ -106,7 +107,6 @@ namespace Emby.Dlna } else { - _logger.Debug("No matching device profile found. The default will need to be used."); LogUnmatchedProfile(deviceInfo); } @@ -220,12 +220,8 @@ namespace Emby.Dlna } else { - var msg = new StringBuilder(); - foreach (var header in headers) - { - msg.AppendLine(header.Key + ": " + header.Value); - } - _logger.LogMultiline("No matching device profile found. The default will need to be used.", LogSeverity.Info, msg); + var headerString = string.Join(", ", headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray(headers.Count)); + _logger.Debug("No matching device profile found. {0}", headerString); } return profile; diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs index e222980102..ff493e365e 100644 --- a/Emby.Dlna/PlayTo/Device.cs +++ b/Emby.Dlna/PlayTo/Device.cs @@ -15,6 +15,7 @@ using System.Threading.Tasks; using System.Xml.Linq; using Emby.Dlna.Server; using MediaBrowser.Model.Threading; +using MediaBrowser.Model.Extensions; namespace Emby.Dlna.PlayTo { @@ -890,7 +891,7 @@ namespace Emby.Dlna.PlayTo if (room != null && !string.IsNullOrWhiteSpace(room.Value)) friendlyNames.Add(room.Value); - deviceProperties.Name = string.Join(" ", friendlyNames.ToArray()); + deviceProperties.Name = string.Join(" ", friendlyNames.ToArray(friendlyNames.Count)); var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault(); if (model != null) diff --git a/Emby.Dlna/Profiles/DefaultProfile.cs b/Emby.Dlna/Profiles/DefaultProfile.cs index 06ce936408..ff025152a7 100644 --- a/Emby.Dlna/Profiles/DefaultProfile.cs +++ b/Emby.Dlna/Profiles/DefaultProfile.cs @@ -1,6 +1,7 @@ using MediaBrowser.Model.Dlna; using System.Linq; using System.Xml.Serialization; +using MediaBrowser.Model.Extensions; namespace Emby.Dlna.Profiles { @@ -164,7 +165,7 @@ namespace Emby.Dlna.Profiles public void AddXmlRootAttribute(string name, string value) { var atts = XmlRootAttributes ?? new XmlAttribute[] { }; - var list = atts.ToList(); + var list = atts.ToList(atts.Length); list.Add(new XmlAttribute { @@ -172,7 +173,7 @@ namespace Emby.Dlna.Profiles Value = value }); - XmlRootAttributes = list.ToArray(); + XmlRootAttributes = list.ToArray(list.Count); } } } diff --git a/Emby.Dlna/Server/DescriptionXmlBuilder.cs b/Emby.Dlna/Server/DescriptionXmlBuilder.cs index 2a4a5792fa..bba4adc5f4 100644 --- a/Emby.Dlna/Server/DescriptionXmlBuilder.cs +++ b/Emby.Dlna/Server/DescriptionXmlBuilder.cs @@ -226,7 +226,7 @@ namespace Emby.Dlna.Server } } - var characters = characterList.ToArray(); + var characters = characterList.ToArray(characterList.Count); var serverName = new string(characters); diff --git a/Emby.Dlna/Service/BaseControlHandler.cs b/Emby.Dlna/Service/BaseControlHandler.cs index 3092589c12..7cd10bd019 100644 --- a/Emby.Dlna/Service/BaseControlHandler.cs +++ b/Emby.Dlna/Service/BaseControlHandler.cs @@ -11,6 +11,7 @@ using System.Xml; using Emby.Dlna.Didl; using MediaBrowser.Controller.Extensions; using MediaBrowser.Model.Xml; +using MediaBrowser.Model.Extensions; namespace Emby.Dlna.Service { @@ -235,26 +236,29 @@ namespace Emby.Dlna.Service private void LogRequest(ControlRequest request) { - var builder = new StringBuilder(); + if (!Config.GetDlnaConfiguration().EnableDebugLog) + { + return; + } - var headers = string.Join(", ", request.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray()); - builder.AppendFormat("Headers: {0}", headers); - builder.AppendLine(); - //builder.Append(request.InputXml); + var originalHeaders = request.Headers; + var headers = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray(originalHeaders.Count)); - Logger.LogMultiline("Control request", LogSeverity.Debug, builder); + Logger.Debug("Control request. Headers: {0}", headers); } private void LogResponse(ControlResponse response) { - var builder = new StringBuilder(); + if (!Config.GetDlnaConfiguration().EnableDebugLog) + { + return; + } - var headers = string.Join(", ", response.Headers.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray()); - builder.AppendFormat("Headers: {0}", headers); - builder.AppendLine(); - builder.Append(response.Xml); + var originalHeaders = response.Headers; + var headers = string.Join(", ", originalHeaders.Select(i => string.Format("{0}={1}", i.Key, i.Value)).ToArray(originalHeaders.Count)); + //builder.Append(response.Xml); - Logger.LogMultiline("Control response", LogSeverity.Debug, builder); + Logger.Debug("Control response. Headers: {0}", headers); } } } diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs index cc7b77de6d..bd23eba7aa 100644 --- a/Emby.Drawing/ImageProcessor.cs +++ b/Emby.Drawing/ImageProcessor.cs @@ -17,12 +17,10 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.IO; using Emby.Drawing.Common; - -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Net; using MediaBrowser.Model.Threading; -using TagLib; +using MediaBrowser.Model.Extensions; namespace Emby.Drawing { @@ -662,7 +660,7 @@ namespace Emby.Drawing var cacheKeys = imageEnhancers.Select(i => i.GetConfigurationCacheKey(item, imageType)).ToList(); cacheKeys.Add(originalImagePath + dateModified.Ticks); - return string.Join("|", cacheKeys.ToArray()).GetMD5().ToString("N"); + return string.Join("|", cacheKeys.ToArray(cacheKeys.Count)).GetMD5().ToString("N"); } /// diff --git a/Emby.Photos/PhotoProvider.cs b/Emby.Photos/PhotoProvider.cs index 57047cf81e..c3c30ab6d1 100644 --- a/Emby.Photos/PhotoProvider.cs +++ b/Emby.Photos/PhotoProvider.cs @@ -111,7 +111,7 @@ namespace Emby.Photos } item.Genres = image.ImageTag.Genres.ToList(); - item.Tags = image.ImageTag.Keywords.ToList(); + item.Tags = image.ImageTag.Keywords; item.Software = image.ImageTag.Software; if (image.ImageTag.Orientation == TagLib.Image.ImageOrientation.None) diff --git a/Emby.Server.Core/Emby.Server.Core.csproj b/Emby.Server.Core/Emby.Server.Core.csproj deleted file mode 100644 index 063ef6eb90..0000000000 --- a/Emby.Server.Core/Emby.Server.Core.csproj +++ /dev/null @@ -1,176 +0,0 @@ - - - - - Debug - AnyCPU - {776B9F0C-5195-45E3-9A36-1CC1F0D8E0B0} - Library - Properties - Emby.Server.Core - Emby.Server.Core - v4.6 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - - - - ..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll - True - - - ..\packages\ServiceStack.Text.4.5.8\lib\net45\ServiceStack.Text.dll - True - - - ..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll - - - - - - - - - - - - - - Properties\SharedVersion.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {1e37a338-9f57-4b70-bd6d-bb9c591e319b} - Emby.Common.Implementations - - - {805844ab-e92f-45e6-9d99-4f6d48d129a5} - Emby.Dlna - - - {08fff49b-f175-4807-a2b5-73b0ebd9f716} - Emby.Drawing - - - {89ab4548-770d-41fd-a891-8daff44f452c} - Emby.Photos - - - {e383961b-9356-4d5d-8233-9a1079d03055} - Emby.Server.Implementations - - - {4fd51ac5-2c16-4308-a993-c3a84f3b4582} - MediaBrowser.Api - - - {9142eefa-7570-41e1-bfcc-468bb571af2f} - MediaBrowser.Common - - - {17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2} - MediaBrowser.Controller - - - {7ef9f3e0-697d-42f3-a08f-19deb5f84392} - MediaBrowser.LocalMetadata - - - {0bd82fa6-eb8a-4452-8af5-74f9c3849451} - MediaBrowser.MediaEncoding - - - {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} - MediaBrowser.Model - - - {442b5058-dcaf-4263-bb6a-f21e31120a1b} - MediaBrowser.Providers - - - {2e781478-814d-4a48-9d80-bff206441a65} - MediaBrowser.Server.Implementations - - - {5624b7b5-b5a7-41d8-9f10-cc5611109619} - MediaBrowser.WebDashboard - - - {23499896-b135-4527-8574-c26e926ea99e} - MediaBrowser.XbmcMetadata - - - {cb7f2326-6497-4a3d-ba03-48513b17a7be} - Mono.Nat - - - {4a4402d4-e910-443b-b8fc-2c18286a2ca0} - OpenSubtitlesHandler - - - {1d74413b-e7cf-455b-b021-f52bdf881542} - SocketHttpListener - - - - - - - - - \ No newline at end of file diff --git a/Emby.Server.Core/Properties/AssemblyInfo.cs b/Emby.Server.Core/Properties/AssemblyInfo.cs deleted file mode 100644 index ead0429819..0000000000 --- a/Emby.Server.Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Emby.Server.Core")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Emby.Server.Core")] -[assembly: AssemblyCopyright("Copyright © 2017")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("776b9f0c-5195-45e3-9a36-1cc1f0d8e0b0")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] \ No newline at end of file diff --git a/Emby.Server.Core/app.config b/Emby.Server.Core/app.config deleted file mode 100644 index 57ff623921..0000000000 --- a/Emby.Server.Core/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Emby.Server.Core/packages.config b/Emby.Server.Core/packages.config deleted file mode 100644 index 6311b55eb2..0000000000 --- a/Emby.Server.Core/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs b/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs index 567f139fd8..702917832b 100644 --- a/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs +++ b/Emby.Server.Implementations/Activity/ActivityLogEntryPoint.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Activity { @@ -436,7 +437,7 @@ namespace Emby.Server.Implementations.Activity { Name = string.Format(_localization.GetLocalizedString("ScheduledTaskFailedWithName"), task.Name), Type = "ScheduledTaskFailed", - Overview = string.Join(Environment.NewLine, vals.ToArray()), + Overview = string.Join(Environment.NewLine, vals.ToArray(vals.Count)), ShortOverview = runningTime, Severity = LogSeverity.Error }); diff --git a/Emby.Server.Implementations/Activity/ActivityRepository.cs b/Emby.Server.Implementations/Activity/ActivityRepository.cs index e9b6f7a404..7720f8f2fd 100644 --- a/Emby.Server.Implementations/Activity/ActivityRepository.cs +++ b/Emby.Server.Implementations/Activity/ActivityRepository.cs @@ -10,6 +10,7 @@ using MediaBrowser.Model.Activity; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; using SQLitePCL.pretty; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Activity { @@ -94,13 +95,13 @@ namespace Emby.Server.Implementations.Activity var whereTextWithoutPaging = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); if (startIndex.HasValue && startIndex.Value > 0) { var pagingWhereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM ActivityLogEntries {0} ORDER BY DateCreated DESC LIMIT {1})", pagingWhereText, @@ -109,7 +110,7 @@ namespace Emby.Server.Implementations.Activity var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); commandText += whereText; @@ -154,7 +155,7 @@ namespace Emby.Server.Implementations.Activity result.TotalRecordCount = statement.ExecuteQuery().SelectScalarInt().First(); } - result.Items = list.ToArray(); + result.Items = list.ToArray(list.Count); return result; }, ReadTransactionMode); diff --git a/Emby.Server.Core/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs similarity index 97% rename from Emby.Server.Core/ApplicationHost.cs rename to Emby.Server.Implementations/ApplicationHost.cs index 68cb2a4e32..f1f24660c5 100644 --- a/Emby.Server.Core/ApplicationHost.cs +++ b/Emby.Server.Implementations/ApplicationHost.cs @@ -1,11 +1,52 @@ -using MediaBrowser.Api; +using Emby.Common.Implementations; +using Emby.Common.Implementations.Archiving; +using Emby.Common.Implementations.IO; +using Emby.Common.Implementations.Reflection; +using Emby.Common.Implementations.ScheduledTasks; +using Emby.Common.Implementations.Serialization; +using Emby.Common.Implementations.TextEncoding; +using Emby.Common.Implementations.Xml; +using Emby.Dlna; +using Emby.Dlna.ConnectionManager; +using Emby.Dlna.ContentDirectory; +using Emby.Dlna.Main; +using Emby.Dlna.MediaReceiverRegistrar; +using Emby.Dlna.Ssdp; +using Emby.Drawing; +using Emby.Photos; +using Emby.Server.Implementations.Activity; +using Emby.Server.Implementations.Channels; +using Emby.Server.Implementations.Collections; +using Emby.Server.Implementations.Configuration; +using Emby.Server.Implementations.Data; +using Emby.Server.Implementations.Devices; +using Emby.Server.Implementations.Dto; +using Emby.Server.Implementations.FFMpeg; +using Emby.Server.Implementations.HttpServer; +using Emby.Server.Implementations.HttpServer.Security; +using Emby.Server.Implementations.IO; +using Emby.Server.Implementations.Library; +using Emby.Server.Implementations.LiveTv; +using Emby.Server.Implementations.Localization; +using Emby.Server.Implementations.MediaEncoder; +using Emby.Server.Implementations.Migrations; +using Emby.Server.Implementations.Notifications; +using Emby.Server.Implementations.Playlists; +using Emby.Server.Implementations.Security; +using Emby.Server.Implementations.Session; +using Emby.Server.Implementations.Social; +using Emby.Server.Implementations.TV; +using Emby.Server.Implementations.Updates; +using MediaBrowser.Api; using MediaBrowser.Common; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Events; using MediaBrowser.Common.Extensions; -using Emby.Common.Implementations.ScheduledTasks; using MediaBrowser.Common.Net; +using MediaBrowser.Common.Plugins; using MediaBrowser.Common.Progress; +using MediaBrowser.Common.Security; +using MediaBrowser.Common.Updates; using MediaBrowser.Controller; using MediaBrowser.Controller.Channels; using MediaBrowser.Controller.Chapters; @@ -17,6 +58,9 @@ using MediaBrowser.Controller.Dlna; using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Entities.Movies; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.MediaEncoding; @@ -34,102 +78,47 @@ using MediaBrowser.Controller.Subtitles; using MediaBrowser.Controller.Sync; using MediaBrowser.Controller.TV; using MediaBrowser.LocalMetadata.Savers; -using MediaBrowser.MediaEncoding.BdInfo; -using MediaBrowser.MediaEncoding.Encoder; -using MediaBrowser.MediaEncoding.Subtitles; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.MediaInfo; -using MediaBrowser.Model.System; -using MediaBrowser.Model.Updates; -using MediaBrowser.Providers.Chapters; -using MediaBrowser.Providers.Manager; -using MediaBrowser.Providers.Subtitles; -using MediaBrowser.WebDashboard.Api; -using MediaBrowser.XbmcMetadata.Providers; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Sockets; -using System.Reflection; -using System.Security.Cryptography.X509Certificates; -using System.Threading; -using System.Threading.Tasks; -using Emby.Common.Implementations; -using Emby.Common.Implementations.Archiving; -using Emby.Common.Implementations.IO; -using Emby.Common.Implementations.Reflection; -using Emby.Common.Implementations.Serialization; -using Emby.Common.Implementations.TextEncoding; -using Emby.Common.Implementations.Xml; -using Emby.Photos; -using MediaBrowser.Model.IO; -using MediaBrowser.Api.Playback; -using MediaBrowser.Common.Plugins; -using MediaBrowser.Common.Security; -using MediaBrowser.Common.Updates; -using MediaBrowser.Controller.Entities.Audio; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.Entities.TV; -using Emby.Dlna; -using Emby.Dlna.ConnectionManager; -using Emby.Dlna.ContentDirectory; -using Emby.Dlna.Main; -using Emby.Dlna.MediaReceiverRegistrar; -using Emby.Dlna.Ssdp; -using Emby.Server.Core; -using Emby.Server.Implementations.Activity; -using Emby.Server.Implementations.Devices; -using Emby.Server.Implementations.FFMpeg; -using Emby.Server.Core.IO; -using Emby.Server.Core.Localization; -using Emby.Server.Implementations.Migrations; -using Emby.Server.Implementations.Security; -using Emby.Server.Implementations.Social; -using Emby.Server.Implementations.Channels; -using Emby.Server.Implementations.Collections; -using Emby.Server.Implementations.Dto; -using Emby.Server.Implementations.IO; -using Emby.Server.Implementations.HttpServer; -using Emby.Server.Implementations.HttpServer.Security; -using Emby.Server.Implementations.Library; -using Emby.Server.Implementations.LiveTv; -using Emby.Server.Implementations.Localization; -using Emby.Server.Implementations.MediaEncoder; -using Emby.Server.Implementations.Notifications; -using Emby.Server.Implementations.Data; -using Emby.Server.Implementations.Playlists; -using Emby.Server.Implementations; -using Emby.Server.Implementations.ServerManager; -using Emby.Server.Implementations.Session; -using Emby.Server.Implementations.TV; -using Emby.Server.Implementations.Updates; using MediaBrowser.Model.Activity; using MediaBrowser.Model.Configuration; +using MediaBrowser.Model.Diagnostics; using MediaBrowser.Model.Dlna; using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Net; using MediaBrowser.Model.News; using MediaBrowser.Model.Reflection; using MediaBrowser.Model.Serialization; using MediaBrowser.Model.Services; using MediaBrowser.Model.Social; +using MediaBrowser.Model.System; using MediaBrowser.Model.Text; +using MediaBrowser.Model.Updates; using MediaBrowser.Model.Xml; +using MediaBrowser.Providers.Chapters; +using MediaBrowser.Providers.Manager; +using MediaBrowser.Providers.Subtitles; +using MediaBrowser.WebDashboard.Api; +using MediaBrowser.XbmcMetadata.Providers; using OpenSubtitlesHandler; using ServiceStack; using SocketHttpListener.Primitives; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Emby.Server.MediaEncoding.Subtitles; +using MediaBrowser.MediaEncoding.BdInfo; using StringExtensions = MediaBrowser.Controller.Extensions.StringExtensions; -using Emby.Drawing; -using Emby.Server.Implementations.Migrations; -using MediaBrowser.Model.Diagnostics; -using Emby.Common.Implementations.Diagnostics; -using Emby.Server.Implementations.Configuration; -namespace Emby.Server.Core +namespace Emby.Server.Implementations { /// /// Class CompositionRoot @@ -357,13 +346,6 @@ namespace Emby.Server.Core { var builder = GetBaseExceptionMessage(ApplicationPaths); - // Skip if plugins haven't been loaded yet - //if (Plugins != null) - //{ - // var pluginString = string.Join("|", Plugins.Select(i => i.Name + "-" + i.Version.ToString()).ToArray()); - // builder.Insert(0, string.Format("Plugins: {0}{1}", pluginString, Environment.NewLine)); - //} - builder.Insert(0, string.Format("Version: {0}{1}", ApplicationVersion, Environment.NewLine)); builder.Insert(0, "*** Error Report ***" + Environment.NewLine); @@ -608,7 +590,7 @@ namespace Emby.Server.Core RegisterSingleInstance(HttpServer, false); progress.Report(10); - ServerManager = new ServerManager(this, JsonSerializer, LogManager.GetLogger("ServerManager"), ServerConfigurationManager, MemoryStreamFactory, textEncoding); + ServerManager = new ServerManager.ServerManager(this, JsonSerializer, LogManager.GetLogger("ServerManager"), ServerConfigurationManager, MemoryStreamFactory, textEncoding); RegisterSingleInstance(ServerManager); var innerProgress = new ActionableProgress(); @@ -884,7 +866,7 @@ namespace Emby.Server.Core probePath = info.ProbePath; var hasExternalEncoder = string.Equals(info.Version, "external", StringComparison.OrdinalIgnoreCase); - var mediaEncoder = new MediaEncoder(LogManager.GetLogger("MediaEncoder"), + var mediaEncoder = new MediaEncoding.Encoder.MediaEncoder(LogManager.GetLogger("MediaEncoder"), JsonSerializer, encoderPath, probePath, @@ -980,8 +962,6 @@ namespace Emby.Server.Core BaseItem.CollectionManager = CollectionManager; BaseItem.MediaSourceManager = MediaSourceManager; CollectionFolder.XmlSerializer = XmlSerializer; - BaseStreamingService.AppHost = this; - BaseStreamingService.HttpClient = HttpClient; Utilities.CryptographyProvider = CryptographyProvider; AuthenticatedAttribute.AuthService = AuthService; } @@ -1254,7 +1234,7 @@ namespace Emby.Server.Core list.Add(GetAssembly(typeof(InstallationManager))); // MediaEncoding - list.Add(GetAssembly(typeof(MediaEncoder))); + list.Add(GetAssembly(typeof(MediaEncoding.Encoder.MediaEncoder))); // Dlna list.Add(GetAssembly(typeof(DlnaEntryPoint))); @@ -1267,10 +1247,7 @@ namespace Emby.Server.Core list.AddRange(GetAssembliesWithPartsInternal()); - // Include composable parts in the running assembly - list.Add(GetAssembly(typeof(ApplicationHost))); - - return list; + return list.ToList(); } protected abstract List GetAssembliesWithPartsInternal(); diff --git a/Emby.Server.Core/ApplicationPathHelper.cs b/Emby.Server.Implementations/ApplicationPathHelper.cs similarity index 97% rename from Emby.Server.Core/ApplicationPathHelper.cs rename to Emby.Server.Implementations/ApplicationPathHelper.cs index e83d5444aa..262cc526ec 100644 --- a/Emby.Server.Core/ApplicationPathHelper.cs +++ b/Emby.Server.Implementations/ApplicationPathHelper.cs @@ -2,7 +2,7 @@ using System.Configuration; using System.IO; -namespace Emby.Server.Core +namespace Emby.Server.Implementations { public static class ApplicationPathHelper { diff --git a/Emby.Server.Implementations/Channels/ChannelManager.cs b/Emby.Server.Implementations/Channels/ChannelManager.cs index 2adf6a37ca..5e97cd5f5c 100644 --- a/Emby.Server.Implementations/Channels/ChannelManager.cs +++ b/Emby.Server.Implementations/Channels/ChannelManager.cs @@ -159,7 +159,7 @@ namespace Emby.Server.Implementations.Channels all = all.Take(query.Limit.Value).ToList(); } - var returnItems = all.ToArray(); + var returnItems = all.ToArray(all.Count); var result = new QueryResult { @@ -182,8 +182,10 @@ namespace Emby.Server.Implementations.Channels { }; - var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) - .ToArray(); + var returnList = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user) + .ConfigureAwait(false)); + var returnItems = returnList + .ToArray(returnList.Count); var result = new QueryResult { @@ -567,8 +569,9 @@ namespace Emby.Server.Implementations.Channels Fields = query.Fields.ToList() }; - var returnItems = (await _dtoService.GetBaseItemDtos(items, dtoOptions, user).ConfigureAwait(false)) - .ToArray(); + var returnList = (await _dtoService.GetBaseItemDtos(items, dtoOptions, user).ConfigureAwait(false)); + var returnItems = returnList + .ToArray(returnList.Count); var result = new QueryResult { @@ -676,12 +679,10 @@ namespace Emby.Server.Implementations.Channels internalItems = internalItems.Take(query.Limit.Value).ToArray(); } - var returnItemArray = internalItems.ToArray(); - return new QueryResult { TotalRecordCount = totalCount, - Items = returnItemArray + Items = internalItems }; } @@ -813,12 +814,10 @@ namespace Emby.Server.Implementations.Channels var internalItems = await Task.WhenAll(itemTasks).ConfigureAwait(false); - var returnItemArray = internalItems.ToArray(); - return new QueryResult { TotalRecordCount = totalCount, - Items = returnItemArray + Items = internalItems }; } @@ -837,8 +836,10 @@ namespace Emby.Server.Implementations.Channels Fields = query.Fields.ToList() }; - var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) - .ToArray(); + var returnList = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user) + .ConfigureAwait(false)); + var returnItems = returnList + .ToArray(returnList.Count); var result = new QueryResult { @@ -989,8 +990,10 @@ namespace Emby.Server.Implementations.Channels Fields = query.Fields.ToList() }; - var returnItems = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user).ConfigureAwait(false)) - .ToArray(); + var returnList = (await _dtoService.GetBaseItemDtos(internalResult.Items, dtoOptions, user) + .ConfigureAwait(false)); + var returnItems = returnList + .ToArray(returnList.Count); var result = new QueryResult { @@ -1191,7 +1194,7 @@ namespace Emby.Server.Implementations.Channels } } - var returnItemArray = all.ToArray(); + var returnItemArray = all.ToArray(all.Count); RefreshIfNeeded(returnItemArray); return new QueryResult @@ -1309,7 +1312,7 @@ namespace Emby.Server.Implementations.Channels { item.Name = info.Name; item.Genres = info.Genres; - item.Studios = info.Studios; + item.Studios = info.Studios.ToArray(info.Studios.Count); item.CommunityRating = info.CommunityRating; item.Overview = info.Overview; item.IndexNumber = info.IndexNumber; @@ -1319,7 +1322,7 @@ namespace Emby.Server.Implementations.Channels item.ProviderIds = info.ProviderIds; item.OfficialRating = info.OfficialRating; item.DateCreated = info.DateCreated ?? DateTime.UtcNow; - item.Tags = info.Tags; + item.Tags = info.Tags.ToArray(info.Tags.Count); item.HomePageUrl = info.HomePageUrl; } else if (info.Type == ChannelItemType.Folder && info.FolderType == ChannelFolderType.Container) diff --git a/Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs b/Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs index 2241e93778..4d9bf0624d 100644 --- a/Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs +++ b/Emby.Server.Implementations/Configuration/ServerConfigurationManager.cs @@ -16,6 +16,7 @@ using MediaBrowser.Model.Events; using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Configuration { @@ -216,7 +217,7 @@ namespace Emby.Server.Implementations.Configuration list.Add(service); - options.DisabledMetadataSavers = list.ToArray(); + options.DisabledMetadataSavers = list.ToArray(list.Count); } } @@ -236,7 +237,7 @@ namespace Emby.Server.Implementations.Configuration list.Add(options); - config.MetadataOptions = list.ToArray(); + config.MetadataOptions = list.ToArray(list.Count); } return options; diff --git a/Emby.Server.Core/Cryptography/ASN1.cs b/Emby.Server.Implementations/Cryptography/ASN1.cs similarity index 100% rename from Emby.Server.Core/Cryptography/ASN1.cs rename to Emby.Server.Implementations/Cryptography/ASN1.cs diff --git a/Emby.Server.Core/Cryptography/ASN1Convert.cs b/Emby.Server.Implementations/Cryptography/ASN1Convert.cs similarity index 100% rename from Emby.Server.Core/Cryptography/ASN1Convert.cs rename to Emby.Server.Implementations/Cryptography/ASN1Convert.cs diff --git a/Emby.Server.Core/Cryptography/BitConverterLE.cs b/Emby.Server.Implementations/Cryptography/BitConverterLE.cs similarity index 100% rename from Emby.Server.Core/Cryptography/BitConverterLE.cs rename to Emby.Server.Implementations/Cryptography/BitConverterLE.cs diff --git a/Emby.Server.Core/Cryptography/CertificateGenerator.cs b/Emby.Server.Implementations/Cryptography/CertificateGenerator.cs similarity index 100% rename from Emby.Server.Core/Cryptography/CertificateGenerator.cs rename to Emby.Server.Implementations/Cryptography/CertificateGenerator.cs diff --git a/Emby.Server.Core/Cryptography/CryptoConvert.cs b/Emby.Server.Implementations/Cryptography/CryptoConvert.cs similarity index 100% rename from Emby.Server.Core/Cryptography/CryptoConvert.cs rename to Emby.Server.Implementations/Cryptography/CryptoConvert.cs diff --git a/Emby.Server.Core/Cryptography/PKCS1.cs b/Emby.Server.Implementations/Cryptography/PKCS1.cs similarity index 100% rename from Emby.Server.Core/Cryptography/PKCS1.cs rename to Emby.Server.Implementations/Cryptography/PKCS1.cs diff --git a/Emby.Server.Core/Cryptography/PKCS12.cs b/Emby.Server.Implementations/Cryptography/PKCS12.cs similarity index 100% rename from Emby.Server.Core/Cryptography/PKCS12.cs rename to Emby.Server.Implementations/Cryptography/PKCS12.cs diff --git a/Emby.Server.Core/Cryptography/PKCS7.cs b/Emby.Server.Implementations/Cryptography/PKCS7.cs similarity index 100% rename from Emby.Server.Core/Cryptography/PKCS7.cs rename to Emby.Server.Implementations/Cryptography/PKCS7.cs diff --git a/Emby.Server.Core/Cryptography/PKCS8.cs b/Emby.Server.Implementations/Cryptography/PKCS8.cs similarity index 100% rename from Emby.Server.Core/Cryptography/PKCS8.cs rename to Emby.Server.Implementations/Cryptography/PKCS8.cs diff --git a/Emby.Server.Core/Cryptography/PfxGenerator.cs b/Emby.Server.Implementations/Cryptography/PfxGenerator.cs similarity index 100% rename from Emby.Server.Core/Cryptography/PfxGenerator.cs rename to Emby.Server.Implementations/Cryptography/PfxGenerator.cs diff --git a/Emby.Server.Core/Cryptography/X501Name.cs b/Emby.Server.Implementations/Cryptography/X501Name.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X501Name.cs rename to Emby.Server.Implementations/Cryptography/X501Name.cs diff --git a/Emby.Server.Core/Cryptography/X509Builder.cs b/Emby.Server.Implementations/Cryptography/X509Builder.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X509Builder.cs rename to Emby.Server.Implementations/Cryptography/X509Builder.cs diff --git a/Emby.Server.Core/Cryptography/X509Certificate.cs b/Emby.Server.Implementations/Cryptography/X509Certificate.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X509Certificate.cs rename to Emby.Server.Implementations/Cryptography/X509Certificate.cs diff --git a/Emby.Server.Core/Cryptography/X509CertificateBuilder.cs b/Emby.Server.Implementations/Cryptography/X509CertificateBuilder.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X509CertificateBuilder.cs rename to Emby.Server.Implementations/Cryptography/X509CertificateBuilder.cs diff --git a/Emby.Server.Core/Cryptography/X509CertificateCollection.cs b/Emby.Server.Implementations/Cryptography/X509CertificateCollection.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X509CertificateCollection.cs rename to Emby.Server.Implementations/Cryptography/X509CertificateCollection.cs diff --git a/Emby.Server.Core/Cryptography/X509Extension.cs b/Emby.Server.Implementations/Cryptography/X509Extension.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X509Extension.cs rename to Emby.Server.Implementations/Cryptography/X509Extension.cs diff --git a/Emby.Server.Core/Cryptography/X509Extensions.cs b/Emby.Server.Implementations/Cryptography/X509Extensions.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X509Extensions.cs rename to Emby.Server.Implementations/Cryptography/X509Extensions.cs diff --git a/Emby.Server.Core/Cryptography/X520Attributes.cs b/Emby.Server.Implementations/Cryptography/X520Attributes.cs similarity index 100% rename from Emby.Server.Core/Cryptography/X520Attributes.cs rename to Emby.Server.Implementations/Cryptography/X520Attributes.cs diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs index 72c0690733..a34c90cb41 100644 --- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs +++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs @@ -136,24 +136,6 @@ namespace Emby.Server.Implementations.Data queries.Add("PRAGMA temp_store = file"); } - ////foreach (var query in queries) - ////{ - //// db.Execute(query); - ////} - - //Logger.Info("synchronous: " + db.Query("PRAGMA synchronous").SelectScalarString().First()); - //Logger.Info("temp_store: " + db.Query("PRAGMA temp_store").SelectScalarString().First()); - - /*if (!string.Equals(_defaultWal, "wal", StringComparison.OrdinalIgnoreCase)) - { - queries.Add("PRAGMA journal_mode=WAL"); - - using (WriteLock.Write()) - { - db.ExecuteAll(string.Join(";", queries.ToArray())); - } - } - else*/ foreach (var query in queries) { db.Execute(query); @@ -212,6 +194,13 @@ namespace Emby.Server.Implementations.Data "pragma temp_store = memory" }); } + else + { + queries.AddRange(new List + { + "pragma temp_store = file" + }); + } db.ExecuteAll(string.Join(";", queries.ToArray())); Logger.Info("PRAGMA synchronous=" + db.Query("PRAGMA synchronous").SelectScalarString().First()); diff --git a/Emby.Server.Implementations/Data/SqliteItemRepository.cs b/Emby.Server.Implementations/Data/SqliteItemRepository.cs index 44b2cd10bd..23d46e8211 100644 --- a/Emby.Server.Implementations/Data/SqliteItemRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteItemRepository.cs @@ -31,6 +31,7 @@ using MediaBrowser.Model.Reflection; using SQLitePCL.pretty; using MediaBrowser.Model.System; using MediaBrowser.Model.Threading; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Data { @@ -836,7 +837,7 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBind("@IsInMixedFolder", item.IsInMixedFolder); - if (item.LockedFields.Count > 0) + if (item.LockedFields.Length > 0) { saveItemStatement.TryBind("@LockedFields", string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray())); } @@ -845,7 +846,7 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBindNull("@LockedFields"); } - if (item.Studios.Count > 0) + if (item.Studios.Length > 0) { saveItemStatement.TryBind("@Studios", string.Join("|", item.Studios.ToArray())); } @@ -865,9 +866,9 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBind("@ExternalServiceId", item.ServiceName); - if (item.Tags.Count > 0) + if (item.Tags.Length > 0) { - saveItemStatement.TryBind("@Tags", string.Join("|", item.Tags.ToArray())); + saveItemStatement.TryBind("@Tags", string.Join("|", item.Tags)); } else { @@ -984,16 +985,16 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBind("@ProviderIds", SerializeProviderIds(item)); saveItemStatement.TryBind("@Images", SerializeImages(item)); - if (item.ProductionLocations.Count > 0) + if (item.ProductionLocations.Length > 0) { - saveItemStatement.TryBind("@ProductionLocations", string.Join("|", item.ProductionLocations.ToArray())); + saveItemStatement.TryBind("@ProductionLocations", string.Join("|", item.ProductionLocations)); } else { saveItemStatement.TryBindNull("@ProductionLocations"); } - if (item.ThemeSongIds.Count > 0) + if (item.ThemeSongIds.Length > 0) { saveItemStatement.TryBind("@ThemeSongIds", string.Join("|", item.ThemeSongIds.ToArray())); } @@ -1002,7 +1003,7 @@ namespace Emby.Server.Implementations.Data saveItemStatement.TryBindNull("@ThemeSongIds"); } - if (item.ThemeVideoIds.Count > 0) + if (item.ThemeVideoIds.Length > 0) { saveItemStatement.TryBind("@ThemeVideoIds", string.Join("|", item.ThemeVideoIds.ToArray())); } @@ -1089,9 +1090,9 @@ namespace Emby.Server.Implementations.Data private string SerializeImages(BaseItem item) { - var images = item.ImageInfos.ToList(); + var images = item.ImageInfos; - if (images.Count == 0) + if (images.Length == 0) { return null; } @@ -1108,22 +1109,24 @@ namespace Emby.Server.Implementations.Data return; } - if (item.ImageInfos.Count > 0) + if (item.ImageInfos.Length > 0) { return; } var parts = value.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); - + var list = new List(); foreach (var part in parts) { var image = ItemImageInfoFromValueString(part); if (image != null) { - item.ImageInfos.Add(image); + list.Add(image); } } + + item.ImageInfos = list.ToArray(list.Count); } public string ToValueString(ItemImageInfo image) @@ -1678,7 +1681,7 @@ namespace Emby.Server.Implementations.Data return parsedValue; } return (MetadataFields?)null; - }).Where(i => i.HasValue).Select(i => i.Value).ToList(); + }).Where(i => i.HasValue).Select(i => i.Value).ToArray(); } index++; } @@ -1687,7 +1690,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.Studios = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + item.Studios = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); } index++; } @@ -1696,7 +1699,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.Tags = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + item.Tags = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries); } index++; } @@ -1873,7 +1876,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.ProductionLocations = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToList(); + item.ProductionLocations = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).ToArray(); } index++; } @@ -1882,7 +1885,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.ThemeSongIds = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => new Guid(i)).ToList(); + item.ThemeSongIds = SplitToGuids(reader.GetString(index)); } index++; } @@ -1891,7 +1894,7 @@ namespace Emby.Server.Implementations.Data { if (!reader.IsDBNull(index)) { - item.ThemeVideoIds = reader.GetString(index).Split('|').Where(i => !string.IsNullOrWhiteSpace(i)).Select(i => new Guid(i)).ToList(); + item.ThemeVideoIds = SplitToGuids(reader.GetString(index)); } index++; } @@ -1950,12 +1953,26 @@ namespace Emby.Server.Implementations.Data return item; } + private Guid[] SplitToGuids(string value) + { + var ids = value.Split('|'); + + var result = new Guid[ids.Length]; + + for (var i = 0; i < result.Length; i++) + { + result[i] = new Guid(ids[i]); + } + + return result; + } + /// /// Gets the critic reviews. /// /// The item id. /// Task{IEnumerable{ItemReview}}. - public IEnumerable GetCriticReviews(Guid itemId) + public List GetCriticReviews(Guid itemId) { return new List(); } @@ -2206,7 +2223,7 @@ namespace Emby.Server.Implementations.Data return false; } - private List allFields = Enum.GetNames(typeof(ItemFields)) + private readonly List allFields = Enum.GetNames(typeof(ItemFields)) .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true)) .ToList(); @@ -2548,11 +2565,11 @@ namespace Emby.Server.Implementations.Data } } - query.ExcludeItemIds = excludeIds.ToArray(); + query.ExcludeItemIds = excludeIds.ToArray(excludeIds.Count); query.ExcludeProviderIds = item.ProviderIds; } - return list.ToArray(); + return list.ToArray(list.Count); } private void BindSimilarParams(InternalItemsQuery query, IStatement statement) @@ -2595,7 +2612,7 @@ namespace Emby.Server.Implementations.Data if (groups.Count > 0) { - return " Group by " + string.Join(",", groups.ToArray()); + return " Group by " + string.Join(",", groups.ToArray(groups.Count)); } return string.Empty; @@ -2632,7 +2649,7 @@ namespace Emby.Server.Implementations.Data var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); commandText += whereText; @@ -2689,7 +2706,7 @@ namespace Emby.Server.Implementations.Data var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); commandText += whereText; @@ -2842,7 +2859,7 @@ namespace Emby.Server.Implementations.Data var returnList = GetItemList(query); return new QueryResult { - Items = returnList.ToArray(), + Items = returnList.ToArray(returnList.Count), TotalRecordCount = returnList.Count }; } @@ -2865,7 +2882,7 @@ namespace Emby.Server.Implementations.Data var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); var whereTextWithoutPaging = whereText; @@ -2926,8 +2943,7 @@ namespace Emby.Server.Implementations.Data return connection.RunInTransaction(db => { var result = new QueryResult(); - var statements = PrepareAllSafe(db, statementTexts) - .ToList(); + var statements = PrepareAllSafe(db, statementTexts); if (!isReturningZeroItems) { @@ -2981,7 +2997,7 @@ namespace Emby.Server.Implementations.Data LogQueryTime("GetItems", commandText, now); - result.Items = list.ToArray(); + result.Items = list.ToArray(list.Count); return result; }, ReadTransactionMode); @@ -3133,7 +3149,7 @@ namespace Emby.Server.Implementations.Data var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); commandText += whereText; @@ -3204,7 +3220,7 @@ namespace Emby.Server.Implementations.Data var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); commandText += whereText; @@ -3277,7 +3293,7 @@ namespace Emby.Server.Implementations.Data var returnList = GetItemIdsList(query); return new QueryResult { - Items = returnList.ToArray(), + Items = returnList.ToArray(returnList.Count), TotalRecordCount = returnList.Count }; } @@ -3292,7 +3308,7 @@ namespace Emby.Server.Implementations.Data var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); var whereTextWithoutPaging = whereText; @@ -3355,8 +3371,7 @@ namespace Emby.Server.Implementations.Data { var result = new QueryResult(); - var statements = PrepareAllSafe(db, statementTexts) - .ToList(); + var statements = PrepareAllSafe(db, statementTexts); if (!isReturningZeroItems) { @@ -3399,7 +3414,7 @@ namespace Emby.Server.Implementations.Data LogQueryTime("GetItemIds", commandText, now); - result.Items = list.ToArray(); + result.Items = list.ToArray(list.Count); return result; }, ReadTransactionMode); @@ -3604,7 +3619,7 @@ namespace Emby.Server.Implementations.Data } if (programAttribtues.Count > 0) { - whereClauses.Add("(" + string.Join(" OR ", programAttribtues.ToArray()) + ")"); + whereClauses.Add("(" + string.Join(" OR ", programAttribtues.ToArray(programAttribtues.Count)) + ")"); } } @@ -5129,9 +5144,9 @@ namespace Emby.Server.Implementations.Data var itemCountColumns = new List>(); - var typesToCount = query.IncludeItemTypes.ToList(); + var typesToCount = query.IncludeItemTypes; - if (typesToCount.Count > 0) + if (typesToCount.Length > 0) { var itemCountColumnQuery = "select group_concat(type, '|')" + GetFromText("B"); @@ -5191,7 +5206,7 @@ namespace Emby.Server.Implementations.Data var whereText = " where Type=@SelectType"; - if (typesToCount.Count == 0) + if (typesToCount.Length == 0) { whereText += " And CleanName In (Select CleanValue from ItemValues where " + typeClause + " AND ItemId in (select guid from TypedBaseItems" + innerWhereText + "))"; } @@ -5269,8 +5284,7 @@ namespace Emby.Server.Implementations.Data var list = new List>(); var result = new QueryResult>(); - var statements = PrepareAllSafe(db, statementTexts) - .ToList(); + var statements = PrepareAllSafe(db, statementTexts); if (!isReturningZeroItems) { @@ -5345,7 +5359,7 @@ namespace Emby.Server.Implementations.Data { result.TotalRecordCount = list.Count; } - result.Items = list.ToArray(); + result.Items = list.ToArray(list.Count); return result; @@ -5354,11 +5368,11 @@ namespace Emby.Server.Implementations.Data } } - private ItemCounts GetItemCounts(IReadOnlyList reader, int countStartColumn, List typesToCount) + private ItemCounts GetItemCounts(IReadOnlyList reader, int countStartColumn, string[] typesToCount) { var counts = new ItemCounts(); - if (typesToCount.Count == 0) + if (typesToCount.Length == 0) { return counts; } diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs index daa5ff642c..098e11720b 100644 --- a/Emby.Server.Implementations/Dto/DtoService.cs +++ b/Emby.Server.Implementations/Dto/DtoService.cs @@ -649,12 +649,12 @@ namespace Emby.Server.Implementations.Dto dto.GameSystem = item.GameSystemName; } - private List GetImageTags(BaseItem item, List images) + private string[] GetImageTags(BaseItem item, List images) { return images .Select(p => GetImageCacheTag(item, p)) .Where(i => i != null) - .ToList(); + .ToArray(); } private string GetImageCacheTag(BaseItem item, ImageType type) @@ -766,7 +766,7 @@ namespace Emby.Server.Implementations.Dto } } - dto.People = list.ToArray(); + dto.People = list.ToArray(list.Count); } /// @@ -1049,12 +1049,12 @@ namespace Emby.Server.Implementations.Dto { if (!string.IsNullOrWhiteSpace(item.Tagline)) { - dto.Taglines = new List { item.Tagline }; + dto.Taglines = new string[] { item.Tagline }; } if (dto.Taglines == null) { - dto.Taglines = new List(); + dto.Taglines = new string[]{}; } } @@ -1430,9 +1430,9 @@ namespace Emby.Server.Implementations.Dto if (fields.Contains(ItemFields.ProductionLocations)) { - if (item.ProductionLocations.Count > 0 || item is Movie) + if (item.ProductionLocations.Length > 0 || item is Movie) { - dto.ProductionLocations = item.ProductionLocations.ToArray(); + dto.ProductionLocations = item.ProductionLocations; } } diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index ed69c9755b..62f23bb536 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -21,6 +21,7 @@ DEBUG;TRACE prompt 4 + true pdbonly @@ -40,6 +41,8 @@ + + @@ -52,6 +55,24 @@ + + + + + + + + + + + + + + + + + + @@ -63,6 +84,7 @@ + @@ -78,6 +100,7 @@ + @@ -99,7 +122,9 @@ + + @@ -170,6 +195,8 @@ + + @@ -249,6 +276,7 @@ + @@ -260,6 +288,26 @@ + + {1e37a338-9f57-4b70-bd6d-bb9c591e319b} + Emby.Common.Implementations + + + {805844ab-e92f-45e6-9d99-4f6d48d129a5} + Emby.Dlna + + + {08fff49b-f175-4807-a2b5-73b0ebd9f716} + Emby.Drawing + + + {89ab4548-770d-41fd-a891-8daff44f452c} + Emby.Photos + + + {4fd51ac5-2c16-4308-a993-c3a84f3b4582} + MediaBrowser.Api + {9142eefa-7570-41e1-bfcc-468bb571af2f} MediaBrowser.Common @@ -268,6 +316,10 @@ {17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2} MediaBrowser.Controller + + {7ef9f3e0-697d-42f3-a08f-19deb5f84392} + MediaBrowser.LocalMetadata + {7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b} MediaBrowser.Model @@ -280,10 +332,29 @@ {2e781478-814d-4a48-9d80-bff206441a65} MediaBrowser.Server.Implementations + + {5624b7b5-b5a7-41d8-9f10-cc5611109619} + MediaBrowser.WebDashboard + + + {23499896-b135-4527-8574-c26e926ea99e} + MediaBrowser.XbmcMetadata + + + {cb7f2326-6497-4a3d-ba03-48513b17a7be} + Mono.Nat + + + {4a4402d4-e910-443b-b8fc-2c18286a2ca0} + OpenSubtitlesHandler + {1d74413b-e7cf-455b-b021-f52bdf881542} SocketHttpListener + + ..\ThirdParty\emby\Emby.Server.MediaEncoding.dll + ..\packages\Emby.XmlTv.1.0.9\lib\portable-net45+win8\Emby.XmlTv.dll True @@ -292,6 +363,15 @@ ..\packages\MediaBrowser.Naming.1.0.5\lib\portable-net45+win8\MediaBrowser.Naming.dll True + + ..\packages\Microsoft.IO.RecyclableMemoryStream.1.2.2\lib\net45\Microsoft.IO.RecyclableMemoryStream.dll + + + ..\packages\ServiceStack.Text.4.5.12\lib\net45\ServiceStack.Text.dll + + + ..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll + ..\packages\SQLitePCL.pretty.1.1.0\lib\portable-net45+netcore45+wpa81+wp8\SQLitePCL.pretty.dll True @@ -299,10 +379,10 @@ - ..\packages\SQLitePCLRaw.core.1.1.7\lib\net45\SQLitePCLRaw.core.dll - True + ..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll + diff --git a/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs b/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs similarity index 98% rename from Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs rename to Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs index 2c7e6a4870..c96799b2f8 100644 --- a/Emby.Server.Core/EntryPoints/ExternalPortForwarding.cs +++ b/Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Globalization; using System.Net; +using System.Threading.Tasks; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; @@ -11,9 +12,9 @@ using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Threading; using Mono.Nat; -using System.Threading.Tasks; +using MediaBrowser.Model.Extensions; -namespace Emby.Server.Core.EntryPoints +namespace Emby.Server.Implementations.EntryPoints { public class ExternalPortForwarding : IServerEntryPoint { @@ -50,7 +51,7 @@ namespace Emby.Server.Core.EntryPoints values.Add(config.EnableHttps.ToString()); values.Add(_appHost.EnableHttps.ToString()); - return string.Join("|", values.ToArray()); + return string.Join("|", values.ToArray(values.Count)); } void _config_ConfigurationUpdated(object sender, EventArgs e) diff --git a/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs b/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs index 9fbe06673f..99d39ffe02 100644 --- a/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs +++ b/Emby.Server.Implementations/EntryPoints/UsageEntryPoint.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Threading.Tasks; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.EntryPoints { @@ -58,7 +59,7 @@ namespace Emby.Server.Implementations.EntryPoints session.ApplicationVersion }; - var key = string.Join("_", keys.ToArray()).GetMD5(); + var key = string.Join("_", keys.ToArray(keys.Count)).GetMD5(); _apps.GetOrAdd(key, guid => GetNewClientInfo(session)); } diff --git a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs index 05f78eba95..f150e47859 100644 --- a/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs +++ b/Emby.Server.Implementations/HttpServer/HttpListenerHost.cs @@ -125,13 +125,6 @@ namespace Emby.Server.Implementations.HttpServer return _appHost.CreateInstance(type); } - private ServiceController CreateServiceController() - { - var types = _restServices.Select(r => r.GetType()).ToArray(); - - return new ServiceController(() => types); - } - /// /// Applies the request filters. Returns whether or not the request has been handled /// and no more processing should be done. @@ -186,7 +179,7 @@ namespace Emby.Server.Implementations.HttpServer attributes.Sort((x, y) => x.Priority - y.Priority); - return attributes.ToArray(); + return attributes.ToArray(attributes.Count); } /// @@ -697,11 +690,13 @@ namespace Emby.Server.Implementations.HttpServer { _restServices.AddRange(services); - ServiceController = CreateServiceController(); + ServiceController = new ServiceController(); _logger.Info("Calling ServiceStack AppHost.Init"); - ServiceController.Init(this); + var types = _restServices.Select(r => r.GetType()).ToArray(); + + ServiceController.Init(this, types); var requestFilters = _appHost.GetExports().ToList(); foreach (var filter in requestFilters) @@ -741,7 +736,7 @@ namespace Emby.Server.Implementations.HttpServer }); } - return routes.ToArray(); + return routes.ToArray(routes.Count); } public Func GetParseFn(Type propertyType) diff --git a/Emby.Server.Implementations/HttpServer/LoggerUtils.cs b/Emby.Server.Implementations/HttpServer/LoggerUtils.cs index f0e75eea48..de30dc30a8 100644 --- a/Emby.Server.Implementations/HttpServer/LoggerUtils.cs +++ b/Emby.Server.Implementations/HttpServer/LoggerUtils.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Linq; using MediaBrowser.Model.Services; using SocketHttpListener.Net; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.HttpServer { @@ -29,7 +30,7 @@ namespace Emby.Server.Implementations.HttpServer } else { - var headerText = string.Join(", ", headers.Select(i => i.Name + "=" + i.Value).ToArray()); + var headerText = string.Join(", ", headers.Select(i => i.Name + "=" + i.Value).ToArray(headers.Count)); logger.Info("HTTP {0} {1}. {2}", method, url, headerText); } diff --git a/Emby.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs b/Emby.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs index 4fbe0ed946..4e8dd73626 100644 --- a/Emby.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs +++ b/Emby.Server.Implementations/HttpServer/SocketSharp/HttpUtility.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using System.Text; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.HttpServer.SocketSharp { @@ -585,7 +586,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp WriteCharBytes(bytes, ch, e); } - byte[] buf = bytes.ToArray(); + byte[] buf = bytes.ToArray(bytes.Count); bytes = null; return e.GetString(buf, 0, buf.Length); diff --git a/Emby.Server.Core/HttpServerFactory.cs b/Emby.Server.Implementations/HttpServerFactory.cs similarity index 97% rename from Emby.Server.Core/HttpServerFactory.cs rename to Emby.Server.Implementations/HttpServerFactory.cs index e16cbea0e3..b1d78e6f42 100644 --- a/Emby.Server.Core/HttpServerFactory.cs +++ b/Emby.Server.Implementations/HttpServerFactory.cs @@ -1,9 +1,7 @@ using System; using System.IO; using System.Net.Security; -using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; -using System.Threading; using System.Threading.Tasks; using Emby.Common.Implementations.Net; using Emby.Server.Implementations.HttpServer; @@ -21,7 +19,7 @@ using MediaBrowser.Model.Text; using ServiceStack.Text.Jsv; using SocketHttpListener.Primitives; -namespace Emby.Server.Core +namespace Emby.Server.Implementations { /// /// Class ServerFactory diff --git a/Emby.Server.Core/IO/LibraryMonitor.cs b/Emby.Server.Implementations/IO/LibraryMonitor.cs similarity index 99% rename from Emby.Server.Core/IO/LibraryMonitor.cs rename to Emby.Server.Implementations/IO/LibraryMonitor.cs index ebc5e5e558..c452c01be3 100644 --- a/Emby.Server.Core/IO/LibraryMonitor.cs +++ b/Emby.Server.Implementations/IO/LibraryMonitor.cs @@ -13,9 +13,8 @@ using MediaBrowser.Model.Logging; using MediaBrowser.Model.System; using MediaBrowser.Model.Tasks; using MediaBrowser.Model.Threading; -using Emby.Server.Implementations.IO; -namespace Emby.Server.Core.IO +namespace Emby.Server.Implementations.IO { public class LibraryMonitor : ILibraryMonitor { diff --git a/Emby.Server.Core/IO/MemoryStreamProvider.cs b/Emby.Server.Implementations/IO/MemoryStreamProvider.cs similarity index 97% rename from Emby.Server.Core/IO/MemoryStreamProvider.cs rename to Emby.Server.Implementations/IO/MemoryStreamProvider.cs index f6dd1ecbc2..eca76203c5 100644 --- a/Emby.Server.Core/IO/MemoryStreamProvider.cs +++ b/Emby.Server.Implementations/IO/MemoryStreamProvider.cs @@ -2,7 +2,7 @@ using MediaBrowser.Model.IO; using Microsoft.IO; -namespace Emby.Server.Core.IO +namespace Emby.Server.Implementations.IO { public class RecyclableMemoryStreamProvider : IMemoryStreamFactory { diff --git a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs index 8e6f63f722..3f9ea79c6a 100644 --- a/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs +++ b/Emby.Server.Implementations/Images/BaseDynamicImageProvider.cs @@ -293,20 +293,16 @@ namespace Emby.Server.Implementations.Images return true; } - protected List GetFinalItems(List items) + protected List GetFinalItems(IEnumerable items) { return GetFinalItems(items, 4); } - protected virtual List GetFinalItems(List items, int limit) + protected virtual List GetFinalItems(IEnumerable items, int limit) { - // Rotate the images once every x days - var random = DateTime.Now.DayOfYear % MaxImageAgeDays; - return items - .OrderBy(i => (random + string.Empty + items.IndexOf(i)).GetMD5()) + .OrderBy(i => Guid.NewGuid()) .Take(limit) - .OrderBy(i => i.Name) .ToList(); } diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs index 5c7dc2507c..271dac1538 100644 --- a/Emby.Server.Implementations/Library/LibraryManager.cs +++ b/Emby.Server.Implementations/Library/LibraryManager.cs @@ -136,14 +136,6 @@ namespace Emby.Server.Implementations.Library /// The configuration manager. private IServerConfigurationManager ConfigurationManager { get; set; } - /// - /// A collection of items that may be referenced from multiple physical places in the library - /// (typically, multiple user roots). We store them here and be sure they all reference a - /// single instance. - /// - /// The by reference items. - private ConcurrentDictionary ByReferenceItems { get; set; } - private readonly Func _libraryMonitorFactory; private readonly Func _providerManagerFactory; private readonly Func _userviewManager; @@ -186,7 +178,6 @@ namespace Emby.Server.Implementations.Library _fileSystem = fileSystem; _providerManagerFactory = providerManagerFactory; _userviewManager = userviewManager; - ByReferenceItems = new ConcurrentDictionary(); _libraryItemsCache = new ConcurrentDictionary(); ConfigurationManager.ConfigurationUpdated += ConfigurationUpdated; @@ -560,22 +551,6 @@ namespace Emby.Server.Implementations.Library return key.GetMD5(); } - /// - /// Ensure supplied item has only one instance throughout - /// - /// The item. - /// The proper instance to the item - public BaseItem GetOrAddByReferenceItem(BaseItem item) - { - // Add this item to our list if not there already - if (!ByReferenceItems.TryAdd(item.Id, item)) - { - // Already there - return the existing reference - item = ByReferenceItems[item.Id]; - } - return item; - } - public BaseItem ResolvePath(FileSystemMetadata fileInfo, Folder parent = null) { @@ -1298,7 +1273,7 @@ namespace Emby.Server.Implementations.Library return item; } - public IEnumerable GetItemList(InternalItemsQuery query, bool allowExternalContent) + public List GetItemList(InternalItemsQuery query, bool allowExternalContent) { if (query.Recursive && query.ParentId.HasValue) { @@ -1317,7 +1292,7 @@ namespace Emby.Server.Implementations.Library return ItemRepository.GetItemList(query); } - public IEnumerable GetItemList(InternalItemsQuery query) + public List GetItemList(InternalItemsQuery query) { return GetItemList(query, true); } @@ -1341,7 +1316,7 @@ namespace Emby.Server.Implementations.Library return ItemRepository.GetCount(query); } - public IEnumerable GetItemList(InternalItemsQuery query, List parents) + public List GetItemList(InternalItemsQuery query, List parents) { SetTopParentIdsOrAncestors(query, parents); @@ -1515,9 +1490,11 @@ namespace Emby.Server.Implementations.Library return ItemRepository.GetItems(query); } + var list = ItemRepository.GetItemList(query); + return new QueryResult { - Items = ItemRepository.GetItemList(query).ToArray() + Items = list.ToArray(list.Count) }; } @@ -2610,7 +2587,7 @@ namespace Emby.Server.Implementations.Library var resolvers = new IItemResolver[] { - new GenericVideoResolver(this) + new GenericVideoResolver(this, _fileSystem) }; return ResolvePaths(files, directoryService, null, new LibraryOptions(), null, resolvers) diff --git a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs index e64980dff8..83bee89e05 100644 --- a/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs +++ b/Emby.Server.Implementations/Library/LocalTrailerPostScanTask.cs @@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -45,7 +46,7 @@ namespace Emby.Server.Implementations.Library Recursive = true, DtoOptions = new DtoOptions(false) - }).ToArray(); + }); var numComplete = 0; @@ -64,7 +65,7 @@ namespace Emby.Server.Implementations.Library progress.Report(100); } - private async Task AssignTrailers(IHasTrailers item, BaseItem[] channelTrailers) + private async Task AssignTrailers(IHasTrailers item, IEnumerable channelTrailers) { if (item is Game) { diff --git a/Emby.Server.Implementations/Library/MusicManager.cs b/Emby.Server.Implementations/Library/MusicManager.cs index f0d07cc3c4..7f77170ad6 100644 --- a/Emby.Server.Implementations/Library/MusicManager.cs +++ b/Emby.Server.Implementations/Library/MusicManager.cs @@ -19,27 +19,27 @@ namespace Emby.Server.Implementations.Library _libraryManager = libraryManager; } - public IEnumerable public class EpisodeResolver : BaseVideoResolver { - public EpisodeResolver(ILibraryManager libraryManager) : base(libraryManager) - { - } - /// /// Resolves the specified args. /// @@ -76,5 +73,9 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV return null; } + + public EpisodeResolver(ILibraryManager libraryManager, IFileSystem fileSystem) : base(libraryManager, fileSystem) + { + } } } diff --git a/Emby.Server.Implementations/Library/Resolvers/VideoResolver.cs b/Emby.Server.Implementations/Library/Resolvers/VideoResolver.cs index b5e1bf5f74..5c7a528f54 100644 --- a/Emby.Server.Implementations/Library/Resolvers/VideoResolver.cs +++ b/Emby.Server.Implementations/Library/Resolvers/VideoResolver.cs @@ -1,6 +1,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Resolvers; +using MediaBrowser.Model.IO; namespace Emby.Server.Implementations.Library.Resolvers { @@ -9,11 +10,6 @@ namespace Emby.Server.Implementations.Library.Resolvers /// public class VideoResolver : BaseVideoResolver /// IEnumerable{CultureDto}. - public IEnumerable GetCultures() + public List GetCultures() { var type = GetType(); var path = type.Namespace + ".iso6392.txt"; @@ -169,14 +169,14 @@ namespace Emby.Server.Implementations.Localization return list.Where(i => !string.IsNullOrWhiteSpace(i.Name) && !string.IsNullOrWhiteSpace(i.DisplayName) && !string.IsNullOrWhiteSpace(i.ThreeLetterISOLanguageName) && - !string.IsNullOrWhiteSpace(i.TwoLetterISOLanguageName)); + !string.IsNullOrWhiteSpace(i.TwoLetterISOLanguageName)).ToList(); } /// /// Gets the countries. /// /// IEnumerable{CountryInfo}. - public IEnumerable GetCountries() + public List GetCountries() { var type = GetType(); var path = type.Namespace + ".countries.json"; diff --git a/Emby.Server.Core/Localization/TextLocalizer.cs b/Emby.Server.Implementations/Localization/TextLocalizer.cs similarity index 95% rename from Emby.Server.Core/Localization/TextLocalizer.cs rename to Emby.Server.Implementations/Localization/TextLocalizer.cs index 1e8ccbbfa8..5188a959e3 100644 --- a/Emby.Server.Core/Localization/TextLocalizer.cs +++ b/Emby.Server.Implementations/Localization/TextLocalizer.cs @@ -3,9 +3,8 @@ using System.Globalization; using System.Linq; using System.Text; using System.Text.RegularExpressions; -using Emby.Server.Implementations.Localization; -namespace Emby.Server.Core.Localization +namespace Emby.Server.Implementations.Localization { public class TextLocalizer : ITextLocalizer { diff --git a/Emby.Server.Core/Logging/ConsoleLogger.cs b/Emby.Server.Implementations/Logging/ConsoleLogger.cs similarity index 65% rename from Emby.Server.Core/Logging/ConsoleLogger.cs rename to Emby.Server.Implementations/Logging/ConsoleLogger.cs index 01eca7b7e4..51199f08ae 100644 --- a/Emby.Server.Core/Logging/ConsoleLogger.cs +++ b/Emby.Server.Implementations/Logging/ConsoleLogger.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using MediaBrowser.Model.Logging; -namespace Emby.Server.Core.Logging +namespace Emby.Server.Implementations.Logging { public class ConsoleLogger : IConsoleLogger { diff --git a/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs b/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs index 40752db800..ff152c9e9c 100644 --- a/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs +++ b/Emby.Server.Implementations/Notifications/SqliteNotificationsRepository.cs @@ -12,6 +12,7 @@ using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Notifications; using SQLitePCL.pretty; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Notifications { @@ -83,13 +84,13 @@ namespace Emby.Server.Implementations.Notifications clauses.Add("UserId=?"); paramList.Add(query.UserId.ToGuidBlob()); - var whereClause = " where " + string.Join(" And ", clauses.ToArray()); + var whereClause = " where " + string.Join(" And ", clauses.ToArray(clauses.Count)); using (WriteLock.Read()) { using (var connection = CreateConnection(true)) { - result.TotalRecordCount = connection.Query("select count(Id) from Notifications" + whereClause, paramList.ToArray()).SelectScalarInt().First(); + result.TotalRecordCount = connection.Query("select count(Id) from Notifications" + whereClause, paramList.ToArray(paramList.Count)).SelectScalarInt().First(); var commandText = string.Format("select Id,UserId,Date,Name,Description,Url,Level,IsRead,Category,RelatedId from Notifications{0} order by IsRead asc, Date desc", whereClause); @@ -110,12 +111,12 @@ namespace Emby.Server.Implementations.Notifications var resultList = new List(); - foreach (var row in connection.Query(commandText, paramList.ToArray())) + foreach (var row in connection.Query(commandText, paramList.ToArray(paramList.Count))) { resultList.Add(GetNotification(row)); } - result.Notifications = resultList.ToArray(); + result.Notifications = resultList.ToArray(resultList.Count); } } @@ -280,7 +281,7 @@ namespace Emby.Server.Implementations.Notifications public async Task MarkRead(IEnumerable notificationIdList, string userId, bool isRead, CancellationToken cancellationToken) { var list = notificationIdList.ToList(); - var idArray = list.Select(i => new Guid(i)).ToArray(); + var idArray = list.Select(i => new Guid(i)).ToArray(list.Count); await MarkReadInternal(idArray, userId, isRead, cancellationToken).ConfigureAwait(false); @@ -290,7 +291,7 @@ namespace Emby.Server.Implementations.Notifications { NotificationsMarkedRead(this, new NotificationReadEventArgs { - IdList = list.ToArray(), + IdList = list.ToArray(list.Count), IsRead = isRead, UserId = userId }); diff --git a/Emby.Server.Implementations/Notifications/WebSocketNotifier.cs b/Emby.Server.Implementations/Notifications/WebSocketNotifier.cs index 0239ee3365..0d89ba84f3 100644 --- a/Emby.Server.Implementations/Notifications/WebSocketNotifier.cs +++ b/Emby.Server.Implementations/Notifications/WebSocketNotifier.cs @@ -2,6 +2,7 @@ using MediaBrowser.Controller.Notifications; using MediaBrowser.Controller.Plugins; using System.Linq; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Notifications { @@ -33,7 +34,7 @@ namespace Emby.Server.Implementations.Notifications list.Add(e.UserId); list.Add(e.IsRead.ToString().ToLower()); - var msg = string.Join("|", list.ToArray()); + var msg = string.Join("|", list.ToArray(list.Count)); _serverManager.SendWebSocketMessage("NotificationsMarkedRead", msg); } diff --git a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs index e232854251..f7c65f63d7 100644 --- a/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs +++ b/Emby.Server.Implementations/Photos/PhotoAlbumImageProvider.cs @@ -21,7 +21,7 @@ namespace Emby.Server.Implementations.Photos protected override List GetItemsWithImages(IHasMetadata item) { var photoAlbum = (PhotoAlbum)item; - var items = GetFinalItems(photoAlbum.Children.ToList()); + var items = GetFinalItems(photoAlbum.Children); return items; } diff --git a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs index f5d0e314e8..c2e8603396 100644 --- a/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs +++ b/Emby.Server.Implementations/Playlists/PlaylistImageProvider.cs @@ -65,8 +65,7 @@ namespace Emby.Server.Implementations.Playlists return null; }) .Where(i => i != null) - .DistinctBy(i => i.Id) - .ToList(); + .DistinctBy(i => i.Id); return GetFinalItems(items); } @@ -93,7 +92,7 @@ namespace Emby.Server.Implementations.Playlists ImageTypes = new[] { ImageType.Primary }, DtoOptions = new DtoOptions(false) - }).ToList(); + }); return GetFinalItems(items); } @@ -125,7 +124,7 @@ namespace Emby.Server.Implementations.Playlists ImageTypes = new[] { ImageType.Primary }, DtoOptions = new DtoOptions(false) - }).ToList(); + }); return GetFinalItems(items); } diff --git a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs index 967e7ddd86..91ae2afd1c 100644 --- a/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs +++ b/Emby.Server.Implementations/ScheduledTasks/ChapterImagesTask.cs @@ -15,6 +15,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Tasks; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.ScheduledTasks { @@ -142,7 +143,7 @@ namespace Emby.Server.Implementations.ScheduledTasks _fileSystem.CreateDirectory(parentPath); - _fileSystem.WriteAllText(failHistoryPath, string.Join("|", previouslyFailedImages.ToArray())); + _fileSystem.WriteAllText(failHistoryPath, string.Join("|", previouslyFailedImages.ToArray(previouslyFailedImages.Count))); } numComplete++; diff --git a/Emby.Server.Implementations/Security/AuthenticationRepository.cs b/Emby.Server.Implementations/Security/AuthenticationRepository.cs index 9ec0af6bb5..d512ff4fb9 100644 --- a/Emby.Server.Implementations/Security/AuthenticationRepository.cs +++ b/Emby.Server.Implementations/Security/AuthenticationRepository.cs @@ -11,6 +11,7 @@ using MediaBrowser.Controller.Security; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Querying; using SQLitePCL.pretty; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Security { @@ -174,13 +175,13 @@ namespace Emby.Server.Implementations.Security var whereTextWithoutPaging = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); if (startIndex > 0) { var pagingWhereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM AccessTokens {0} ORDER BY DateCreated LIMIT {1})", pagingWhereText, @@ -189,7 +190,7 @@ namespace Emby.Server.Implementations.Security var whereText = whereClauses.Count == 0 ? string.Empty : - " where " + string.Join(" AND ", whereClauses.ToArray()); + " where " + string.Join(" AND ", whereClauses.ToArray(whereClauses.Count)); commandText += whereText; @@ -236,7 +237,7 @@ namespace Emby.Server.Implementations.Security } } - result.Items = list.ToArray(); + result.Items = list.ToArray(list.Count); return result; }, ReadTransactionMode); diff --git a/Emby.Server.Implementations/Services/ServiceController.cs b/Emby.Server.Implementations/Services/ServiceController.cs index 1c530144c9..4ad56411ad 100644 --- a/Emby.Server.Implementations/Services/ServiceController.cs +++ b/Emby.Server.Implementations/Services/ServiceController.cs @@ -15,17 +15,15 @@ namespace Emby.Server.Implementations.Services public class ServiceController { public static ServiceController Instance; - private readonly Func> _resolveServicesFn; - public ServiceController(Func> resolveServicesFn) + public ServiceController() { Instance = this; - _resolveServicesFn = resolveServicesFn; } - public void Init(HttpListenerHost appHost) + public void Init(HttpListenerHost appHost, Type[] serviceTypes) { - foreach (var serviceType in _resolveServicesFn()) + foreach (var serviceType in serviceTypes) { RegisterService(appHost, serviceType); } diff --git a/Emby.Server.Implementations/Services/ServiceExec.cs b/Emby.Server.Implementations/Services/ServiceExec.cs index e0b5e69c09..4a2199c89d 100644 --- a/Emby.Server.Implementations/Services/ServiceExec.cs +++ b/Emby.Server.Implementations/Services/ServiceExec.cs @@ -5,6 +5,7 @@ using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Services { @@ -123,7 +124,7 @@ namespace Emby.Server.Implementations.Services } if (reqFilters.Count > 0) - actionCtx.RequestFilters = reqFilters.OrderBy(i => i.Priority).ToArray(); + actionCtx.RequestFilters = reqFilters.OrderBy(i => i.Priority).ToArray(reqFilters.Count); actions.Add(actionCtx); } diff --git a/Emby.Server.Implementations/Services/ServicePath.cs b/Emby.Server.Implementations/Services/ServicePath.cs index 255b209192..da5e74f1fb 100644 --- a/Emby.Server.Implementations/Services/ServicePath.cs +++ b/Emby.Server.Implementations/Services/ServicePath.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Reflection; using System.Text; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Services { @@ -142,13 +143,13 @@ namespace Emby.Server.Implementations.Services } } - var components = componentsList.ToArray(); + var components = componentsList.ToArray(componentsList.Count); this.TotalComponentsCount = components.Length; this.literalsToMatch = new string[this.TotalComponentsCount]; this.variablesNames = new string[this.TotalComponentsCount]; this.isWildcard = new bool[this.TotalComponentsCount]; - this.componentsWithSeparators = hasSeparators.ToArray(); + this.componentsWithSeparators = hasSeparators.ToArray(hasSeparators.Count); this.PathComponentsCount = this.componentsWithSeparators.Length; string firstLiteralMatch = null; @@ -268,7 +269,7 @@ namespace Emby.Server.Implementations.Services propertyInfos.InsertRange(0, newPropertyInfos); } - return propertyInfos.ToArray(); + return propertyInfos.ToArray(propertyInfos.Count); } return GetTypesPublicProperties(type) @@ -285,7 +286,7 @@ namespace Emby.Server.Implementations.Services if (mi != null && mi.IsStatic) continue; pis.Add(pi); } - return pis.ToArray(); + return pis.ToArray(pis.Count); } @@ -450,7 +451,7 @@ namespace Emby.Server.Implementations.Services } } - withPathInfoParts = totalComponents.ToArray(); + withPathInfoParts = totalComponents.ToArray(totalComponents.Count); return true; } diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs index 763ca9f24c..0b39cfc477 100644 --- a/Emby.Server.Implementations/Session/SessionManager.cs +++ b/Emby.Server.Implementations/Session/SessionManager.cs @@ -32,6 +32,7 @@ using System.Threading.Tasks; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Threading; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Session { @@ -1000,7 +1001,7 @@ namespace Emby.Server.Implementations.Session command.PlayCommand = PlayCommand.PlayNow; } - command.ItemIds = items.Select(i => i.Id.ToString("N")).ToArray(); + command.ItemIds = items.Select(i => i.Id.ToString("N")).ToArray(items.Count); if (user != null) { @@ -1033,7 +1034,7 @@ namespace Emby.Server.Implementations.Session if (episodes.Count > 0) { - command.ItemIds = episodes.Select(i => i.Id.ToString("N")).ToArray(); + command.ItemIds = episodes.Select(i => i.Id.ToString("N")).ToArray(episodes.Count); } } } diff --git a/Emby.Server.Implementations/Social/SharingRepository.cs b/Emby.Server.Implementations/Social/SharingRepository.cs index 46e9205bb2..a2a1f879a2 100644 --- a/Emby.Server.Implementations/Social/SharingRepository.cs +++ b/Emby.Server.Implementations/Social/SharingRepository.cs @@ -8,6 +8,7 @@ using MediaBrowser.Common.Configuration; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Social; using SQLitePCL.pretty; +using MediaBrowser.Model.Extensions; namespace Emby.Server.Implementations.Social { @@ -86,7 +87,7 @@ namespace Emby.Server.Implementations.Social var paramList = new List(); paramList.Add(id.ToGuidBlob()); - foreach (var row in connection.Query(commandText, paramList.ToArray())) + foreach (var row in connection.Query(commandText, paramList.ToArray(paramList.Count))) { return GetSocialShareInfo(row); } diff --git a/Emby.Server.Core/SystemEvents.cs b/Emby.Server.Implementations/SystemEvents.cs similarity index 97% rename from Emby.Server.Core/SystemEvents.cs rename to Emby.Server.Implementations/SystemEvents.cs index 8d5cd4ad8c..dfff92f1ef 100644 --- a/Emby.Server.Core/SystemEvents.cs +++ b/Emby.Server.Implementations/SystemEvents.cs @@ -3,7 +3,7 @@ using MediaBrowser.Common.Events; using MediaBrowser.Model.Logging; using MediaBrowser.Model.System; -namespace MediaBrowser.Server.Startup.Common +namespace Emby.Server.Implementations { public class SystemEvents : ISystemEvents { diff --git a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs index ac5bd128aa..98e0c4080a 100644 --- a/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/CollectionFolderImageProvider.cs @@ -91,7 +91,7 @@ namespace Emby.Server.Implementations.UserViews }).DistinctBy(i => i.Id); - return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); + return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)), 8); } protected override bool Supports(IHasMetadata item) @@ -149,7 +149,7 @@ namespace Emby.Server.Implementations.UserViews DtoOptions = new DtoOptions(false) }); - return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); + return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)), 8); } protected override bool Supports(IHasMetadata item) diff --git a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs index 6805080aa6..885dfec58b 100644 --- a/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs +++ b/Emby.Server.Implementations/UserViews/DynamicImageProvider.cs @@ -62,9 +62,9 @@ namespace Emby.Server.Implementations.UserViews IsMovie = true, DtoOptions = new DtoOptions(false) - }).ToList(); + }); - return GetFinalItems(programs).ToList(); + return GetFinalItems(programs); } if (string.Equals(view.ViewType, SpecialFolder.MovieGenre, StringComparison.OrdinalIgnoreCase) || @@ -133,10 +133,10 @@ namespace Emby.Server.Implementations.UserViews if (isUsingCollectionStrip) { - return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)).ToList(), 8); + return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary) || i.HasImage(ImageType.Thumb)), 8); } - return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary)).ToList()); + return GetFinalItems(items.Where(i => i.HasImage(ImageType.Primary))); } protected override bool Supports(IHasMetadata item) diff --git a/Emby.Server.Implementations/packages.config b/Emby.Server.Implementations/packages.config index 03336c936a..c86812ee00 100644 --- a/Emby.Server.Implementations/packages.config +++ b/Emby.Server.Implementations/packages.config @@ -2,6 +2,9 @@ + + + - + \ No newline at end of file diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs index 34d0bd413a..21552617da 100644 --- a/MediaBrowser.Api/ApiEntryPoint.cs +++ b/MediaBrowser.Api/ApiEntryPoint.cs @@ -1,27 +1,15 @@ -using MediaBrowser.Api.Playback; -using MediaBrowser.Common.Configuration; +using System; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; -using MediaBrowser.Model.Configuration; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Session; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -using MediaBrowser.Controller.MediaEncoding; -using MediaBrowser.Controller.Net; using MediaBrowser.Model.Diagnostics; using MediaBrowser.Model.IO; -using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Threading; +using System.Collections.Generic; +using System.Threading; namespace MediaBrowser.Api { @@ -53,11 +41,6 @@ namespace MediaBrowser.Api public readonly ITimerFactory TimerFactory; public readonly IProcessFactory ProcessFactory; - /// - /// The active transcoding jobs - /// - private readonly List _activeTranscodingJobs = new List(); - private readonly Dictionary _transcodingLocks = new Dictionary(); @@ -81,39 +64,21 @@ namespace MediaBrowser.Api ResultFactory = resultFactory; Instance = this; - _sessionManager.PlaybackProgress += _sessionManager_PlaybackProgress; - _sessionManager.PlaybackStart += _sessionManager_PlaybackStart; } - public SemaphoreSlim GetTranscodingLock(string outputPath) + public static string[] Split(string value, char separator, bool removeEmpty) { - lock (_transcodingLocks) + if (string.IsNullOrWhiteSpace(value)) { - SemaphoreSlim result; - if (!_transcodingLocks.TryGetValue(outputPath, out result)) - { - result = new SemaphoreSlim(1, 1); - _transcodingLocks[outputPath] = result; - } - - return result; + return new string[] { }; } - } - private void _sessionManager_PlaybackStart(object sender, PlaybackProgressEventArgs e) - { - if (!string.IsNullOrWhiteSpace(e.PlaySessionId)) + if (removeEmpty) { - PingTranscodingJob(e.PlaySessionId, e.IsPaused); + return value.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries); } - } - void _sessionManager_PlaybackProgress(object sender, PlaybackProgressEventArgs e) - { - if (!string.IsNullOrWhiteSpace(e.PlaySessionId)) - { - PingTranscodingJob(e.PlaySessionId, e.IsPaused); - } + return value.Split(separator); } /// @@ -121,41 +86,6 @@ namespace MediaBrowser.Api /// public void Run() { - try - { - DeleteEncodedMediaCache(); - } - catch (FileNotFoundException) - { - // Don't clutter the log - } - catch (IOException) - { - // Don't clutter the log - } - catch (Exception ex) - { - Logger.ErrorException("Error deleting encoded media cache", ex); - } - } - - public EncodingOptions GetEncodingOptions() - { - return _config.GetConfiguration("encoding"); - } - - /// - /// Deletes the encoded media cache. - /// - private void DeleteEncodedMediaCache() - { - var path = _config.ApplicationPaths.TranscodingTempPath; - - foreach (var file in _fileSystem.GetFilePaths(path, true) - .ToList()) - { - _fileSystem.DeleteFile(file); - } } /// @@ -163,660 +93,6 @@ namespace MediaBrowser.Api /// public void Dispose() { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Releases unmanaged and - optionally - managed resources. - /// - /// true to release both managed and unmanaged resources; false to release only unmanaged resources. - protected virtual void Dispose(bool dispose) - { - var list = _activeTranscodingJobs.ToList(); - var jobCount = list.Count; - - Parallel.ForEach(list, j => KillTranscodingJob(j, false, path => true)); - - // Try to allow for some time to kill the ffmpeg processes and delete the partial stream files - if (jobCount > 0) - { - var task = Task.Delay(1000); - Task.WaitAll(task); - } - } - - /// - /// Called when [transcode beginning]. - /// - /// The path. - /// The play session identifier. - /// The live stream identifier. - /// The transcoding job identifier. - /// The type. - /// The process. - /// The device id. - /// The state. - /// The cancellation token source. - /// TranscodingJob. - public TranscodingJob OnTranscodeBeginning(string path, - string playSessionId, - string liveStreamId, - string transcodingJobId, - TranscodingJobType type, - IProcess process, - string deviceId, - StreamState state, - CancellationTokenSource cancellationTokenSource) - { - lock (_activeTranscodingJobs) - { - var job = new TranscodingJob(Logger, TimerFactory) - { - Type = type, - Path = path, - Process = process, - ActiveRequestCount = 1, - DeviceId = deviceId, - CancellationTokenSource = cancellationTokenSource, - Id = transcodingJobId, - PlaySessionId = playSessionId, - LiveStreamId = liveStreamId, - MediaSource = state.MediaSource - }; - - _activeTranscodingJobs.Add(job); - - ReportTranscodingProgress(job, state, null, null, null, null, null); - - return job; - } - } - - public void ReportTranscodingProgress(TranscodingJob job, StreamState state, TimeSpan? transcodingPosition, float? framerate, double? percentComplete, long? bytesTranscoded, int? bitRate) - { - var ticks = transcodingPosition.HasValue ? transcodingPosition.Value.Ticks : (long?)null; - - if (job != null) - { - job.Framerate = framerate; - job.CompletionPercentage = percentComplete; - job.TranscodingPositionTicks = ticks; - job.BytesTranscoded = bytesTranscoded; - job.BitRate = bitRate; - } - - var deviceId = state.Request.DeviceId; - - if (!string.IsNullOrWhiteSpace(deviceId)) - { - var audioCodec = state.ActualOutputAudioCodec; - var videoCodec = state.ActualOutputVideoCodec; - - _sessionManager.ReportTranscodingInfo(deviceId, new TranscodingInfo - { - Bitrate = bitRate ?? state.TotalOutputBitrate, - AudioCodec = audioCodec, - VideoCodec = videoCodec, - Container = state.OutputContainer, - Framerate = framerate, - CompletionPercentage = percentComplete, - Width = state.OutputWidth, - Height = state.OutputHeight, - AudioChannels = state.OutputAudioChannels, - IsAudioDirect = string.Equals(state.OutputAudioCodec, "copy", StringComparison.OrdinalIgnoreCase), - IsVideoDirect = string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase), - TranscodeReasons = state.TranscodeReasons - }); - } - } - - /// - /// - /// The progressive - /// - /// Called when [transcode failed to start]. - /// - /// The path. - /// The type. - /// The state. - public void OnTranscodeFailedToStart(string path, TranscodingJobType type, StreamState state) - { - lock (_activeTranscodingJobs) - { - var job = _activeTranscodingJobs.FirstOrDefault(j => j.Type == type && string.Equals(j.Path, path, StringComparison.OrdinalIgnoreCase)); - - if (job != null) - { - _activeTranscodingJobs.Remove(job); - } - } - - lock (_transcodingLocks) - { - _transcodingLocks.Remove(path); - } - - if (!string.IsNullOrWhiteSpace(state.Request.DeviceId)) - { - _sessionManager.ClearTranscodingInfo(state.Request.DeviceId); - } - } - - /// - /// Determines whether [has active transcoding job] [the specified path]. - /// - /// The path. - /// The type. - /// true if [has active transcoding job] [the specified path]; otherwise, false. - public bool HasActiveTranscodingJob(string path, TranscodingJobType type) - { - return GetTranscodingJob(path, type) != null; - } - - public TranscodingJob GetTranscodingJob(string path, TranscodingJobType type) - { - lock (_activeTranscodingJobs) - { - return _activeTranscodingJobs.FirstOrDefault(j => j.Type == type && string.Equals(j.Path, path, StringComparison.OrdinalIgnoreCase)); - } - } - - public TranscodingJob GetTranscodingJob(string playSessionId) - { - lock (_activeTranscodingJobs) - { - return _activeTranscodingJobs.FirstOrDefault(j => string.Equals(j.PlaySessionId, playSessionId, StringComparison.OrdinalIgnoreCase)); - } - } - - /// - /// Called when [transcode begin request]. - /// - /// The path. - /// The type. - public TranscodingJob OnTranscodeBeginRequest(string path, TranscodingJobType type) - { - lock (_activeTranscodingJobs) - { - var job = _activeTranscodingJobs.FirstOrDefault(j => j.Type == type && string.Equals(j.Path, path, StringComparison.OrdinalIgnoreCase)); - - if (job == null) - { - return null; - } - - OnTranscodeBeginRequest(job); - - return job; - } - } - - public void OnTranscodeBeginRequest(TranscodingJob job) - { - job.ActiveRequestCount++; - - if (string.IsNullOrWhiteSpace(job.PlaySessionId) || job.Type == TranscodingJobType.Progressive) - { - job.StopKillTimer(); - } - } - - public void OnTranscodeEndRequest(TranscodingJob job) - { - job.ActiveRequestCount--; - //Logger.Debug("OnTranscodeEndRequest job.ActiveRequestCount={0}", job.ActiveRequestCount); - if (job.ActiveRequestCount <= 0) - { - PingTimer(job, false); - } - } - internal void PingTranscodingJob(string playSessionId, bool? isUserPaused) - { - if (string.IsNullOrEmpty(playSessionId)) - { - throw new ArgumentNullException("playSessionId"); - } - - //Logger.Debug("PingTranscodingJob PlaySessionId={0} isUsedPaused: {1}", playSessionId, isUserPaused); - - List jobs; - - lock (_activeTranscodingJobs) - { - // This is really only needed for HLS. - // Progressive streams can stop on their own reliably - jobs = _activeTranscodingJobs.Where(j => string.Equals(playSessionId, j.PlaySessionId, StringComparison.OrdinalIgnoreCase)).ToList(); - } - - foreach (var job in jobs) - { - if (isUserPaused.HasValue) - { - //Logger.Debug("Setting job.IsUserPaused to {0}. jobId: {1}", isUserPaused, job.Id); - job.IsUserPaused = isUserPaused.Value; - } - PingTimer(job, true); - } - } - - private void PingTimer(TranscodingJob job, bool isProgressCheckIn) - { - if (job.HasExited) - { - job.StopKillTimer(); - return; - } - - var timerDuration = 10000; - - if (job.Type != TranscodingJobType.Progressive) - { - timerDuration = 60000; - } - - job.PingTimeout = timerDuration; - job.LastPingDate = DateTime.UtcNow; - - // Don't start the timer for playback checkins with progressive streaming - if (job.Type != TranscodingJobType.Progressive || !isProgressCheckIn) - { - job.StartKillTimer(OnTranscodeKillTimerStopped); - } - else - { - job.ChangeKillTimerIfStarted(); - } - } - - /// - /// Called when [transcode kill timer stopped]. - /// - /// The state. - private void OnTranscodeKillTimerStopped(object state) - { - var job = (TranscodingJob)state; - - if (!job.HasExited && job.Type != TranscodingJobType.Progressive) - { - var timeSinceLastPing = (DateTime.UtcNow - job.LastPingDate).TotalMilliseconds; - - if (timeSinceLastPing < job.PingTimeout) - { - job.StartKillTimer(OnTranscodeKillTimerStopped, job.PingTimeout); - return; - } - } - - Logger.Info("Transcoding kill timer stopped for JobId {0} PlaySessionId {1}. Killing transcoding", job.Id, job.PlaySessionId); - - KillTranscodingJob(job, true, path => true); - } - - /// - /// Kills the single transcoding job. - /// - /// The device id. - /// The play session identifier. - /// The delete files. - /// Task. - internal void KillTranscodingJobs(string deviceId, string playSessionId, Func deleteFiles) - { - KillTranscodingJobs(j => - { - if (!string.IsNullOrWhiteSpace(playSessionId)) - { - return string.Equals(playSessionId, j.PlaySessionId, StringComparison.OrdinalIgnoreCase); - } - - return string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase); - - }, deleteFiles); - } - - /// - /// Kills the transcoding jobs. - /// - /// The kill job. - /// The delete files. - /// Task. - private void KillTranscodingJobs(Func killJob, Func deleteFiles) - { - var jobs = new List(); - - lock (_activeTranscodingJobs) - { - // This is really only needed for HLS. - // Progressive streams can stop on their own reliably - jobs.AddRange(_activeTranscodingJobs.Where(killJob)); - } - - if (jobs.Count == 0) - { - return; - } - - foreach (var job in jobs) - { - KillTranscodingJob(job, false, deleteFiles); - } - } - - /// - /// Kills the transcoding job. - /// - /// The job. - /// if set to true [close live stream]. - /// The delete. - private async void KillTranscodingJob(TranscodingJob job, bool closeLiveStream, Func delete) - { - job.DisposeKillTimer(); - - Logger.Debug("KillTranscodingJob - JobId {0} PlaySessionId {1}. Killing transcoding", job.Id, job.PlaySessionId); - - lock (_activeTranscodingJobs) - { - _activeTranscodingJobs.Remove(job); - - if (!job.CancellationTokenSource.IsCancellationRequested) - { - job.CancellationTokenSource.Cancel(); - } - } - - lock (_transcodingLocks) - { - _transcodingLocks.Remove(job.Path); - } - - lock (job.ProcessLock) - { - if (job.TranscodingThrottler != null) - { - job.TranscodingThrottler.Stop(); - } - - var process = job.Process; - - var hasExited = job.HasExited; - - if (!hasExited) - { - try - { - Logger.Info("Stopping ffmpeg process with q command for {0}", job.Path); - - //process.Kill(); - process.StandardInput.WriteLine("q"); - - // Need to wait because killing is asynchronous - if (!process.WaitForExit(5000)) - { - Logger.Info("Killing ffmpeg process for {0}", job.Path); - process.Kill(); - } - } - catch (Exception ex) - { - Logger.ErrorException("Error killing transcoding job for {0}", ex, job.Path); - } - } - } - - if (delete(job.Path)) - { - DeletePartialStreamFiles(job.Path, job.Type, 0, 1500); - } - - if (closeLiveStream && !string.IsNullOrWhiteSpace(job.LiveStreamId)) - { - try - { - await _mediaSourceManager.CloseLiveStream(job.LiveStreamId).ConfigureAwait(false); - } - catch (Exception ex) - { - Logger.ErrorException("Error closing live stream for {0}", ex, job.Path); - } - } - } - - private async void DeletePartialStreamFiles(string path, TranscodingJobType jobType, int retryCount, int delayMs) - { - if (retryCount >= 10) - { - return; - } - - Logger.Info("Deleting partial stream file(s) {0}", path); - - await Task.Delay(delayMs).ConfigureAwait(false); - - try - { - if (jobType == TranscodingJobType.Progressive) - { - DeleteProgressivePartialStreamFiles(path); - } - else - { - DeleteHlsPartialStreamFiles(path); - } - } - catch (FileNotFoundException) - { - - } - catch (IOException) - { - //Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, path); - - DeletePartialStreamFiles(path, jobType, retryCount + 1, 500); - } - catch - { - //Logger.ErrorException("Error deleting partial stream file(s) {0}", ex, path); - } - } - - /// - /// Deletes the progressive partial stream files. - /// - /// The output file path. - private void DeleteProgressivePartialStreamFiles(string outputFilePath) - { - _fileSystem.DeleteFile(outputFilePath); - } - - /// - /// Deletes the HLS partial stream files. - /// - /// The output file path. - private void DeleteHlsPartialStreamFiles(string outputFilePath) - { - var directory = _fileSystem.GetDirectoryName(outputFilePath); - var name = Path.GetFileNameWithoutExtension(outputFilePath); - - var filesToDelete = _fileSystem.GetFilePaths(directory) - .Where(f => f.IndexOf(name, StringComparison.OrdinalIgnoreCase) != -1) - .ToList(); - - Exception e = null; - - foreach (var file in filesToDelete) - { - try - { - //Logger.Debug("Deleting HLS file {0}", file); - _fileSystem.DeleteFile(file); - } - catch (FileNotFoundException) - { - - } - catch (IOException ex) - { - e = ex; - //Logger.ErrorException("Error deleting HLS file {0}", ex, file); - } - } - - if (e != null) - { - throw e; - } - } - } - - /// - /// Class TranscodingJob - /// - public class TranscodingJob - { - /// - /// Gets or sets the play session identifier. - /// - /// The play session identifier. - public string PlaySessionId { get; set; } - /// - /// Gets or sets the live stream identifier. - /// - /// The live stream identifier. - public string LiveStreamId { get; set; } - - public bool IsLiveOutput { get; set; } - - /// - /// Gets or sets the path. - /// - /// The path. - public MediaSourceInfo MediaSource { get; set; } - public string Path { get; set; } - /// - /// Gets or sets the type. - /// - /// The type. - public TranscodingJobType Type { get; set; } - /// - /// Gets or sets the process. - /// - /// The process. - public IProcess Process { get; set; } - public ILogger Logger { get; private set; } - /// - /// Gets or sets the active request count. - /// - /// The active request count. - public int ActiveRequestCount { get; set; } - /// - /// Gets or sets the kill timer. - /// - /// The kill timer. - private ITimer KillTimer { get; set; } - - private readonly ITimerFactory _timerFactory; - - public string DeviceId { get; set; } - - public CancellationTokenSource CancellationTokenSource { get; set; } - - public object ProcessLock = new object(); - - public bool HasExited { get; set; } - public bool IsUserPaused { get; set; } - - public string Id { get; set; } - - public float? Framerate { get; set; } - public double? CompletionPercentage { get; set; } - - public long? BytesDownloaded { get; set; } - public long? BytesTranscoded { get; set; } - public int? BitRate { get; set; } - - public long? TranscodingPositionTicks { get; set; } - public long? DownloadPositionTicks { get; set; } - - public TranscodingThrottler TranscodingThrottler { get; set; } - - private readonly object _timerLock = new object(); - - public DateTime LastPingDate { get; set; } - public int PingTimeout { get; set; } - - public TranscodingJob(ILogger logger, ITimerFactory timerFactory) - { - Logger = logger; - _timerFactory = timerFactory; - } - - public void StopKillTimer() - { - lock (_timerLock) - { - if (KillTimer != null) - { - KillTimer.Change(Timeout.Infinite, Timeout.Infinite); - } - } - } - - public void DisposeKillTimer() - { - lock (_timerLock) - { - if (KillTimer != null) - { - KillTimer.Dispose(); - KillTimer = null; - } - } - } - - public void StartKillTimer(Action callback) - { - StartKillTimer(callback, PingTimeout); - } - - public void StartKillTimer(Action callback, int intervalMs) - { - if (HasExited) - { - return; - } - - lock (_timerLock) - { - if (KillTimer == null) - { - //Logger.Debug("Starting kill timer at {0}ms. JobId {1} PlaySessionId {2}", intervalMs, Id, PlaySessionId); - KillTimer = _timerFactory.Create(callback, this, intervalMs, Timeout.Infinite); - } - else - { - //Logger.Debug("Changing kill timer to {0}ms. JobId {1} PlaySessionId {2}", intervalMs, Id, PlaySessionId); - KillTimer.Change(intervalMs, Timeout.Infinite); - } - } - } - - public void ChangeKillTimerIfStarted() - { - if (HasExited) - { - return; - } - - lock (_timerLock) - { - if (KillTimer != null) - { - var intervalMs = PingTimeout; - - //Logger.Debug("Changing kill timer to {0}ms. JobId {1} PlaySessionId {2}", intervalMs, Id, PlaySessionId); - KillTimer.Change(intervalMs, Timeout.Infinite); - } - } } } } diff --git a/MediaBrowser.Api/FilterService.cs b/MediaBrowser.Api/FilterService.cs index 5d81e9ea56..41b17e535d 100644 --- a/MediaBrowser.Api/FilterService.cs +++ b/MediaBrowser.Api/FilterService.cs @@ -63,7 +63,7 @@ namespace MediaBrowser.Api var result = ((Folder)item).GetItemList(GetItemsQuery(request, user)); - return ToOptimizedResult(GetFilters(result.ToArray())); + return ToOptimizedResult(GetFilters(result)); } private QueryFilters GetFilters(BaseItem[] items) diff --git a/MediaBrowser.Api/GamesService.cs b/MediaBrowser.Api/GamesService.cs index 2d161ccfd5..0ce57a16a8 100644 --- a/MediaBrowser.Api/GamesService.cs +++ b/MediaBrowser.Api/GamesService.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Threading.Tasks; using MediaBrowser.Model.Querying; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api { @@ -227,11 +228,13 @@ namespace MediaBrowser.Api SimilarTo = item, DtoOptions = dtoOptions - }).ToList(); + }); + + var returnList = (await _dtoService.GetBaseItemDtos(itemsResult, dtoOptions, user).ConfigureAwait(false)); var result = new QueryResult { - Items = (await _dtoService.GetBaseItemDtos(itemsResult, dtoOptions, user).ConfigureAwait(false)).ToArray(), + Items = returnList.ToArray(returnList.Count), TotalRecordCount = itemsResult.Count }; diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs index a360e11833..318360336a 100644 --- a/MediaBrowser.Api/Images/ImageService.cs +++ b/MediaBrowser.Api/Images/ImageService.cs @@ -279,13 +279,16 @@ namespace MediaBrowser.Api.Images var itemImages = item.ImageInfos; - foreach (var image in itemImages.Where(i => !item.AllowsMultipleImages(i.Type))) + foreach (var image in itemImages) { - var info = GetImageInfo(item, image, null); - - if (info != null) + if (!item.AllowsMultipleImages(image.Type)) { - list.Add(info); + var info = GetImageInfo(item, image, null); + + if (info != null) + { + list.Add(info); + } } } diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs index 19220cdec0..a4b6c39562 100644 --- a/MediaBrowser.Api/ItemUpdateService.cs +++ b/MediaBrowser.Api/ItemUpdateService.cs @@ -66,8 +66,8 @@ namespace MediaBrowser.Api { ParentalRatingOptions = _localizationManager.GetParentalRatings().ToList(), ExternalIdInfos = _providerManager.GetExternalIdInfos(item).ToList(), - Countries = _localizationManager.GetCountries().ToList(), - Cultures = _localizationManager.GetCultures().ToList() + Countries = _localizationManager.GetCountries(), + Cultures = _localizationManager.GetCultures() }; if (!item.IsVirtualItem && !(item is ICollectionFolder) && !(item is UserView) && !(item is AggregateFolder) && !(item is LiveTvChannel) && !(item is IItemByName) && @@ -269,7 +269,7 @@ namespace MediaBrowser.Api if (request.Studios != null) { - item.Studios = request.Studios.Select(x => x.Name).ToList(); + item.Studios = request.Studios.Select(x => x.Name).ToArray(); } if (request.DateCreated.HasValue) @@ -285,7 +285,7 @@ namespace MediaBrowser.Api if (request.ProductionLocations != null) { - item.ProductionLocations = request.ProductionLocations.ToList(); + item.ProductionLocations = request.ProductionLocations; } item.PreferredMetadataCountryCode = request.PreferredMetadataCountryCode; diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs index 3bb119cbae..7dd1afaf45 100644 --- a/MediaBrowser.Api/Library/LibraryService.cs +++ b/MediaBrowser.Api/Library/LibraryService.cs @@ -29,6 +29,7 @@ using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Services; using MediaBrowser.Common.Extensions; using MediaBrowser.Common.Progress; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api.Library { @@ -460,22 +461,22 @@ namespace MediaBrowser.Api.Library EnableImages = false } - }).ToArray(); + }); if (!string.IsNullOrWhiteSpace(request.ImdbId)) { - movies = movies.Where(i => string.Equals(request.ImdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase)).ToArray(); + movies = movies.Where(i => string.Equals(request.ImdbId, i.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase)).ToList(); } else if (!string.IsNullOrWhiteSpace(request.TmdbId)) { - movies = movies.Where(i => string.Equals(request.TmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase)).ToArray(); + movies = movies.Where(i => string.Equals(request.TmdbId, i.GetProviderId(MetadataProviders.Tmdb), StringComparison.OrdinalIgnoreCase)).ToList(); } else { - movies = new BaseItem[] { }; + movies = new List(); } - if (movies.Length > 0) + if (movies.Count > 0) { foreach (var item in movies) { @@ -732,7 +733,8 @@ namespace MediaBrowser.Api.Library { DeleteFileLocation = true }); - }).ToArray(); + + }).ToArray(ids.Length); Task.WaitAll(tasks); } @@ -758,7 +760,7 @@ namespace MediaBrowser.Api.Library { var reviews = _itemRepo.GetCriticReviews(new Guid(request.Id)); - var reviewsArray = reviews.ToArray(); + var reviewsArray = reviews.ToArray(reviews.Count); var result = new QueryResult { @@ -833,7 +835,7 @@ namespace MediaBrowser.Api.Library throw new ResourceNotFoundException("Item not found."); } - while (item.ThemeSongIds.Count == 0 && request.InheritFromParent && item.GetParent() != null) + while (item.ThemeSongIds.Length == 0 && request.InheritFromParent && item.GetParent() != null) { item = item.GetParent(); } @@ -882,7 +884,7 @@ namespace MediaBrowser.Api.Library throw new ResourceNotFoundException("Item not found."); } - while (item.ThemeVideoIds.Count == 0 && request.InheritFromParent && item.GetParent() != null) + while (item.ThemeVideoIds.Length == 0 && request.InheritFromParent && item.GetParent() != null) { item = item.GetParent(); } diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs index 837a0f6a6b..09d4cdfa96 100644 --- a/MediaBrowser.Api/LiveTv/LiveTvService.cs +++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs @@ -16,13 +16,12 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Model.IO; -using MediaBrowser.Api.Playback.Progressive; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.IO; using MediaBrowser.Model.Services; using MediaBrowser.Model.System; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api.LiveTv { @@ -734,7 +733,7 @@ namespace MediaBrowser.Api.LiveTv outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType(path); - return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, null, Logger, _environment, CancellationToken.None) + return new ProgressiveFileCopier(_fileSystem, path, outputHeaders, Logger, _environment, CancellationToken.None) { AllowEndOfFile = false }; @@ -753,7 +752,7 @@ namespace MediaBrowser.Api.LiveTv outputHeaders["Content-Type"] = Model.Net.MimeTypes.GetMimeType("file." + request.Container); - return new ProgressiveFileCopier(directStreamProvider, outputHeaders, null, Logger, _environment, CancellationToken.None) + return new ProgressiveFileCopier(directStreamProvider, outputHeaders, Logger, _environment, CancellationToken.None) { AllowEndOfFile = false }; @@ -921,7 +920,9 @@ namespace MediaBrowser.Api.LiveTv options.AddCurrentProgram = request.AddCurrentProgram; - var returnArray = (await _dtoService.GetBaseItemDtos(channelResult.Items, options, user).ConfigureAwait(false)).ToArray(); + var returnList = (await _dtoService.GetBaseItemDtos(channelResult.Items, options, user) + .ConfigureAwait(false)); + var returnArray = returnList.ToArray(returnList.Count); var result = new QueryResult { @@ -962,7 +963,7 @@ namespace MediaBrowser.Api.LiveTv { var query = new ProgramQuery { - ChannelIds = (request.ChannelIds ?? string.Empty).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToArray(), + ChannelIds = ApiEntryPoint.Split(request.ChannelIds, ',', true), UserId = request.UserId, HasAired = request.HasAired, EnableTotalRecordCount = request.EnableTotalRecordCount diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs similarity index 59% rename from MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs rename to MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs index d84d889fa8..20466c5f63 100644 --- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs +++ b/MediaBrowser.Api/LiveTv/ProgressiveFileCopier.cs @@ -1,23 +1,19 @@ -using MediaBrowser.Model.Logging; -using System; +using System; +using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; -using MediaBrowser.Model.IO; -using MediaBrowser.Controller.Net; -using System.Collections.Generic; - -using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; using MediaBrowser.Model.Services; using MediaBrowser.Model.System; -namespace MediaBrowser.Api.Playback.Progressive +namespace MediaBrowser.Api.LiveTv { public class ProgressiveFileCopier : IAsyncStreamWriter, IHasHeaders { private readonly IFileSystem _fileSystem; - private readonly TranscodingJob _job; private readonly ILogger _logger; private readonly string _path; private readonly CancellationToken _cancellationToken; @@ -32,22 +28,20 @@ namespace MediaBrowser.Api.Playback.Progressive private readonly IDirectStreamProvider _directStreamProvider; private readonly IEnvironmentInfo _environment; - public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary outputHeaders, TranscodingJob job, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) + public ProgressiveFileCopier(IFileSystem fileSystem, string path, Dictionary outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) { _fileSystem = fileSystem; _path = path; _outputHeaders = outputHeaders; - _job = job; _logger = logger; _cancellationToken = cancellationToken; _environment = environment; } - public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary outputHeaders, TranscodingJob job, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) + public ProgressiveFileCopier(IDirectStreamProvider directStreamProvider, Dictionary outputHeaders, ILogger logger, IEnvironmentInfo environment, CancellationToken cancellationToken) { _directStreamProvider = directStreamProvider; _outputHeaders = outputHeaders; - _job = job; _logger = logger; _cancellationToken = cancellationToken; _environment = environment; @@ -77,61 +71,48 @@ namespace MediaBrowser.Api.Playback.Progressive { cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, _cancellationToken).Token; - try + if (_directStreamProvider != null) { - if (_directStreamProvider != null) - { - await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false); - return; - } - - var eofCount = 0; - - // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 - var allowAsyncFileRead = _environment.OperatingSystem != OperatingSystem.Windows; - - using (var inputStream = GetInputStream(allowAsyncFileRead)) - { - if (StartPosition > 0) - { - inputStream.Position = StartPosition; - } - - while (eofCount < 20 || !AllowEndOfFile) - { - int bytesRead; - if (allowAsyncFileRead) - { - bytesRead = await CopyToInternalAsync(inputStream, outputStream, cancellationToken).ConfigureAwait(false); - } - else - { - bytesRead = await CopyToInternalAsyncWithSyncRead(inputStream, outputStream, cancellationToken).ConfigureAwait(false); - } - - //var position = fs.Position; - //_logger.Debug("Streamed {0} bytes to position {1} from file {2}", bytesRead, position, path); - - if (bytesRead == 0) - { - if (_job == null || _job.HasExited) - { - eofCount++; - } - await Task.Delay(100, cancellationToken).ConfigureAwait(false); - } - else - { - eofCount = 0; - } - } - } + await _directStreamProvider.CopyToAsync(outputStream, cancellationToken).ConfigureAwait(false); + return; } - finally + + var eofCount = 0; + + // use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039 + var allowAsyncFileRead = _environment.OperatingSystem != OperatingSystem.Windows; + + using (var inputStream = GetInputStream(allowAsyncFileRead)) { - if (_job != null) + if (StartPosition > 0) { - ApiEntryPoint.Instance.OnTranscodeEndRequest(_job); + inputStream.Position = StartPosition; + } + + while (eofCount < 20 || !AllowEndOfFile) + { + int bytesRead; + if (allowAsyncFileRead) + { + bytesRead = await CopyToInternalAsync(inputStream, outputStream, cancellationToken).ConfigureAwait(false); + } + else + { + bytesRead = await CopyToInternalAsyncWithSyncRead(inputStream, outputStream, cancellationToken).ConfigureAwait(false); + } + + //var position = fs.Position; + //_logger.Debug("Streamed {0} bytes to position {1} from file {2}", bytesRead, position, path); + + if (bytesRead == 0) + { + eofCount++; + await Task.Delay(100, cancellationToken).ConfigureAwait(false); + } + else + { + eofCount = 0; + } } } } @@ -152,11 +133,6 @@ namespace MediaBrowser.Api.Playback.Progressive _bytesWritten += bytesRead; totalBytesRead += bytesRead; - - if (_job != null) - { - _job.BytesDownloaded = Math.Max(_job.BytesDownloaded ?? _bytesWritten, _bytesWritten); - } } } @@ -179,11 +155,6 @@ namespace MediaBrowser.Api.Playback.Progressive _bytesWritten += bytesRead; totalBytesRead += bytesRead; - - if (_job != null) - { - _job.BytesDownloaded = Math.Max(_job.BytesDownloaded ?? _bytesWritten, _bytesWritten); - } } } diff --git a/MediaBrowser.Api/LocalizationService.cs b/MediaBrowser.Api/LocalizationService.cs index 90b963149b..eee340a874 100644 --- a/MediaBrowser.Api/LocalizationService.cs +++ b/MediaBrowser.Api/LocalizationService.cs @@ -85,7 +85,7 @@ namespace MediaBrowser.Api /// System.Object. public object Get(GetCountries request) { - var result = _localization.GetCountries().ToList(); + var result = _localization.GetCountries(); return ToOptimizedResult(result); } @@ -97,7 +97,7 @@ namespace MediaBrowser.Api /// System.Object. public object Get(GetCultures request) { - var result = _localization.GetCultures().ToList(); + var result = _localization.GetCultures(); return ToOptimizedResult(result); } diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 88889e5e76..810b0f6b27 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -48,9 +48,7 @@ - - - + @@ -101,18 +99,6 @@ - - - - - - - - - - - - @@ -126,7 +112,6 @@ - @@ -136,7 +121,6 @@ - diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs index e20fa2cca1..43d8f3ecf9 100644 --- a/MediaBrowser.Api/Movies/MoviesService.cs +++ b/MediaBrowser.Api/Movies/MoviesService.cs @@ -158,17 +158,19 @@ namespace MediaBrowser.Api.Movies var itemsResult = _libraryManager.GetItemList(new InternalItemsQuery(user) { Limit = request.Limit, - IncludeItemTypes = itemTypes.ToArray(), + IncludeItemTypes = itemTypes.ToArray(itemTypes.Count), IsMovie = true, SimilarTo = item, EnableGroupByMetadataKey = true, DtoOptions = dtoOptions - }).ToList(); + }); + + var returnList = await _dtoService.GetBaseItemDtos(itemsResult, dtoOptions, user).ConfigureAwait(false); var result = new QueryResult { - Items = (await _dtoService.GetBaseItemDtos(itemsResult, dtoOptions, user).ConfigureAwait(false)).ToArray(), + Items = returnList.ToArray(returnList.Count), TotalRecordCount = itemsResult.Count }; @@ -200,7 +202,7 @@ namespace MediaBrowser.Api.Movies DtoOptions = dtoOptions }; - var recentlyPlayedMovies = _libraryManager.GetItemList(query).ToList(); + var recentlyPlayedMovies = _libraryManager.GetItemList(query); var itemTypes = new List { typeof(Movie).Name }; if (_config.Configuration.EnableExternalContentInSuggestions) @@ -211,19 +213,19 @@ namespace MediaBrowser.Api.Movies var likedMovies = _libraryManager.GetItemList(new InternalItemsQuery(user) { - IncludeItemTypes = itemTypes.ToArray(), + IncludeItemTypes = itemTypes.ToArray(itemTypes.Count), IsMovie = true, SortBy = new[] { ItemSortBy.Random }, SortOrder = SortOrder.Descending, Limit = 10, IsFavoriteOrLiked = true, - ExcludeItemIds = recentlyPlayedMovies.Select(i => i.Id.ToString("N")).ToArray(), + ExcludeItemIds = recentlyPlayedMovies.Select(i => i.Id.ToString("N")).ToArray(recentlyPlayedMovies.Count), EnableGroupByMetadataKey = true, ParentId = parentIdGuid, Recursive = true, DtoOptions = dtoOptions - }).ToList(); + }); var mostRecentMovies = recentlyPlayedMovies.Take(6).ToList(); // Get recently played directors @@ -300,7 +302,7 @@ namespace MediaBrowser.Api.Movies // Account for duplicates by imdb id, since the database doesn't support this yet Limit = itemLimit + 2, PersonTypes = new[] { PersonType.Director }, - IncludeItemTypes = itemTypes.ToArray(), + IncludeItemTypes = itemTypes.ToArray(itemTypes.Count), IsMovie = true, EnableGroupByMetadataKey = true, DtoOptions = dtoOptions @@ -311,12 +313,14 @@ namespace MediaBrowser.Api.Movies if (items.Count > 0) { + var returnItems = _dtoService.GetBaseItemDtos(items, dtoOptions, user).Result; + yield return new RecommendationDto { BaselineItemName = name, CategoryId = name.GetMD5().ToString("N"), RecommendationType = type, - Items = _dtoService.GetBaseItemDtos(items, dtoOptions, user).Result.ToArray() + Items = returnItems.ToArray(returnItems.Count) }; } } @@ -338,7 +342,7 @@ namespace MediaBrowser.Api.Movies Person = name, // Account for duplicates by imdb id, since the database doesn't support this yet Limit = itemLimit + 2, - IncludeItemTypes = itemTypes.ToArray(), + IncludeItemTypes = itemTypes.ToArray(itemTypes.Count), IsMovie = true, EnableGroupByMetadataKey = true, DtoOptions = dtoOptions @@ -349,12 +353,14 @@ namespace MediaBrowser.Api.Movies if (items.Count > 0) { + var returnItems = _dtoService.GetBaseItemDtos(items, dtoOptions, user).Result; + yield return new RecommendationDto { BaselineItemName = name, CategoryId = name.GetMD5().ToString("N"), RecommendationType = type, - Items = _dtoService.GetBaseItemDtos(items, dtoOptions, user).Result.ToArray() + Items = returnItems.ToArray(returnItems.Count) }; } } @@ -374,28 +380,30 @@ namespace MediaBrowser.Api.Movies var similar = _libraryManager.GetItemList(new InternalItemsQuery(user) { Limit = itemLimit, - IncludeItemTypes = itemTypes.ToArray(), + IncludeItemTypes = itemTypes.ToArray(itemTypes.Count), IsMovie = true, SimilarTo = item, EnableGroupByMetadataKey = true, DtoOptions = dtoOptions - }).ToList(); + }); if (similar.Count > 0) { + var returnItems = _dtoService.GetBaseItemDtos(similar, dtoOptions, user).Result; + yield return new RecommendationDto { BaselineItemName = item.Name, CategoryId = item.Id.ToString("N"), RecommendationType = type, - Items = _dtoService.GetBaseItemDtos(similar, dtoOptions, user).Result.ToArray() + Items = returnItems.ToArray(returnItems.Count) }; } } } - private IEnumerable GetActors(IEnumerable items) + private IEnumerable GetActors(List items) { var people = _libraryManager.GetPeople(new InternalPeopleQuery { @@ -406,7 +414,7 @@ namespace MediaBrowser.Api.Movies MaxListOrder = 3 }); - var itemIds = items.Select(i => i.Id).ToList(); + var itemIds = items.Select(i => i.Id).ToList(items.Count); return people .Where(i => itemIds.Contains(i.ItemId)) @@ -414,7 +422,7 @@ namespace MediaBrowser.Api.Movies .DistinctNames(); } - private IEnumerable GetDirectors(IEnumerable items) + private IEnumerable GetDirectors(List items) { var people = _libraryManager.GetPeople(new InternalPeopleQuery { @@ -424,7 +432,7 @@ namespace MediaBrowser.Api.Movies } }); - var itemIds = items.Select(i => i.Id).ToList(); + var itemIds = items.Select(i => i.Id).ToList(items.Count); return people .Where(i => itemIds.Contains(i.ItemId)) diff --git a/MediaBrowser.Api/Music/InstantMixService.cs b/MediaBrowser.Api/Music/InstantMixService.cs index 3cb29de072..b0f086ec5b 100644 --- a/MediaBrowser.Api/Music/InstantMixService.cs +++ b/MediaBrowser.Api/Music/InstantMixService.cs @@ -9,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using MediaBrowser.Model.Services; +using MediaBrowser.Model.Extensions; namespace MediaBrowser.Api.Music { @@ -180,16 +181,19 @@ namespace MediaBrowser.Api.Music return GetResult(items, user, request, dtoOptions); } - private async Task GetResult(IEnumerable