예제 #1
0
    /// <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)));
        }
    }
예제 #2
0
        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);
        }