+ } elseif ( wp_attachment_is( 'video', $attachment ) ) {
+ $metadata = wp_read_video_metadata( $file );
+ $support = current_theme_supports( 'post-thumbnails', 'attachment:video' ) || post_type_supports( 'attachment:video', 'thumbnail' );
+ } elseif ( wp_attachment_is( 'audio', $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'] ) ) {
+ // Check for existing cover.
+ $hash = md5( $metadata['image']['data'] );
+ $posts = get_posts( array(
+ 'fields' => 'ids',
+ 'post_type' => 'attachment',
+ 'post_mime_type' => $metadata['image']['mime'],
+ 'post_status' => 'inherit',
+ 'posts_per_page' => 1,
+ 'meta_key' => '_cover_hash',
+ 'meta_value' => $hash
+ ) );
+ $exists = reset( $posts );
+
+ if ( ! empty( $exists ) ) {
+ update_post_meta( $attachment_id, '_thumbnail_id', $exists );
+ } else {
+ $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'] ) {
+ $image_attachment = array(
+ 'post_mime_type' => $metadata['image']['mime'],
+ 'post_type' => 'attachment',
+ 'post_content' => '',
+ );
+ /**
+ * Filters the parameters for the attachment thumbnail creation.
+ *
+ * @since 3.9.0
+ *
+ * @param array $image_attachment An array of parameters to create the thumbnail.
+ * @param array $metadata Current attachment metadata.
+ * @param array $uploaded An array containing the thumbnail path and url.
+ */
+ $image_attachment = apply_filters( 'attachment_thumbnail_args', $image_attachment, $metadata, $uploaded );
+
+ $sub_attachment_id = wp_insert_attachment( $image_attachment, $uploaded['file'] );
+ add_post_meta( $sub_attachment_id, '_cover_hash', $hash );
+ $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 );
+ }
+ }
+ }
+ // Try to create image thumbnails for PDFs
+ else if ( 'application/pdf' === $mime_type ) {
+ $fallback_sizes = array(
+ 'thumbnail',
+ 'medium',
+ 'large',
+ );
+
+ /**
+ * Filters the image sizes generated for non-image mime types.
+ *
+ * @since 4.7.0
+ *
+ * @param array $fallback_sizes An array of image size names.
+ */
+ $fallback_sizes = apply_filters( 'fallback_intermediate_image_sizes', $fallback_sizes, $metadata );
+
+ $sizes = array();
+ $_wp_additional_image_sizes = wp_get_additional_image_sizes();
+
+ foreach ( $fallback_sizes as $s ) {
+ if ( isset( $_wp_additional_image_sizes[ $s ]['width'] ) ) {
+ $sizes[ $s ]['width'] = intval( $_wp_additional_image_sizes[ $s ]['width'] );
+ } else {
+ $sizes[ $s ]['width'] = get_option( "{$s}_size_w" );
+ }
+
+ if ( isset( $_wp_additional_image_sizes[ $s ]['height'] ) ) {
+ $sizes[ $s ]['height'] = intval( $_wp_additional_image_sizes[ $s ]['height'] );
+ } else {
+ $sizes[ $s ]['height'] = get_option( "{$s}_size_h" );
+ }
+
+ if ( isset( $_wp_additional_image_sizes[ $s ]['crop'] ) ) {
+ $sizes[ $s ]['crop'] = $_wp_additional_image_sizes[ $s ]['crop'];
+ } else {
+ // Force thumbnails to be soft crops.
+ if ( ! 'thumbnail' === $s ) {
+ $sizes[ $s ]['crop'] = get_option( "{$s}_crop" );
+ }
+ }
+ }
+
+ // Only load PDFs in an image editor if we're processing sizes.
+ if ( ! empty( $sizes ) ) {
+ $editor = wp_get_image_editor( $file );
+
+ if ( ! is_wp_error( $editor ) ) { // No support for this type of file
+ $uploaded = $editor->save( $file, 'image/jpeg' );
+ unset( $editor );
+
+ // Resize based on the full size image, rather than the source.
+ if ( ! is_wp_error( $uploaded ) ) {
+ $editor = wp_get_image_editor( $uploaded['path'] );
+ unset( $uploaded['path'] );
+
+ if ( ! is_wp_error( $editor ) ) {
+ $metadata['sizes'] = $editor->multi_resize( $sizes );
+ $metadata['sizes']['full'] = $uploaded;
+ }
+ }
+ }
+ }