vimeo_upload(), sube vídeos a vimeo desde tu servidor con PHP

upload_vimeoSi como a mi os gusta mas vimeo que youtube ya sea por su diseño, facilidad de uso o mayores capacidades de personalización (como la capacidad de descargar los vídeos directamente, personalización de thumbnails…) estáis de enhorabuena..

El siguiente código es capaz de subir vídeos directamente desde nuestro servidor a vimeo agregando titulo, descripción, tags y permisos de acceso. Para hacer esto y cumpliendo una pasada promesa, utilizaremos source_extract() así que es necesario que esta función también esté en el mismo archivo.

[PHP]
function vimeo_upload(
$file,
$mail,
$pass,
$title=”,
$descripcion=”,
$tags=”,
$permisos=false,
$api_key=’e1dfce4136d69d7f99d2a4d00c4a0d71′,
$api_secret=’e9ff591b0′
){

@set_time_limit(0);
$title = htmlentities($title, ENT_NOQUOTES, ‘UTF-8’);
$descripcion = htmlentities($descripcion, ENT_NOQUOTES, ‘UTF-8’);
$cookie = tempnam (“/tmp”, “VIMEO”);
$api_login_url = “http://www.vimeo.com/log_in”;
$api_rest_url = “http://www.vimeo.com/api/rest/”;
$api_auth_url = “http://www.vimeo.com/services/auth/”;
$api_upload_url = “http://www.vimeo.com/services/upload/”;

if($file){
#login
$args = array(
‘sign_in[email]’ => $mail,
‘sign_in[password]’ => $pass
);
$login = source_extract($api_login_url, $args, ”, ”, true, $cookie);

#frob
$args = $_args = array(
‘api_key’ => $api_key,
‘perms’ => ‘write’,
‘format’ => ‘php’
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$frob = source_extract($api_auth_url, ”, $args, ”, true, $cookie);
if(!$frob[‘header’][‘Location’]){ //si aun no fue aceptada la autorizacion
$frob = source_extract($api_auth_url, $_args, ”, ”, true, $cookie); #lo autorizamos por POST
$frob = source_extract($api_auth_url, ”, $args, ”, true, $cookie); #y pedimos el frob de nuevo
}
$frob = substr($frob[‘header’][‘Location’], strpos($frob[‘header’][‘Location’], ‘frob=’)+strlen(‘frob=’) );

#token
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘frob’ => $frob,
‘method’ => ‘vimeo.auth.getToken’
);
$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$token = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$token = unserialize($token[‘content’]);
$token = $token->auth->token;

#tiket
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘frob’ => $frob,
‘method’ => ‘vimeo.videos.getUploadTicket’
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$tiket = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$tiket = unserialize($tiket[‘content’]);
$tiket = $tiket->ticket->id;

#upload video
$file = array(‘video’=>$file);
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘auth_token’ => $token,
‘ticket_id’ => $tiket
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$upload = source_extract($api_upload_url, $args, ”, $file, true, $cookie);

#check
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘frob’ => $frob,
‘method’ => ‘vimeo.videos.checkUploadStatus’,
‘ticket_id’ => $tiket
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$check = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$check = unserialize($check[‘content’]);

#title
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘method’ => ‘vimeo.videos.setTitle’,
‘title’ => $title,
‘video_id’ => $check->ticket->video_id,
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$title = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$title = unserialize($title[‘content’]);

#caption
$args = array(
‘api_key’ => $api_key,
‘caption’ => $descripcion,
‘format’ => ‘php’,
‘method’ => ‘vimeo.videos.setCaption’,
‘video_id’ => $check->ticket->video_id,
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$caption = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$caption = unserialize($caption[‘content’]);

#tags
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘method’ => ‘vimeo.videos.addTags’,
‘tags’ => $tags,
‘video_id’ => $check->ticket->video_id,
);

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$tags = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$tags = unserialize($tags[‘content’]);

#privacidad
if($permisos){
$permisos = strtolower($permisos);
if( $permisos!=’anybody’ && $permisos!=’nobody’ && $permisos!=’contacts’ && !strpos($permisos, ‘,’)){
return ‘ERROR: Los permisos permitidos son “nobody” para que sea privado, “anybody”,’.
‘ para que sea publico, “contacts” para que solo lo puedan ver los contactos del’.
‘ usuario registrado o una lista de usuarios separada por comas para que solo esos’.
‘ usuarios puedan ver el video. (la funcion requiere que si se usa esta ultima’.
‘ opción se ponga al menos una coma final.’;
}

if(strpos($permisos, ‘,’)) {
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘method’ => ‘vimeo.videos.setPrivacy’,
‘privacy’ => ‘users’,
‘users’ => (substr($permisos, -1)==’,’) ? substr($permisos, 0, -1) : $permisos,
‘video_id’ => $check->ticket->video_id,
);
} else {
$args = array(
‘api_key’ => $api_key,
‘format’ => ‘php’,
‘method’ => ‘vimeo.videos.setPrivacy’,
‘privacy’ => $permisos,
‘video_id’ => $check->ticket->video_id,
);
}

$s=$api_secret; foreach($args as $k=>$v){ $s .= $k.$v; } $args[‘api_sig’] = md5($s);
$permisos = source_extract($api_rest_url, ”, $args, ”, true, $cookie);
$permisos = unserialize($permisos[‘content’]);
}

return array(
‘login’ => $login,
‘frob’ => $frob,
‘token’ => $token,
‘tiket’ => $tiket,
‘upload’ => $upload,
‘check’ => $check,
‘title’ => $title,
‘caption’ => $caption,
‘tags’ => $tags,
‘privacity’ => $permisos,
);
}
}
[/PHP]

