aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/piwigo_upload.pl121
1 files changed, 121 insertions, 0 deletions
diff --git a/tools/piwigo_upload.pl b/tools/piwigo_upload.pl
new file mode 100644
index 000000000..bc167d7f9
--- /dev/null
+++ b/tools/piwigo_upload.pl
@@ -0,0 +1,121 @@
+#!/usr/bin/perl
+
+####
+# Usage
+#
+# perl piwigo_upload.pl --url=http://piwigo.org/demo --user=admin --password=secret --file=photo.jpg --album_id=9
+
+use strict;
+use warnings;
+
+use JSON;
+use LWP::UserAgent;
+use Getopt::Long;
+use POSIX qw(ceil floor);
+use Digest::MD5 qw/md5 md5_hex/;
+use File::Slurp;
+use File::Basename;
+
+my %opt = ();
+GetOptions(
+ \%opt,
+ qw/
+ file=s
+ album_id=i
+ category=s
+ url=s
+ username=s
+ password=s
+ /
+);
+
+our %conf = (
+ chunk_size => 500_000,
+);
+
+our $ua = LWP::UserAgent->new;
+$ua->agent('Mozilla/piwigo_upload.pl 1.56');
+$ua->cookie_jar({});
+
+my $result = undef;
+
+my $form = {
+ method => 'pwg.session.login',
+ username => $opt{username},
+ password => $opt{password},
+};
+
+$result = $ua->post(
+ $opt{url}.'/ws.php?format=json',
+ $form
+);
+
+my $response = $ua->post(
+ $opt{url}.'/ws.php?format=json',
+ {
+ method => 'pwg.session.getStatus',
+ }
+);
+
+my $pwg_token = from_json($response->content)->{result}->{pwg_token};
+
+my $content = read_file($opt{file});
+my $content_length = length($content);
+my $nb_chunks = ceil($content_length / $conf{chunk_size});
+
+my $chunk_pos = 0;
+my $chunk_id = 0;
+
+while ($chunk_pos < $content_length) {
+ my $chunk = substr(
+ $content,
+ $chunk_pos,
+ $conf{chunk_size}
+ );
+
+ # write the chunk as a temporary local file
+ my $chunk_path = '/tmp/'.md5_hex($opt{file}).'.chunk';
+
+ open(my $ofh, '>'.$chunk_path) or die "problem for writing temporary local chunk";
+ print {$ofh} $chunk;
+ close($ofh);
+
+ $chunk_pos += $conf{chunk_size};
+
+ my $response = $ua->post(
+ $opt{url}.'/ws.php?format=json',
+ {
+ method => 'pwg.images.upload',
+ chunk => $chunk_id,
+ chunks => $nb_chunks,
+ category => $opt{album_id},
+ pwg_token => $pwg_token,
+ file => [$chunk_path],
+ name => basename($opt{file}),
+ },
+ 'Content_Type' => 'form-data',
+ );
+
+ unlink($chunk_path);
+
+ printf(
+ 'chunk %03u of %03u for "%s"'."\n",
+ $chunk_id+1,
+ $nb_chunks,
+ $opt{file}
+ );
+
+ if ($response->code != 200) {
+ printf("response code : %u\n", $response->code);
+ printf("response message : %s\n", $response->message);
+ }
+
+ $chunk_id++;
+}
+
+$result = $ua->get(
+ $opt{url}.'/ws.php?format=json',
+ {
+ method => 'pwg.session.logout'
+ }
+);