/// <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);
 }