source: extras/pLoader/trunk/src/Uploader/PWG/WebServices.pm @ 3194

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

Bug 939 fixed. Use pwg.images.addChunk for upload.

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