/// <summary> /// Gets the item image infos. /// </summary> /// <param name="item">The item.</param> /// <returns>Task{List{ImageInfo}}.</returns> public List<ImageInfo> GetItemImageInfos(BaseItem item) { var list = new List<ImageInfo>(); var itemImages = item.ImageInfos; if (itemImages.Length == 0) { // short-circuit return list; } _libraryManager.UpdateImages(item); // this makes sure dimensions and hashes are correct foreach (var image in itemImages) { if (!item.AllowsMultipleImages(image.Type)) { var info = GetImageInfo(item, image, null); if (info != null) { list.Add(info); } } } foreach (var imageType in itemImages.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages)) { var index = 0; // Prevent implicitly captured closure var currentImageType = imageType; foreach (var image in itemImages.Where(i => i.Type == currentImageType)) { var info = GetImageInfo(item, image, index); if (info != null) { list.Add(info); } index++; } } return list; }
/// <summary> /// Gets the item image infos. /// </summary> /// <param name="item">The item.</param> /// <returns>Task{List{ImageInfo}}.</returns> public List <ImageInfo> GetItemImageInfos(BaseItem item) { var list = new List <ImageInfo>(); var itemImages = item.ImageInfos; foreach (var image in itemImages) { if (!item.AllowsMultipleImages(image.Type)) { var info = GetImageInfo(item, image, null); if (info != null) { list.Add(info); } } } foreach (var imageType in itemImages.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages)) { var index = 0; // Prevent implicitly captured closure var currentImageType = imageType; foreach (var image in itemImages.Where(i => i.Type == currentImageType)) { var info = GetImageInfo(item, image, index); if (info != null) { list.Add(info); } index++; } } return(list); }
public async Task SaveImage(BaseItem item, Stream source, string mimeType, ImageType type, int?imageIndex, bool?saveLocallyWithMedia, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(mimeType)) { throw new ArgumentNullException("mimeType"); } var saveLocally = item.SupportsLocalMetadata && item.IsSaveLocalMetadataEnabled() && !item.ExtraType.HasValue && !(item is Audio); if (item is User) { saveLocally = true; } if (type != ImageType.Primary && item is Episode) { saveLocally = false; } if (!item.IsFileProtocol) { saveLocally = false; var season = item as Season; // If season is virtual under a physical series, save locally if using compatible convention if (season != null && _config.Configuration.ImageSavingConvention == ImageSavingConvention.Compatible) { var series = season.Series; if (series != null && series.SupportsLocalMetadata && series.IsSaveLocalMetadataEnabled()) { saveLocally = true; } } } if (saveLocallyWithMedia.HasValue && !saveLocallyWithMedia.Value) { saveLocally = saveLocallyWithMedia.Value; } if (!imageIndex.HasValue && item.AllowsMultipleImages(type)) { imageIndex = item.GetImages(type).Count(); } var index = imageIndex ?? 0; var paths = GetSavePaths(item, type, imageIndex, mimeType, saveLocally); var retryPaths = GetSavePaths(item, type, imageIndex, mimeType, false); // If there are more than one output paths, the stream will need to be seekable var memoryStream = new MemoryStream(); using (source) { await source.CopyToAsync(memoryStream).ConfigureAwait(false); } source = memoryStream; var currentImage = GetCurrentImage(item, type, index); var currentImageIsLocalFile = currentImage != null && currentImage.IsLocalFile; var currentImagePath = currentImage == null ? null : currentImage.Path; var savedPaths = new List <string>(); using (source) { var currentPathIndex = 0; foreach (var path in paths) { source.Position = 0; string retryPath = null; if (paths.Length == retryPaths.Length) { retryPath = retryPaths[currentPathIndex]; } var savedPath = await SaveImageToLocation(source, path, retryPath, cancellationToken).ConfigureAwait(false); savedPaths.Add(savedPath); currentPathIndex++; } } // Set the path into the item SetImagePath(item, type, imageIndex, savedPaths[0]); // Delete the current path if (currentImageIsLocalFile && !savedPaths.Contains(currentImagePath, StringComparer.OrdinalIgnoreCase)) { var currentPath = currentImagePath; _logger.Info("Deleting previous image {0}", currentPath); _libraryMonitor.ReportFileSystemChangeBeginning(currentPath); try { _fileSystem.DeleteFile(currentPath); } catch (FileNotFoundException) { } finally { _libraryMonitor.ReportFileSystemChangeComplete(currentPath, false); } } }
private void SaveImageStub(BaseItem item, ImageType imageType, IEnumerable<string> urls) { var newIndex = item.AllowsMultipleImages(imageType) ? item.GetImages(imageType).Count() : 0; SaveImageStub(item, imageType, urls, newIndex); }
/// <summary> /// Gets the item image infos. /// </summary> /// <param name="item">The item.</param> /// <returns>Task{List{ImageInfo}}.</returns> public List <ImageInfo> GetItemImageInfos(BaseItem item) { var list = new List <ImageInfo>(); foreach (var image in item.ImageInfos.Where(i => !item.AllowsMultipleImages(i.Type))) { var info = GetImageInfo(item, image, null); if (info != null) { list.Add(info); } } foreach (var imageType in item.ImageInfos.Select(i => i.Type).Distinct().Where(item.AllowsMultipleImages)) { var index = 0; // Prevent implicitly captured closure var currentImageType = imageType; foreach (var image in item.ImageInfos.Where(i => i.Type == currentImageType)) { var info = GetImageInfo(item, image, index); if (info != null) { list.Add(info); } index++; } } var video = item as Video; if (video != null) { var index = 0; foreach (var chapter in _itemRepo.GetChapters(video.Id)) { if (!string.IsNullOrEmpty(chapter.ImagePath)) { var image = chapter.ImagePath; var info = GetImageInfo(item, new ItemImageInfo { Path = image, Type = ImageType.Chapter, DateModified = _fileSystem.GetLastWriteTimeUtc(image) }, index); if (info != null) { list.Add(info); } } index++; } } return(list); }
private async Task RefreshFromProvider( BaseItem item, IDynamicImageProvider provider, ImageRefreshOptions refreshOptions, TypeOptions savedOptions, ICollection <ImageType> downloadedImages, RefreshResult result, CancellationToken cancellationToken) { try { var images = provider.GetSupportedImages(item); foreach (var imageType in images) { if (!savedOptions.IsEnabled(imageType)) { continue; } if (!item.HasImage(imageType) || (refreshOptions.IsReplacingImage(imageType) && !downloadedImages.Contains(imageType))) { _logger.LogDebug("Running {Provider} for {Item}", provider.GetType().Name, item.Path ?? item.Name); var response = await provider.GetImage(item, imageType, cancellationToken).ConfigureAwait(false); if (response.HasImage) { if (string.IsNullOrEmpty(response.Path)) { var mimeType = response.Format.GetMimeType(); await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false); } else { if (response.Protocol == MediaProtocol.Http) { _logger.LogDebug("Setting image url into item {Item}", item.Id); var index = item.AllowsMultipleImages(imageType) ? item.GetImages(imageType).Count() : 0; item.SetImage( new ItemImageInfo { Path = response.Path, Type = imageType }, index); } else { var mimeType = MimeTypes.GetMimeType(response.Path); var stream = AsyncFile.OpenRead(response.Path); await _providerManager.SaveImage(item, stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false); } } downloadedImages.Add(imageType); result.UpdateType |= ItemUpdateType.ImageUpdate; } } } } catch (OperationCanceledException) { throw; } catch (Exception ex) { result.ErrorMessage = ex.Message; _logger.LogError(ex, "Error in {Provider}", provider.Name); } }