source: trunk/tools/piwigo_remote.pl @ 3282

Last change on this file since 3282 was 3282, checked in by plg, 15 years ago

change: according to topic:15067, svn:keywords property was removed

  • Property svn:eol-style set to LF
File size: 6.8 KB
Line 
1#!/usr/bin/perl
2
3####
4# Usage examples
5#
6# time perl piwigo_remote.pl \
7#   --action=pwg.images.add \
8#   --file=erwann_rocher-web.jpg \
9#   --thumb=erwann_rocher-thumb.jpg \
10#   --high=erwann_rocher-high.jpg \
11#   --original=erwann_rocher-high.jpg \
12#   --define categories=9 \
13#   --chunk_size=200_000
14
15use strict;
16use warnings;
17
18use JSON;
19use LWP::UserAgent;
20use Getopt::Long;
21use Encode qw/is_utf8 decode/;
22use POSIX qw(ceil floor);
23
24my %opt = ();
25GetOptions(
26    \%opt,
27    qw/action=s file=s thumbnail=s high=s original=s categories=s chunk_size=i define=s%/
28);
29
30our $ua = LWP::UserAgent->new;
31$ua->cookie_jar({});
32
33my %conf;
34$conf{base_url} = 'http://localhost/piwigo/2.0';
35$conf{response_format} = 'json';
36$conf{username} = 'plg';
37$conf{password} = 'plg';
38$conf{limit} = 10;
39$conf{chunk_size} = defined $opt{chunk_size} ? $opt{chunk_size} : 500_000;
40
41my $result = undef;
42my $query = undef;
43
44binmode STDOUT, ":encoding(utf-8)";
45
46# TODO : don't connect at each script call, use the session duration instead.
47my $form = {
48    method => 'pwg.session.login',
49    username => $conf{username},
50    password => $conf{password},
51};
52
53$result = $ua->post(
54    $conf{base_url}.'/ws.php?format=json',
55    $form
56);
57
58# print "\n", $ua->cookie_jar->as_string, "\n";
59
60if ($opt{action} eq 'pwg.images.add') {
61    use MIME::Base64 qw(encode_base64);
62    use Digest::MD5::File qw/file_md5_hex/;
63    use File::Slurp;
64
65    $form = {};
66    $form->{method} = 'pwg.images.add';
67
68    my $original_sum = file_md5_hex($opt{original});
69    $form->{original_sum} = $original_sum;
70
71    send_chunks(
72        filepath => $opt{file},
73        type => 'file',
74        original_sum => $original_sum,
75    );
76    $form->{file_sum} = file_md5_hex($opt{file});
77
78    send_chunks(
79        filepath => $opt{thumbnail},
80        type => 'thumb',
81        original_sum => $original_sum,
82    );
83    $form->{thumbnail_sum} = file_md5_hex($opt{thumbnail});
84
85    if (defined $opt{high}) {
86        send_chunks(
87            filepath => $opt{high},
88            type => 'high',
89            original_sum => $original_sum,
90        );
91        $form->{high_sum} = file_md5_hex($opt{high});
92    }
93
94    foreach my $key (keys %{ $opt{define} }) {
95        $form->{$key} = $opt{define}{$key};
96    }
97
98    my $response = $ua->post(
99        $conf{base_url}.'/ws.php?format=json',
100        $form
101    );
102
103    print "-" x 50, "\n";
104    printf("response code    : %u\n", $response->code);
105    printf("response message : %s\n", $response->message);
106    print "-" x 50, "\n";
107    print "\n";
108
109#     use Data::Dumper;
110#     print Dumper($response->content);
111#     print Dumper(from_json($response->content));
112
113    if ($response->is_success) {
114        print "upload successful\n";
115    }
116    else {
117        warn 'A problem has occured during upload', "\n";
118        warn $response->decoded_content, "\n";
119        die $response->status_line;
120    }
121}
122
123if ($opt{action} eq 'pwg.tags.list') {
124    use Text::ASCIITable;
125
126    $query = pwg_ws_get_query(
127        method => 'pwg.tags.getList',
128        sort_by_counter => 'true',
129    );
130
131    $result = $ua->get($query);
132    my $tag_result = from_json($result->content);
133    my $t = Text::ASCIITable->new({ headingText => 'Tags' });
134    $t->setCols('id','counter','name');
135
136    my $tag_number = 1;
137    foreach my $tag_href (@{ $tag_result->{result}{tags} }) {
138        $t->addRow(
139            $tag_href->{id},
140            $tag_href->{counter},
141            $tag_href->{name}
142        );
143
144        last if $tag_number++ >= $conf{limit};
145    }
146    print $t;
147}
148
149if ($opt{action} eq 'pwg.tags.getAdminList') {
150    $query = pwg_ws_get_query(
151        method => 'pwg.tags.getAdminList'
152    );
153
154    $result = $ua->get($query);
155    my $tags = from_json($result->content)->{result}{tags};
156
157    foreach my $tag (@{$tags}) {
158        # print join(',', keys %{$tag}), "\n"; exit();
159        printf(
160            '{%u} %s ',
161            $tag->{id},
162            $tag->{name}
163        );
164    }
165
166    print "\n";
167}
168
169if ($opt{action} eq 'pwg.categories.add') {
170    $form = {
171        method => 'pwg.categories.add',
172        name => $opt{define}{name},
173        parent => $opt{define}{parent},
174    };
175
176    my $response = $ua->post(
177        $conf{base_url}.'/ws.php?format=json',
178        $form
179    );
180
181    use Data::Dumper;
182    print Dumper(from_json($response->content));
183}
184
185if ($opt{action} eq 'pwg.tags.add') {
186    $form = {
187        method => 'pwg.tags.add',
188        name => $opt{define}{name},
189    };
190
191    my $response = $ua->post(
192        $conf{base_url}.'/ws.php?format=json',
193        $form
194    );
195
196    use Data::Dumper;
197    print Dumper(from_json($response->content));
198}
199
200if ($opt{action} eq 'pwg.images.exist') {
201    $form = {
202        method => $opt{action},
203    };
204
205    foreach my $key (keys %{ $opt{define} }) {
206        $form->{$key} = $opt{define}{$key};
207    }
208
209    my $response = $ua->post(
210        $conf{base_url}.'/ws.php?format=json',
211        $form
212    );
213
214    use Data::Dumper;
215    print Dumper(from_json($response->content)->{result});
216    # print Dumper($response);
217}
218
219if ($opt{action} eq 'pwg.images.setInfo') {
220    $form = {
221        method => $opt{action},
222    };
223
224    foreach my $key (keys %{ $opt{define} }) {
225        $form->{$key} = $opt{define}{$key};
226    }
227
228    my $response = $ua->post(
229        $conf{base_url}.'/ws.php?format=json',
230        $form
231    );
232
233    use Data::Dumper;
234    # print Dumper(from_json($response->content)->{result});
235    print Dumper($response);
236}
237
238$query = pwg_ws_get_query(
239    method => 'pwg.session.logout'
240);
241$ua->get($query);
242
243sub pwg_ws_get_query {
244    my %params = @_;
245
246    my $query = $conf{base_url}.'/ws.php?format='.$conf{response_format};
247
248    foreach my $key (keys %params) {
249        $query .= '&'.$key.'='.$params{$key};
250    }
251
252    return $query;
253}
254
255sub send_chunks {
256    my %params = @_;
257
258    my $content = read_file($params{filepath});
259    my $content_length = length($content);
260    my $nb_chunks = ceil($content_length / $conf{chunk_size});
261
262    my $chunk_pos = 0;
263    my $chunk_id = 1;
264    while ($chunk_pos < $content_length) {
265        my $chunk = substr(
266            $content,
267            $chunk_pos,
268            $conf{chunk_size}
269        );
270        $chunk_pos += $conf{chunk_size};
271
272        my $response = $ua->post(
273            $conf{base_url}.'/ws.php?format=json',
274            {
275                method => 'pwg.images.addChunk',
276                data => encode_base64($chunk),
277                original_sum => $params{original_sum},
278                position => $chunk_id,
279                type => $params{type},
280            }
281        );
282
283        printf(
284            'chunk %05u of %05u for %s "%s"'."\n",
285            $chunk_id,
286            $nb_chunks,
287            $params{type},
288            $params{filepath}
289        );
290        if ($response->code != 200) {
291            printf("response code    : %u\n", $response->code);
292            printf("response message : %s\n", $response->message);
293        }
294
295        $chunk_id++;
296    }
297}
Note: See TracBrowser for help on using the repository browser.