mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-09 03:04:24 -04:00
replace all images when using identify function
This commit is contained in:
parent
f72b1f531a
commit
cd1ca67ce6
@ -12,8 +12,11 @@ namespace MediaBrowser.Api
|
|||||||
{
|
{
|
||||||
public class BaseRefreshRequest : IReturnVoid
|
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; }
|
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")]
|
[Route("/Items/{Id}/Refresh", "POST")]
|
||||||
@ -145,7 +148,8 @@ namespace MediaBrowser.Api
|
|||||||
{
|
{
|
||||||
MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
|
MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
|
||||||
ImageRefreshMode = ImageRefreshMode.FullRefresh,
|
ImageRefreshMode = ImageRefreshMode.FullRefresh,
|
||||||
ReplaceAllMetadata = request.Forced
|
ReplaceAllMetadata = request.Forced,
|
||||||
|
ReplaceAllImages = request.ReplaceAllImages
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -489,9 +489,9 @@ namespace MediaBrowser.Api.Playback
|
|||||||
if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream)
|
if (state.SubtitleStream != null && state.SubtitleStream.IsTextSubtitleStream)
|
||||||
{
|
{
|
||||||
assSubtitleParam = GetTextSubtitleParam(state, cancellationToken);
|
assSubtitleParam = GetTextSubtitleParam(state, cancellationToken);
|
||||||
|
|
||||||
copyTsParam = " -copyts";
|
copyTsParam = " -copyts";
|
||||||
}
|
}
|
||||||
//copyTsParam = " -copyts";
|
|
||||||
|
|
||||||
// If fixed dimensions were supplied
|
// If fixed dimensions were supplied
|
||||||
if (request.Width.HasValue && request.Height.HasValue)
|
if (request.Width.HasValue && request.Height.HasValue)
|
||||||
|
@ -53,6 +53,15 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
|
|
||||||
public async Task<RefreshResult> RefreshImages(IHasImages item, IEnumerable<IImageProvider> imageProviders, ImageRefreshOptions refreshOptions, MetadataOptions savedOptions, CancellationToken cancellationToken)
|
public async Task<RefreshResult> RefreshImages(IHasImages item, IEnumerable<IImageProvider> 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 result = new RefreshResult { UpdateType = ItemUpdateType.None };
|
||||||
|
|
||||||
var providers = imageProviders.ToList();
|
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
|
// In order to avoid duplicates, only download these if there are none already
|
||||||
var backdropLimit = savedOptions.GetLimit(ImageType.Backdrop);
|
var backdropLimit = savedOptions.GetLimit(ImageType.Backdrop);
|
||||||
var screenshotLimit = savedOptions.GetLimit(ImageType.Screenshot);
|
var screenshotLimit = savedOptions.GetLimit(ImageType.Screenshot);
|
||||||
|
var downloadedImages = new List<ImageType>();
|
||||||
|
|
||||||
foreach (var provider in providers)
|
foreach (var provider in providers)
|
||||||
{
|
{
|
||||||
@ -69,7 +79,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
|
|
||||||
if (remoteProvider != null)
|
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());
|
providerIds.Add(provider.GetType().FullName.GetMD5());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -78,7 +88,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
|
|
||||||
if (dynamicImageProvider != null)
|
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());
|
providerIds.Add(provider.GetType().FullName.GetMD5());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -95,6 +105,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
/// <param name="provider">The provider.</param>
|
/// <param name="provider">The provider.</param>
|
||||||
/// <param name="refreshOptions">The refresh options.</param>
|
/// <param name="refreshOptions">The refresh options.</param>
|
||||||
/// <param name="savedOptions">The saved options.</param>
|
/// <param name="savedOptions">The saved options.</param>
|
||||||
|
/// <param name="downloadedImages">The downloaded images.</param>
|
||||||
/// <param name="result">The result.</param>
|
/// <param name="result">The result.</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
@ -102,6 +113,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
IDynamicImageProvider provider,
|
IDynamicImageProvider provider,
|
||||||
ImageRefreshOptions refreshOptions,
|
ImageRefreshOptions refreshOptions,
|
||||||
MetadataOptions savedOptions,
|
MetadataOptions savedOptions,
|
||||||
|
ICollection<ImageType> downloadedImages,
|
||||||
RefreshResult result,
|
RefreshResult result,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@ -111,8 +123,9 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
|
|
||||||
foreach (var imageType in images)
|
foreach (var imageType in images)
|
||||||
{
|
{
|
||||||
if (savedOptions.IsEnabled(imageType) &&
|
if (!savedOptions.IsEnabled(imageType)) continue;
|
||||||
(!item.HasImage(imageType) || refreshOptions.IsReplacingImage(imageType)))
|
|
||||||
|
if (!item.HasImage(imageType) || (refreshOptions.IsReplacingImage(imageType) && !downloadedImages.Contains(imageType)))
|
||||||
{
|
{
|
||||||
_logger.Debug("Running {0} for {1}", provider.GetType().Name, item.Path ?? item.Name);
|
_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);
|
await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
downloadedImages.Add(imageType);
|
||||||
result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
|
result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,7 +203,7 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
return false;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
@ -206,14 +220,25 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
/// <param name="savedOptions">The saved options.</param>
|
/// <param name="savedOptions">The saved options.</param>
|
||||||
/// <param name="backdropLimit">The backdrop limit.</param>
|
/// <param name="backdropLimit">The backdrop limit.</param>
|
||||||
/// <param name="screenshotLimit">The screenshot limit.</param>
|
/// <param name="screenshotLimit">The screenshot limit.</param>
|
||||||
|
/// <param name="downloadedImages">The downloaded images.</param>
|
||||||
/// <param name="result">The result.</param>
|
/// <param name="result">The result.</param>
|
||||||
/// <param name="cancellationToken">The cancellation token.</param>
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
/// <returns>Task.</returns>
|
/// <returns>Task.</returns>
|
||||||
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<ImageType> downloadedImages,
|
||||||
|
RefreshResult result,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
try
|
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;
|
return;
|
||||||
}
|
}
|
||||||
@ -231,12 +256,19 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
var list = images.ToList();
|
var list = images.ToList();
|
||||||
int minWidth;
|
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);
|
minWidth = savedOptions.GetMinWidth(imageType);
|
||||||
await DownloadImage(item, provider, result, list, minWidth, type, cancellationToken).ConfigureAwait(false);
|
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<LocalImageInfo> images)
|
public bool MergeImages(IHasImages item, List<LocalImageInfo> images)
|
||||||
{
|
{
|
||||||
var changed = false;
|
var changed = false;
|
||||||
@ -332,7 +392,13 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DownloadImage(IHasImages item, IRemoteImageProvider provider, RefreshResult result, IEnumerable<RemoteImageInfo> images, int minWidth, ImageType type, CancellationToken cancellationToken)
|
private async Task<bool> DownloadImage(IHasImages item,
|
||||||
|
IRemoteImageProvider provider,
|
||||||
|
RefreshResult result,
|
||||||
|
IEnumerable<RemoteImageInfo> images,
|
||||||
|
int minWidth,
|
||||||
|
ImageType type,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
foreach (var image in images.Where(i => i.Type == type))
|
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);
|
await _providerManager.SaveImage(item, response.Content, response.ContentType, type, null, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
|
result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
|
||||||
break;
|
return true;
|
||||||
}
|
}
|
||||||
catch (HttpException ex)
|
catch (HttpException ex)
|
||||||
{
|
{
|
||||||
@ -362,6 +428,8 @@ namespace MediaBrowser.Providers.Manager
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DownloadBackdrops(IHasImages item, ImageType imageType, int limit, IRemoteImageProvider provider, RefreshResult result, IEnumerable<RemoteImageInfo> images, int minWidth, CancellationToken cancellationToken)
|
private async Task DownloadBackdrops(IHasImages item, ImageType imageType, int limit, IRemoteImageProvider provider, RefreshResult result, IEnumerable<RemoteImageInfo> images, int minWidth, CancellationToken cancellationToken)
|
||||||
|
@ -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?",
|
"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",
|
"HeaderResume": "Resume",
|
||||||
"HeaderMyLibrary": "My Library",
|
"HeaderMyLibrary": "My Library",
|
||||||
"HeaderLibraryFolders": "Folder View"
|
"HeaderLibraryFolders": "Folder View",
|
||||||
"HeaderLatestMedia": "Latest Media",
|
"HeaderLatestMedia": "Latest Media",
|
||||||
"ButtonMore": "More...",
|
"ButtonMore": "More...",
|
||||||
"HeaderFavoriteMovies": "Favorite Movies",
|
"HeaderFavoriteMovies": "Favorite Movies",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user