• Josetxu.com
  • Perfil
  • Portafolio
  • Iconos
  • Demos
  • Blog
Blog · Josetxu.com

Convertir duración de video de la API v3 de Youtube en PHP

Publicada en 19 feb 2017 de Josetxu

Hace poco me encontré con un problema intentando extraer la duración de un video de la API v3 de Youtube. El formato que nos devuelve la API es algo extraño y tras probar distintas soluciones vistas por la web y sin que ninguna funcionara del todo, intenté hacer mi propia función …

Convertir Tiempo

En este artículo vamos a ver tres partes bien diferenciadas:

  • API v3 Youtube => el formato del dato duración en la respuesta de la API.
  • DateInterval ====> clase de PHP usada para la transformación de los datos.
  • convertTime ====> nuestra función personalizada para ajustar la salida de los datos.

API v3 Youtube

La parte de la respuesta de la API que nos devuelve la duración del video y que viene en JSON es la siguiente:

JSON
1
2
3
4
5
6
7
8
“contentDetails”: {
“duration”: “PT1H8M12S”,
“dimension”: “2d”,
“definition”: “hd”,
“caption”: “false”,
“licensedContent”: false,
“projection”: “rectangular”
}
En próximos artículos veremos toda la respuesta de la API de Youtube explicada parte por parte.

El dato que nos interesa aquí es duration y el formato que nos dá la API es PT1H8M12S.
Las dos primeras letras corresponden a Pacific Time (tiempo del pacífico), el resto que es la parte que nos interesa es fácilmente entendible y la traducción sería, en este caso, 1 hora, 8 minutos y 12 segundos. En la siguiente tabla hay algunos ejemplos más:

Formato API Traducción
PT1H38M10S 1 hora, 38 minutos y 10 segundos
PT1H50S 1 hora, 0 minutos y 50 segundos
PT10M1S 10 minutos y 1 segundo
PT9M23S 9 minutos y 23 segundos
PT1M 1 minuto y 0 segundos

DateInterval

La clase DateInterval de PHP sirve para representar un intervalo de fechas en años, meses, días, horas, minutos y segundos. Con esta clase podemos separar los valores 1H 8M 12S separando cada dato con el símbolo : cuando proceda.

PHP
1
2
3
4
5
$newTime = new DateInterval($youtubeDuration);
$horas = $newTime->h; //extraemos el dato horas
$minutos = $newTime->i; //extraemos el dato minutos
$segundos = $newTime->s; //extraemos el dato segundos
echo $horas.':'.$minutos.':'.$segundos;

Todas las soluciones que probé usaban esta técnica. El problema era el formato que devolvían esas soluciones, a veces quedaba raro dependiendo de la duración del video, y pongo unos ejemplos:

Duración del video Formato Esperado Formato Obtenido
0 horas, 2 minutos y 30 segundos 02:30 0:2:30
1 hora, 2 minutos y 10 segundos 1:02:10 1:2:10
1 hora, 0 minutos y 5 segundos 1:00:05 1:0:5
2 minutos y 7 segundos 2:07 2:7

convertTime

Para crear nuestra propia función con la clase DateInterval ya tenemos casi todo hecho, solo hay que poner un par de condiciones extra para montar el formato final de la duración del video a nuestro gusto.

Las dos cosas que he tenido en cuenta a la hora de crear la función son:

  • Si el dato es menor de 10 hay que poner siempre un 0 delante, excepto en las horas.
  • Si no existe el dato horas y el dato minutos es menor de 10 este no necesita el 0 delante.

Teniendo en cuenta esas dos cosas y trás probar con diferentes videos de diferentes duraciones llegué a una solución que a mi me sirve.

