source: extensions/pLoader/trunk/src/Uploader/PWG/WebServices.pm @ 3467

Last change on this file since 3467 was 3467, checked in by ronosman, 15 years ago

Feature 1037 added. Add an option to change photo transfert chunk size.

  • Property svn:eol-style set to LF
File size: 10.4 KB
Line 
1# +-----------------------------------------------------------------------+
2# | pLoader - a Perl photo uploader for Piwigo                            |
3# +-----------------------------------------------------------------------+
4# | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
5# +-----------------------------------------------------------------------+
6# | This program is free software; you can redistribute it and/or modify  |
7# | it under the terms of the GNU General Public License as published by  |
8# | the Free Software Foundation                                          |
9# |                                                                       |
10# | This program is distributed in the hope that it will be useful, but   |
11# | WITHOUT ANY WARRANTY; without even the implied warranty of            |
12# | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
13# | General Public License for more details.                              |
14# |                                                                       |
15# | You should have received a copy of the GNU General Public License     |
16# | along with this program; if not, write to the Free Software           |
17# | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
18# | USA.                                                                  |
19# +-----------------------------------------------------------------------+
20package Uploader::PWG::WebServices;
21 
22use strict;
23use warnings;
24use MIME::Base64 qw(encode_base64); 
25use JSON;
26use LWP::UserAgent;
27use Data::Dumper;
28use Digest::MD5::File qw/file_md5_hex md5_hex/;
29use File::Slurp;
30use Encode qw/encode decode is_utf8/;
31use POSIX qw(ceil floor);
32use base qw/
33           Uploader::Object
34           Class::Accessor::Fast
35           /;
36
37__PACKAGE__->mk_accessors( 
38    qw/
39           uagent
40           urlbase
41           username
42           password
43           qry_list_categories
44           qry_add_categories
45           items
46           tags
47           categories
48           site_high_file
49           site_resized_file
50           site_thumb_file
51           site_image_name
52           rank
53           site_author
54           site_comment
55           site_img_date_creation
56           uagent_response
57           login_result
58           action_result
59           upload_high
60           chunk_size
61      / 
62);
63
64$|=1;
65
66sub Init {
67    my ( $self ) = @_ ;
68 
69    $self->uagent(
70        LWP::UserAgent->new
71    );
72   
73   
74    $self->uagent->cookie_jar({});     
75
76    $self->urlbase(
77        $self->{site_url}
78    );
79   
80    $self->username(
81        $self->{site_username}
82    );
83   
84    $self->password(
85        $self->{site_password}
86    );
87   
88    $self->chunk_size(
89        $self->{chunk_size}
90    );
91
92   
93    $self->uagent->default_headers->authorization_basic(
94        $self->{http_username}||$self->username, 
95        $self->{http_password}||$self->password
96    );
97   
98   
99    $self->qry_list_categories( sprintf
100        "%s/ws.php?format=json&method=%s&recursive=%s",
101        $self->urlbase,
102#        'pwg.categories.getAdminList',
103        'pwg.categories.getList',
104        'true',
105    );
106
107    my $form = {
108        method => 'pwg.session.login',
109        username => $self->username,
110        password => $self->password,
111    };
112 
113    $self->uagent_response(
114        $self->uagent->post(
115            $self->urlbase.'/ws.php?format=json',
116            $form
117        )
118    );
119   
120    my $hresult = {} ;
121
122    if($self->uagent_response->is_success){
123        eval {
124            $hresult = from_json(
125                $self->uagent_response->content
126            );
127        };
128    }
129    else{
130        $hresult = {
131            'message' => $self->uagent_response->message,
132            'stat'    => 'fail',
133        };
134    }
135
136    $self->login_result(
137        $hresult
138    );
139
140}
141
142sub GetCategories {
143    my ( $self ) = @_;
144
145    my $result;
146    eval {
147        $result = $self->uagent->get(
148            $self->qry_list_categories
149        );
150    };
151
152    if($@){
153        printf("An error occured in query execution %s\n%s",
154            $self->qry_list_categories,
155            $@,
156        );     
157    }
158    my $hresult;
159   
160    eval {
161        $hresult = from_json(
162            $result->content
163        );
164    };
165   
166    $hresult ||= {};
167
168    my $categories = $hresult->{result}{categories};
169
170    $categories;       
171}
172
173sub UploadImage {
174    my ( $self ) = @_;
175
176    my $file_sum;
177
178    eval {
179        $file_sum = file_md5_hex(
180            encode('iso-8859-1', $self->site_resized_file)
181        );
182    };
183 
184
185    my $thumbnail_sum = file_md5_hex(
186        encode('iso-8859-1', $self->site_thumb_file),
187    );
188
189    my $original_sum = file_md5_hex(
190        encode('iso-8859-1', $self->site_high_file)
191    );
192
193    my $form = {
194        method            => 'pwg.images.exist',
195        md5sum_list       => $original_sum,
196    };
197
198    my $result = $self->uagent->post(
199        $self->urlbase.'/ws.php?format=json',
200        $form
201    );
202
203    my $hresult = {};
204        eval {
205            $hresult = from_json(
206                $result->{_content}
207            );
208        };
209
210    my $site_image_name = is_utf8($self->site_image_name) ? 
211                                  $self->site_image_name : 
212                                  encode('utf8', $self->site_image_name);
213
214    my $image_id = $hresult->{result}{$original_sum};
215    my $status = 0;
216    my $status_line = "An error has occured during upload.";
217    while(1){
218        if(!defined($image_id)){
219               
220            my $resized_params = {
221                filepath => encode('iso-8859-1', $self->site_resized_file),
222                type => 'file',
223                original_sum => $original_sum,
224            };
225   
226            $self->send_chunks(
227                $resized_params
228            );
229           
230            $status_line = $resized_params->{message};
231            last if !$resized_params->{ok};
232         
233            my $thumb_params = {
234                filepath => encode('iso-8859-1', $self->site_thumb_file),
235                type => 'thumb',
236                original_sum => $original_sum,         
237            };
238   
239            $self->send_chunks(
240                $thumb_params
241            );
242
243            $status_line = $thumb_params->{message};
244            last if !$thumb_params->{ok};
245
246       
247            $form = {
248                method            => 'pwg.images.add',
249                original_sum      => $original_sum,
250                file_sum          => $file_sum,
251                thumbnail_sum     => $thumbnail_sum,
252                categories        => $self->categories,
253                name              => $site_image_name,
254                rank              => $self->rank,
255                author            => $self->site_author,
256                comment           => $self->site_comment,
257                date_creation     => $self->site_img_date_creation,
258               
259            };
260            my $high_params = {
261                filepath => encode('iso-8859-1', $self->site_high_file),
262                type => 'high',
263                original_sum => $original_sum,
264            };
265   
266            if($self->upload_high){
267                $form->{high_sum} = $original_sum;
268   
269                $self->send_chunks(
270                    $high_params
271                );
272
273                $status_line = $high_params->{message};
274                last if !$high_params->{ok};
275   
276            }
277        }
278        else {
279            $form = {
280                method            => 'pwg.images.setInfo',
281                image_id          => $image_id,
282                categories        => $self->categories,
283                name              => $site_image_name,
284                rank              => $self->rank,
285                author            => $self->site_author,
286                comment           => $self->site_comment,
287                date_creation     => $self->site_img_date_creation,
288            };
289        }
290   
291        $result = $self->uagent->post(
292            $self->urlbase.'/ws.php?format=json',
293            $form
294        );
295   
296        $status = $result->is_success;
297        $status_line = $result->status_line; 
298        last;
299    }
300   
301    return ( $status,  $status_line);
302}
303 
304
305sub AddCategories{
306    my ( $self, $name, $parentid ) = @_;
307
308    my $form = {
309        method            => 'pwg.categories.add',
310        name              => $name,
311        parent            => $parentid,
312       
313    };
314
315    my $result = $self->uagent->post(
316        $self->urlbase.'/ws.php?format=json',
317        $form
318    );
319
320    my $content = {};
321        eval {
322            $content = from_json(
323                $result->content
324            );
325        };
326
327    return ( $result->is_success, $result->status_line, $content );
328       
329}
330
331sub SetInfoCategories{
332    my ( $self, $name, $comment, $parentid ) = @_;
333
334    my $form = {
335        method            => 'pwg.categories.setInfo',
336        name              => $name,
337        comment           => $comment,
338        category_id       => $parentid,
339       
340    };
341
342    my $result = $self->uagent->post(
343        $self->urlbase.'/ws.php?format=json',
344        $form
345    );
346
347    my $content = {};
348        eval {
349            $content = from_json(
350                $result->content
351            );
352        };
353
354    return ( $result->is_success, $result->status_line, $content );
355       
356}
357
358
359sub send_chunks {
360    my ( $self, $params ) = @_;
361
362    my $content = read_file(
363        $params->{filepath},
364        binmode => ':raw',
365    );
366
367    my $content_length = length($content);
368    my $nb_chunks = ceil($content_length / $self->chunk_size);
369
370    my $chunk_pos = 0;
371    my $chunk_id = 1;
372    while ($chunk_pos < $content_length) {
373        my $chunk = substr(
374            $content,
375            $chunk_pos,
376            $self->chunk_size
377        );
378        $chunk_pos += $self->chunk_size;
379
380        my $response = $self->uagent->post(
381            $self->urlbase.'/ws.php?format=json',
382            {
383                method       => 'pwg.images.addChunk',
384                data         => encode_base64($chunk),
385                original_sum => $params->{original_sum},
386                position     => $chunk_id,
387                type         => $params->{type},
388            }
389        );
390
391        $params->{ok} = 1;
392        if ($response->code != 200) {
393            printf("response code    : %u\n", $response->code);
394            printf("response message : %s\n", $response->message);
395            $params->{ok} = 0;
396            $params->{message} = $response->message;
397            $params->{code} = $response->code;
398            last;
399        }
400
401        $chunk_id++;
402    }
403}
404
405 
4061;
407   
Note: See TracBrowser for help on using the repository browser.