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

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

Bug 1004 fixed : keep category tree layout after adding a new category.

  • Property svn:eol-style set to LF
File size: 9.0 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   
89    $self->uagent->default_headers->authorization_basic(
90        $self->{http_username}||$self->username, 
91        $self->{http_password}||$self->password
92    );
93   
94    $self->chunk_size(
95        $self->{chunk_size}||500_000
96    );
97   
98    $self->qry_list_categories( sprintf
99        "%s/ws.php?format=json&method=%s&recursive=%s",
100        $self->urlbase,
101#        'pwg.categories.getAdminList',
102        'pwg.categories.getList',
103        'true',
104    );
105
106    my $form = {
107        method => 'pwg.session.login',
108        username => $self->username,
109        password => $self->password,
110    };
111 
112    $self->uagent_response(
113        $self->uagent->post(
114            $self->urlbase.'/ws.php?format=json',
115            $form
116        )
117    );
118   
119    my $hresult = {} ;
120
121    if($self->uagent_response->is_success){
122        eval {
123            $hresult = from_json(
124                $self->uagent_response->content
125            );
126        };
127    }
128    else{
129        $hresult = {
130            'message' => $self->uagent_response->message,
131            'stat'    => 'fail',
132        };
133    }
134
135    $self->login_result(
136        $hresult
137    );
138
139}
140
141sub GetCategories {
142    my ( $self ) = @_;
143
144    my $result;
145    eval {
146        $result = $self->uagent->get(
147            $self->qry_list_categories
148        );
149    };
150
151    if($@){
152        printf("An error occured in query execution %s\n%s",
153            $self->qry_list_categories,
154            $@,
155        );     
156    }
157    my $hresult;
158   
159    eval {
160        $hresult = from_json(
161            $result->content
162        );
163    };
164   
165    $hresult ||= {};
166
167    my $categories = $hresult->{result}{categories};
168
169    $categories;       
170}
171
172sub UploadImage {
173    my ( $self ) = @_;
174
175    my $file_sum;
176
177    eval {
178        $file_sum = file_md5_hex(
179            encode('iso-8859-1', $self->site_resized_file)
180        );
181    };
182 
183
184    my $thumbnail_sum = file_md5_hex(
185        encode('iso-8859-1', $self->site_thumb_file),
186    );
187
188    my $original_sum = file_md5_hex(
189        encode('iso-8859-1', $self->site_high_file)
190    );
191
192    my $form = {
193        method            => 'pwg.images.exist',
194        md5sum_list       => $original_sum,
195    };
196
197    my $result = $self->uagent->post(
198        $self->urlbase.'/ws.php?format=json',
199        $form
200    );
201
202    my $hresult = {};
203        eval {
204            $hresult = from_json(
205                $result->{_content}
206            );
207        };
208
209    my $site_image_name = is_utf8($self->site_image_name) ? 
210                                  $self->site_image_name : 
211                                  encode('utf8', $self->site_image_name);
212
213    my $image_id = $hresult->{result}{$original_sum};
214    if(!defined($image_id)){
215        $self->send_chunks(
216            {
217                filepath => encode('iso-8859-1', $self->site_resized_file),
218                type => 'file',
219                original_sum => $original_sum,
220            }
221        );
222
223        $self->send_chunks(
224            {
225                filepath => encode('iso-8859-1', $self->site_thumb_file),
226                type => 'thumb',
227                original_sum => $original_sum,
228            }
229        );
230       
231        $form = {
232            method            => 'pwg.images.add',
233            original_sum      => $original_sum,
234            file_sum          => $file_sum,
235            thumbnail_sum     => $thumbnail_sum,
236            categories        => $self->categories,
237            name              => $site_image_name,
238            rank              => $self->rank,
239            author            => $self->site_author,
240            comment           => $self->site_comment,
241            date_creation     => $self->site_img_date_creation,
242           
243        };
244   
245        if($self->upload_high){
246            $self->send_chunks(
247                {
248                    filepath => encode('iso-8859-1', $self->site_high_file),
249                    type => 'high',
250                    original_sum => $original_sum,
251                }
252            );
253
254            $form->{high_sum}     = $original_sum;
255        }
256    }
257    else {
258        $form = {
259            method            => 'pwg.images.setInfo',
260            image_id          => $image_id,
261            categories        => $self->categories,
262            name              => $site_image_name,
263            rank              => $self->rank,
264            author            => $self->site_author,
265            comment           => $self->site_comment,
266            date_creation     => $self->site_img_date_creation,
267        };
268    }
269
270    $result = $self->uagent->post(
271        $self->urlbase.'/ws.php?format=json',
272        $form
273    );
274
275    return ( $result->is_success, $result->status_line );
276}
277 
278
279sub AddCategories{
280    my ( $self, $name, $parentid ) = @_;
281
282    my $form = {
283        method            => 'pwg.categories.add',
284        name              => $name,
285        parent            => $parentid,
286       
287    };
288
289    my $result = $self->uagent->post(
290        $self->urlbase.'/ws.php?format=json',
291        $form
292    );
293
294    my $content = {};
295        eval {
296            $content = from_json(
297                $result->content
298            );
299        };
300
301    return ( $result->is_success, $result->status_line, $content );
302       
303}
304
305
306sub send_chunks {
307    my ( $self, $params ) = @_;
308
309    my $content = read_file(
310        $params->{filepath},
311        binmode => ':raw',
312    );
313
314    my $content_length = length($content);
315    my $nb_chunks = ceil($content_length / $self->chunk_size);
316
317    my $chunk_pos = 0;
318    my $chunk_id = 1;
319    while ($chunk_pos < $content_length) {
320        my $chunk = substr(
321            $content,
322            $chunk_pos,
323            $self->chunk_size
324        );
325        $chunk_pos += $self->chunk_size;
326
327        my $response = $self->uagent->post(
328            $self->urlbase.'/ws.php?format=json',
329            {
330                method       => 'pwg.images.addChunk',
331                data         => encode_base64($chunk),
332                original_sum => $params->{original_sum},
333                position     => $chunk_id,
334                type         => $params->{type},
335            }
336        );
337
338        #printf(
339        #    'chunk %05u of %05u for %s "%s"'."\n",
340        #    $chunk_id,
341        #    $nb_chunks,
342        #    $params->{type},
343        #    $params->{filepath}
344        #);
345        if ($response->code != 200) {
346            printf("response code    : %u\n", $response->code);
347            printf("response message : %s\n", $response->message);
348        }
349
350        $chunk_id++;
351    }
352}
353
354 
3551;
356   
Note: See TracBrowser for help on using the repository browser.