PHP Youtube Downloader 2.1

  • 30/10/2008
  • 12:56 am
  • unijimpe

Ahora que nuevamente se han cambiado las rutas de los vídeos de Youtube, nuestros visitantes nos han pedido explicar la forma en que se pueden obtener los vídeos. Entonces les presentamos un nuevo método para realizar la descarga directa de los vídeos.

Nota: Esta información es para propósitos educativos, el autor no se responsabiliza de los usos que puedan hacer los usuarios de la presente información.

 
Como Funciona

Como ya hemos explicado en ocasiones anteriores, para acceder directamente a un vídeo, se puede acceder al siguiente URL donde: id es el identificador del vídeo, token es una variable para validar la descarga y fmt es el formato en el que se desea descargar el vídeo (5 para FLV, 18 para MP4 y 13 para 3GP).

  1. http://www.youtube.com/get_video.php?video_id=id&t=token&fmt=fmt

Luego el problema se reduce a obtener el valor token que nos servirá para validar la descarga, luego de hacer un análisis se nota que para obtener los datos del vídeo entre ellos este valor token se puede hacer accediendo a:

  1. http://www.youtube.com/get_video_info?video_id=id

En donde id es el identificador del vídeo, luego esto devolverá los datos del vídeo en formato URLEncoded y entre ellos se encuentra la variable que necesitamos.

Creando el Script PHP

Lo primero que necesitamos es una función que tome una ruta y devuelva el contenido de esta dirección, ello lo haremos con las funciones cURL que permiten acceso a contenido remoto. Entonces creamos la función getContent, que devuelve el contenido de una determinada URL.

  1. function getContent($url) {
  2.     $ch = curl_init();
  3.     curl_setopt ($ch, CURLOPT_URL, $url);
  4.     curl_setopt ($ch, CURLOPT_HEADER, 0);
  5.  
  6.     ob_start();
  7.     curl_exec ($ch);
  8.     curl_close ($ch);
  9.     $string = ob_get_contents();
  10.     ob_end_clean();
  11.     return $string;   
  12. }

Ahora como el contenido devuelto esta el formato URLEncoded, creamos otra función que interprete el contenido devuelto por la función anterior y devuelva la variable token.

  1. function getYoutubeToken($id) {
  2.     $path = "http://www.youtube.com/get_video_info?";
  3.     $cont = getContent($path."&video_id=".$id);
  4.     parse_str($cont, $opts);
  5.     return $opts['token'];
  6. }

Entonces ahora que tenemos la variable que nos hacia falta podemos crear el URL para la descarga directa de los vídeos, suponiendo que tenemos un formulario que envía las variables por GET, primero obtenemos la variable token, generamos el URL para la descarga del vídeo donde incluimos el formato en el cual deseamos la descarga y finalmente redireccionamos el script a la ruta recién creada.

  1. $vItem = trim($_GET['item']);
  2. $vType = $_GET['type'];
  3. $vPath = "http://www.youtube.com/get_video.php";
  4.  
  5. if ($videoItem != "") {
  6.     $vTokn = getYoutubeToken($videoItem);
  7.     $vPath+= "?video_id=".$vItem."&t=".$vTokn."&fmt=".$Type;
  8.     header("Location: ".$vPath);
  9.     exit;
  10. }

Uniendo estos elementos, agregando el formulario para el ingreso del identificador del vídeo un una hoja de estilos para mejorar la apariencia de nuestro script, obtenemos nuestra aplicación para descargar vídeos de Youtube sin necesidad de instalaciones adicionales.

Posts Relacionados

Total de Comentarios: 37

Publicidad
30/10/2008
4:13 pm

gracias por tu aporte unijimpe, me volvia loco con este problema, saludos

Mati
30/10/2008
5:58 pm

Hola, te dejo las gracias por tu aporte

Mati
31/10/2008
5:49 am

unijimpe, existira alguna forma de hacer que se guarden con un titulo? , recuerdo antes se podia, pero ahora no encontre una forma

enrico
31/10/2008
9:34 am

gracias unijimpemui wen aporte .. pero creo ke hai un problema man en la opcion descargar video en .flv nod escarga en mp4 y 3gp si pero en .flv nada.
depeus respeto a ese pedido si puedes acer para ke descargue con el nombre por ejemplo mira este http://adictoz.uni.cc/zx/Scripts/zegaxtube.php?id=
pones el ID del video y los descarga con el nombre

31/10/2008
1:01 pm

suena interezante descargar el archivo con el nombre. tambien me uno a la peticion. xP

Luciano
31/10/2008
8:43 pm

Hola, en vez de utilizar cURL no se podria utilizar la funcion file_get_contents()??

Saludos y muchas gracias por este aporte que vienes actualizando, te lo agradezco mucho y sigue así :)

01/11/2008
1:35 pm

Muy bueno, el método me sirve mucho para un pequeño app en LUA en el que estoy trabajando.

La verdad que los tokens me solucionan la vida ya que ahora no necesito los headers :)

Muchas gracias!

02/11/2008
2:20 pm

Hola, efectivamente la descarga en FLV no funciona correctamente y es por que puse fmt=5, para resolver este problema en el caso de FLV no hace falta colocar el parámetro fmt, aunque esto hace que el archivo que se intenta descargar aparezca como get_video y sin extensión por lo cual hay que renombrarlo con extensión .flv luego de haberlo descargado. Les dejo el archivo con las modificaciones hechas.

http://blog.unijimpe.net/download/4/

Acerca del uso de cURL en lugar de file_get_contents es por que cURL es mucho mas rápida y consume menos recursos del servidor, esto por que esta especialmente preparada para comunicación sobre diferentes protocoles. Si desean pueden modificar el script y utilizar file_get_contents con lo cual obviamente se ahorrarían varias lineas de código.

Respecto a entregar el vídeo con el nombre aun no he llegado a encontrar un método para hacerlo, así que si encuentro la solución la estaré publicando.

02/11/2008
5:32 pm

Gracias otravez Unijimpe, saludos.

07/11/2008
11:34 am

[...] bueno si sabemos un poco de PHP veremos que la cosa no es muy complicada, puedes ver como aqui Otros, [...]

07/11/2008
6:44 pm

esta re bueno es un gran aporte para la comunidad te felicito.

¿el codigo se puede modificar para cargar el archivo a una carpeta en el servidor?????

si es asi es un muy buen codigo

15/11/2008
1:10 pm

hola a todos estaba leyendo el script y buscando en google un duda que tengo.. quisiera agregar para bajar en mp3 pero que $videoItem =”" <– ahi va un numero ya se 0 13 o 18 para flv 3gp o mp4 pero que numero seria para mp3??

izzukay
15/11/2008
6:46 pm

Hola a todos:

Por si os interesa, he dejado un mensaje en:

http://blog.unijimpe.net/php-youtube-downloader-20

proponiendo crear un grupo de trabajo para investigar la descarga y acceso a Youtube y otras plataformas y compartir nuestros conocimientos. He dejado mi correo para quien se apunte a la idea.

Unijimpe, respecto a lo del nombre del vídeo, yo lo hago llamando al RSS del vídeo:

http://www.youtube.com/rss/tag/VIDEO_ID.rss

De ahí extraigo el título.

Luego le elimino los caracteres ilegales y lo guardo con el título como nombre, agregándole extensión FLV.

Ésto último lo hago en un segundo archivo (por razones prácticas de mi proyecto). Os lo dejo aquí por si os puede ser de ayuda:

http://www.siliconvega.com/public/ejemplo_descarga_con_nombre.zip

Saludos!!

Rio-Abajo
19/11/2008
3:36 pm

Muchas gracias por este post, estuvo realmente bueno.

Por cierto a mi si me funcionó usando fmt con los valores 5, 18, 13… cuando quería bajar un video en FLV con el valor 0 me aparecía el error 404.

Gracias de nuevo.

Luis
29/11/2008
10:07 pm

a mi no me funciona solo, es mas no me funciona ni el que pones como demo :’( que sucede es mi navegador o algo asi?

Jose migue
30/11/2008
3:31 pm

Ya youtube cambio nuevamente el codigo. hay que arreglar el programa nuevamente.

Xavier
18/12/2008
7:31 am

la descarga no anda unijimpe

arturo
22/12/2008
3:48 pm

ya no funka el link arreglenlo porfavor
se ve bueno el script :)

28/12/2008
4:51 pm

unijimpe me podrias pasar el script de php-youtube-downloader-2.1/

lo que pasa es que lo intente bajar pero dice “post no encontrado”

http://blog.unijimpe.net/download/4/

28/12/2008
11:37 pm

Hola Carlos, por descuido al actualizar Wordpress, no hice la actualización del plugin que permite manejar las descargar, ya lo he actualizado y esta funcionando nuevamente.

29/12/2008
9:03 pm

unijimpe muchas gracias por el aporte y la contestacion tan rapida, ahora tengo una pequena duda baje un script en php para subir imagenes.
pero como hago para cuando suba una imagen hacerla mas chica, tengo una imagen de 1024 x 768 y quiero que cuando la suba php la reduzca a 800 x 600, es que son muchas imagenes y las tengo que hacer mas chicas en photoshop

29/12/2008
9:53 pm

