WordPress.org

Plugin Directory

Changeset 621812


Ignore:
Timestamp:
11/06/12 20:00:39 (18 months ago)
Author:
dllh
Message:

Posterous Importer, various and sundry tweaks, including:

  • Some whitespace cleanup (more than I really meant to mix with this commit).
  • Better handling of utf8 (the prior fix could still fail sometimes).
  • Prevent duplicate imports of media files.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • posterous-importer/branches/v2api/posterous.php

    r621398 r621812  
    6666        parent::__construct(); 
    6767        $this->last_api_call_timestamp = time(); 
    68         add_action( 'process_attachment', array( &$this, 'process_attachment' ), 10, 3 ); 
    69         add_action( 'posterous_handle_bad_response', array( &$this, 'handle_bad_response' ), 10, 2 ); 
    70         add_action( 'posterous_api_sleep', array( &$this, 'api_sleep' ) ); 
     68        add_action( 'process_attachment', array( $this, 'process_attachment' ), 10, 3 ); 
     69        add_action( 'posterous_handle_bad_response', array( $this, 'handle_bad_response' ), 10, 2 ); 
     70        add_action( 'posterous_api_sleep', array( $this, 'api_sleep' ) ); 
    7171 
    7272        if ( isset( $_GET['import'] ) && 'posterous' == $_GET['import'] ) { 
    73             add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) ); 
    74             add_action( 'admin_head', array ( &$this, 'admin_head' ) ); 
     73            add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); 
     74            add_action( 'admin_head', array ( $this, 'admin_head' ) ); 
    7575        } 
    7676    } 
     
    8484        $this->__construct(); 
    8585    } 
    86      
     86 
    8787    /** 
    8888     * Strip out protocol, check for proper domain. 
     
    176176            return $hashtable; 
    177177    } 
    178          
     178 
    179179    function get_sites() { 
    180180        $url = 'http://posterous.com/api/2/sites/'; 
     
    193193        } 
    194194 
    195         $body = $data['body']; 
    196         if ( seems_utf8( $body ) ) 
    197             $body = utf8_encode( $body ); 
     195        $body = $this->ensure_utf8( $data['body'] ); 
    198196 
    199197        $sites = json_decode( $body ); 
     
    218216     * @return void 
    219217     */ 
    220     function do_posts( $type='posts' ) {         
     218    function do_posts( $type='posts' ) { 
    221219        $page = 1; 
    222220        $this->have_post = true; 
     
    247245                break; 
    248246            default: 
    249                 printf( "<strong>Error: </strong>%s<br />\n", __( 'Got HTTP code' ) . ' ' . $code );     
    250         }        
     247                printf( "<strong>Error: </strong>%s<br />\n", __( 'Got HTTP code' ) . ' ' . $code ); 
     248        } 
    251249        exit(); 
    252250    } 
    253      
     251 
    254252    /** 
    255253     * Extract XML from URL and import as posts 
     
    271269        } 
    272270 
    273         $body = $data['body']; 
    274         if ( seems_utf8( $body ) ) 
    275             $body = utf8_encode( $body ); 
    276  
    277         $posts = json_decode( utf8_encode( $body ) ); 
     271        $body = $this->ensure_utf8( $data['body'] ); 
     272 
     273        $posts = json_decode( $body ); 
    278274 
    279275        if ( !is_array( $posts ) ) { 
    280276            printf( __METHOD__ . ": <em>%s</em><br />\n", __( 'Error loading JSON data.' ) ); 
    281             $this->have_posts = false;  
     277            $this->have_posts = false; 
    282278            return; 
    283279        } 
     
    293289            $permalink = (string) $entry->full_url; 
    294290            $commentscount = (int) $entry->number_of_comments; 
    295              
     291 
    296292            switch( $type ) { 
    297293                case 'pages': 
     
    304300                    $_permalinks = $this->permalinks; 
    305301            } 
    306              
     302 
    307303            if ( isset( $_permalinks[$permalink] ) ) { 
    308304                printf( "<em>%s</em><br />\n", __( 'Skipping' ) . ' ' . $entry->title ); 
     
    312308                    $this->process_comments( $_permalinks[$permalink], $entry ); 
    313309                continue; 
    314             }                    
     310            } 
    315311 
    316312            $post = array(); 
    317             $post['post_title'] = (string) $entry->title;                        
     313            $post['post_title'] = (string) $entry->title; 
    318314            $post['post_status'] = 'publish'; 
    319315            switch ( $type ) { 
     
    351347            if ( isset( $entry->media ) ) { 
    352348                $media = array(); 
    353                  
    354                 foreach ( $entry->media->videos as $video ) {    
     349 
     350                foreach ( $entry->media->videos as $video ) { 
    355351                    $file = new stdClass(); 
    356352                    $file->type = ''; 
     
    358354                    $file->filesize = (string) $video->size; 
    359355                    $file->thumb = (string) $video->thumb; 
    360                     //$file->filesize=''; 
    361356                    $media[] = $file; 
    362357                } 
     
    370365 
    371366                if ( 0 < count( $media ) ) 
    372                     add_post_meta( $post_id, 'posterous_' . $this->bid . '_media', $media, true );                                   
     367                    add_post_meta( $post_id, 'posterous_' . $this->bid . '_media', $media, true ); 
    373368            } 
    374369 
    375370            printf( "<em>%s</em><br />\n", __( 'Importing' ) . ' ' . $entry->title ); 
    376              
     371 
    377372            $_permalinks[$permalink] = $post_id; 
    378373 
     
    499494                $_permalinks = $this->permalinks; 
    500495        } 
    501          
     496 
    502497        if ( empty( $_permalinks ) ) 
    503498            return; 
     
    518513            } 
    519514 
     515            /* Process elements in the $single array only if they haven't already been processed 
     516             * for the fullsize array. The need to do this is a byproduct of our dealing 
     517             * with Posterous's dimension scaling hack. 
     518             */ 
     519            $single = array_diff( $attachments['single'], $attachments['fullsize'] ); 
     520            if ( !empty( $single ) ) { 
     521                do_action( 'process_attachment', $post, $attachments['single'], $attachments['thumb'] ); 
     522            } 
     523 
    520524            if ( !empty( $attachments['single'] ) ) { 
    521525                do_action( 'process_attachment', $post, $attachments['single'], $attachments['single'] ); 
     
    536540     * @return void 
    537541     */ 
    538     function process_attachment( $post, $fullsizes, $thumbs ) {          
    539         // Add media files from postmeta to the $fullsizes array for fetching. 
    540         $media_types = array(); 
    541         $media = get_post_meta( $post->ID, 'posterous_' . $this->bid . '_media', true );         
    542         if ( is_array( $media ) ) { 
    543             foreach ( $media as $m ) { 
    544                 $fullsizes[] = $m->url; 
    545                 $media_types[$m->url] = $m->type; 
    546             } 
    547         } 
    548          
     542    function process_attachment( $post, $fullsizes, $thumbs ) { 
    549543        if ( empty( $fullsizes ) ) 
    550544            return; 
     
    554548                return false; 
    555549 
     550            /** 
     551             * Check to see if we've already fetched the path for this image. Posterous 
     552             * serves files from different hostnames, so if we don't check by path only, 
     553             * we can download multiple times. Since we still want to do thumbs and 
     554             * do a url remapping later for the $fullpath url (which may be referenced in 
     555             * page source), do those bits even if we've already seen this $fullsize_path but then bail. 
     556             */ 
     557            $fullsize_path = parse_url( $fullsize, PHP_URL_PATH ); 
     558 
    556559            $thumb = $thumbs[$id]; 
    557560 
    558561            // Skip duplicates 
    559             if ( isset( $this->attachments[$fullsize] ) ) { 
     562            if ( isset( $this->attachments[$fullsize_path] ) ) { 
    560563                $post_id = $this->attachments[$fullsize]; 
    561564                printf( "<em>%s</em><br />\n", __( 'Skipping duplicate' ) . ' ' . $fullsize ); 
     
    575578            echo '<em>Importing attachment ' . htmlspecialchars( $fullsize ) . "...</em>"; 
    576579            $upload = $this->fetch_remote_file( $post, $fullsize ); 
    577              
     580 
    578581            if ( is_wp_error( $upload ) ) { 
    579582                printf( "<em>%s</em><br />\n", __( 'Remote file error:' ) . ' ' . htmlspecialchars( $upload->get_error_message() ) ); 
     
    597600 
    598601            // as per wp-admin/includes/upload.php 
    599             $attachment = array (  
    600                 'post_title' => $post->post_title,  
    601                 'post_content' => '',  
    602                 'post_status' => 'inherit',  
    603                 'guid' => $upload['url'],  
    604                 'post_mime_type' => $info['type']  
     602            $attachment = array ( 
     603                'post_title' => $post->post_title, 
     604                'post_content' => '', 
     605                'post_status' => 'inherit', 
     606                'guid' => $upload['url'], 
     607                'post_mime_type' => $info['type'] 
    605608                ); 
    606      
     609 
    607610            $post_id = (int) wp_insert_attachment( $attachment, $upload['file'], $post->ID ); 
    608611            $attachment_meta = @wp_generate_attachment_metadata( $post_id, $upload['file'] ); 
    609             wp_update_attachment_metadata( $post_id, $attachment_meta );                         
     612            wp_update_attachment_metadata( $post_id, $attachment_meta ); 
    610613 
    611614            // Fire an action to do anything we might like to do to the post after adding an attachment (e.g. inserting shortcodes). 
     
    617620            // Add remote_url to hash table 
    618621            $this->attachments[$fullsize] = $post_id; 
    619              
     622 
    620623            // Get new attachment URL 
    621624            $attachment_url = wp_get_attachment_url( $post_id ); 
     
    625628            if ( isset( $sized[0] ) ) { 
    626629                $this->url_remap[$thumb] = $sized[0]; 
    627             }            
    628         } 
    629          
     630            } 
     631        } 
     632 
    630633        $this->backfill_attachment_urls( $post ); 
    631634    } 
     
    641644 
    642645        // make sure we do the longest urls first, in case one is a substring of another 
    643         uksort( $this->url_remap, array( &$this, 'cmpr_strlen') ); 
     646        uksort( $this->url_remap, array( $this, 'cmpr_strlen') ); 
    644647 
    645648        $from_urls = array_keys( $this->url_remap ); 
     
    663666    function fetch_remote_file( $post, $url ) { 
    664667        // Increase the timeout 
    665         add_filter( 'http_request_timeout', array( &$this, 'bump_request_timeout' ) ); 
     668        add_filter( 'http_request_timeout', array( $this, 'bump_request_timeout' ) ); 
    666669 
    667670        $parts = parse_url( $url ); 
    668671        $filename = basename( $parts['path'] ); 
    669          
     672 
    670673        // get placeholder file in the upload dir with a unique sanitized filename 
    671674        $upload = wp_upload_bits( $filename, 0, '', $post->post_date ); 
     
    680683 
    681684        /** 
    682          * Hosts in safe mode or with open_basedir set use custom stuff for  
     685         * Hosts in safe mode or with open_basedir set use custom stuff for 
    683686         * handling redirects when curl is the http transport. Something in that process 
    684687         * that I haven't figured out yet mucks up URLs with entities like "=" in them. 
    685          * This is bad for some Amazon S3 URLs that end with an = sign that gets  
     688         * This is bad for some Amazon S3 URLs that end with an = sign that gets 
    686689         * translated to %3D in S3 file signatures and causes the redirection to 
    687690         * result in an error response from S3. Just intercept redirects here and 
    688          * go ahead and set the URL to the destination S3 url to bypass the underlying  
     691         * go ahead and set the URL to the destination S3 url to bypass the underlying 
    689692         * issue, which probably needs further investigation. 
    690693         */ 
     
    733736        $matches = array(); 
    734737        preg_match_all( '|<a.*?href=[\'"](.*?)[\'"].*?><img.*?src=[\'"](.*?)[\'"].*?>|i', $post_content, $matches ); 
     738 
    735739        foreach ( $matches[1] as $i => $url ) { 
    736740            if ( strstr( $url, 'posterous.com' ) ) { 
     
    754758                $attachments['fullsize'][] = $m->url; 
    755759            } 
    756         }        
     760        } 
    757761        unset( $post_content, $matches ); 
    758762        return $attachments; 
     
    779783                // Set permalinks into array 
    780784                $hashtable[$r->meta_value] = (int) $r->post_id; 
     785                $fullsize_path = parse_url( $r->meta_value, PHP_URL_PATH ); 
     786                $hashtable[$fullsize_path] = (int) $r->post_id; 
    781787            } 
    782788        } 
     
    921927            success: function( data, status ) { 
    922928                code = data; 
    923                 //alert(code);                   
    924             if ( '401' == code ) { 
    925                 $('#spinner').hide(); 
    926                 $('#auth_message').html("Please check your user name and password, Posterous says it's incorrect."); 
    927                 $('#import_submit').attr('value', 'Submit'); 
    928                 $('#import_submit').removeAttr('disabled'); 
    929  
    930                 return false; 
    931             } 
    932          
    933             if ( '200' == code ) { 
    934                 $.ajax({ 
    935                     type: 'POST', 
    936                     url: 'admin.php?import=posterous&noheader=true&step=2', 
    937                     data: dataString, 
    938                     success: function( data, status ) { 
    939                         if ( 'ready' == data ) { 
    940                           window.location = 'admin.php?import=posterous&step=3'; 
     929                if ( '401' == code ) { 
     930                    $('#spinner').hide(); 
     931                    $('#auth_message').html("Please check your user name and password, Posterous says it's incorrect."); 
     932                    $('#import_submit').attr('value', 'Submit'); 
     933                    $('#import_submit').removeAttr('disabled'); 
     934 
     935                    return false; 
     936                } 
     937                if ( '200' == code ) { 
     938                    $.ajax({ 
     939                        type: 'POST', 
     940                        url: 'admin.php?import=posterous&noheader=true&step=2', 
     941                        data: dataString, 
     942                        success: function( data, status ) { 
     943                            if ( 'ready' == data ) { 
     944                              window.location = 'admin.php?import=posterous&step=3'; 
     945                            } 
    941946                        } 
    942                     } 
    943                   }); 
    944  
    945                   return true; 
    946             } 
     947                      }); 
     948 
     949                      return true; 
     950                } 
    947951 
    948952            } 
     
    956960 * jQuery doTimeout: Like setTimeout, but better! - v0.4 - 7/15/2009 
    957961 * http://benalman.com/projects/jquery-dotimeout-plugin/ 
    958  *  
     962 * 
    959963 * Copyright (c) 2009 "Cowboy" Ben Alman 
    960964 * Dual licensed under the MIT and GPL licenses. 
     
    984988 
    985989        var ajaxurl = 'admin.php?import=posterous&noheader=true&status=true&hostname=' + $('#hostname').val(); 
    986         $.getJSON( ajaxurl, function( data ) {  
     990        $.getJSON( ajaxurl, function( data ) { 
    987991            var jo = eval( data ); 
    988992            $('#posts_count').html( jo.posts ); 
     
    994998        }); 
    995999    }); 
    996      
     1000 
    9971001    $('#stop_poll').click( function() { 
    9981002        // Cancel the polling loop with id of 'loop'. 
     
    10741078        $data->username = $username; 
    10751079        $data->password = $password; 
    1076          
     1080 
    10771081        add_option( 'posterous_import', $data ); 
    10781082        echo 'ready'; 
     
    10851089        if ( !is_object( $data ) ) 
    10861090            die(); 
    1087      
     1091 
    10881092        $this->hostname = $this->sanitize_hostname( $data->hostname ); 
    10891093        $this->bid = md5( $this->hostname ); 
     
    10931097        if ( !empty( $this->username ) && !empty( $this->password ) ) 
    10941098            $this->auth = true; 
    1095      
     1099 
    10961100        $this->blog_id = $this->set_blog( $blog_id ); 
    10971101        $this->user_id = $this->set_user( $current_user->ID ); 
     
    11471151        // A hook to do anything we might like to do before proceeding. Not implemented but potentially useful for extending the plugin. 
    11481152        do_action( 'posterous_pre_dispatch' ); 
    1149          
     1153 
    11501154        // Set step 
    11511155        $step = isset( $_GET['step'] ) ? (int) $_GET['step'] : 1; 
     
    11531157        if ( isset( $_GET['hostname'] ) && isset( $_GET['status'] ) ) 
    11541158            die( $this->get_importer_status( $_GET['hostname'] ) ); 
    1155          
     1159 
    11561160        if ( isset( $_GET['test_user_pass'] ) ) 
    11571161            die( $this->test_user_pass( $_POST['hostname'], $_POST['username'], $_POST['password'] ) ); 
     
    11751179    } 
    11761180 
    1177     function process_links() {       
     1181    function process_links() { 
    11781182        $url = 'http://posterous.com/api/2/sites/' . $this->site_id . '/link_categories'; 
    1179         $url = add_query_arg( 'api_token', $this->api_token, $url );         
     1183        $url = add_query_arg( 'api_token', $this->api_token, $url ); 
    11801184        do_action( 'posterous_api_sleep' ); 
    1181         $data = $this->get_page( $url, $this->username, $this->password );       
     1185        $data = $this->get_page( $url, $this->username, $this->password ); 
    11821186        if ( is_wp_error( $data ) ) { 
    11831187            echo "Error:\n" . $data->get_error_message() . "\n"; 
     
    11901194        } 
    11911195 
    1192         $body = $data['body']; 
    1193         if ( seems_utf8( $body ) ) 
    1194             $body = utf8_encode( $body ); 
     1196        $body = $this->ensure_utf8( $data['body'] ); 
    11951197 
    11961198        $categories = json_decode( $body ); 
     
    12021204                $links_url = add_query_arg( 'api_token', $this->api_token, $links_url ); 
    12031205                $data = $this->get_page( $links_url, $this->username, $this->password ); 
    1204                  
     1206 
    12051207                if ( is_wp_error( $data ) ) { 
    12061208                    echo "Error:\n" . $data->get_error_message() . "\n"; 
    12071209                    return; 
    12081210                } 
    1209          
     1211 
    12101212                $code = (int) $data['response']['code']; 
    12111213                if ( 200 !== $code ) { 
    12121214                    do_action( 'posterous_handle_bad_response', $data, $code ); 
    12131215                } 
    1214          
    1215                 $body = $data['body']; 
    1216                 if ( seems_utf8( $body ) ) 
    1217                     $body = utf8_encode( $body ); 
     1216 
     1217                $body = $this->ensure_utf8( $data['body'] ); 
    12181218 
    12191219                $links = json_decode( $body ); 
    12201220                foreach ( $links as $link ) { 
    12211221                    $this->add_link( $link ); 
    1222                 }                
    1223             } 
    1224         }    
     1222                } 
     1223            } 
     1224        } 
    12251225    } 
    12261226 
     
    12311231            if ( is_array( $term ) ) 
    12321232                $this->category_map[$category->id] = $term['term_id']; 
    1233             else     
     1233            else 
    12341234                $this->category_map[$category->id] = $term; 
    12351235            return true; 
    12361236        } 
    1237              
     1237 
    12381238        $cat = wp_insert_term( $category->title, 'link_category' ) ; 
    12391239        if ( is_wp_error( $cat ) ) { 
     
    12441244        return true; 
    12451245    } 
    1246      
     1246 
    12471247    function add_link( $link ) { 
    12481248        $link_data = array(); 
     
    12681268    } 
    12691269 
     1270    function ensure_utf8( $input ) { 
     1271        $input = mb_convert_encoding( $input, 'UTF-8', 'ASCII,UTF-8,ISO-8859-1' ); 
     1272        if (substr ( $input, 0, 3) == pack( "CCC", 0xEF, 0xBB, 0xBF ) ) 
     1273            $input = substr( $input, 3 ); 
     1274 
     1275        return $input; 
     1276    } 
     1277 
    12701278} 
    12711279} 
     
    12731281$posterous = new Posterous_Import(); 
    12741282register_importer( 'posterous', __( 'Posterous' ), __( 'Import posts, comments, tags, and attachments from a Posterous.com blog.' ), array( $posterous, 'dispatch' ) ); 
     1283 
Note: See TracChangeset for help on using the changeset viewer.