Ejemplo n.º 1
0
        private void Test(string imagePath, string exePath, string exeArgs, out OptimizerArgs argsOut, out long startingSize)
        {
            var inputStream = new MemoryStream();

            using (var testJpeg = File.OpenRead(imagePath))
            {
                testJpeg.CopyTo(inputStream);
            }

            var sut = new MozJpegOptimizer();

            sut.ExePath = exePath;
            sut.AdditionalToolArguments = exeArgs;

            var args = new OptimizerArgs(inputStream);

            startingSize = args.Stream.Length;

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            sut.Process(args);
            stopwatch.Stop();
            output.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms");

            argsOut = args;
        }
Ejemplo n.º 2
0
        public void ShouldNotProcess_WhenInputStreamIsNull()
        {
            var args      = new OptimizerArgs(null);
            var processor = new TestOptimizerProcessor(optimizerArgs => { throw new Exception(); });

            processor.Process(args);             // would throw if body called
        }
Ejemplo n.º 3
0
        private void Test(string imagePath, string exePath, string exeArgs, out OptimizerArgs argsOut, out long startingSize)
        {
            var inputStream = new MemoryStream();

            using (var testJpeg = File.OpenRead(imagePath))
            {
                testJpeg.CopyTo(inputStream);
            }

            var sut = new WebPOptimizer();

            sut.ExePath = exePath;
            sut.AdditionalToolArguments = exeArgs;

            var opts = new Sitecore.Resources.Media.MediaOptions();

            opts.CustomOptions["extension"] = "webp";
            var args = new OptimizerArgs(inputStream, opts, imagePath);

            startingSize = args.Stream.Length;

            var stopwatch = new Stopwatch();

            stopwatch.Start();
            sut.Process(args);
            stopwatch.Stop();
            output.WriteLine($"Time: {stopwatch.ElapsedMilliseconds}ms");

            argsOut = args;
        }
Ejemplo n.º 4
0
        private MediaStream GetImageStream(MediaStream stream, TransformationOptions options)
        {
            Assert.ArgumentNotNull((object)stream, nameof(stream));
            Assert.ArgumentNotNull((object)options, nameof(options));
            var mediaOptions = new MediaOptions()
            {
                AllowStretch      = options.AllowStretch,
                BackgroundColor   = options.BackgroundColor,
                IgnoreAspectRatio = options.IgnoreAspectRatio,
                Scale             = options.Scale,
                Width             = options.Size.Width,
                Height            = options.Size.Height,
                MaxWidth          = options.MaxSize.Width,
                MaxHeight         = options.MaxSize.Height
            };

            mediaOptions.CustomOptions["extension"] = "webp";
            var args = new OptimizerArgs(stream.Stream, mediaOptions);

            CorePipeline.Run("dianogaOptimizeWebP", args);

            if (args.IsOptimized)
            {
                return(new MediaStream(args.Stream, args.Extension, stream.MediaItem));
            }
            return(null);
        }
Ejemplo n.º 5
0
        protected override void ProcessOptimize(ProcessorArgs args)
        {
            if (_supportedExtensionsLookup.Contains(args.InputStream.Extension))
            {
                if (args.ResultStream == null)
                {
                    // MakeStreamSeekable will buffer the stream if its not seekable
                    args.InputStream.MakeStreamSeekable();
                    args.InputStream.Stream.Seek(0, SeekOrigin.Begin);
                }

                var sourceStream = args.ResultStream ?? args.InputStream.Stream;

                var optimizerArgs = new OptimizerArgs(sourceStream, args.MediaOptions);

                CorePipeline.Run(Pipeline, optimizerArgs);

                args.IsOptimized  = optimizerArgs.IsOptimized;
                args.Extension    = optimizerArgs.Extension;
                args.ResultStream = optimizerArgs.Stream;

                if (!string.IsNullOrEmpty(optimizerArgs.Message))
                {
                    args.AddMessage(optimizerArgs.Message);
                }

                if (optimizerArgs.Aborted)
                {
                    args.AbortPipeline();
                }
            }
        }
Ejemplo n.º 6
0
        protected void ExecuteProcess(OptimizerArgs args)
        {
            using (Process toolProcess = new Process())
            {
                toolProcess.StartInfo.FileName               = ExePath;
                toolProcess.StartInfo.Arguments              = AdditionalToolArguments;
                toolProcess.StartInfo.UseShellExecute        = false;
                toolProcess.StartInfo.RedirectStandardInput  = true;
                toolProcess.StartInfo.RedirectStandardOutput = true;
                toolProcess.StartInfo.RedirectStandardError  = true;

                var processOutput = new ConcurrentBag <string>();
                toolProcess.ErrorDataReceived += (sender, eventArgs) => processOutput.Add(eventArgs.Data);

#if DEBUG
                Sitecore.Diagnostics.Log.Info($"\"{ExePath} {AdditionalToolArguments}\"", this);
#endif

                try
                {
                    toolProcess.Start();
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException($"\"{ExePath}\" could not be started because an error occurred. See the inner exception for details.", ex);
                }

                // Copy the svg to the stdin stream then close it to say we're done
                StreamWriter myStreamWriter = toolProcess.StandardInput;
                args.Stream.CopyTo(myStreamWriter.BaseStream);
                myStreamWriter.Close();

                toolProcess.BeginErrorReadLine();

                // Read the optimized svg from the stdout stream
                args.Stream.Dispose();
                args.Stream = new MemoryStream();
                toolProcess.StandardOutput.BaseStream.CopyTo(args.Stream);
                args.IsOptimized = true;

                if (!toolProcess.WaitForExit(ToolTimeout))
                {
                    try
                    {
                        toolProcess.Kill();
                    }
                    catch
                    {
                        // do nothing if kill errors, we want the exception below
                    }

                    throw new InvalidOperationException($"\"{ExePath}\" took longer than {ToolTimeout}ms to run, which is a failure. Output: {string.Join(Environment.NewLine, processOutput)}");
                }

                if (toolProcess.ExitCode != 0)
                {
                    throw new InvalidOperationException($"\"{ExePath}\" exited with unexpected exit code {toolProcess.ExitCode}. Output: {string.Join(Environment.NewLine, processOutput)}");
                }
            }
        }
