diff -r 490d5cc509ed -r cf61fcea0001 wp/wp-admin/includes/media.php --- a/wp/wp-admin/includes/media.php Tue Jun 09 11:14:17 2015 +0000 +++ b/wp/wp-admin/includes/media.php Mon Oct 14 17:39:30 2019 +0200 @@ -22,7 +22,7 @@ ); /** - * Filter the available tabs in the legacy (pre-3.5.0) media popup. + * Filters the available tabs in the legacy (pre-3.5.0) media popup. * * @since 2.5.0 * @@ -36,6 +36,8 @@ * * @since 2.5.0 * + * @global wpdb $wpdb WordPress database abstraction object. + * * @param array $tabs * @return array $tabs with gallery if post has image attachment */ @@ -61,12 +63,13 @@ return $tabs; } -add_filter('media_upload_tabs', 'update_gallery_tab'); /** - * {@internal Missing Short Description}} + * Outputs the legacy media upload tabs UI. * * @since 2.5.0 + * + * @global string $redir_tab */ function the_media_upload_tabs() { global $redir_tab; @@ -99,42 +102,52 @@ } /** - * {@internal Missing Short Description}} + * Retrieves the image HTML to send to the editor. * * @since 2.5.0 * - * @param integer $id image attachment id - * @param string $caption image caption - * @param string $alt image alt attribute - * @param string $title image title attribute - * @param string $align image css alignment property - * @param string $url image src url - * @param string|bool $rel image rel attribute - * @param string $size image size (thumbnail, medium, large, full or added with add_image_size() ) - * @return string the html to insert into editor + * @param int $id Image attachment id. + * @param string $caption Image caption. + * @param string $title Image title attribute. + * @param string $align Image CSS alignment property. + * @param string $url Optional. Image src URL. Default empty. + * @param bool|string $rel Optional. Value for rel attribute or whether to add a default value. Default false. + * @param string|array $size Optional. Image size. Accepts any valid image size, or an array of width + * and height values in pixels (in that order). Default 'medium'. + * @param string $alt Optional. Image alt attribute. Default empty. + * @return string The HTML output to insert into the editor. */ -function get_image_send_to_editor($id, $caption, $title, $align, $url='', $rel = false, $size='medium', $alt = '') { - - $html = get_image_tag($id, $alt, '', $align, $size); - - $rel = $rel ? ' rel="attachment wp-att-' . esc_attr($id).'"' : ''; +function get_image_send_to_editor( $id, $caption, $title, $align, $url = '', $rel = false, $size = 'medium', $alt = '' ) { + + $html = get_image_tag( $id, $alt, '', $align, $size ); + + if ( $rel ) { + if ( is_string( $rel ) ) { + $rel = ' rel="' . esc_attr( $rel ) . '"'; + } else { + $rel = ' rel="attachment wp-att-' . intval( $id ) . '"'; + } + } else { + $rel = ''; + } if ( $url ) - $html = '$html"; + $html = '' . $html . ''; /** - * Filter the image HTML markup to send to the editor. + * Filters the image HTML markup to send to the editor when inserting an image. * * @since 2.5.0 * - * @param string $html The image HTML markup to send. - * @param int $id The attachment id. - * @param string $caption The image caption. - * @param string $title The image title. - * @param string $align The image alignment. - * @param string $url The image source URL. - * @param string $size The image size. - * @param string $alt The image alternative, or alt, text. + * @param string $html The image HTML markup to send. + * @param int $id The attachment id. + * @param string $caption The image caption. + * @param string $title The image title. + * @param string $align The image alignment. + * @param string $url The image source URL. + * @param string|array $size Size of image. Image size or array of width and height values + * (in that order). Default 'medium'. + * @param string $alt The image alternative, or alt, text. */ $html = apply_filters( 'image_send_to_editor', $html, $id, $caption, $title, $align, $url, $size, $alt ); @@ -149,23 +162,23 @@ * @param string $html * @param integer $id * @param string $caption image caption - * @param string $alt image alt attribute * @param string $title image title attribute * @param string $align image css alignment property * @param string $url image src url * @param string $size image size (thumbnail, medium, large, full or added with add_image_size() ) + * @param string $alt image alt attribute * @return string */ function image_add_caption( $html, $id, $caption, $title, $align, $url, $size, $alt = '' ) { /** - * Filter the caption text. + * Filters the caption text. * * Note: If the caption text is empty, the caption shortcode will not be appended * to the image HTML when inserted into the editor. * * Passing an empty value also prevents the {@see 'image_add_caption_shortcode'} - * filter from being evaluated at the end of {@see image_add_caption()}. + * Filters from being evaluated at the end of image_add_caption(). * * @since 4.1.0 * @@ -175,7 +188,7 @@ $caption = apply_filters( 'image_add_caption_text', $caption, $id ); /** - * Filter whether to disable captions. + * Filters whether to disable captions. * * Prevents image captions from being appended to image HTML when inserted into the editor. * @@ -207,7 +220,7 @@ $shcode = '[caption id="' . $id . '" align="align' . $align . '" width="' . $width . '"]' . $html . ' ' . $caption . '[/caption]'; /** - * Filter the image HTML markup including the caption shortcode. + * Filters the image HTML markup including the caption shortcode. * * @since 2.6.0 * @@ -216,7 +229,6 @@ */ return apply_filters( 'image_add_caption_shortcode', $shcode, $html ); } -add_filter( 'image_send_to_editor', 'image_add_caption', 20, 8 ); /** * Private preg_replace callback used in image_add_caption() @@ -240,7 +252,7 @@ ?> false )) { $time = current_time('mysql'); if ( $post = get_post($post_id) ) { - if ( substr( $post->post_date, 0, 4 ) > 0 ) + // The post date doesn't usually matter for pages, so don't backdate this upload. + if ( 'page' !== $post->post_type && substr( $post->post_date, 0, 4 ) > 0 ) $time = $post->post_date; } - $name = $_FILES[$file_id]['name']; $file = wp_handle_upload($_FILES[$file_id], $overrides, $time); if ( isset($file['error']) ) return new WP_Error( 'upload_error', $file['error'] ); - $name_parts = pathinfo($name); - $name = trim( substr( $name, 0, -(1 + strlen($name_parts['extension'])) ) ); + $name = $_FILES[$file_id]['name']; + $ext = pathinfo( $name, PATHINFO_EXTENSION ); + $name = wp_basename( $name, ".$ext" ); $url = $file['url']; $type = $file['type']; $file = $file['file']; - $title = $name; + $title = sanitize_text_field( $name ); $content = ''; $excerpt = ''; @@ -301,6 +314,7 @@ /* translators: 1: audio track title, 2: artist name */ $content .= sprintf( __( '"%1$s" by %2$s.' ), $title, $meta['artist'] ); } else { + /* translators: 1: audio track title */ $content .= sprintf( __( '"%s".' ), $title ); } @@ -319,22 +333,29 @@ } - if ( ! empty( $meta['year'] ) ) + if ( ! empty( $meta['year'] ) ) { + /* translators: Audio file track information. 1: Year of audio track release */ $content .= ' ' . sprintf( __( 'Released: %d.' ), $meta['year'] ); + } if ( ! empty( $meta['track_number'] ) ) { $track_number = explode( '/', $meta['track_number'] ); - if ( isset( $track_number[1] ) ) + if ( isset( $track_number[1] ) ) { + /* translators: Audio file track information. 1: Audio track number, 2: Total audio tracks */ $content .= ' ' . sprintf( __( 'Track %1$s of %2$s.' ), number_format_i18n( $track_number[0] ), number_format_i18n( $track_number[1] ) ); - else + } else { + /* translators: Audio file track information. 1: Audio track number */ $content .= ' ' . sprintf( __( 'Track %1$s.' ), number_format_i18n( $track_number[0] ) ); + } } - if ( ! empty( $meta['genre'] ) ) + if ( ! empty( $meta['genre'] ) ) { + /* translators: Audio file genre information. 1: Audio genre name */ $content .= ' ' . sprintf( __( 'Genre: %s.' ), $meta['genre'] ); + } // Use image exif/iptc data for title and caption defaults if possible. - } elseif ( 0 === strpos( $type, 'image/' ) && $image_meta = @wp_read_image_metadata( $file ) ) { + } elseif ( 0 === strpos( $type, 'image/' ) && $image_meta = wp_read_image_metadata( $file ) ) { if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) { $title = $image_meta['title']; } @@ -355,11 +376,10 @@ ), $post_data ); // This should never be set as it would then overwrite an existing attachment. - if ( isset( $attachment['ID'] ) ) - unset( $attachment['ID'] ); + unset( $attachment['ID'] ); // Save the data - $id = wp_insert_attachment($attachment, $file, $post_id); + $id = wp_insert_attachment( $attachment, $file, $post_id, true ); if ( !is_wp_error($id) ) { wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) ); } @@ -369,17 +389,17 @@ } /** - * This handles a sideloaded file in the same way as an uploaded file is handled by {@link media_handle_upload()} + * Handles a side-loaded file in the same way as an uploaded file is handled by media_handle_upload(). * * @since 2.6.0 * - * @param array $file_array Array similar to a {@link $_FILES} upload array - * @param int $post_id The post ID the media is associated with - * @param string $desc Description of the sideloaded file - * @param array $post_data allows you to overwrite some of the attachment - * @return int|object The ID of the attachment or a WP_Error on failure + * @param array $file_array Array similar to a `$_FILES` upload array. + * @param int $post_id The post ID the media is associated with. + * @param string $desc Optional. Description of the side-loaded file. Default null. + * @param array $post_data Optional. Post data to override. Default empty array. + * @return int|object The ID of the attachment or a WP_Error on failure. */ -function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = array()) { +function media_handle_sideload( $file_array, $post_id, $desc = null, $post_data = array() ) { $overrides = array('test_form'=>false); $time = current_time( 'mysql' ); @@ -399,7 +419,7 @@ $content = ''; // Use image exif/iptc data for title and caption defaults if possible. - if ( $image_meta = @wp_read_image_metadata($file) ) { + if ( $image_meta = wp_read_image_metadata( $file ) ) { if ( trim( $image_meta['title'] ) && ! is_numeric( sanitize_title( $image_meta['title'] ) ) ) $title = $image_meta['title']; if ( trim( $image_meta['caption'] ) ) @@ -419,8 +439,7 @@ ), $post_data ); // This should never be set as it would then overwrite an existing attachment. - if ( isset( $attachment['ID'] ) ) - unset( $attachment['ID'] ); + unset( $attachment['ID'] ); // Save the attachment metadata $id = wp_insert_attachment($attachment, $file, $post_id); @@ -435,6 +454,8 @@ * * @since 2.5.0 * + * @global int $body_id + * * @param string|callable $content_func */ function wp_iframe($content_func /* ... */) { @@ -447,7 +468,7 @@ // Check callback name for 'media' if ( ( is_array( $content_func ) && ! empty( $content_func[1] ) && 0 === strpos( (string) $content_func[1], 'media' ) ) || ( ! is_array( $content_func ) && 0 === strpos( $content_func, 'media' ) ) ) - wp_enqueue_style( 'media' ); + wp_enqueue_style( 'deprecated-media' ); wp_enqueue_style( 'ie' ); ?> \n"; + + echo ''; if ( empty( $_GET['chromeless'] ) ) { echo '
'; the_media_upload_tabs(); @@ -1724,10 +1791,15 @@ } /** - * {@internal Missing Short Description}} + * Outputs the legacy media upload form. * * @since 2.5.0 * + * @global string $type + * @global string $tab + * @global bool $is_IE + * @global bool $is_opera + * * @param array $errors */ function media_upload_form( $errors = null ) { @@ -1788,7 +1860,7 @@ ); /** - * Filter the media upload post parameters. + * Filters the media upload post parameters. * * @since 3.1.0 As 'swfupload_post_params' * @since 3.3.0 @@ -1797,15 +1869,16 @@ */ $post_params = apply_filters( 'upload_post_params', $post_params ); +/* + * Since 4.9 the `runtimes` setting is hardcoded in our version of Plupload to `html5,html4`, + * and the `flash_swf_url` and `silverlight_xap_url` are not used. + */ $plupload_init = array( - 'runtimes' => 'html5,flash,silverlight,html4', 'browse_button' => 'plupload-browse-button', 'container' => 'plupload-upload-ui', 'drop_element' => 'drag-drop-area', 'file_data_name' => 'async-upload', 'url' => $upload_action_url, - 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), - 'silverlight_xap_url' => includes_url( 'js/plupload/plupload.silverlight.xap' ), 'filters' => array( 'max_file_size' => $max_upload_size . 'b', ), @@ -1821,7 +1894,7 @@ } /** - * Filter the default Plupload settings. + * Filters the default Plupload settings. * * @since 3.3.0 * @@ -1883,7 +1956,7 @@

- +

@@ -1911,7 +1984,7 @@ } /** - * {@internal Missing Short Description}} + * Outputs the legacy media upload form for a given media type. * * @since 2.5.0 * @@ -1928,7 +2001,7 @@ $form_action_url = admin_url("media-upload.php?type=$type&tab=type&post_id=$post_id"); /** - * Filter the media upload form action URL. + * Filters the media upload form action URL. * * @since 2.6.0 * @@ -1974,14 +2047,14 @@ ?>

- +

" alt="" />'; }, @@ -2108,7 +2181,7 @@

- 'save-all', 'style' => 'display: none;' ) ); ?> + 'save-all', 'style' => 'display: none;' ) ); ?> @@ -2268,10 +2345,17 @@ } /** - * {@internal Missing Short Description}} + * Outputs the legacy media upload form for the media library. * * @since 2.5.0 * + * @global wpdb $wpdb + * @global WP_Query $wp_query + * @global WP_Locale $wp_locale + * @global string $type + * @global string $tab + * @global array $post_mime_types + * * @param array $errors */ function media_upload_library_form($errors) { @@ -2314,7 +2398,7 @@

@@ -2441,7 +2525,7 @@

- +

@@ -2484,21 +2568,21 @@ return '

   

+

' . sprintf( __( 'Required fields are marked %s' ), '*' ) . '

- + - + @@ -2544,7 +2628,7 @@
- - * + +
- - * +

' . __('Link text, e.g. “Ransom Demands (PDF)”') . '

- ' . get_submit_button( __( 'Insert into Post' ), 'button', 'insertonlybutton', false ) . ' + ' . get_submit_button( __( 'Insert into Post' ), '', 'insertonlybutton', false ) . '
@@ -2556,6 +2640,8 @@ * Displays the multi-file uploader message. * * @since 2.6.0 + * + * @global int $post_ID */ function media_upload_flash_bypass() { $browser_uploader = admin_url( 'media-new.php?browser-uploader' ); @@ -2571,7 +2657,6 @@

ID, '_wp_attachment_image_alt', true ); $att_url = wp_get_attachment_url( $post->ID ); ?> -
+
ID ) ) : $image_edit_button = ''; @@ -2656,7 +2742,7 @@
- class="wp_attachment_image" id="media-head-"> + class="wp_attachment_image wp-clearfix" id="media-head-">

