浏览代码

improve reaction to image stub failures

Conflicts:
	MediaBrowser.Server.Implementations/Library/LibraryManager.cs
Luke Pulverenti 9 年之前
父节点
当前提交
d317bedd85

+ 18 - 17
MediaBrowser.Providers/Manager/ItemImageProvider.cs

@@ -480,22 +480,21 @@ namespace MediaBrowser.Providers.Manager
             ImageType type,
             CancellationToken cancellationToken)
         {
-            foreach (var image in images.Where(i => i.Type == type))
+            var eligibleImages = images
+                .Where(i => i.Type == type && !(i.Width.HasValue && i.Width.Value < minWidth))
+                .ToList();
+
+            if (EnableImageStub(item, type) && eligibleImages.Count > 0)
             {
-                if (image.Width.HasValue && image.Width.Value < minWidth)
-                {
-                    continue;
-                }
+                SaveImageStub(item, type, eligibleImages.Select(i => i.Url));
+                result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
+                return true;
+            }
 
+            foreach (var image in eligibleImages)
+            {
                 var url = image.Url;
 
-                if (EnableImageStub(item, type))
-                {
-                    SaveImageStub(item, type, url);
-                    result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
-                    return true;
-                }
-
                 try
                 {
                     var response = await provider.GetImageResponse(url, cancellationToken).ConfigureAwait(false);
@@ -557,18 +556,20 @@ namespace MediaBrowser.Providers.Manager
             }
         }
 
-        private void SaveImageStub(IHasImages item, ImageType imageType, string url)
+        private void SaveImageStub(IHasImages item, ImageType imageType, IEnumerable<string> urls)
         {
             var newIndex = item.AllowsMultipleImages(imageType) ? item.GetImages(imageType).Count() : 0;
 
-            SaveImageStub(item, imageType, url, newIndex);
+            SaveImageStub(item, imageType, urls, newIndex);
         }
 
-        private void SaveImageStub(IHasImages item, ImageType imageType, string url, int newIndex)
+        private void SaveImageStub(IHasImages item, ImageType imageType, IEnumerable<string> urls, int newIndex)
         {
+            var path = string.Join("|", urls.Take(1).ToArray());
+
             item.SetImage(new ItemImageInfo
             {
-                Path = url,
+                Path = path,
                 Type = imageType
 
             }, newIndex);
@@ -592,7 +593,7 @@ namespace MediaBrowser.Providers.Manager
 
                 if (EnableImageStub(item, imageType))
                 {
-                    SaveImageStub(item, imageType, url);
+                    SaveImageStub(item, imageType, new[] { url });
                     result.UpdateType = result.UpdateType | ItemUpdateType.ImageUpdate;
                     continue;
                 }

+ 28 - 8
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -2387,20 +2387,40 @@ namespace MediaBrowser.Server.Implementations.Library
         private readonly SemaphoreSlim _dynamicImageResourcePool = new SemaphoreSlim(1,1);
         public async Task<ItemImageInfo> ConvertImageToLocal(IHasImages item, ItemImageInfo image, int imageIndex)
         {
-            _logger.Debug("ConvertImageToLocal item {0}", item.Id);
+            foreach (var url in image.Path.Split('|'))
+            {
+                try
+                {
+                    _logger.Debug("ConvertImageToLocal item {0} - image url: {1}", item.Id, url);
 
-            await _providerManagerFactory().SaveImage(item, image.Path, _dynamicImageResourcePool, image.Type, imageIndex, CancellationToken.None).ConfigureAwait(false);
+                    await _providerManagerFactory().SaveImage(item, url, _dynamicImageResourcePool, image.Type, imageIndex, CancellationToken.None).ConfigureAwait(false);
 
-            var newImage = item.GetImageInfo(image.Type, imageIndex);
+                    var newImage = item.GetImageInfo(image.Type, imageIndex);
 
-            if (newImage != null)
-            {
-                newImage.IsPlaceholder = image.IsPlaceholder;
+                    if (newImage != null)
+                    {
+                        newImage.IsPlaceholder = image.IsPlaceholder;
+                    }
+
+                    await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false);
+
+                    return item.GetImageInfo(image.Type, imageIndex);
+                }
+                catch (HttpException ex)
+                {
+                    if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound)
+                    {
+                        continue;
+                    }
+                    throw;
+                }
             }
 
+            // Remove this image to prevent it from retrying over and over
+            item.RemoveImage(image);
             await item.UpdateToRepository(ItemUpdateType.ImageUpdate, CancellationToken.None).ConfigureAwait(false);
-
-            return item.GetImageInfo(image.Type, imageIndex);
+            
+            throw new InvalidOperationException();
         }
     }
 }