/// <inheritdoc/> public override IRenderable Render(RenderContext context, ProgressTask task, TimeSpan deltaTime) { var total = new FileSize(task.MaxValue); if (task.IsFinished) { return(new Markup(string.Format( "[green]{0} {1}[/]", total.Format(Culture), total.Suffix))); } else { var downloaded = new FileSize(task.Value, total.Unit); return(new Markup(string.Format( "{0}[grey]/[/]{1} [grey]{2}[/]", downloaded.Format(Culture), total.Format(Culture), total.Suffix))); } }
private async Task <EncodingJob> BuildEncodingJob(HttpRequestMessage request) { if (!request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } var encodingJob = new EncodingJob(); var provider = new MultipartFormDataMemoryStreamProvider(); await Request.Content.ReadAsMultipartAsync(provider); var form = provider.FormData; encodingJob.FileName = form["file-name"]; encodingJob.Password = form["password"]; encodingJob.Format = (ImageFormat)Enum.Parse(typeof(ImageFormat), form["image-format"]); encodingJob.EncryptionAlgorithm = encodingJob.HasPassword ? (EncryptionType)Enum.Parse(typeof(EncryptionType), form["encryption-algorithm"]) : (EncryptionType?)null; encodingJob.CompressionAlgorithm = ParseNullableEnum <CompressionType>(form["compression-algorithm"]); encodingJob.CompressionLevel = (CompressionLevel)Enum.Parse(typeof(CompressionLevel), form["compression-level"]); var directoryInput = form.GetValues("directories[]") ?? new string [0]; if (directoryInput == null) { return(null); } Dictionary <string, List <File> > directories = directoryInput.ToDictionary(directory => directory, directory => new List <File>()); KeyValuePair <string, Stream> embeddedImageUpload = provider.FileStreams.FirstOrDefault(file => file.Key == "embedded-image"); if (embeddedImageUpload.Key != null) { int maxFileSize = TranscodingConfiguration.EmbeddedPictureLimits.Bytes; if (embeddedImageUpload.Value.Length > maxFileSize) { throw new BadRequestException("The selected cover picture exceeds the maximum file size of " + FileSize.Format(maxFileSize)); } var pixelStorage = (EmbeddedImage.PixelStorage)Enum.Parse(typeof(EmbeddedImage.PixelStorage), form["pixel-storage-level"]); encodingJob.EmbeddedImage = new EmbeddedImage(Image.FromStream(embeddedImageUpload.Value), pixelStorage); var maxHeight = TranscodingConfiguration.EmbeddedPictureLimits.Height; var maxWidth = TranscodingConfiguration.EmbeddedPictureLimits.Width; if (encodingJob.EmbeddedImage.Image.Height > maxHeight || encodingJob.EmbeddedImage.Image.Width > maxWidth) { throw new BadRequestException("The selected cover picture exceeds the maximum size of " + maxWidth + " x " + maxHeight + "px"); } } foreach (var file in provider.FileStreams) { if (file.Key == "embedded-image") { continue; } var key = file.Key; var name = form[key + ".name"]; var directory = form[key + ".directory"]; if (!directories.ContainsKey(directory)) { directories.Add(directory, new List <File>()); } directories[directory].Add(new File(name, file.Value)); } foreach (var directory in directories) { encodingJob.Directories.Add(new Directory(directory.Key, directory.Value)); } long encodedFilesLength = encodingJob.Directories .SelectMany(directory => directory.Files) .Sum(file => file.Length); var maxEncodedDataSize = GetMaxDataSizeFor(encodingJob.EmbeddedImage == null ? (EmbeddedImage.PixelStorage?)null : encodingJob.EmbeddedImage.EmbeddedPixelStorage); if (encodedFilesLength > maxEncodedDataSize) { throw new BadRequestException("The selected files exceeds the maximum data size of " + FileSize.Format(maxEncodedDataSize) + " for the specified configuration"); } return(encodingJob); }