/// <summary> /// Create a scaled image based on mediaItemType /// </summary> /// <param name="request"></param> /// <param name="mediaItemType"></param> /// <param name="image"></param> /// <returns></returns> private async Task <MediaItemStorageLocationDto> CreateMediaItem(ProcessMediaItemRequestEvent request, MediaItemType mediaItemType, Image image) { using (Image scaled = ScaleImage(mediaItemType, image)) { return(await SaveImage(request, mediaItemType, scaled)); } }
/// <summary> /// Save the image as a png in a public bucket. /// </summary> /// <param name="request"></param> /// <param name="mediaItemType"></param> /// <param name="image"></param> /// <returns></returns> private async Task <MediaItemStorageLocationDto> SaveImage(ProcessMediaItemRequestEvent request, MediaItemType mediaItemType, Image image) { Guid id = request.Id; // Default encoding as png for everything // except the original image. ImageFormat format = ImageFormat.Jpeg; // ImageFormat.Png; // TODO: Use gif if original was gif. // Try to preserve the original content type. if (mediaItemType == MediaItemType.OriginalItem || request.PreserveImageFormat) { format = GetFormat(request.StorageLocation.ContentType); } DateTime date = DateTime.UtcNow; string contentType = GetContentType(format); string imageName = string.Format("{0}/{1}/{2}/{3}/{4}.{5}", date.Year, date.Month, date.Day, mediaItemType, id, format); using (MemoryStream stream = new MemoryStream()) { // Save to png... // unless the original was gif to preserve animated gifs? image.Save(stream, format); stream.Position = 0; var mediaItemStorageLocation = new MediaItemStorageLocation { Bucket = _imageBucket, ContentType = contentType, ItemType = mediaItemType.ToString(), ContentLength = (int)stream.Length, Filename = imageName, }; await _fileStore.SaveAsync(mediaItemStorageLocation, stream); return(Mapper.Map <MediaItemStorageLocationDto>(mediaItemStorageLocation)); } }
public async Task OnRequestAsync(ProcessMediaItemRequestEvent request) { Logger.LogMessage("Process Media Item Request. Id: {0}", request.Id); Stopwatch stopWatch = Stopwatch.StartNew(); try { List <MediaItemStorageLocationDto> storageLocations = new List <MediaItemStorageLocationDto>(); // If the content type is an image then create a scaled version for each of the // image type options if (IsImage(request.StorageLocation.ContentType)) { // Load the image at the original storage location Image image = await LoadImage(request.StorageLocation); Logger.LogMessage("Got image. Width: {0}, Height: {1}", image.Width, image.Height); IList <MediaItemType> mediaItemTypes = GetImageMediaItems(); foreach (var mediaItemType in mediaItemTypes) { var itemStorageLocation = await CreateMediaItem(request, mediaItemType, image); storageLocations.Add(itemStorageLocation); } } else { // TODO: For non-image media item just move them // to the appropriate bucket/folder Logger.LogWarn("Media item was not an image. Unable to process."); } await PublishMediaItemProcessedAsync(request.Id, storageLocations); } catch (Exception ex) { Logger.LogException(ex, "Failed to convert image: " + request.Id); throw; } finally { stopWatch.Stop(); Logger.LogMessage("Image processing for {0} took {1}ms", request.Id, stopWatch.ElapsedMilliseconds); } }
/// <summary> /// Publish a request to convert the media at the storage location /// into the appropriate media items (scaled down etc) /// </summary> /// <param name="mediaItem"></param> /// <param name="storageLocation"></param> /// <returns></returns> private async Task PublishProcessMediaItemAsync(MediaItem mediaItem, MediaItemStorageLocation storageLocation, bool preserveImageFormat) { ProcessMediaItemRequestEvent requestEvent = new ProcessMediaItemRequestEvent { Id = mediaItem.Id, StorageLocation = new MediaItemStorageLocationDto { Bucket = storageLocation.Bucket, ContentLength = storageLocation.ContentLength, ContentType = storageLocation.ContentType, Filename = storageLocation.Filename, ItemType = (MediaItemType)Enum.Parse(typeof(MediaItemType), storageLocation.ItemType), }, PreserveImageFormat = preserveImageFormat }; await _bus.PublishAsync(requestEvent); }