Como resultado la función da un conjunto ordenado en array de las respuestas ofrecidas en cada consulta a la API de vimeo para que podamos extraer o interpretar los datos que queramos.

Para que funcione correctamente tenemos que poner las siguientes variables (en orden):

  • Dirección del archivo a subir. La dirección tiene que estar en el servidor. No se permite indicar otras paginas web por motivos de seguridad en cURL.
  • Email de la cuenta de usuario a la que se quiere subir el archivo.
  • Contraseña de la cuenta de vimeo a la que se va a subir el archivo
  • Titulo del video a subir (opcional)
  • Descripción del video (opcional)
  • Etiquetas del video, IMPORTANTE: separadas por comas (opcional)
  • Permiso de acceso al video. Los vídeos se suben como predeterminado con el permiso en nobody, lo que quiere decir que solo los puede ver el usuario que los ha subido. Los permisos que se pueden poner aquí son nobody para que sea un video privado, anybody para que sea público, contacts para que lo puedan ver solo los contactos agregados a la cuenta de vimeo en la que se sube el video o los nombres de los usuarios a los que se desea dar permiso para que puedan ver el video. Si solo se desea dar permiso a un usuario es obligatorio escribir una coma al final. (opcional)
  • Key del programa. Vimeo identifica las firmas de cada aplicación a partir de las key, así que si quieres usar esta función sin modificar esto no hay problema. La función viene ya con una key pero si quieres modificar la que tiene predeterminada para firmar tu propio programa solo tienes que ponerla aquí. (opcional)
  • Key secreta. Es el complemento a la key anterior para firmar las peticiones. si cambias el parámetro anterior es obligatorio que cambies este también por los datos de la nueva key. (opcional)

Y ahora un ejemplo simple:
Este ejemplo sube un video en mp4 llamado “gato_saltando.mp4″ situado en la misma carpeta donde se ejecute al función.
[PHP]

$video_datos = vimeo_upload(‘gato_saltando.mp4’, ‘cuenta_de_usu@rio.com’, ‘SeCrEt0’, ‘Gato saltando!!’, ‘Texto que explica lo que se ve en el video. En este caso supongo que seria un gato saltando un rato….’, ‘gato, saltando, cat, jumping’, ‘anybody’);

if(strpos($video_datos[‘upload’][‘content’],’stat=”ok”‘)) {
echo ‘El video se ha subido con &eacite;xito’;
} else {
echo ‘No se pudo subir el video: ‘.”\n”;
print_r($video_datos);
}

[/PHP]

Recordad que siempre los archivos a enviar tiene que estar previamente dentro del servidor web.
Para subir los vídeos a vuestro servidor web hay muchísimos script que podéis usar.

Si alguien quiere hacer algo parecido o modificar esta función se puede sentir libre de hacerlo, y si lo deja por aquí mejor que mejor..! Solo comentar que si queréis seguir usando otras propiedades de la API de vimeo tened en cuenta que aun no se por que pero en mi experiencia el “orden” de lo introducido en la consulta es vital para evitar que aparezcan los errores Invalid “111 Signature” sin razón aparente.
Para cualquier cosa comentario.. y como mención especial no puedo dejar de agradecer al señor @edeleon la rápida y acertada respuesta en mis dudas, Gracias.
Gracias de nuevo al Sr. @edeleon he encontrado un bug que afecta a la primera vez que se intenta subir un video a una cuenta nueva… el sistema intentaba asociar la API-KEY a la cuenta y al no conseguirlo, no podia subir el video correctamente. Por esto se le ha añadido una comprobación en el apartado #frob.