@@ -2694,6 +2780,27 @@ echo wp_video_shortcode( $attr ); + elseif ( isset( $thumb_url[0] ) ): + + ?> +
+

+ +

+
+
@@ -2721,7 +2828,7 @@ ); ?> - @@ -2735,14 +2842,15 @@ } /** - * Displays non-editable attachment metadata in the publish metabox + * Displays non-editable attachment metadata in the publish meta box. * * @since 3.5.0 */ function attachment_submitbox_metadata() { $post = get_post(); - $filename = esc_html( wp_basename( $post->guid ) ); + $file = get_attached_file( $post->ID ); + $filename = esc_html( wp_basename( $file ) ); $media_dims = ''; $meta = wp_get_attachment_metadata( $post->ID ); @@ -2754,8 +2862,8 @@ $att_url = wp_get_attachment_url( $post->ID ); ?>
- - + +
@@ -2777,7 +2885,6 @@
ID ); $file_size = false; if ( isset( $meta['filesize'] ) ) @@ -2793,21 +2900,24 @@ endif; if ( preg_match( '#^(audio|video)/#', $post->post_mime_type ) ) { + $fields = array( + 'length_formatted' => __( 'Length:' ), + 'bitrate' => __( 'Bitrate:' ), + ); /** - * Filter the audio and video metadata fields to be shown in the publish meta box. + * Filters the audio and video metadata fields to be shown in the publish meta box. * * The key for each item in the array should correspond to an attachment * metadata key, and the value should be the desired label. * * @since 3.7.0 + * @since 4.9.0 Added the `$post` parameter. * - * @param array $fields An array of the attachment metadata keys and labels. + * @param array $fields An array of the attachment metadata keys and labels. + * @param WP_Post $post WP_Post object for the current attachment. */ - $fields = apply_filters( 'media_submitbox_misc_sections', array( - 'length_formatted' => __( 'Length:' ), - 'bitrate' => __( 'Bitrate:' ), - ) ); + $fields = apply_filters( 'media_submitbox_misc_sections', $fields, $post ); foreach ( $fields as $key => $label ) { if ( empty( $meta[ $key ] ) ) { @@ -2832,20 +2942,24 @@ __( 'Audio Format:' ), + 'codec' => __( 'Audio Codec:' ) + ); + /** - * Filter the audio attachment metadata fields to be shown in the publish meta box. + * Filters the audio attachment metadata fields to be shown in the publish meta box. * * The key for each item in the array should correspond to an attachment * metadata key, and the value should be the desired label. * * @since 3.7.0 + * @since 4.9.0 Added the `$post` parameter. * - * @param array $fields An array of the attachment metadata keys and labels. + * @param array $fields An array of the attachment metadata keys and labels. + * @param WP_Post $post WP_Post object for the current attachment. */ - $audio_fields = apply_filters( 'audio_submitbox_misc_sections', array( - 'dataformat' => __( 'Audio Format:' ), - 'codec' => __( 'Audio Codec:' ) - ) ); + $audio_fields = apply_filters( 'audio_submitbox_misc_sections', $fields, $post ); foreach ( $audio_fields as $key => $label ) { if ( empty( $meta['audio'][ $key ] ) ) { @@ -2868,21 +2982,6 @@ endif; } -add_filter( 'async_upload_image', 'get_media_item', 10, 2 ); -add_filter( 'async_upload_audio', 'get_media_item', 10, 2 ); -add_filter( 'async_upload_video', 'get_media_item', 10, 2 ); -add_filter( 'async_upload_file', 'get_media_item', 10, 2 ); - -add_action( 'media_upload_image', 'wp_media_upload_handler' ); -add_action( 'media_upload_audio', 'wp_media_upload_handler' ); -add_action( 'media_upload_video', 'wp_media_upload_handler' ); -add_action( 'media_upload_file', 'wp_media_upload_handler' ); - -add_filter( 'media_upload_gallery', 'media_upload_gallery' ); -add_filter( 'media_upload_library', 'media_upload_library' ); - -add_action( 'attachment_submitbox_misc_actions', 'attachment_submitbox_metadata' ); - /** * Parse ID3v2, ID3v1, and getID3 comments to extract usable data * @@ -2896,7 +2995,7 @@ if ( ! empty( $data[$version]['comments'] ) ) { foreach ( $data[$version]['comments'] as $key => $list ) { if ( 'length' !== $key && ! empty( $list ) ) { - $metadata[$key] = reset( $list ); + $metadata[$key] = wp_kses_post( reset( $list ) ); // Fix bug in byte stream analysis. if ( 'terms_of_use' === $key && 0 === strpos( $metadata[$key], 'yright notice.' ) ) $metadata[$key] = 'Cop' . $metadata[$key]; @@ -2936,13 +3035,19 @@ * @return array|bool Returns array of metadata, if found. */ function wp_read_video_metadata( $file ) { - if ( ! file_exists( $file ) ) + if ( ! file_exists( $file ) ) { return false; + } $metadata = array(); - if ( ! class_exists( 'getID3' ) ) + if ( ! defined( 'GETID3_TEMP_DIR' ) ) { + define( 'GETID3_TEMP_DIR', get_temp_dir() ); + } + + if ( ! class_exists( 'getID3', false ) ) { require( ABSPATH . WPINC . '/ID3/getid3.php' ); + } $id3 = new getID3(); $data = $id3->analyze( $file ); @@ -2978,9 +3083,32 @@ $metadata['audio'] = $data['audio']; } + if ( empty( $metadata['created_timestamp'] ) ) { + $created_timestamp = wp_get_media_creation_timestamp( $data ); + + if ( $created_timestamp !== false ) { + $metadata['created_timestamp'] = $created_timestamp; + } + } + wp_add_id3_tag_data( $metadata, $data ); - return $metadata; + $file_format = isset( $metadata['fileformat'] ) ? $metadata['fileformat'] : null; + + /** + * Filters the array of metadata retrieved from a video. + * + * In core, usually this selection is what is stored. + * More complete data can be parsed from the `$data` parameter. + * + * @since 4.9.0 + * + * @param array $metadata Filtered Video metadata. + * @param string $file Path to video file. + * @param string $file_format File format of video, as analyzed by getID3. + * @param string $data Raw metadata from getID3. + */ + return apply_filters( 'wp_read_video_metadata', $metadata, $file, $file_format, $data ); } /** @@ -2989,15 +3117,21 @@ * @since 3.6.0 * * @param string $file Path to file. - * @return array|boolean Returns array of metadata, if found. + * @return array|bool Returns array of metadata, if found. */ function wp_read_audio_metadata( $file ) { - if ( ! file_exists( $file ) ) + if ( ! file_exists( $file ) ) { return false; + } $metadata = array(); - if ( ! class_exists( 'getID3' ) ) + if ( ! defined( 'GETID3_TEMP_DIR' ) ) { + define( 'GETID3_TEMP_DIR', get_temp_dir() ); + } + + if ( ! class_exists( 'getID3', false ) ) { require( ABSPATH . WPINC . '/ID3/getid3.php' ); + } $id3 = new getID3(); $data = $id3->analyze( $file ); @@ -3023,6 +3157,55 @@ } /** + * Parse creation date from media metadata. + * + * The getID3 library doesn't have a standard method for getting creation dates, + * so the location of this data can vary based on the MIME type. + * + * @since 4.9.0 + * + * @link https://github.com/JamesHeinrich/getID3/blob/master/structure.txt + * + * @param array $metadata The metadata returned by getID3::analyze(). + * @return int|bool A UNIX timestamp for the media's creation date if available + * or a boolean FALSE if a timestamp could not be determined. + */ +function wp_get_media_creation_timestamp( $metadata ) { + $creation_date = false; + + if ( empty( $metadata['fileformat'] ) ) { + return $creation_date; + } + + switch ( $metadata['fileformat'] ) { + case 'asf': + if ( isset( $metadata['asf']['file_properties_object']['creation_date_unix'] ) ) { + $creation_date = (int) $metadata['asf']['file_properties_object']['creation_date_unix']; + } + break; + + case 'matroska': + case 'webm': + if ( isset( $metadata['matroska']['comments']['creation_time']['0'] ) ) { + $creation_date = strtotime( $metadata['matroska']['comments']['creation_time']['0'] ); + } + elseif ( isset( $metadata['matroska']['info']['0']['DateUTC_unix'] ) ) { + $creation_date = (int) $metadata['matroska']['info']['0']['DateUTC_unix']; + } + break; + + case 'quicktime': + case 'mp4': + if ( isset( $metadata['quicktime']['moov']['subatoms']['0']['creation_time_unix'] ) ) { + $creation_date = (int) $metadata['quicktime']['moov']['subatoms']['0']['creation_time_unix']; + } + break; + } + + return $creation_date; +} + +/** * Encapsulate logic for Attach/Detach actions * * @since 4.2.0 @@ -3041,7 +3224,7 @@ } if ( ! current_user_can( 'edit_post', $parent_id ) ) { - wp_die( __( 'You are not allowed to edit this post.' ) ); + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); } $ids = array(); foreach ( (array) $_REQUEST['media'] as $att_id ) {