matjazp

Auto Smush

34 posts in this topic

Module: Auto Smush

https://github.com/matjazpotocnik/AutoSmush 

Optimize/compress images.

In Automatic mode images that are uploaded can be automatically optimized. Variations of images that are created on resize/crop and admin thumbnails can also be automatically optimized. In Manual mode "Optimize image" link/button will be present. This allows manual optimization of the individual image or variation. In Bulk mode all images, all variations or both can be optimized in one click. Will process images sitewide.

Two optimization "engines" are avaialable. reShmush.it is a free (at the moment) tool that provides an online way to optimize images. This tool is based on several well-known algorithms such as pngquant, jpegoptim, optipng. Image is uploaded to the reSmush.it web server, then optimized image is downloaded. There is a 5 MB file upload limit and no limit on number of uploaded images. "Local tools" is set of executables on the server for optimizing images: optipng, pngquant, pngcrush, pngout, advpng, gifsicle, jpegoptim, jpegtran. Binaries for Windows are provided with this module in windows_binaries folder, copy them somewhere on the PATH environment variable eg. to C:\Windows.

Similar modules:

JpegOptimImage by Jonathan Dart: https://processwire.com/talk/topic/6667-jpegoptimimage/ 

TinyPNG Image Compression by Roope: https://github.com/BlowbackDesign/TinyPNG 

ProcessImageMinimize by conclurer: https://processwire.com/talk/topic/5404-processimageminimize-image-compression-service-commercial/ 

Forum discusion: https://processwire.com/talk/topic/12111-crowdfunded-tinypng-integration-module/

 

Module created by Roland Toth (@tpr).

10 people like this

Share this post


Link to post
Share on other sites
30 minutes ago, matjazp said:

free (at the moment)

Thanks for this - looks great, but curious if you know if they have plans to start charging ? I didn't see anything on their website (http://www.resmush.it/) to indicate the long term plans.

Share this post


Link to post
Share on other sites

I don't know about plans. The service is up for quite a time, sure more over a year, but it's not clear who is owner of site. Site is created by French Tech, the collective name for all those working in the French startup market. There is also no privacy policy available, so who knows what happen with your uploaded images. There are other services with "free" plans, but with limitations, like file size (100kB) or number of images (eg. 500 per month). I actually don't like web services, because first you upload the image to your server, then upload to web service and then download it. That's why I use local tools on the server, but that come with a price, cpu & memory usage, but I can aford it, since I'm the sysdamin :-) 

Auto Smush is somehow different from other modules, since it does not add the method(s) to PageImage, thus you don't have to change your code and also you may uninstall (or disable) the module at any time without code modification in your templates.

2 people like this

Share this post


Link to post
Share on other sites
1 hour ago, matjazp said:

Module created by Roland Toth (@tpr).

Only started it :) Then came @matjazp and fixed a number of issues, added local tools and so on. I kinda lost interest when I made it work on my sites and do not wanted to invest more time to improve and make it ready for public. So big thanks to matjazp, and hopefully after a few iterations it will be more stable.

1 person likes this

Share this post


Link to post
Share on other sites

Great! I was looking for a module like this after https://minimize.pw/ closed the doors.

I have to test it tomorrow. I guess it works with Croppable Image 3, too, doesn’t it? Or let’s better phrase it: Does automatic mode work with all modules which extend the functionality of PW’s default image field? That would really make optimizing images a no-brainer. :-)

Share this post


Link to post
Share on other sites

It's not compatible with CI3, but I think I know why and I think I know how to fix it :-) Will report, stay tuned.

3 people like this

Share this post


Link to post
Share on other sites

Sadly I get an error when downloading the module via PW.

PW Version is 2.8

IMG_0153.PNG

Just tried with latest PW 3.0.41: Same, same... :-(

Edited by Mikel
Reproduced with other PW version

Share this post


Link to post
Share on other sites

Sorry for inconvenience! I just realised that the whole directory was missing on github. I fixed that and also upgraded AS to v1.0.2 that add support for CroppableImage3.

3 people like this

Share this post


Link to post
Share on other sites
On 11/20/2016 at 8:25 AM, matjazp said:

Sorry for inconvenience! I just realised that the whole directory was missing on github. I fixed that and also upgraded AS to v1.0.2 that add support for CroppableImage3.

That fixed it. (I was getting the same error.) Works great!

Share this post


Link to post
Share on other sites

Is there anything I have to set up to use the local optimization tools?

I'm on a shared webspace, but each customer has a separate FastCGI PHP interpreter. So it should work according to the module’s documentation. Or did I miss anything?

The error messages say “Command "jpegoptim" not found.” or the similar message for pngs.

Share this post


Link to post
Share on other sites

It looks like executable is not found because it's not within the PATH. Do php -r "print getenv('PATH');" from shell or phpinfo(); from php and check for environment variable PATH. Make sure that jpegoptim (and others) are on the path. You could also check what shell is executed: echo shell_exec("echo $0");  It's possible that it's sh and not bash  You may need to use the putenv command or determine whether your path needs to be set in /etc/profile, ~/.profile or ~/.bashrc in order for it to be picked up by the user runing php. Some versions of apache read configuration from /etc/apache2/envvars . You can set environment vars locally within a VirtualHost config using SetEnv. Or it might help if you put putenv('PATH=/your/path'); somewhere in the php, just for the test.

You could also set the path of jpegoptim (and other binaries) by modifying optimizeSettings in AutoSmush.module:

        $this->optimizeSettings = array(
            'ignore_errors'     => false, //in production could be set to true
            'jpegtran_options'  => array('-optimize', '-progressive', '-copy', ' all'),
            'jpegoptim_options' => array('--preserve', '--all-progressive', '--strip-none', '-T' . self::JPG_QUALITY_THRESHOLD),
            'optipng_options'   => array('-i0', '-o2', '-quiet', '-preserve'),
            'advpng_options'    => array('-z', '-3', '-q'),
            'jpegoptim_bin'     => '/path/to/jpegoptim', <== add this line
        );

All this is specific to the environment, so I can't give detail instructions on how to make "Local tools" to work. I'm also not a linux user, I tested tools on windows. Let me know how it goes.

2 people like this

Share this post


Link to post
Share on other sites
On 23.11.2016 at 9:28 PM, matjazp said:

Let me know how it goes.

Since my Linux knowledge is quite limited, I had to research and try a bit. Only the last option (inserting the path into the module file) worked – but only for jpegoptim. If i try to upload a png, I receive an error message telling me that the pngquant command doesn’t work, even if the module now knows the path to the binary.

To be honest, that’s too much work to investigate. I just use resmush.it as long as it works.

Share this post


Link to post
Share on other sites

jpegoptim_bin is just for jpegoptim, the other options are:

  • optipng_bin
  • pngquant_bin
  • pngcrush_bin
  • pngout_bin
  • gifsicle_bin
  • jpegtran_bin

Would it help if you could enter the paths in the module settings page?

Share this post


Link to post
Share on other sites

Of course I used the individual options.

I also tried commenting out the pngquant_bin setting, hoping that the modiule would go on trying to use the next available PNG optimizer. But it didn’t work. I got the error message that pngquant could not be found.

Share this post


Link to post
Share on other sites

Hi, sorry for the late reply. I'm using OptimizerFactory library and that's how it works. Quick workaround would be changing the source code in the library, so that only one optimizer would run. Open /site/modules/AutoSmush/image-optimizer/src/ImageOptimizer/OptimizerFactory.php and change to this:

        $this->optimizers['png'] = new ChainOptimizer(array(
            $this->optimizers['optipng'], //reversed the order so optipng is first
            $this->optimizers['pngquant'],
            $this->optimizers['pngcrush'],
            $this->optimizers['advpng']
        //));
        ), true); //if true, just first optimizer will run, if false all optimizers will run

I'll see what I can do, since others that are using this library has similar problems. Author of the library does not response to this issue, but we will find a solution. It might take some time though.

Share this post


Link to post
Share on other sites

Thanks for the explanation, @matjazp. As I said, I'm fine with being able to use resmush.it via the module, since resmush.it works like a charm, and I don’t have any images which are not sooner or later made publicly available (so there are no privacy issues).

Being independent from resmush.it would be a nice extra, but it’s not really required from my side. This would be interesting for cases where PW and Autosmush are used to build a website for a closed user group with confidential content which should not be send around between servers.

Share this post


Link to post
Share on other sites

I made some changes in v1.0.4 (just uploaded to GH). At the bottom at the module config you can see what is the path being search for local optimizers (executables) and which optimizers have been found. If optimizer is not found, then it's skipped. I extended the search path so you can put optipng, jpegoptim and gifsicle on the root of PW ($config->paths->root) on templates directory  ($config->paths->templates) and assets directory ($config->paths->assets). If you have shell access then you can install all three mentioned optimizers with apt-get install optipng jpegoptim gifsicle Hope that helps.

1 person likes this

Share this post


Link to post
Share on other sites

Thanks for the great module, but I get the following error in php7 environment. It runs smoothly in php5.

require_once(): Failed opening required '/home/admin/public_html/site/modules/AutoSmush./ImageOptimizer.php' (include_path='.:/usr/share/php')

The error is gone after I change line 5 in AutoSmush.module from

require_once /*NoCompile*/__DIR__ . './ImageOptimizer.php';

to

require_once /*NoCompile*/__DIR__ . '/ImageOptimizer.php';

(remove dot before /ImageOptimizer.php)

 

However, in Local tool optimizers info, the module cannot find any exe.(EDIT: I found that you have posted solution above. Let me try first, thanks)

EDIT: Solved by simply  apt-get install optipng jpegoptim gifsicle

2 people like this

Share this post


Link to post
Share on other sites

Just before commit to GH I added /*NoCompile*/ option introduced in lasted PW dev and somehow added dot, don't know why  :-) I hope I didn't break other things... It's working fine on windows with php 7.1, tried on linux with php 7.0 and got an error. I just pushed a fix for that. Thx for reporting.

Optimizers on linux: I can't make instructions on how to install them, since there are so many flavors of *x, but it looks like apt-get is now some sort of standard. 

Share this post


Link to post
Share on other sites
2 hours ago, matjazp said:

I hope I didn't break other things...

I did :-)

