From cd1ca67ce697287aafd8191b48e73a87d5d42dc0 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 14 Jun 2014 22:24:04 -0400 Subject: [PATCH] replace all images when using identify function --- MediaBrowser.Api/ItemRefreshService.cs | 8 +- .../Playback/BaseStreamingService.cs | 2 +- .../Manager/ItemImageProvider.cs | 94 ++++++++++++++++--- .../Localization/JavaScript/javascript.json | 2 +- 4 files changed, 89 insertions(+), 17 deletions(-) diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs index 4345fbc5cc..0094282c8a 100644 --- a/MediaBrowser.Api/ItemRefreshService.cs +++ b/MediaBrowser.Api/ItemRefreshService.cs @@ -12,8 +12,11 @@ namespace MediaBrowser.Api { public class BaseRefreshRequest : IReturnVoid { - [ApiMember(Name = "Forced", Description = "Indicates if a normal or forced refresh should occur.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "POST")] + [ApiMember(Name = "Forced", Description = "Indicates if a normal or forced refresh should occur.", IsRequired = false, DataType = "boolean", ParameterType = "query", Verb = "POST")] public bool Forced { get; set; } + + [ApiMember(Name = "ReplaceAllImages", Description = "Determines if images should be replaced during the refresh.", IsRequired = true, DataType = "boolean", ParameterType = "query", Verb = "POST")] + public bool ReplaceAllImages { get; set; } } [Route("/Items/{Id}/Refresh", "POST")] @@ -145,7 +148,8 @@ namespace MediaBrowser.Api { MetadataRefreshMode = MetadataRefreshMode.FullRefresh, ImageRefreshMode = ImageRefreshMode.FullRefresh, - ReplaceAllMetadata = request.Forced + ReplaceAllMetadata = request.Forced, + ReplaceAllImages = request.ReplaceAllImages }; } } diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index a19a247ed8..71d66664bf 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -489,9 +489,9 @@ namespace MediaBrowser.Api.Playback if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream) { assSubtitleParam = GetTextSubtitleParam(state, cancellationToken); + copyTsParam = " -copyts"; } - //copyTsParam = " -copyts"; // If fixed dimensions were supplied if (request.Width.HasValue && request.Height.HasValue) diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index cbcb0caf29..9e69d08577 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -53,6 +53,15 @@ namespace MediaBrowser.Providers.Manager public async Task RefreshImages(IHasImages item, IEnumerable imageProviders, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, CancellationToken cancellationToken) { + if (refreshOptions.IsReplacingImage(ImageType.Backdrop)) + { + ClearImages(item, ImageType.Backdrop); + } + if (refreshOptions.IsReplacingImage(ImageType.Screenshot)) + { + ClearImages(item, ImageType.Screenshot); + } + var result = new RefreshResult { UpdateType = ItemUpdateType.None }; var providers = imageProviders.ToList(); @@ -62,6 +71,7 @@ namespace MediaBrowser.Providers.Manager // In order to avoid duplicates, only download these if there are none already var backdropLimit = savedOptions.GetLimit(ImageType.Backdrop); var screenshotLimit = savedOptions.GetLimit(ImageType.Screenshot); + var downloadedImages = new List(); foreach (var provider in providers) { @@ -69,7 +79,7 @@ namespace MediaBrowser.Providers.Manager if (remoteProvider != null) { - await RefreshFromProvider(item, remoteProvider, refreshOptions, savedOptions, backdropLimit, screenshotLimit, result, cancellationToken).ConfigureAwait(false); + await RefreshFromProvider(item, remoteProvider, refreshOptions, savedOptions, backdropLimit, screenshotLimit, downloadedImages, result, cancellationToken).ConfigureAwait(false); providerIds.Add(provider.GetType().FullName.GetMD5()); continue; } @@ -78,7 +88,7 @@ namespace MediaBrowser.Providers.Manager if (dynamicImageProvider != null) { - await RefreshFromProvider(item, dynamicImageProvider, refreshOptions, savedOptions, result, cancellationToken).ConfigureAwait(false); + await RefreshFromProvider(item, dynamicImageProvider, refreshOptions, savedOptions, downloadedImages, result, cancellationToken).ConfigureAwait(false); providerIds.Add(provider.GetType().FullName.GetMD5()); } } @@ -95,6 +105,7 @@ namespace MediaBrowser.Providers.Manager /// The provider. /// The refresh options. /// The saved options. + /// The downloaded images. /// The result. /// The cancellation token. /// Task. @@ -102,6 +113,7 @@ namespace MediaBrowser.Providers.Manager IDynamicImageProvider provider, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, + ICollection downloadedImages, RefreshResult result, CancellationToken cancellationToken) { @@ -111,8 +123,9 @@ namespace MediaBrowser.Providers.Manager foreach (var imageType in images) { - if (savedOptions.IsEnabled(imageType) && - (!item.HasImage(imageType) || refreshOptions.IsReplacingImage(imageType))) + if (!savedOptions.IsEnabled(imageType)) continue; + + if (!item.HasImage(imageType) || (refreshOptions.IsReplacingImage(imageType) && !downloadedImages.Contains(imageType))) { _logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name); @@ -135,6 +148,7 @@ namespace MediaBrowser.Providers.Manager await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false); } + downloadedImages.Add(imageType); result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate; } } @@ -189,7 +203,7 @@ namespace MediaBrowser.Providers.Manager return false; } - if (images.Contains(ImageType.Screenshot) && item.GetImages(ImageType.Screenshot).Count() < backdropLimit) + if (images.Contains(ImageType.Screenshot) && item.GetImages(ImageType.Screenshot).Count() < screenshotLimit) { return false; } @@ -206,14 +220,25 @@ namespace MediaBrowser.Providers.Manager /// The saved options. /// The backdrop limit. /// The screenshot limit. + /// The downloaded images. /// The result. /// The cancellation token. /// Task. - private async Task RefreshFromProvider(IHasImages item, IRemoteImageProvider provider, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, int backdropLimit, int screenshotLimit, RefreshResult result, CancellationToken cancellationToken) + private async Task RefreshFromProvider(IHasImages item, + IRemoteImageProvider provider, + ImageRefreshOptions refreshOptions, + MetadataOptions savedOptions, + int backdropLimit, + int screenshotLimit, + ICollection downloadedImages, + RefreshResult result, + CancellationToken cancellationToken) { try { - if (ContainsImages(item, provider.GetSupportedImages(item).ToList(), savedOptions, backdropLimit, screenshotLimit)) + if (!refreshOptions.ReplaceAllImages && + refreshOptions.ReplaceImages.Count == 0 && + ContainsImages(item, provider.GetSupportedImages(item).ToList(), savedOptions, backdropLimit, screenshotLimit)) { return; } @@ -231,12 +256,19 @@ namespace MediaBrowser.Providers.Manager var list = images.ToList(); int minWidth; - foreach (var type in _singularImages) + foreach (var imageType in _singularImages) { - if (savedOptions.IsEnabled(type) && !item.HasImage(type)) + if (!savedOptions.IsEnabled(imageType)) continue; + + if (!item.HasImage(imageType) || (refreshOptions.IsReplacingImage(imageType) && !downloadedImages.Contains(imageType))) { - minWidth = savedOptions.GetMinWidth(type); - await DownloadImage(item, provider, result, list, minWidth, type, cancellationToken).ConfigureAwait(false); + minWidth = savedOptions.GetMinWidth(imageType); + var downloaded = await DownloadImage(item, provider, result, list, minWidth, imageType, cancellationToken).ConfigureAwait(false); + + if (downloaded) + { + downloadedImages.Add(imageType); + } } } @@ -262,6 +294,34 @@ namespace MediaBrowser.Providers.Manager } } + private void ClearImages(IHasImages item, ImageType type) + { + var deleted = false; + + foreach (var image in item.GetImages(type).ToList()) + { + // Delete the source file + var currentFile = new FileInfo(image.Path); + + // Deletion will fail if the file is hidden so remove the attribute first + if (currentFile.Exists) + { + if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + { + currentFile.Attributes &= ~FileAttributes.Hidden; + } + + currentFile.Delete(); + deleted = true; + } + } + + if (deleted) + { + item.ValidateImages(new DirectoryService(_logger)); + } + } + public bool MergeImages(IHasImages item, List images) { var changed = false; @@ -332,7 +392,13 @@ namespace MediaBrowser.Providers.Manager return changed; } - private async Task DownloadImage(IHasImages item, IRemoteImageProvider provider, RefreshResult result, IEnumerable images, int minWidth, ImageType type, CancellationToken cancellationToken) + private async Task DownloadImage(IHasImages item, + IRemoteImageProvider provider, + RefreshResult result, + IEnumerable images, + int minWidth, + ImageType type, + CancellationToken cancellationToken) { foreach (var image in images.Where(i => i.Type == type)) { @@ -350,7 +416,7 @@ namespace MediaBrowser.Providers.Manager await _providerManager.SaveImage(item, response.Content, response.ContentType, type, null, cancellationToken).ConfigureAwait(false); result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate; - break; + return true; } catch (HttpException ex) { @@ -362,6 +428,8 @@ namespace MediaBrowser.Providers.Manager break; } } + + return false; } private async Task DownloadBackdrops(IHasImages item, ImageType imageType, int limit, IRemoteImageProvider provider, RefreshResult result, IEnumerable images, int minWidth, CancellationToken cancellationToken) diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json index 6255b1a092..f147cc439b 100644 --- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json +++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json @@ -122,7 +122,7 @@ "MessageConfirmItemGrouping": "Media Browser clients will automatically choose the optimal version to play based on device and network performance. Are you sure you wish to continue?", "HeaderResume": "Resume", "HeaderMyLibrary": "My Library", - "HeaderLibraryFolders": "Folder View" + "HeaderLibraryFolders": "Folder View", "HeaderLatestMedia": "Latest Media", "ButtonMore": "More...", "HeaderFavoriteMovies": "Favorite Movies",