Tinypng compressor plugin

Here you go.
This script will convert all .jpg & .png files in the given directory.
If you run it with ‘overwrite’ as second parameter, it will do just that :smile:

It’s a bit sparse as far as feedback goes: If all goes will it will be silent for a while, and then return the prompt.

#!perl
#
# Tiny PNG/Tiny JPG API interface
#
 
use strict;
use LWP;

use constant API_KEY => '<INSERT API KEY HERE>';
use constant API_URL => 'https://api.tinify.com/shrink';

main();

sub main {
    my $input     = $ARGV[0];
    my $overwrite = $ARGV[1];

    my $save_prefix = 'tiny_';
    if ($overwrite eq 'overwrite') {
        $save_prefix = '';
    }

    unless ($input) {
        die "\nUsage: $0 <input dir> ['overwrite']\nIf 'overwrite' is added, the source files will be overwritten\n\n";
    }

    unless(-d $input) {
        die "\nDirectory $input not found!\n\n";
    }

    my @files = read_dir($input);

    foreach my $file (@files) {
        my $data = slurp_file($input . '/' . $file);

        my $agent = new LWP::UserAgent;

        my $request = new HTTP::Request(POST => API_URL);
        $request->authorization_basic('api',API_KEY());
        $request->content($data);

        my $response = $agent->request($request);

        if ($response->code() eq '201') {
            my $result_url = $response->header('Location');

            $request = new HTTP::Request(GET => $result_url);
            $response = $agent->request($request);

            my $result_data = $response->content();

            my $output = $input . '/' . $save_prefix . $file;
            store_data(file => $output, data => $result_data);
        } else {
            print "Error " . $response->code() . " while trying to shrink $input\n";
        }
    }
}

sub read_dir {
    my $dir = shift;

    opendir(DIR,$dir) or die "Could not open dir $dir! ($!)\n";
    my @files = grep { /\.(jpg|png)$/} readdir(DIR);
    closedir(DIR);

    return @files;
}

sub slurp_file {
    my $file = shift;
    my $str   = "";
    local *F;
    if (!open (F,"<$file")) {
        return(undef);
    } else {
        local $/ = undef;
        $str = <F>;
        close(F);
    }
    return($str);
}

sub store_data {
    my %param  = @_;
    my $data   = $param{'data'};
    my $output = $param{'file'};

    open(OUTFILE,">$output") || die "\nCould not open $output ($@)\n\n";
    print OUTFILE $data;
    close(OUTFILE);
}
1 Like