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
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);
}