Changeset 3226


Ignore:
Timestamp:
Mar 29, 2009, 12:24:08 PM (15 years ago)
Author:
ronosman
Message:

Change how pLoader identifies images : now use md5 checksum - feature 961
Fix filename with accentuated characters causing processing failures - bug 952

Location:
extras/pLoader/trunk/src/Uploader
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • extras/pLoader/trunk/src/Uploader/Image.pm

    r3177 r3226  
    3939        preview_w
    4040        preview_h
     41        file_sum
    4142    /
    4243);
  • extras/pLoader/trunk/src/Uploader/ImageList.pm

    r3177 r3226  
    2828use Data::Dumper;
    2929use Storable;
     30use Digest::MD5::File qw/file_md5_hex md5_hex/;
     31use Encode qw/encode decode is_utf8/;
     32
    3033# this class implements a collection of image files with associated data
    3134$|=1;
     
    6871                progressbar_refresh
    6972                progress_endinfo_refresh
     73                RescaleCallback
    7074                ResizeCallback
    7175                upload_rejects
     
    7882                create_resized
    7983                use_exif_preview
     84                image_sums
     85                sums
     86                version
     87                imagelist_version
    8088     /
    8189);
     
    96104    # If PreviewImage is available, we use it
    97105    if(defined $imagedata ) {
     106        print "_write_preview_image, use exif PreviewImage\n";
    98107        eval {
    99108            open PREVIEW_FILE, ">", $self->current_image->preview_file ;
     
    126135}
    127136
    128 sub _set_current_image_filepaths {
     137sub _set_current_image_filepaths__ {
    129138    my ( $self ) = @_;
    130139
     
    134143
    135144    my ( $filename, $ext ) = split /\./, $file ;
     145   
    136146
    137147    $self->current_image->wx_thumb_file(
     
    156166        )
    157167    );
    158 
     168    $self->current_image->preview_file(
     169        encode('iso-8859-1', $self->current_image->preview_file)
     170    );
    159171
    160172    $self->current_image->site_thumb_file(
     
    169181    );
    170182
    171        
    172 }
     183}
     184
     185sub _set_current_image_filepaths {
     186    my ( $self ) = @_;
     187
     188    my $filename = sprintf(
     189        "%s.%s",
     190        $self->current_image->file_sum,
     191        $self->type,
     192    );
     193
     194
     195    $self->current_image->wx_thumb_file(
     196        File::Spec->catfile(
     197            $self->wx_thumb_dir,
     198            $filename
     199        )
     200    );
     201
     202    $self->current_image->preview_file(
     203        File::Spec->catfile(
     204            $self->preview_dir,
     205            $filename
     206        )
     207    );
     208    $self->current_image->preview_file(
     209        encode('iso-8859-1', $self->current_image->preview_file)
     210    );
     211
     212    $self->current_image->site_thumb_file(
     213        File::Spec->catfile(
     214            $self->site_thumb_dir,
     215            $filename
     216        )
     217    );
     218
     219}
     220
    173221
    174222sub SetCurrentImage {
     
    176224
    177225    $self->current_image(
    178         $self->images->[$indx]
     226        $self->GetImage($indx)
    179227    );
    180228}
     
    187235
    188236    # if some files have been previously selected
    189     my $i = scalar @{$self->images};
     237    my $i = scalar @{$self->sums};
    190238    my $count = 0;
    191239    $self->count($count);
    192240    my $errors = 0;
     241
    193242    map {
    194         # read exif metadata
    195         my $info;
    196 
    197 
    198         eval {
    199             $info = ImageInfo( $_ );
    200         };
    201 
    202         $info = {} if($@);
    203 
    204         $self->_add_image($_, $info, $i);       
     243        my $info = $self->_read_exif_metatdata($_);
     244        my $is_new_image = $self->_add_image($_, $info, $i);   
    205245        $self->SetCurrentImage($i);
    206246        $self->_set_current_image_filepaths();
    207247
    208         my $create_gui_preview;
    209         if($self->use_exif_preview){       
    210             # an exif preview is available. we try to use it
    211             if(defined $info->{PreviewImage} ){
    212                 printf("use preview\n");
    213                 $self->_write_preview_image( $info->{PreviewImage} );
    214                 my $image = new Image::Magick;
    215                 eval {
    216                         $create_gui_preview = $image->ReadImage(
    217                         $self->current_image->preview_file
    218                     );
    219                 };
    220                 unlink $self->current_image->preview_file if $create_gui_preview;
     248        if($is_new_image){
     249            my $use_wx_resize = $self->_create_gui_preview($info);
     250            $self->_create_gui_thumbnail($use_wx_resize);
     251
     252            # ok
     253            if(!$@){
     254                $self->progress_msg("Thumbnail and preview created for %s");
    221255            }
    222256            else {
    223                 $create_gui_preview = 1;
     257                $self->progress_msg("An error has occured when processing %s\n$@");
     258                # remove from list
     259                splice @{$self->sums}, $i, 1;
     260                $errors++;
    224261            }
     262       
     263            $self->SetNewFilesProgressCallback->();
    225264        }
    226         else {
    227             $create_gui_preview = 1;
    228         }
    229         print "create gui preview", $create_gui_preview, "\n";
    230         # have to create a preview file
    231         if($create_gui_preview) {
    232             eval {
    233                 if(!$self->CreateGUIPreview()){
    234                     # use method provided by the caller
    235                     # source, target, type, ratio
    236                     $self->ResizeCallback->(
    237                         $self->current_image->file,
    238                         $self->current_image->preview_file,
    239                         $self->type,
    240                         $self->preview_ratio,
    241                         undef,
    242                         undef,
    243                         $self->quality,
    244                     );
    245                 }
    246             };# create a preview file
    247         }   
    248 
    249         $self->RotateImage(
    250             $self->current_image->preview_file,
    251         ) if $self->auto_rotate;
    252 
    253         $self->_set_exif_tag(
    254             $self->current_image->preview_file,
    255             'Orientation',
    256             'Horizontal (normal)',
    257         ) if $self->auto_rotate;
    258 
    259 
    260         # Now, we should have a valid preview image.
    261         # try to thumbnail it
    262         eval {
    263             printf("create gui thumbnail\n");
    264             # use the preview image to create a gui display thumbnail
    265             $self->CreateGUIThumbnail();
    266         };
    267         # ok
    268         if(!$@){
    269             $self->progress_msg("Thumbnail and preview created for %s");
    270             $i++;
    271             $count++;
    272             $self->count($count);
    273         }
    274         else {
    275             $self->progress_msg("An error has occured when processing %s\n$@");
    276             # remove from list
    277             splice @{$self->images}, $i, 1;
    278             $errors++;
    279         }
    280        
    281         $self->SetNewFilesProgressCallback->();
     265        $i++;
     266        $count++;
     267        $self->count($count);
    282268        $self->SetNewFilesViewerRefreshCallback->();
    283 
    284269    }
    285270    @{$files};
     
    297282}
    298283
     284sub _read_exif_metatdata {
     285    my ( $self, $file ) = @_;
     286   
     287    # read exif metadata
     288    my $info;
     289    eval {
     290        $info = ImageInfo( $file );
     291    };
     292    $info = {} if($@);
     293   
     294    $info;
     295}
     296
    299297# key is file path
    300298sub _add_image {
    301299    my ( $self, $file, $info, $i ) = @_;       
    302300
    303     my $image = Uploader::Image->new(
     301    my $is_new_image;
     302
     303    # for legacy imagelist that do not have image_sums property
     304    $self->image_sums(
     305        {}
     306    ) if !$self->image_sums;
     307
     308    my $sum = file_md5_hex($file);
     309
     310    my $image;
     311    if ( !exists $self->image_sums->{$sum} ){
     312        # append to image list
     313        $image = Uploader::Image->new(
    304314        {
    305             file              => $_,
    306             site_name         => sprintf(
    307                                      "%s %s",
    308                                      $self->default_name_prefix,
    309                                      $i,
    310                                  ),
    311             site_author       => $self->author,
    312             exif_metadata     => $self->_select_exif_data($info),
    313             add_rank          => $i,
    314             site_categories   => [],
    315             site_tags         => [],
    316             site_high_file    => $_,
     315                file              => $_,
     316                file_sum          => $sum,
     317                site_name         => sprintf(
     318                                         "%s %s",
     319                                         $self->default_name_prefix,
     320                                         $i,
     321                                     ),
     322                site_author       => $self->author,
     323                exif_metadata     => $self->_select_exif_data($info),
     324                add_rank          => $i,
     325                site_categories   => [],
     326                site_tags         => [],
     327                site_high_file    => $_,
     328            }
     329        );
     330
     331        $self->image_sums->{$sum} = $image ;
     332        $is_new_image = 1;
     333    } else {
     334        $image = $self->image_sums->{$sum};
     335    }
     336
     337       
     338    #$self->images->[$i] = $image ;
     339    $self->sums->[$i] = $sum ;
     340
     341    $is_new_image;
     342}
     343
     344sub _create_gui_preview {
     345    my ( $self, $info ) = @_;
     346
     347    my $create_gui_preview;
     348    my $use_wx_resize;
     349    if($self->use_exif_preview){       
     350        # an exif preview is available. we try to use it
     351        if(defined $info->{PreviewImage} ){
     352            printf("use preview\n");
     353            $self->_write_preview_image( $info->{PreviewImage} );
     354            my $image = new Image::Magick;
     355            eval {
     356                $create_gui_preview = $image->ReadImage(
     357                    $self->current_image->preview_file
     358                );
     359            };
     360            unlink $self->current_image->preview_file if $create_gui_preview;
    317361        }
    318     );
    319 
    320     # append to image list
    321     $self->images->[$i] = $image ;
    322 
    323 }
    324 
     362        else {
     363            $create_gui_preview = 1;
     364        }
     365    }
     366    else {
     367        $create_gui_preview = 1;
     368    }
     369    print "create gui preview", $create_gui_preview, "\n";
     370    # have to create a preview file
     371    if($create_gui_preview) {
     372        eval {
     373            if(!$self->CreateGUIPreview()){
     374                # use method provided by the caller
     375                # source, target, type, ratio
     376                print "CreateGUIPreview failed, use callback\n";
     377                $self->RescaleCallback->(
     378                    $self->current_image->file,
     379                    $self->current_image->preview_file,
     380                    $self->type,
     381                    $self->preview_ratio,
     382                    undef,
     383                    undef,
     384                    $self->quality,
     385                );
     386                $use_wx_resize = 1;
     387            }
     388        };# create a preview file
     389    }   
     390
     391    $self->RotateImage(
     392        $self->current_image->preview_file,
     393    ) if $self->auto_rotate;
     394
     395    $self->_set_exif_tag(
     396        $self->current_image->preview_file,
     397        'Orientation',
     398        'Horizontal (normal)',
     399    ) if $self->auto_rotate;
     400   
     401    $use_wx_resize;     
     402}
     403
     404sub _create_gui_thumbnail {
     405    my ( $self, $use_wx_resize ) = @_;
     406
     407    # Now, we should have a valid preview image.
     408    # try to thumbnail it
     409     eval {
     410        printf("create gui thumbnail\n");
     411        # use the preview image to create a gui display thumbnail
     412        if($use_wx_resize)
     413        {
     414                print "CreateGUIThumbnail failed, use callback\n";
     415                $self->ResizeCallback->(
     416                    $self->current_image->preview_file,
     417                    $self->current_image->wx_thumb_file,
     418                    $self->type,
     419                    $self->wx_thumb_size,
     420                    $self->wx_thumb_size,
     421                    $self->wx_quality,
     422                );
     423               
     424        } else {
     425            $self->CreateGUIThumbnail();               
     426        }
     427     };
     428}
    325429
    326430sub RemoveImageSelection {
    327431    my ( $self ) = @_;
    328432   
    329     return if (! scalar @{$self->images} );
     433    return if (! scalar @{$self->sums} );
    330434    return if (! defined $self->image_selection );
    331435   
     
    333437    my @images = reverse @{$self->image_selection};     
    334438    map {
    335         my $image = $self->images->[$_]->file;
    336         splice @{$self->images}, $_, 1 ;
     439        my $image = $self->GetImage($_)->file;
     440        splice @{$self->sums}, $_, 1 ;
    337441        $self->wx_thumb_imglist->Remove($_);
    338442        shift @images;
     
    350454    return 1 if( -e $self->current_image->wx_thumb_file );
    351455    my $rval = 0;
    352 print "CreateGUIThumbnail ", $self->current_image->wx_thumb_file, "\n";
     456    print "CreateGUIThumbnail ", $self->current_image->wx_thumb_file, "\n";
    353457    my $image = new Image::Magick;
    354458
     
    401505            "%s:%s",
    402506            $self->type,
    403             $self->current_image->wx_thumb_file,
     507            encode('iso-8859-1', $self->current_image->wx_thumb_file),
    404508        )
    405509    );
     
    459563            "%s:%s",
    460564            $self->type,
    461             $self->current_image->preview_file,
     565            encode('iso-8859-1', $self->current_image->preview_file),
    462566        )
    463567    );
     
    537641            "%s:%s",
    538642            $self->type,
    539             $self->current_image->site_resized_file,
     643            encode('iso-8859-1', $self->current_image->site_resized_file),
    540644        )
    541645    );
     
    561665
    562666    my $status = $image->ReadImage(
    563         $self->current_image->site_resized_file
     667        encode('iso-8859-1', $self->current_image->site_resized_file)
    564668    );
    565669    warn "$status" if $status ;
     
    589693            "%s:%s",
    590694            $self->type,
    591             $self->current_image->site_thumb_file,
     695            encode('iso-8859-1', $self->current_image->site_thumb_file),
    592696        )
    593697    );
     
    652756                wx_thumb_size
    653757                current_image
    654                 images
    655758                exif_metadata
    656759                wx_thumb_dir
     
    666769                create_resized
    667770                use_exif_preview
     771                image_sums
     772                sums
     773                version
     774                imagelist_version
    668775            /
    669776        ]
     
    702809        # current image object         
    703810        $self->current_image(
    704             $self->images->[$_]
     811            $self->GetImage($_)
    705812        );
    706813
     
    711818        my $site_name = $self->current_image->site_name;
    712819   
    713         my ( $filename, $ext ) = split /\./, $file ;
     820#        my ( $filename, $ext ) = split /\./, $file ;
     821        my $filename = $self->current_image->file_sum ;
    714822
    715823        # lately defined to make sure we have the last global properties ( resize_w, resize_h )
     
    733841        );
    734842
    735         eval {
     843#       eval {
    736844            # set current image thumbnail
    737845            $self->progress_thumbnail_refresh->();
     
    741849            # update upload progress dialog
    742850            $self->progressbar_refresh->(0.25);
    743         };
     851#        };
    744852        # user cancelled : dialog box is destroyed
    745         croak "Upload cancelled." if $@ ;
    746 
     853        croak "Upload cancelled. ", $@ if $@ ;
     854print "1\n";
    747855        if( $self->create_resized ){
    748             eval {
     856#            eval {
    749857                if(!$self->CreateResized()){
    750858                    printf("CreateResized failed %s. Use ResizeCallback\n", $@);
     
    765873                    ) if $self->auto_rotate;
    766874                }
    767             };
     875#            };
    768876            $self->_set_exif_tag(
    769877                $self->current_image->site_resized_file,
     
    778886            );
    779887        }
     888print "2\n";
    780889
    781890
     
    792901        );
    793902
    794         eval {
     903#       eval {
    795904            $self->progress_msg_refresh->($msg);
    796         };
    797         croak "Upload cancelled." if $@ ;
    798 
    799         eval {
     905#        };
     906        croak "Upload cancelled. ", $@ if $@ ;
     907print "3\n";
     908
     909#       eval {
    800910            $self->CreateThumbnail();
    801         };
     911#        };
    802912
    803913        if($@){
     
    815925            );
    816926        }
    817         eval {
     927#       eval {
    818928            $self->progress_msg_refresh->($msg);
    819929            $self->progressbar_refresh->(0.50);
    820         };
    821         croak "Upload cancelled." if $@ ;
     930#        };
     931        croak "Upload cancelled. ", $@ if $@ ;
     932print "4\n";
    822933
    823934        # photo metadata
    824935        $self->_prepare_upload_properties();           
     936print "5\n";
    825937        my ( $status, $status_msg ) = $self->pwg->UploadImage();
     938print "6\n";
    826939
    827940        if ( $status ){
     
    847960        );
    848961        # update upload progress dialog
    849         eval {
     962#       eval {
    850963            $self->progress_msg_refresh->($msg);
    851964            $self->progressbar_refresh->(1);
    852         };
    853         croak "Upload cancelled." if $@ ;
     965#        };
     966        croak "Upload cancelled. ", $@ if $@ ;
     967print "7\n";
    854968       
    855969    }
     
    9071021       
    9081022        $image->Write(
    909             filename=>$self->current_image->site_high_file
     1023            encode('iso-8859-1', filename=>$self->current_image->site_high_file)
    9101024        );
    9111025        warn "$status ", $self->current_image->site_high_file, "\n" if $status ;
     
    10131127        # write resizd file
    10141128        $image->Write(
    1015             filename=>$file
     1129            encode('iso-8859-1', filename=>$file)
    10161130        );
    10171131        warn "$status ", $file, "\n" if $status ;
     
    10241138}
    10251139
     1140sub GetImage {
     1141    my ( $self, $indx ) = @_;
     1142   
     1143    my $sum = $self->sums->[$indx];
     1144
     1145    $self->image_sums->{$sum};
     1146}
     1147
    102611481;
Note: See TracChangeset for help on using the changeset viewer.