| | 2400 | |
| | 2401 | /** |
| | 2402 | * Parse ID3v2, ID3v1, and getID3 comments to extract usable data |
| | 2403 | * |
| | 2404 | * @since 3.6.0 |
| | 2405 | * |
| | 2406 | * @param array $metadata An existing array with data |
| | 2407 | * @param array $data Data supplied by ID3 tags |
| | 2408 | */ |
| | 2409 | function wp_add_id3_tag_data( &$metadata, $data ) { |
| | 2410 | foreach ( array( 'id3v2', 'id3v1' ) as $version ) { |
| | 2411 | if ( ! empty( $data[$version]['comments'] ) ) { |
| | 2412 | foreach ( $data[$version]['comments'] as $key => $list ) { |
| | 2413 | if ( ! empty( $list ) ) { |
| | 2414 | $metadata[$key] = reset( $list ); |
| | 2415 | // fix bug in byte stream analysis |
| | 2416 | if ( 'terms_of_use' === $key && 0 === strpos( $metadata[$key], 'yright notice.' ) ) |
| | 2417 | $metadata[$key] = 'Cop' . $metadata[$key]; |
| | 2418 | } |
| | 2419 | } |
| | 2420 | break; |
| | 2421 | } |
| | 2422 | } |
| | 2423 | |
| | 2424 | if ( ! empty( $data['id3v2']['APIC'] ) ) { |
| | 2425 | $image = reset( $data['id3v2']['APIC']); |
| | 2426 | if ( ! empty( $image['data'] ) ) { |
| | 2427 | $metadata['image'] = array( |
| | 2428 | 'data' => $image['data'], |
| | 2429 | 'mime' => $image['image_mime'], |
| | 2430 | 'width' => $image['image_width'], |
| | 2431 | 'height' => $image['image_height'] |
| | 2432 | ); |
| | 2433 | } |
| | 2434 | } elseif ( ! empty( $data['comments']['picture'] ) ) { |
| | 2435 | $image = reset( $data['comments']['picture'] ); |
| | 2436 | if ( ! empty( $image['data'] ) ) { |
| | 2437 | $metadata['image'] = array( |
| | 2438 | 'data' => $image['data'], |
| | 2439 | 'mime' => $image['image_mime'] |
| | 2440 | ); |
| | 2441 | } |
| | 2442 | } |
| | 2443 | } |
| | 2444 | |
| | 2445 | /** |
| | 2446 | * Retrieve metadata from a video file's ID3 tags |
| | 2447 | * |
| | 2448 | * @since 3.6.0 |
| | 2449 | * |
| | 2450 | * @param string $file Path to file. |
| | 2451 | * @return array|boolean Returns array of metadata, if found. |
| | 2452 | */ |
| | 2453 | function wp_read_video_metadata( $file ) { |
| | 2454 | if ( ! file_exists( $file ) ) |
| | 2455 | return false; |
| | 2456 | |
| | 2457 | $metadata = array(); |
| | 2458 | |
| | 2459 | if ( ! class_exists( 'getID3' ) ) |
| | 2460 | require( ABSPATH . WPINC . '/ID3/class-getid3.php' ); |
| | 2461 | $id3 = new getID3(); |
| | 2462 | $data = $id3->analyze( $file ); |
| | 2463 | |
| | 2464 | if ( isset( $data['video']['lossless'] ) ) |
| | 2465 | $metadata['lossless'] = $data['video']['lossless']; |
| | 2466 | if ( ! empty( $data['video']['bitrate'] ) ) |
| | 2467 | $metadata['bitrate'] = (int) $data['video']['bitrate']; |
| | 2468 | if ( ! empty( $data['video']['bitrate_mode'] ) ) |
| | 2469 | $metadata['bitrate_mode'] = $data['video']['bitrate_mode']; |
| | 2470 | if ( ! empty( $data['filesize'] ) ) |
| | 2471 | $metadata['filesize'] = (int) $data['filesize']; |
| | 2472 | if ( ! empty( $data['mime_type'] ) ) |
| | 2473 | $metadata['mime_type'] = $data['mime_type']; |
| | 2474 | if ( ! empty( $data['playtime_seconds'] ) ) |
| | 2475 | $metadata['length'] = (int) ceil( $data['playtime_seconds'] ); |
| | 2476 | if ( ! empty( $data['playtime_string'] ) ) |
| | 2477 | $metadata['length_formatted'] = $data['playtime_string']; |
| | 2478 | if ( ! empty( $data['video']['resolution_x'] ) ) |
| | 2479 | $metadata['width'] = (int) $data['video']['resolution_x']; |
| | 2480 | if ( ! empty( $data['video']['resolution_y'] ) ) |
| | 2481 | $metadata['height'] = (int) $data['video']['resolution_y']; |
| | 2482 | if ( ! empty( $data['fileformat'] ) ) |
| | 2483 | $metadata['fileformat'] = $data['fileformat']; |
| | 2484 | if ( ! empty( $data['video']['dataformat'] ) ) |
| | 2485 | $metadata['dataformat'] = $data['video']['dataformat']; |
| | 2486 | if ( ! empty( $data['video']['encoder'] ) ) |
| | 2487 | $metadata['encoder'] = $data['video']['encoder']; |
| | 2488 | if ( ! empty( $data['video']['codec'] ) ) |
| | 2489 | $metadata['codec'] = $data['video']['codec']; |
| | 2490 | |
| | 2491 | unset( $data['audio']['streams'] ); |
| | 2492 | $metadata['audio'] = $data['audio']; |
| | 2493 | |
| | 2494 | wp_add_id3_tag_data( $metadata, $data ); |
| | 2495 | |
| | 2496 | return $metadata; |
| | 2497 | } |
| | 2498 | |
| | 2499 | /** |
| | 2500 | * Retrieve metadata from a audio file's ID3 tags |
| | 2501 | * |
| | 2502 | * @since 3.6.0 |
| | 2503 | * |
| | 2504 | * @param string $file Path to file. |
| | 2505 | * @return array|boolean Returns array of metadata, if found. |
| | 2506 | */ |
| | 2507 | function wp_read_audio_metadata( $file ) { |
| | 2508 | if ( ! file_exists( $file ) ) |
| | 2509 | return false; |
| | 2510 | $metadata = array(); |
| | 2511 | |
| | 2512 | if ( ! class_exists( 'getID3' ) ) |
| | 2513 | require( ABSPATH . WPINC . '/ID3/class-getid3.php' ); |
| | 2514 | $id3 = new getID3(); |
| | 2515 | $data = $id3->analyze( $file ); |
| | 2516 | |
| | 2517 | if ( ! empty( $data['audio'] ) ) { |
| | 2518 | unset( $data['audio']['streams'] ); |
| | 2519 | $metadata = $data['audio']; |
| | 2520 | } |
| | 2521 | |
| | 2522 | if ( ! empty( $data['fileformat'] ) ) |
| | 2523 | $metadata['fileformat'] = $data['fileformat']; |
| | 2524 | if ( ! empty( $data['filesize'] ) ) |
| | 2525 | $metadata['filesize'] = (int) $data['filesize']; |
| | 2526 | if ( ! empty( $data['mime_type'] ) ) |
| | 2527 | $metadata['mime_type'] = $data['mime_type']; |
| | 2528 | if ( ! empty( $data['playtime_seconds'] ) ) |
| | 2529 | $metadata['length'] = (int) ceil( $data['playtime_seconds'] ); |
| | 2530 | if ( ! empty( $data['playtime_string'] ) ) |
| | 2531 | $metadata['length_formatted'] = $data['playtime_string']; |
| | 2532 | |
| | 2533 | wp_add_id3_tag_data( $metadata, $data ); |
| | 2534 | |
| | 2535 | return $metadata; |
| | 2536 | } |