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:
  1. function vimeo_upload(
  2.     $file,
  3.     $mail,
  4.     $pass,
  5.     $title='',
  6.     $descripcion='',
  7.     $tags='',
  8.     $permisos=false,
  9.     $api_key='e1dfce4136d69d7f99d2a4d00c4a0d71',
  10.     $api_secret='e9ff591b0'
  11. ){
  12.    
  13.     @set_time_limit(0);
  14.     $title      = htmlentities($title,            ENT_NOQUOTES, 'UTF-8');
  15.     $descripcion    = htmlentities($descripcion,    ENT_NOQUOTES, 'UTF-8');
  16.     $cookie         = tempnam ("/tmp", "VIMEO");
  17.     $api_login_url  = "http://www.vimeo.com/log_in";
  18.     $api_rest_url   = "http://www.vimeo.com/api/rest/";
  19.     $api_auth_url   = "http://www.vimeo.com/services/auth/";
  20.     $api_upload_url = "http://www.vimeo.com/services/upload/";
  21.  
  22.     if($file){
  23.         #login
  24.         $args = array(
  25.             'sign_in[email]'    => $mail,
  26.             'sign_in[password]' => $pass
  27.         );
  28.         $login = source_extract($api_login_url, $args, '', '', true, $cookie);
  29.        
  30.         #frob
  31.         $args = $_args = array(
  32.             'api_key'   => $api_key,
  33.             'perms'  => 'write',
  34.             'format'    => 'php'
  35.         );
  36.        
  37.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  38.         $frob = source_extract($api_auth_url, '', $args, '', true, $cookie);
  39.         if(!$frob['header']['Location']){ //si aun no fue aceptada la autorizacion
  40.             $frob = source_extract($api_auth_url, $_args, '', '', true, $cookie);   #lo autorizamos por POST
  41.             $frob = source_extract($api_auth_url, '', $args, '', true, $cookie);    #y pedimos el frob de nuevo
  42.         }
  43.         $frob = substr($frob['header']['Location'], strpos($frob['header']['Location'], 'frob=')+strlen('frob=') );
  44.        
  45.         #token
  46.         $args = array(
  47.             'api_key'   => $api_key,
  48.             'format'    => 'php',
  49.             'frob'    => $frob,
  50.             'method'    => 'vimeo.auth.getToken'
  51.         );
  52.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  53.         $token = source_extract($api_rest_url, '', $args, '', true, $cookie);
  54.         $token = unserialize($token['content']);
  55.         $token = $token->auth->token;
  56.        
  57.         #tiket
  58.         $args = array(
  59.             'api_key'   => $api_key,
  60.             'format'    => 'php',
  61.             'frob'    => $frob,
  62.             'method'    => 'vimeo.videos.getUploadTicket'
  63.         );
  64.        
  65.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  66.         $tiket = source_extract($api_rest_url, '', $args, '', true, $cookie);
  67.         $tiket = unserialize($tiket['content']);
  68.         $tiket = $tiket->ticket->id;
  69.        
  70.         #upload video
  71.         $file = array('video'=>$file);
  72.         $args = array(
  73.             'api_key'   => $api_key,
  74.             'format'        => 'php',
  75.             'auth_token'    => $token,
  76.             'ticket_id'  => $tiket
  77.         );
  78.        
  79.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  80.         $upload = source_extract($api_upload_url, $args, '', $file, true, $cookie);
  81.        
  82.         #check
  83.         $args = array(
  84.             'api_key'   => $api_key,
  85.             'format'    => 'php',
  86.             'frob'    => $frob,
  87.             'method'    => 'vimeo.videos.checkUploadStatus',
  88.             'ticket_id' => $tiket
  89.         );
  90.        
  91.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  92.         $check = source_extract($api_rest_url, '', $args, '', true, $cookie);
  93.         $check = unserialize($check['content']);
  94.        
  95.        
  96.         #title
  97.         $args = array(
  98.             'api_key'   => $api_key,
  99.             'format'    => 'php',
  100.             'method'    => 'vimeo.videos.setTitle',
  101.             'title'  => $title,
  102.             'video_id'  => $check->ticket->video_id,
  103.         );
  104.        
  105.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  106.         $title = source_extract($api_rest_url, '', $args, '', true, $cookie);
  107.         $title = unserialize($title['content']);
  108.        
  109.         #caption
  110.         $args = array(
  111.             'api_key'   => $api_key,
  112.             'caption'   => $descripcion,
  113.             'format'    => 'php',
  114.             'method'    => 'vimeo.videos.setCaption',
  115.             'video_id'  => $check->ticket->video_id,
  116.         );
  117.        
  118.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  119.         $caption = source_extract($api_rest_url, '', $args, '', true, $cookie);
  120.         $caption = unserialize($caption['content']);
  121.        
  122.        
  123.         #tags
  124.         $args = array(
  125.             'api_key'   => $api_key,
  126.             'format'    => 'php',
  127.             'method'    => 'vimeo.videos.addTags',
  128.             'tags'    => $tags,
  129.             'video_id'  => $check->ticket->video_id,
  130.         );
  131.        
  132.         $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  133.         $tags = source_extract($api_rest_url, '', $args, '', true, $cookie);
  134.         $tags = unserialize($tags['content']);
  135.        
  136.         #privacidad
  137.         if($permisos){
  138.             $permisos = strtolower($permisos);
  139.             if( $permisos!='anybody' && $permisos!='nobody' && $permisos!='contacts' && !strpos($permisos, ',')){
  140.                 return  'ERROR: Los permisos permitidos son "nobody" para que sea privado, "anybody",'.
  141.                         ' para que sea publico, "contacts" para que solo lo puedan ver los contactos del'.
  142.                         ' usuario registrado o una lista de usuarios separada por comas para que solo esos'.
  143.                         ' usuarios puedan ver el video. (la funcion requiere que si se usa esta ultima'.
  144.                         ' opción se ponga al menos una coma final.';
  145.             }
  146.            
  147.             if(strpos($permisos, ',')) {
  148.                 $args = array(
  149.                     'api_key'   => $api_key,
  150.                     'format'    => 'php',
  151.                     'method'    => 'vimeo.videos.setPrivacy',
  152.                     'privacy'   => 'users',
  153.                     'users'  => (substr($permisos, -1)==',') ? substr($permisos, 0, -1) : $permisos,
  154.                     'video_id'  => $check->ticket->video_id,
  155.                 );
  156.             } else {
  157.                 $args = array(
  158.                     'api_key'   => $api_key,
  159.                     'format'    => 'php',
  160.                     'method'    => 'vimeo.videos.setPrivacy',
  161.                     'privacy'   => $permisos,
  162.                     'video_id'  => $check->ticket->video_id,
  163.                 );
  164.             }
  165.            
  166.             $s=$api_secret; foreach($args as $k=>$v){   $s .= $k.$v;   }  $args['api_sig'] = md5($s);
  167.             $permisos = source_extract($api_rest_url, '', $args, '', true, $cookie);
  168.             $permisos = unserialize($permisos['content']);
  169.         }
  170.        
  171.         return array(
  172.             'login'  => $login,
  173.             'frob'    => $frob,
  174.             'token'  => $token,
  175.             'tiket'  => $tiket,
  176.             'upload'    => $upload,
  177.             'check'  => $check,
  178.             'title'  => $title,
  179.             'caption'   => $caption,
  180.             'tags'    => $tags,
  181.             'privacity' => $permisos,
  182.         );
  183.     }
  184. }

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:
  1. $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');
  2.  
  3. if(strpos($video_datos['upload']['content'],'stat="ok"')) {
  4.     echo 'El video se ha subido con &eacite;xito';
  5. } else {
  6.     echo 'No se pudo subir el video: '."\n";
  7.     print_r($video_datos);
  8. }

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.