Ejemplo n.º 7
0
        public override void Process(OptimizerArgs args)
        {
            if (args.MediaOptions.BrowserSupportsWebP())
            {
                if (string.IsNullOrEmpty(_originalAdditionalToolArguments))
                {
                    _originalAdditionalToolArguments = AdditionalToolArguments;
                }

                var transformationOptions = args.MediaOptions.GetTransformationOptions();
                if (!DisableResizing && transformationOptions.ContainsResizing())
                {
                    AdditionalToolArguments = $"{_originalAdditionalToolArguments} -resize {transformationOptions.Size.Width} {transformationOptions.Size.Height}";
                }
                else
                {
                    AdditionalToolArguments = _originalAdditionalToolArguments;
                }

                base.Process(args);

                if (args.IsOptimized)
                {
                    args.Extension = "webp";

                    //If WebP optimization was executed then abort running other optimizers
                    //because they don't accept webp input file format
                    args.AbortPipeline();
                }
            }
        }
Ejemplo n.º 8
0
        protected override void ProcessOptimizer(OptimizerArgs args)
        {
            var compressed = Compress(args.Stream);

            // dispose of the old output stream now that we've gzipped it
            args.Stream.Dispose();

            args.Stream      = compressed;
            args.IsOptimized = true;
        }
Ejemplo n.º 9
0
        public void ShouldNotProcess_WhenInputStreamIsDisposed()
        {
            var stream = new MemoryStream();
            var args   = new OptimizerArgs(stream);

            stream.Dispose();

            var processor = new TestOptimizerProcessor(optimizerArgs => { throw new Exception(); });

            processor.Process(args);             // would throw if body called
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Generate resize parameters
        /// </summary>
        protected override string GetMediaSpecificArguments(OptimizerArgs args)
        {
            var transformationOptions = args.MediaOptions.GetTransformationOptions();

            if (!DisableResizing && transformationOptions.ContainsResizing())
            {
                return($"-resize {transformationOptions.Size.Width} {transformationOptions.Size.Height}");
            }

            return(null);
        }
Ejemplo n.º 11
0
        public void ShouldDisposeStreams_WhenProcessorThrowsException()
        {
            var stream = new MemoryStream(new byte[] { 12 });
            var args   = new OptimizerArgs(stream);

            var processor = new TestOptimizerProcessor(optimizerArgs => { throw new Exception(); });

            try
            {
                processor.Process(args);
            }
            catch
            {
                stream.CanRead.Should().BeFalse();
            }
        }
Ejemplo n.º 12
0
        public override void Process(OptimizerArgs args)
        {
            if (args.MediaOptions.BrowserSupportsWebP())
            {
                base.Process(args);

                if (args.IsOptimized)
                {
                    args.Extension = "webp";

                    //If WebP optimization was executed then abort running other optimizers
                    //because they don't accept webp input file format
                    args.AbortPipeline();
                }
            }
        }
Ejemplo n.º 13
0
        public void ShouldReturnOriginalStream_WhenOptimizedIsLonger()
        {
            var stream = new MemoryStream(new byte[] { 12 });
            var args   = new OptimizerArgs(stream);

            var processor = new TestOptimizerProcessor(optimizerArgs =>
            {
                optimizerArgs.Stream.Close();
                optimizerArgs.Stream = new MemoryStream(new byte[] { 13, 14 });                 // note longer than input stream
            });

            processor.Process(args);

            args.Stream.Length.Should().Be(1);
            args.GetMessages().Length.Should().Be(1);
            args.Stream.Dispose();
        }
Ejemplo n.º 14
0
        public void ShouldReturnStream_AtPositionZero()
        {
            var stream = new MemoryStream(new byte[] { 12, 13, 14 });
            var args   = new OptimizerArgs(stream);

            var processor = new TestOptimizerProcessor(optimizerArgs =>
            {
                optimizerArgs.Stream.Close();
                optimizerArgs.Stream = new MemoryStream(new byte[] { 13, 14 }); // need to return a shorter stream or it will get tripped
                optimizerArgs.Stream.Seek(0, SeekOrigin.End);                   // seek return stream to the end intentionally
            });

            processor.Process(args);

            args.Stream.Position.Should().Be(0);
            args.Stream.Dispose();
        }
Ejemplo n.º 15
0
 protected override void ProcessOptimizer(OptimizerArgs args)
 {
     ExecuteProcess(args);
 }
Ejemplo n.º 16
0
 protected override void ProcessOptimizer(OptimizerArgs args)
 {
     _bodyAction(args);
 }