13 opiniones en “vimeo_upload(), sube vídeos a vimeo desde tu servidor con PHP”

  1. Hola, quisiera que explicaras bien como usar estos scripts, puesto que es la primera vez que usaré esta API.

    Saludos!

  2. Hola Luis Velito, pues como no me expliques un poco mas que duda tienes…
    el script que esta arriba hace varias consultas para autenticarse, aceptar las verificaciones, conseguir permisos y subir un archivo al servidor..
    Los últimos pasos son para a través de la API y de los valores obtenidos escribir el titulo, tags, texto…

    todas las consultas las tienes divididas por los comentarios de # como en las lineas 23 y 30..

    Para realizar las consultas lo que se utiliza es una función de apoyo como indico arriba que se llama source_extract(). En ese post tiene mas información de como usarla y para que vale.

    Si tienes alguna duda mas concreta coméntamela..

  3. Hola: Estoy intresada en utilizar esta api para un proyecto web. Como soy nueva en esto necesito saber si ademas de permitirme cargar videos que se en cuentran alojados en mi servidor, el codigo me devuelve la url en donde han sido guardados los videos en vimeo, para poder luego llamarlos a mi sitio. Desde ya muchas gracias por las orientaciones que me puedan dar. Y te felicito por el post

  4. Hola laura, como explico arriba, si, los vídeos que subas a vimeo tienen que estar dentro de tu servidor… hay otro post en esta misma web que te explican como hacer un sistema para subir archivos como tus vídeos.

    para hacer la segunda parte de la dirección tendrás q usar los datos que da como resultado la función.

    algunos de esos datos te pueden valer para componer el código directamente pero no, no da los enlaces directamente según recuerdo aunque no seria muy difícil conseguirlo adjuntando mas consultas.

  5. Hola: Otra pregunta: Estoy provando el codigo y ya me saque una cuenta en vimeo. Queda claro que soy bastante novata en este tema, pero tengo intenciones de aprender. Para mi proyecto solo necesito subir el video, no necesito comentarios etc. La carga de archivos en mi pagina la hago en flash, alli llamo al php con el codigo que posteaste. Y obviamente no ocurre nada porque obviamente estoy haciendo algo mal. Necesitaria que orientaras un poco o me sugirieras alguna pagina para poder resolver esta cuestion, muchas gracias

  6. Disculpa recien veo tu respuesta, yo ya tengo un codigo que funciona que me permite cargar y guardar videos en mi servidor dentro de un directorio llamado videos. Mi problema, en realidad lo que no se, es como hacer para enviar dicho video de mi servidor a vimeo. Lo he intentado primero cargando el video y luego en otra funcion enviandolo a vimeo llamando al php con tu post, pero nada.
    GRacias nuevamente!!!!!!!!!:)

  7. Hola laura, para que todo funcione correctamente lo que necesitas es 1º tener los 2 códigos que he puesto arriba en un mismo archivo, luego que esos dos códigos estén entre las etiquetas de PHP (ya sabes, y tercero que modifiques los nombres y el resto de datos del ultimo código, es decir.. que cambies el nombre del archivo de ejemplo por la dirección donde esta alojado el video dentro de tu servidor.. luego cambias el usuario y contraseña por los de tu cuenta de vimeo y por ultimo debes poner los datos asociados al video (titulo y todo eso…)
    de esa manera el video que tengas alojado subirá a vimeo.. si lo que haces es enviar desde el formulario el video al archivo donde tienes al función lógicamente no va a subir a vimeo por que antes tienes que alojarlo en tu servidor para reenviarlo a vimeo. Si quieres conseguir que suba desde un formulario externo necesitaras modificar con variables el ultimo ejemplo de forma que cambie dinámicamente los datos introducidos a la función desde tu formulario, y ejecutar la función cuando el archivo ya ese en tu servidor.

    Suerte con tu proyecto.

  8. Saludos
    Bueno, escribo porque he querido realizar un script de subida de archivos de mi servidor hacia vimeo, encontre entre los resultados este script, y lo estoy probando pero no me permite la subida de archivos

    Ya tengo los datos de key pues he realizado ya el registro en vimeo, y aparte tengo cuenta en vimeo como usuario normal, igualmente copie tus códigos en un archivo php y estoy usando un video que esta en una carpeta de mi propio servidor, quisiera saber si algo ha cambiado desde tu publicación pues veo que es de 2009 guiandome por las fechas de los comentarios, estare atento, y gracias.

  9. buenos dias, estoy probando el script, consegui que me haga el upload, me da el mensaje de que subi correctamente el video pero cuando voy a vimeo no subio nada, que puede ser?

  10. hola esto se puede implementar a drupal o ya existe una aplicacion el cual me permita trabaja drupal con upload de videos vimeo? gracias
    Saludos

  11. Fantastic beat ! I wish to apprentice while you amend your website, how can i subscribe for a blog web site? The account aided me a acceptable deal. I had been a little bit acquainted of this your broadcast offered bright clear concept cfkddabefkde

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *