public async Task EnhanceAsync(MetadataRequest request) { var file = request.File; if (request.Type != MediaType.Unknown) { return; } var mimeType = file.MimeType; ImageInfo?imageInfo = null; await using (var uploadStream = file.OpenRead()) { imageInfo = await assetThumbnailGenerator.GetImageInfoAsync(uploadStream, mimeType); } if (imageInfo != null) { var isSwapped = imageInfo.Orientation > ImageOrientation.TopLeft; if (isSwapped) { var tempFile = TempAssetFile.Create(file); await using (var uploadStream = file.OpenRead()) { await using (var tempStream = tempFile.OpenWrite()) { await assetThumbnailGenerator.FixOrientationAsync(uploadStream, mimeType, tempStream); } } await using (var tempStream = tempFile.OpenRead()) { imageInfo = await assetThumbnailGenerator.GetImageInfoAsync(tempStream, mimeType) ?? imageInfo; } await file.DisposeAsync(); request.File = tempFile; } } if (imageInfo != null) { request.Type = MediaType.Image; request.Metadata.SetPixelWidth(imageInfo.PixelWidth); request.Metadata.SetPixelHeight(imageInfo.PixelHeight); } }
public IEnumerable <string> Format(MetadataRequest request) { if (request.Type == MediaType.Image) { var w = request.Metadata.GetPixelWidth(); var h = request.Metadata.GetPixelHeight(); if (w != null && h != null) { yield return($"{w}x{h}px"); } } }
public async Task <Media> UploadAsync(string appId, AssetFile file, CancellationToken ct = default) { Guard.NotNullOrEmpty(appId); Guard.NotNull(file); var now = clock.GetCurrentInstant(); var request = new MetadataRequest { File = file }; foreach (var metadataSource in mediaMetadataSources) { await metadataSource.EnhanceAsync(request); } var infos = new List <string>(); foreach (var metadataSource in mediaMetadataSources) { infos.AddRange(metadataSource.Format(request)); } var fileInfo = string.Join(", ", infos); var media = new Media(appId, file.FileName, now) { FileInfo = fileInfo, FileSize = file.FileSize, LastUpdate = now, Metadata = request.Metadata, MimeType = file.MimeType, Type = request.Type }; await using (var stream = request.File.OpenRead()) { await mediaFileStore.UploadAsync(appId, media, stream, ct); } await mediaRepository.UpsertAsync(media, ct); return(media); }