Y así queda la función en PHP con comentarios explicativos:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//pasamos como argumento el valor de duracion de la API
// ejemplo PT20M34S
function convertTime($youtubeDuration) {
//convertimos la duracion a formato H:i:s
$newTime = new DateInterval($youtubeDuration);
//HORAS
$hours = $newTime->h; //extraemos el dato horas
if($hours > 0){ //si horas es mayor de cero
$hours .= ':'; //ponemos detras el simbolo :
} else { //si horas es menor de cero
$hours = ''; //horas estara vacio
}
//MINUTOS
$minutes = $newTime->i; //extraemos el dato minutos
if($hours > 0){ //si horas es mayor de cero
if($minutes < 10){ //si minutos es menor de diez
$minutes = '0'.$minutes.':'; //ponemos un cero delante y detras el simbolo :
} else { //si minutos es 10 o mayor de diez
$minutes .= ':'; //ponemos detras el simbolo :
}
} else { //si horas es menor de cero
$minutes .= ':'; //ponemos detras de minutos el simbolo :
}
//SEGUNDOS
$seconds = $newTime->s; //extraemos el dato segundos
if($seconds < 10){ //si segundos es menor de diez
$seconds = '0'.$seconds; //ponemos un cero delante
}
//RESULTADO
return $hours.$minutes.$seconds; //respuesta de la funcion
}

 

Depurando la función

Siempre podemos (o más bien debemos) depurar la función para que sea más rápida y efectiva. Eliminamos los comentarios, abreviamos las variables y si el código lo permite creamos bucles mientras sea posible. De primeras puede que se entienda bastante peor, pero el funcionamiento es exactamente el mismo que el de la función anterior:

PHP
1
2
3
4
5
6
7
function convertTime($ytd){
$t=new DateInterval($ytd);
$h=$t->h; if($h>0){$h.= ':';}else{$h='';}
$m=$t->i; if($h>0){if($m<10){$m='0'.$m.':';}else{$m.=':';}}else{$m.=':';}
$s=$t->s; if($s<10){$s='0'.$s;}
return $h.$m.$s;
}

Lo unico que hay que hacer es pasar el valor recogido de la API como argumento de la función y saldrá transformado en el formato esperado:

Duración del video Formato Recibido Formato Transformado
1 hora, 2 minutos y 10 segundos PT1H2M10S 1:02:10
1 hora, 0 minutos y 5 segundos PT1H5S 1:00:05
36 minutos y 0 segundos PT36M 36:00
2 minutos y 7 segundos PT2M7S 2:07

Próximamente veremos toda la respuesta de la API de Youtube explicada parte por parte.

Publicado en: PHP | Etiquetas: Clases, Funciones, JSON |
« Efecto Mouse Parallax
» Afinador de Guitarra – Online Guitar Tuner

Artículos Relacionados

  • Funciones básicas en PHP: [include()] y [require()]Funciones básicas en PHP: [include()] y [require()]
  • Captcha en PHPCaptcha en PHP
  • Imagen aleatoria con PHPImagen aleatoria con PHP
  • Funciones básicas en PHP: [echo] y [print]Funciones básicas en PHP: [echo] y [print]
  • Afinador de Guitarra – Online Guitar TunerAfinador de Guitarra – Online Guitar Tuner
josetxu Josetxu López

Diseñador y programador web multidisciplinar y autodidacta.
Investigo las posibilidades que nos ofrece la tecnología aprendiendo algo nuevo cada día. La curiosidad y la paciencia me han enseñado casi todo lo que sé...

Buscar

Categorías

  • CSS (7)
  • CSS3 (7)
  • HTML (4)
  • HTML5 (3)
  • Javascript (8)
  • JQuery (1)
  • PHP (6)

Etiquetas

Animación Audio Básico Captcha Clases Constructores Formularios Funciones Iconos Imagen JSON Métodos Responsive

Recientes

Crear pestañas de contenido o 'tabs' fácilmente con javascript
Crear pestañas de contenido o 'tabs' fácilmente con javascript
Funciones básicas en PHP: [include()] y [require()]
Funciones básicas en PHP: [include()] y [require()]
Iconos con CSS
Iconos con CSS
Aplicar estilos CSS a campos [radio] y [checkbox]
Aplicar estilos CSS a campos [radio] y [checkbox]

Utilidades

Color Picker w3c Selector de color Google Fonts google Fuentes de Google Can I use @Fyrd Soporte por navegadores Gimp gimp Manipulación de imágenes Notepad++ notepad++ Editor de código W3C Validator w3c Validador de código Highcharts highchartsGráficas en Javascript

Aviso

La información contenida en este blog es solo orientativa . No soy profesor, solo un tio curioso que quiere compartir lo aprendido durante estos años.

CyberChimps WordPress Themes

josetxu.comJosetxu.com Perfil | Portafolio | Iconos | Demos | Blog 2000 - 2020 © josetxu.com
▲