mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-08-12 21:00:21 +00:00
Add functions for generating metadata for video and audio, using the
ID3 library. Also allows themes/plugins to add thumbnail support to these media types. Think stuff like album art, movie covers, and video freeze-frames. props wonderboymusic. fixes #23673 git-svn-id: https://develop.svn.wordpress.org/trunk@23766 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -141,8 +141,15 @@ if ( post_type_supports( $post_type, 'post-formats' ) ) {
|
||||
if ( post_type_supports($post_type, 'page-attributes') )
|
||||
add_meta_box('pageparentdiv', 'page' == $post_type ? __('Page Attributes') : __('Attributes'), 'page_attributes_meta_box', null, 'side', 'core');
|
||||
|
||||
if ( current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ) )
|
||||
add_meta_box('postimagediv', __('Featured Image'), 'post_thumbnail_meta_box', null, 'side', 'low');
|
||||
$audio_post_support = $video_post_support = false;
|
||||
$theme_support = current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' );
|
||||
if ( 'attachment' === $post_type && ! empty( $post->post_mime_type ) ) {
|
||||
$audio_post_support = 0 === strpos( $post->post_mime_type, 'audio/' ) && current_theme_supports( 'post-thumbnails', 'attachment:audio' ) && post_type_supports( 'attachment:audio', 'thumbnail' );
|
||||
$video_post_support = 0 === strpos( $post->post_mime_type, 'video/' ) && current_theme_supports( 'post-thumbnails', 'attachment:video' ) && post_type_supports( 'attachment:video', 'thumbnail' );
|
||||
}
|
||||
|
||||
if ( $theme_support || $audio_post_support || $video_post_support )
|
||||
add_meta_box('postimagediv', __('Featured Image'), 'post_thumbnail_meta_box', null, 'side', 'low');
|
||||
|
||||
if ( post_type_supports($post_type, 'excerpt') )
|
||||
add_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', null, 'normal', 'core');
|
||||
|
||||
@@ -73,6 +73,7 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) {
|
||||
$attachment = get_post( $attachment_id );
|
||||
|
||||
$metadata = array();
|
||||
$support = false;
|
||||
if ( preg_match('!^image/!', get_post_mime_type( $attachment )) && file_is_displayable_image($file) ) {
|
||||
$imagesize = getimagesize( $file );
|
||||
$metadata['width'] = $imagesize[0];
|
||||
@@ -117,8 +118,41 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) {
|
||||
if ( $image_meta )
|
||||
$metadata['image_meta'] = $image_meta;
|
||||
|
||||
} elseif ( preg_match( '#^video/#', get_post_mime_type( $attachment ) ) ) {
|
||||
$metadata = wp_read_video_metadata( $file );
|
||||
$support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) && post_type_supports( 'attachment:video', 'thumbnail' );
|
||||
} elseif ( preg_match( '#^audio/#', get_post_mime_type( $attachment ) ) ) {
|
||||
$metadata = wp_read_audio_metadata( $file );
|
||||
$support = current_theme_supports( 'post-thumbnails', 'attachment:audio' ) && post_type_supports( 'attachment:audio', 'thumbnail' );
|
||||
}
|
||||
|
||||
if ( $support && ! empty( $metadata['image']['data'] ) ) {
|
||||
$ext = '.jpg';
|
||||
switch ( $metadata['image']['mime'] ) {
|
||||
case 'image/gif':
|
||||
$ext = '.gif';
|
||||
break;
|
||||
case 'image/png':
|
||||
$ext = '.png';
|
||||
break;
|
||||
}
|
||||
$basename = str_replace( '.', '-', basename( $file ) ) . '-image' . $ext;
|
||||
$uploaded = wp_upload_bits( $basename, '', $metadata['image']['data'] );
|
||||
if ( false === $uploaded['error'] ) {
|
||||
$attachment = array(
|
||||
'post_mime_type' => $metadata['image']['mime'],
|
||||
'post_type' => 'attachment',
|
||||
'post_content' => '',
|
||||
);
|
||||
$sub_attachment_id = wp_insert_attachment( $attachment, $uploaded['file'] );
|
||||
$attach_data = wp_generate_attachment_metadata( $sub_attachment_id, $uploaded['file'] );
|
||||
wp_update_attachment_metadata( $sub_attachment_id, $attach_data );
|
||||
update_post_meta( $attachment_id, '_thumbnail_id', $sub_attachment_id );
|
||||
}
|
||||
}
|
||||
// remove the blob of binary data from the array
|
||||
unset( $metadata['image']['data'] );
|
||||
|
||||
return apply_filters( 'wp_generate_attachment_metadata', $metadata, $attachment_id );
|
||||
}
|
||||
|
||||
|
||||
@@ -2397,3 +2397,140 @@ 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
|
||||
*
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param array $metadata An existing array with data
|
||||
* @param array $data Data supplied by ID3 tags
|
||||
*/
|
||||
function wp_add_id3_tag_data( &$metadata, $data ) {
|
||||
foreach ( array( 'id3v2', 'id3v1' ) as $version ) {
|
||||
if ( ! empty( $data[$version]['comments'] ) ) {
|
||||
foreach ( $data[$version]['comments'] as $key => $list ) {
|
||||
if ( ! empty( $list ) ) {
|
||||
$metadata[$key] = reset( $list );
|
||||
// fix bug in byte stream analysis
|
||||
if ( 'terms_of_use' === $key && 0 === strpos( $metadata[$key], 'yright notice.' ) )
|
||||
$metadata[$key] = 'Cop' . $metadata[$key];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! empty( $data['id3v2']['APIC'] ) ) {
|
||||
$image = reset( $data['id3v2']['APIC']);
|
||||
if ( ! empty( $image['data'] ) ) {
|
||||
$metadata['image'] = array(
|
||||
'data' => $image['data'],
|
||||
'mime' => $image['image_mime'],
|
||||
'width' => $image['image_width'],
|
||||
'height' => $image['image_height']
|
||||
);
|
||||
}
|
||||
} elseif ( ! empty( $data['comments']['picture'] ) ) {
|
||||
$image = reset( $data['comments']['picture'] );
|
||||
if ( ! empty( $image['data'] ) ) {
|
||||
$metadata['image'] = array(
|
||||
'data' => $image['data'],
|
||||
'mime' => $image['image_mime']
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve metadata from a video file's ID3 tags
|
||||
*
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param string $file Path to file.
|
||||
* @return array|boolean Returns array of metadata, if found.
|
||||
*/
|
||||
function wp_read_video_metadata( $file ) {
|
||||
if ( ! file_exists( $file ) )
|
||||
return false;
|
||||
|
||||
$metadata = array();
|
||||
|
||||
if ( ! class_exists( 'getID3' ) )
|
||||
require( ABSPATH . WPINC . '/ID3/class-getid3.php' );
|
||||
$id3 = new getID3();
|
||||
$data = $id3->analyze( $file );
|
||||
|
||||
if ( isset( $data['video']['lossless'] ) )
|
||||
$metadata['lossless'] = $data['video']['lossless'];
|
||||
if ( ! empty( $data['video']['bitrate'] ) )
|
||||
$metadata['bitrate'] = (int) $data['video']['bitrate'];
|
||||
if ( ! empty( $data['video']['bitrate_mode'] ) )
|
||||
$metadata['bitrate_mode'] = $data['video']['bitrate_mode'];
|
||||
if ( ! empty( $data['filesize'] ) )
|
||||
$metadata['filesize'] = (int) $data['filesize'];
|
||||
if ( ! empty( $data['mime_type'] ) )
|
||||
$metadata['mime_type'] = $data['mime_type'];
|
||||
if ( ! empty( $data['playtime_seconds'] ) )
|
||||
$metadata['length'] = (int) ceil( $data['playtime_seconds'] );
|
||||
if ( ! empty( $data['playtime_string'] ) )
|
||||
$metadata['length_formatted'] = $data['playtime_string'];
|
||||
if ( ! empty( $data['video']['resolution_x'] ) )
|
||||
$metadata['width'] = (int) $data['video']['resolution_x'];
|
||||
if ( ! empty( $data['video']['resolution_y'] ) )
|
||||
$metadata['height'] = (int) $data['video']['resolution_y'];
|
||||
if ( ! empty( $data['fileformat'] ) )
|
||||
$metadata['fileformat'] = $data['fileformat'];
|
||||
if ( ! empty( $data['video']['dataformat'] ) )
|
||||
$metadata['dataformat'] = $data['video']['dataformat'];
|
||||
if ( ! empty( $data['video']['encoder'] ) )
|
||||
$metadata['encoder'] = $data['video']['encoder'];
|
||||
if ( ! empty( $data['video']['codec'] ) )
|
||||
$metadata['codec'] = $data['video']['codec'];
|
||||
|
||||
unset( $data['audio']['streams'] );
|
||||
$metadata['audio'] = $data['audio'];
|
||||
|
||||
wp_add_id3_tag_data( $metadata, $data );
|
||||
|
||||
return $metadata;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve metadata from a audio file's ID3 tags
|
||||
*
|
||||
* @since 3.6.0
|
||||
*
|
||||
* @param string $file Path to file.
|
||||
* @return array|boolean Returns array of metadata, if found.
|
||||
*/
|
||||
function wp_read_audio_metadata( $file ) {
|
||||
if ( ! file_exists( $file ) )
|
||||
return false;
|
||||
$metadata = array();
|
||||
|
||||
if ( ! class_exists( 'getID3' ) )
|
||||
require( ABSPATH . WPINC . '/ID3/class-getid3.php' );
|
||||
$id3 = new getID3();
|
||||
$data = $id3->analyze( $file );
|
||||
|
||||
if ( ! empty( $data['audio'] ) ) {
|
||||
unset( $data['audio']['streams'] );
|
||||
$metadata = $data['audio'];
|
||||
}
|
||||
|
||||
if ( ! empty( $data['fileformat'] ) )
|
||||
$metadata['fileformat'] = $data['fileformat'];
|
||||
if ( ! empty( $data['filesize'] ) )
|
||||
$metadata['filesize'] = (int) $data['filesize'];
|
||||
if ( ! empty( $data['mime_type'] ) )
|
||||
$metadata['mime_type'] = $data['mime_type'];
|
||||
if ( ! empty( $data['playtime_seconds'] ) )
|
||||
$metadata['length'] = (int) ceil( $data['playtime_seconds'] );
|
||||
if ( ! empty( $data['playtime_string'] ) )
|
||||
$metadata['length_formatted'] = $data['playtime_string'];
|
||||
|
||||
wp_add_id3_tag_data( $metadata, $data );
|
||||
|
||||
return $metadata;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user