unijimpe si quisiera bajar el video en otro tipo de formato como le puedo hacer cual es el valor que le tengo que colocar

si el de .flv es 5
el de .mp4 es 18
el de .3gp es 13

pero como puedo conseguir los demas valores para otro tipo de archivo

muchas gracias unijimpe

22/01/2009
4:10 pm

no existen mas valores q esos excepto el de Mp4 en Hight Definition q es “22″. si quieres descargar en otros formatos tendria q ser un convertidor de formatos.

25/01/2009
9:39 pm

grande master!

Danny
07/02/2009
6:58 pm

Ummmm me pregunto q tengo q hacer para descargar mp3

si el de .flv es 5
el de .mp4 es 18
el de .3gp es 13
el de .mp3 es ????

Pedro Verbel
27/02/2009
1:25 am

ummmmmm tengo una duda
resulta que tengo un reproductor de flv, si quiero reproducir dicho archivo que manda youtube y tengo esta funciona vidlink que me da el video del link..
$vidlink = “http://pagina/video?vItem=”.$vcode.”;
si lo que quiero es incertar el codigo de youtube que ya tengo y esto me devulelva el flv..
¿Como seria?
intente ponerlo asi con el archivo que hisiste pero no devolvio nada
¿Como podria la funcio vItem para que no reciviera por get si no directo asi por el link?
Muchas gracias

Pedro Verbel
27/02/2009
1:27 am

perdon la sentencia es asi
$vidlink = “http://pagina.com/video.php?vItem=”.$vcode.”

15/03/2009
6:16 pm

Gracias x el code :D

24/03/2009
6:44 pm

bueno unijimpe eres el mejor en estos casos, estuve buscando la nueva version y recien me acorde de tu web, estaba utilizando otros servicios.
pero bueno ahora quisiera utilizar mi propio servicio implementando en mi web, pero hay un problema mi web esta alojada en un host gratuito y como te puedes imaginar no esta la variable cURL activa entonces Luciano dijo que se podia utilizar file_get_contents(), y lo q yo pediria es si pudieran hacer un cambio y reemplazar el cURL por el file_get_contents(), se los agradeceria. Espero una respuesta.

LIOK k2
29/03/2009
2:38 pm

Unijimpe por que me da error la descarga si leí arriba que ya avías corregido el plugin de descargas pero aun así no puedo descargar la versión 2.1 ya que e bajado las anteriores pero no funcionan por los cambios en youtube.

Te pido por favor si no lo puedes revisar o decirme si lo as cambiado de hosting ya que lo quiero pero no lo encuentro ya sea aquí o en otra pagina.

Agradecido estaré esperando tu respuesta.

Diver
04/04/2009
1:21 am

La descargas no anda!

don
04/04/2009
5:20 am

unijimpe, youtube changed settings again.. your script is not working please release new update!

LIOK k2
05/04/2009
12:17 pm

Hace como cuatro días que por fin pude bajar la última actualización y hoy dispuse a ponerla a mi página y me doy cuenta que ya no sirve la actualización y me da cólera que ni siquiera lo use pero ya sabíamos que algo así podría pasar en cualquier momento.
Ahora solo queda pedirle al maestro unijimpe que lo revise tal vez nos lo pueda dar ya activo como lo ah hecho anterior mente.

Hugo
05/04/2009
6:41 pm

Youtube actualizo otra vez solo es cuestion de modificar el codigo y claro que el master unijimpe lo hara esperaremos con ansia la version 2.2 Gracias

06/04/2009
10:49 pm

[...] el articulo anterior PHP Youtube Downloader 2.1 habíamos explicado la forma de conseguir esta URL, pero ahora si utilizamos la URL directamente no [...]

03/05/2009
12:50 pm

[...] el articulo anterior PHP Youtube Downloader 2.1 habíamos explicado la forma de conseguir esta URL, pero ahora si utilizamos la URL directamente no [...]

15/05/2009
8:22 pm

El problema de la solución de izzukay y de la web *.uni.cc que publico enrico para modificar el titulo del video es que utilizan la función readfile, es decir que primero se descarga el video al server donde se encuentra el script, y luego se lo envía al usuario con el nombre modificado.
A diferencia de usar un redirect el uso de recursos es inmenso, por ejemplo si un usuario decide descargar un video de 5mb y se usa el redirect forzando la descarga desde youtube va a consumir en nuestro server unos 15kb, en cambio usando el método de readfile va a utilizar un trafico de más de 10mb, 5mb iniciales para descargar el video a al servidor y 5mb mas de la descarga del visitante desde el server a su PC.
Es un metodo que sirve en el caso de que el script no sea utilizado masivamente, de lo contrario es muy poco practico.

Saludos

Enviar Comentario

(*)

(*)