diff --git a/wp-includes/functions.php b/wp-includes/functions.php index f612d8c59c..1433ca98f8 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -322,6 +322,62 @@ function size_format( $bytes, $decimals = 0 ) { return false; } +/** + * Convert a filelength to human readable format. + * + * @since 5.0 + * + * @param string $filelength Duration will be in string format (HH:ii:ss) OR (ii:ss). + * @return boolean|string A human readable filelength string, false on failure. + */ +function human_readable_duration( $filelength = '' ) { + // Return false if filelength is empty or not in format. + if ( ( empty( $filelength ) || ! is_string( $filelength ) ) ) { + return false; + } + + // Validate filelength format. + if ( ! ( (bool) preg_match( '/^(([0-3]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?$/', $filelength ) ) ) { + return false; + } + + $human_readable_duration = array(); + + // Extract duration. + $durations = array_reverse( explode( ':', $filelength ) ); + $duration_count = count( $durations ); + + if ( 3 === $duration_count ) { + // Three parts: hours, minutes & seconds. + list( $second, $minute, $hour ) = $durations; + } elseif ( 2 === $duration_count ) { + // Two parts: minutes & seconds. + list( $second, $minute ) = $durations; + } else { + return false; + } + + // Add the hour part to the string. + if ( ! empty( $hour ) && is_numeric( $hour ) ) { + /* translators: Time duration in hour or hours. */ + $human_readable_duration[] = sprintf( _n( '%s hour', '%s hours', $hour ), (int) $hour ); + } + + // Add the minute part to the string. + if ( ! empty( $minute ) && is_numeric( $minute ) ) { + /* translators: Time duration in minute or minutes. */ + $human_readable_duration[] = sprintf( _n( '%s minute', '%s minutes', $minute ), (int) $minute ); + } + + // Add the second part to the string. + if ( ! empty( $second ) && is_numeric( $second ) ) { + /* translators: Time duration in second or seconds. */ + $human_readable_duration[] = sprintf( _n( '%s second', '%s seconds', $second ), (int) $second ); + } + + return implode( ', ', $human_readable_duration ); +} + /** * Get the week start and end from the datetime or date string from MySQL. * diff --git a/wp-includes/media-template.php b/wp-includes/media-template.php index c5f272cc1a..fb44261cf1 100644 --- a/wp-includes/media-template.php +++ b/wp-includes/media-template.php @@ -371,12 +371,20 @@ function wp_print_media_templates() {