Changeset 3226


Ignore:
Timestamp:
03/29/09 12:24:08 (10 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.