Changeset 3193 for trunk/tools


Ignore:
Timestamp:
Mar 13, 2009, 12:14:50 AM (15 years ago)
Author:
plg
Message:

merge r3192 from branch 2.0 to trunk

bug 941 fixed: to be able to upload heavy photo, chunk the files, send parts
one by one, and then pwg.images.add merge chunks together. Now big uploads
works and you can even have a fine progress bar on client side.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/piwigo_remote.pl

    r3065 r3193  
    11#!/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
    214
    315use strict;
     
    820use Getopt::Long;
    921use Encode qw/is_utf8 decode/;
     22use POSIX qw(ceil floor);
    1023
    1124my %opt = ();
    1225GetOptions(
    1326    \%opt,
    14     qw/action=s file=s thumbnail=s high=s original=s categories=s define=s%/
     27    qw/action=s file=s thumbnail=s high=s original=s categories=s chunk_size=i define=s%/
    1528);
    1629
     
    1932
    2033my %conf;
    21 $conf{base_url} = 'http://localhost/~pierrick/piwigo/trunk';
     34$conf{base_url} = 'http://localhost/piwigo/2.0';
    2235$conf{response_format} = 'json';
    23 $conf{username} = 'pierrick';
    24 $conf{password} = 'z0rglub';
     36$conf{username} = 'plg';
     37$conf{password} = 'plg';
    2538$conf{limit} = 10;
     39$conf{chunk_size} = defined $opt{chunk_size} ? $opt{chunk_size} : 500_000;
    2640
    2741my $result = undef;
     
    4963    use File::Slurp;
    5064
     65    $form = {};
     66    $form->{method} = 'pwg.images.add';
     67
    5168    my $original_sum = file_md5_hex($opt{original});
    52 
    53     my $file_content = encode_base64(read_file($opt{file}));
    54     my $file_sum = file_md5_hex($opt{file});
    55 
    56     my $thumbnail_content = encode_base64(read_file($opt{thumbnail}));
    57     my $thumbnail_sum = file_md5_hex($opt{thumbnail});
    58 
    59     $form = {
    60         method => 'pwg.images.add',
     69    $form->{original_sum} = $original_sum;
     70
     71    send_chunks(
     72        filepath => $opt{file},
     73        type => 'file',
    6174        original_sum => $original_sum,
    62         file_sum => $file_sum,
    63         file_content => $file_content,
    64         thumbnail_sum => $thumbnail_sum,
    65         thumbnail_content => $thumbnail_content,
    66         categories => $opt{categories},
    67     };
     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});
    6884
    6985    if (defined $opt{high}) {
    70         $form->{high_content} = encode_base64(read_file($opt{high}));
     86        send_chunks(
     87            filepath => $opt{high},
     88            type => 'high',
     89            original_sum => $original_sum,
     90        );
    7191        $form->{high_sum} = file_md5_hex($opt{high});
    7292    }
     
    232252    return $query;
    233253}
     254
     255sub send_chunks {
     256    my %params = @_;
     257
     258    my $content = encode_base64(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 => $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 TracChangeset for help on using the changeset viewer.