Please use the latest version from github.

1 person likes this

Share this post


Link to post
Share on other sites

I get the following error when installing from PW Modules.

Also tried to download and install direct from github.

It seems to install fine but this error is apparent when I click the Settings button on AutoSmush 1.0.5

 

Quote

Fatal error: Call to a member function add() on null in /var/www/vhosts/domain.com/httpdocs/site/modules/AutoSmush/AutoSmush.module on line 752

Error: Call to a member function add() on null (line 752 of /var/www/vhosts/domain.com/httpdocs/site/modules/AutoSmush/AutoSmush.module) 

 

Share this post


Link to post
Share on other sites
1 hour ago, Peter Knight said:

I get the following error when installing from PW Modules.

Also tried to download and install direct from github.

It seems to install fine but this error is apparent when I click the Settings button on AutoSmush 1.0.5

I think this was an error from running 2.7.3 (or similar).

Upgraded to 3.0.33 and all is working.

Share this post


Link to post
Share on other sites

Sorry for troubles. Please upgrade to 1.0.6 if that fixes it (just uploaded to github).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By blynx
      Hej,
      just finished the first working version of my photoswipe bundle. https://github.com/blynx/MarkupProcesswirePhotoswipe
      As always any feedback is highly appreciated
      Modules directory: http://modules.processwire.com/modules/markup-processwire-photoswipe
      .zip download: https://github.com/blynx/MarkupProcesswirePhotoswipe/archive/master.zip
      You can add a photoswipe enabled thumbnail gallery / lightbox to your site like this. Just pass an image field to the renderGallery method:
      <?php $pwpswp = $modules->get('Pwpswp'); echo $pwpswp->renderGallery($page->nicePictures); Options are provided like so:
      <?php $galleryOptions = [ 'imageResizerOptions' => [ 'size' => '500x500' 'quality' => 70, 'upscaling' => false, 'cropping' => false ], 'loresResizerOptions' => [ 'size' => '500x500' 'quality' => 20, 'upscaling' => false, 'cropping' => false ], 'pswpOptions' => (object) [ 'shareEl' => false, 'indexIndicatorSep' => ' von ', 'closeOnScroll' => false ] ]; echo $pswp->renderGallery($page->images, $galleryOptions); More info about all that is in the readme: https://github.com/blynx/MarkupProcesswirePhotoswipe
      It is possible to customize pretty much anything by providing your own templates and scripts.
      What do you think? Any ideas, bugs, critique, requests?
      cheers
      Steffen
    • By alexcapes
      Hi,
      I've been invited by Apple to use their 'News' service for a publication in the UK. https://www.apple.com/uk/news/
      A number of CMSs already have plugins to publish content via the API, however Processwire is not one (yet!)
      https://newsresources.apple.com/en/faq/66346243
      It's slightly beyond my technical abilities but would be very interested in anyone that is willing to look at developing a Processwire Module.
      (for reference here is the Apple News API documentation)
      Update: Chapter Three have created a PHP Apple News library here https://github.com/chapter-three/AppleNewsAPI
    • By flydev
      OAuth2Login for ProcessWire
      A Module which give you ability to login an existing user using your favorite thrid-party OAuth2 provider (i.e. Facebook, GitHub, Google, LinkedIn, etc.)..
      You can login from the backend to the backend directly or render a form on the frontend and redirect the user to a choosen page.
      Built on top of ThePhpLeague OAuth2-Client lib.
      Registration is not handled by this module but planned.
       
      Howto Install
      Install the module following this procedure:
       - http://modules.processwire.com/modules/oauth2-login/
       - https://github.com/flydev-fr/OAuth2Login
      Next step, in order to use a provider, you need to use Composer to install each provider
      ie: to install Google, open a terminal, go to your root directory of pw and type the following command-line: composer require league/oauth2-google
      Tested providers/packages :
          Google :  league/oauth2-google     Facebook: league/oauth2-facebook     Github: league/oauth2-github     LinkedIn: league/oauth2-linkedin
      More third-party providers are available there. You should be able to add a provider by simply adding it to the JSON config file.

      Howto Use It
      First (and for testing purpose), you should create a new user in ProcessWire that reflect your real OAuth2 account information. The important informations are, Last Name, First Name and Email. The module will compare existing users by firstname, lastname and email; If the user match the informations, then he is logged in.
      ie, if my Google fullname is John Wick, then in ProcessWire, I create a new user  Wick-John  with email  johnwick@mydomain.com
      Next step, go to your favorite provider and create an app in order to get the ClientId and ClientSecret keys. Ask on the forum if you have difficulties getting there.
      Once you got the keys for a provider, just paste it into the module settings and save it. One or more button should appear bellow the standard login form.
      The final step is to make your JSON configuration file.
      In this sample, the JSON config include all tested providers, you can of course edit it to suit your needs :
      { "providers": { "google": { "className": "Google", "packageName": "league/oauth2-google", "helpUrl": "https://console.developers.google.com/apis/credentials" }, "facebook": { "className": "Facebook", "packageName": "league/oauth2-facebook", "helpUrl": "https://developers.facebook.com/apps/", "options": { "graphApiVersion": "v2.10", "scope": "email" } }, "github": { "className": "Github", "packageName": "league/oauth2-github", "helpUrl": "https://github.com/settings/developers", "options": { "scope": "user:email" } }, "linkedin": { "className": "LinkedIn", "packageName": "league/oauth2-linkedin", "helpUrl": "https://www.linkedin.com/secure/developer" } } }  
      Backend Usage
      In ready.php, call the module :
      if($page->template == 'admin') { $oauth2mod = $modules->get('Oauth2Login'); if($oauth2mod) $oauth2mod->hookBackend(); }  
      Frontend Usage
      Small note: At this moment the render method is pretty simple. It output a InputfieldForm with InputfieldSubmit(s) into wrapped in a ul:li tag. Feedbacks and ideas welcome!
      For the following example, I created a page login and a template login which contain the following code :
      <?php namespace ProcessWire; if(!$user->isLoggedin()) { $options = array( 'buttonClass' => 'my_button_class', 'buttonValue' => 'Login with {provider}', // {{provider}} keyword 'prependMarkup' => '<div class="wrapper">', 'appendMarkup' => '</div>' ); $redirectUri = str_lreplace('//', '/', $config->urls->httpRoot . $page->url); $content = $modules->get('Oauth2Login')->config( array( 'redirect_uri' => $redirectUri, 'success_uri' => $page->url ) )->render($options); }

       
      Screenshot
       



    • By psy
      ProcessWire DropboxAPI on GitHub: https://github.com/clipmagic/DropboxAPI
       
      This module is a wrapper for Kunal Varma's Dropbox PHP SDK https://github.com/kunalvarma05/dropbox-php-sdk
      It was created to perform a specific function for a client, ie upload PDF files on a PW website to a specific Dropbox account folder.
      The PDF files, created using @Wanze's excellent PagesToPdf module using the WirePDF functions, are generated from Formbuilder forms completed by front-end site visitors.  Works a treat!
      There's more that could be done to allow ProcessWire to take advantage of all the features of the SDK, eg downloads, multiple Dropbox accounts, etc. You are welcome to request changes and/or fork the GitHub project to extend the feature set.
      Enjoy!
      System requirements
      PHP 5.6.4 or greater Composer The PHP mbstring extension General information
      This module enables you to access a single Dropbox (www.dropbox.com) account to upload files from a ProcessWire website.
      All kudos to (https://github.com/kunalvarma05/dropbox-php-sdk) for the PHP API.
      First steps
      Visit (https://www.dropbox.com/developers) and read the documentation. Log into Dropbox and create a new application. It's recommended to limit ProcessWire App access to a specified folder Make a note of the App key, the App secret and the name of the Dropbox folder Installation
      Download the zip file into your site/modules folder then expand the zip file. Next, login to ProcessWire > go to Modules > click "Refresh". You should see a note that a new module was found. Install the DropboxAPI module. Configure the module with your App key, App secret and your Call Back URL You need to generate a Dropbox access token to enable your site to communicate with the nominated Dropbox account. Dropbox will generate a token for you or you can create a page for the front end of your ProcessWire site with a template to submit the token request to Dropbox, eg:
      <?php namespace ProcessWire; $drop = $modules->get('DropboxAPI'); if ($input->get->code && $input->get->state) { $code = $sanitizer->text($input->get->code); $state = $sanitizer->text($input->get->state); //Fetch the AccessToken $accessToken = $drop->getAccessToken($code, $state); echo "Copy/paste this code into the module configuration: " . $accessToken; } else { echo "<p><a href='" . $drop->getAuthURL() . "'>Log in with Dropbox</a></p>"; } ?> Once you have entered the token in the module configuration, you can unpublish this page.
      Usage
      Read the dropbox-php-sdk documentation!
      An example template for sending a file to a Dropbox App folder from ProcessWire:
      <?php namespace ProcessWire; use Kunnu\Dropbox\Dropbox; use Kunnu\Dropbox\DropboxApp; use Kunnu\Dropbox\DropboxFile; // send pdf to Dropbox $drop = $modules->get('DropboxAPI'); $app = new DropboxApp($drop->app_key, $drop->app_secret, $drop->authorization_code); if ($app) { //Configure Dropbox service $dropbox = new Dropbox($app); $dropboxFile = new DropboxFile('/path/to/myfilename.pdf'); $file = $dropbox->upload($dropboxFile, "/myfilename.pdf", ['autorename' => true]); //Uploaded File meta data if ($file) { $success = $file->getName() . " uploaded to Dropbox"; $drop->log($success); } }  
       
    • By sirhc
      Hi all,
      Im trying to install this core module and got the error of not having the ImageMagick library installed.
      But if im checking for the version of my ImageMagick installed on my server via SSH im getting this response;
      identify -version
      Version: ImageMagick 6.9.4-9 Q16 i386 2016-06-21 http://www.imagemagick.org
      Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
      License: http://www.imagemagick.org/script/license.php
      Features: Cipher DPC 
      Delegates (built-in): bzlib freetype gslib jng jpeg png ps tiff xml zlib
      Does this even mean the library is installed? And if yes, why cant i install my module?
      Pleaassee help me
      Greetz.