eMule: nuevos servidores y correcciones de velocidad

eMulePor peticiones on y off-line os dejo más instrucciones sencillas para poder tener una mejor búsqueda de archivos, descarga mas rápida y mas servidores validos.

Lista de servidores actualizados:

  1. Seleccionar todas las direcciones y copiarlas.
    http://www.gruk.org/server.met
    http://www.peerates.net/servers.php
    http://usuarios.lycos.es/guillespi/server.met
    http://www.peerates.net/servers.php
    http://www.picsystems.net/emule/servermet/all_server.met
  2. servidor

  3. Hacer click en en Preferencias > Servidor > Editar...
  4. En la ventana del block de notas que aparece borrar todo el texto
  5. pulsar edición > pegar
  6. reiniciar el emule

Si se prefiere solo añadir puntualmente unos cuantos servidores, se puede hacer click en los enlaces que aparecen arriba.

Otro de los servidores mas famosos que no suele estar dentro de ninguna lista es el creado por TusSeries.com . Se trata de un servidor de emule “en beta” pero que funciona realmente bien. Para incluirlo solo hay que hacer click en el siguiente enlace: servidor de emule de TusSeries.

Tablas de velocidad
Para alcanzar la mejor velocidad de emule hay que cambiar algunos parámetros de velocidad. Los pasos son los siguientes.
hacemos el Test de velocidad para ver que velocidad alcanza realmente nuestra linea.
Según los resultados cambiamos los valores por los de la tabla siguiente.
(Situar la flecha encima de los textos subrayados de la tabla para obtener información adicional de la configuración.)

Velocidad 1MB / 300 kbps 2MB / 300 kbps 3MB / 300 kbps 4MB / 512 kbps 6MB 8MB hasta 20 megas con ADSL2+
Capacidad Descarga 100 KB/s 204 KB/s 306 KB/s 400 KB/s 612 KB/s 816 KB/s 2040 KB/s
Límite Descarga sin límite sin límite sin límite sin límite sin límite sin límite sin límite
Capacidad Subida 22 KB/s 22 KB/s 22 KB/s 35 KB/s 45 KB/s 44 KB/s 70 KB/s
Límite Subida 22 KB/s 22 KB/s 22 KB/s 45 KB/s 35 KB/s 44 KB/s 70 KB/s
Tamaño de la cola 5000 5000 5000 5000 5000 5000 5000
Conexiones máximas 1000 1000 1000 1000 1000 1000 1000
Máx. Fuentes/archivo 1000 1000 1000 1000 1000 1000 1000
Nuevas Conexiones máx.5/seg. 60 60 60 60 60 60 60
Máx. Conexiones a medio abrir 9 9 9 9 9 9 50
(tabla extraída de testdevelocidad.es)

Es importante tener los puertos abiertos para obtener una buena velocidad, es lo que se suele llamar tener una ID alta.
Al terminar hay que guardar los valores y cerrar el emule para que cargue los datos.

Filtro AntiSpam
Muchos de los servidores actuales contienen datos de Spam corruptos que impiden que obtengamos resultados al hacer búsquedas.
Para evitar que esto nos pase podemos establecer un filtro que elimine las conexiones malintencionadas y limpie los resultados finales.
para hacer esto tenemos que:
Seguridad eMule

  1. Entramos en Preferencias > Seguridad.
  2. En la seccion de Filtrar IP activamos Filtrar servidores.
  3. en Actualizar desde URL borramos el contenido y escribimos
  4. http://surfnet.dl.sourceforge.net/sourceforge/emulepawcio/ipfilter.dat y pulsamos el boton cargar.
  5. En caso de no encontrar el boton de cargar reiniciamos el emule.

Si todo funciono correctamente, el archivo .dat será actualizado y se borraran automáticamente muchos de los servidores.

Efecto con jQuery tipo LiveUp

estrellas liveUpOs acordáis de SuperMario cuando cogía una vida nueva? pues el otro día pensando en como avisar a los usuarios de alertas gráficamente sin abrir alert() o PopUp innecesarios me acorde de eso mismo.. y fruto de esa idea ha salido este código..

Se trata de una función que al ejecutarla muestra una imagen sobre el elemento indicado, desvaneciéndose y subiendo en un tiempo determinado.

Para ejecutar la función tenemos que poner como primer parámetro el identificador del objeto, ya sea el nombre del tag HTML, del ID o de la clase como en cualquier elemento jQuery es decir, si es un ID con # delante y si es una clase con . delante.
El siguiente parámetro es la dirección de la imagen que queremos que se abra cuando se ejecute la función. El tercer y cuarto valor es respectivamente el alto y ancho de la imagen que vamos a mostrar, el quinto (la variable zenit) es la altura que va a alcanzar la imagen al desaparecer (por defecto esta en 100px). El ultimo valor es el tiempo que tarda en desvanecerse el objeto seleccionado, el tiempo predeterminado es 1 segundo pero si se quiere poner uno hay que ponerlo en ms (1s = 1000).

[js]
function liveUp(id, img, h, w, zenit, wait){
if(img==null) img = ‘star.png’;
if(h== null) h = ’32’;
if(w== null) w = ’32’;
if(zenit== null) zenit = 50;
if(wait== null) wait = 100;
$(id).each(
function(i, domEle){
var d = new Date().getTime();
var liveUpId = id+’_’+i+’_’+d; //i;’_LiVE_Up’+
liveUpId = liveUpId.replace(‘#’, ‘_’);
var offset = $(domEle).offset();
var object = ‘<img id="’+liveUpId+’" src="’+img+’" height="’+h+’" width="’+w+’" />’;

$(‘body’).append(object);

$(‘#’+liveUpId)
.animate({opacity: 1.0}, wait)
.css({‘visibility’:’visible’, ”:”})
.css({‘position’:’absolute’})
.css({‘top’:offset[‘top’], ‘left’:(offset[‘left’]+($(domEle).width()/2)-(w/2) )})
.animate({opacity: 0.0, top: offset[‘top’]-zenit}, 1000,
function (){
$(‘#’+liveUpId).remove();
}
)
;
}
);
}
[/js]

Este código es una función que usa jQuery y jQuery.Easing para ejecutar los efectos base.. ha sido testado en Firefox3, Safari4 y IE7.0.5730.11IC bajo winXP.

A continuación os dejo un ejemplo. Para hacerlo funcionar solo tenéis que guardar con extensión html.

[html]
<html style="background:gray; color: white;">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js" type="text/javascript"></script>
<script type="text/javascript">

function liveUp(id, img, h, w, zenit, wait){
if(img==null) img = ‘star.png’;
if(h== null) h = ’32’;
if(w== null) w = ’32’;
if(zenit== null) zenit = 50;
if(wait== null) wait = 100;
$(id).each(
function(i, domEle){
var d = new Date().getTime();
var liveUpId = id+’_’+i+’_’+d; //i;’_LiVE_Up’+
liveUpId = liveUpId.replace(‘#’, ‘_’);
var offset = $(domEle).offset();
var object = ‘<img id="’+liveUpId+’" src="’+img+’" height="’+h+’" width="’+w+’" />’;

$(‘body’).append(object);

$(‘#’+liveUpId)
.animate({opacity: 1.0}, wait)
.css({‘visibility’:’visible’, ”:”})
.css({‘position’:’absolute’})
.css({‘top’:offset[‘top’], ‘left’:(offset[‘left’]+($(domEle).width()/2)-(w/2) )})
.animate({opacity: 0.0, top: offset[‘top’]-zenit}, 1000,
function (){
$(‘#’+liveUpId).remove();
}
)

;
}
);
}

//direccion de la imagen… en base64 para que funcione directamente con el archivo
var url_imagen = ‘data:image/png;base64,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’; </script>
<title></title>
</head>
<body>
<br /><br /><br /><br /><br /><br /><br /><br /><br />
<b id="estrella" onclick="liveUp(‘#estrella’, url_imagen, 20, 20)">
pulsa aqui para ver como sale una estrella de 20px por 20px
</b>
<br /><br /><br /><br /><br /><br /><br /><br /><br />
<b id="logo" onclick="liveUp(‘#logo’, ‘http://tierra0.com/wp-content/themes/satori/images/LogoTierra0-2.gif’, 100, 200, null, 200)">
pulsa aqui para ver como sale el logo de google pero mucho mas lento
</b>
<p>Ejemplo creado en tierra0.com, mas info en <a href="http://tierra0.com/2009/09/07/efecto-con-jquery-tipo-liveup/">tutorial de liveUp</a></p>
</body>
</html>
[/html]
Para problemas ruegos y preguntas los comentarios, y para donaciones, invitadme a un café 😉

Función de extracción de datos Youtube() en PHP version4

LogoYoutubePHPContinuo con el desarrollo de una nueva versión de esta función que tan famosa parece estarse haciendo.. como todo el mundo sabe su funcionamiento es muy sencillo, se le pasa una variable que puede ser la URL de un video de youtube o su ID y da como resultado un montón de datos sobre el video ordenados dentro de un array, teniendo un segundo parámetro que podemos activar en caso de error y que nos facilita información interna sobre la función..

Esta 4º versión de la función ha salido sobre todo gracias al generoso “cafe” al que me ha invitado @Tx y a los apuntes sobre errores que ha encontrado @Nach en los textos con acentos y similares. De modo que el funcionamiento general de la función es exactamente el mismo.

La otra novedad que tiene esta actualización es el modo en que se realiza la petición de datos, ya que ahora lo hace prácticamente a la misma velocidad pero indicando a youtube que somos un navegador firefox, de manera que así obtendremos los mismos datos que un navegador web normal a su misma velocidad.
Esta modificación se encuentra entre las lineas 9 y 23 de manera que si alguien tiene problemas con esta nueva manera de obtener los datos o encuentra que tiene un consumo de memoria o de tiempo mayor puede volver al modo anterior solo sustituyendo ese párrafo por query = @file_get_contents($url);.

[php]
function youtube($id, $debug = false) {
$_id = parse_url($id);
parse_str($_id[‘query’]);
unset($_id);
$id = empty($v) ? $id : $v;

$url = ‘http://es.youtube.com/watch?v=’.$id;
// Obtencion de los datos desde la web // // //
// (si esta parte te resulta demasiado lenta sustitullela por $query = @file_get_contents($url);
$cookie = tempnam ("/tmp", "YOUTUBE");
$user_agent = ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10’;
$c = curl_init($url);
curl_setopt($c, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true); // no sigue las redirecciones
curl_setopt($c, CURLOPT_HEADER, false); // no mostrar el header denro de la salida
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_USERAGENT, $user_agent);

$query= curl_exec($c);
curl_close($c);

// // // // // // // // // // // // // // // //

$exp_info = ‘!&t=(.+)&!U’;
preg_match_all($exp_info,$query,$t);

$exp_info = "!<meta name=\"title\" content=\"(.+)\">!U";
preg_match_all($exp_info,$query,$titulo);

$exp_info = "!<meta name=\"description\" content=\"(.+)\">!U";
preg_match_all($exp_info,$query,$descripcion);

$exp_info = "!<span class=\"watch-video-added post-date\">(.+) de (.+) de (.+)</span>!U";
preg_match_all($exp_info,$query,$fecha);

$exp_info = "<meta name=\"keywords\" content=\"(.+)\">";
preg_match_all($exp_info,$query,$tags);

$exp_info = "!href=\"/user/(.+)\"!U";
preg_match_all($exp_info,$query,$user);

$t = $t[1][0];
$titulo = $titulo[1][0];
$descripcion = $descripcion[1][0];
$fecha = ($fecha[1][0]&&$fecha[2][0]&&$fecha[3][0]) ? $fecha[1][0].’ de ‘.$fecha[2][0].’ de ‘.$fecha[3][0] : ”;
$tags = $tags[1][0];
$user = $user[1][0];

$salida["id"] = $id;
$salida["t"] = $t;
$salida["url"] = $url;
$salida["iurl"] = "http://img.youtube.com/vi/".$id."/2.jpg";
$salida["reproductor"] = "http://www.youtube.com/p.swf?video_id=".$id."&iurl=http://img.youtube.com/vi/".$id."/2.jpg&t=".$t;
$salida["video"] = "http://youtube.com/get_video.php?video_id=".$id."&t=".$t;
$salida["html"] = "<object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http://www.youtube.com/v/".$id."\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/".$id."\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"425\" height=\"350\"></embed></object>";

$salida["title"] = utf8_decode(html_entity_decode($titulo));
$salida["descripcion"] = utf8_decode(html_entity_decode($descripcion));
$salida["fecha"] = $fecha;
$salida["tags"] = utf8_decode(html_entity_decode($tags));
$salida["usuario"] = utf8_decode(html_entity_decode($user));

if($debug){
//sistema de diagnostico
$salida[‘debug’] = $query;
$s[‘la url de lectura es’] = $url;
$s[‘lectura de video’] = ($query ) ? ‘si’ : ‘no’ ;
$s[‘t encontrado’] = ($t ) ? ‘si’ : ‘no’ ;
$s[‘titulo encontrado’] = ($titulo ) ? ‘si’ : ‘no’ ;
$s[‘descripcion encontrada’] = ($descripcion ) ? ‘si’ : ‘no’ ;
$s[‘fecha encontrada’] = ($fecha ) ? ‘si’ : ‘no’ ;
$s[‘tags encontrados’] = ($tags ) ? ‘si’ : ‘no’ ;
$s[‘usuario encontrado’] = ($user ) ? ‘si’ : ‘no’ ;
$s[‘contenido para debug’] = $salida;
return $s;
}

if($t == ""){ //Error de conexion
return false;
} else { // todo OK
return $salida;
}
}
[/php]

Esta función responde un array con las variables del video siempre que el video no haya sido borrado, caso en el que devuelve false.
Un ejemplo practico.
[PHP]
$datos = youtube(‘http://es.youtube.com/watch?v=aWCD69urAqQ&fmt=18′);
if($datos){
foreach($datos as $nombres => $valor){
echo $nombre.’ = ‘.$valor.”
\n”;
}
} else {
echo ‘el video que intentaba ver no existe’;
}
[/PHP]

Si aun queda algún error solo tenéis que comentarlo ah!, y las donaciones/cafés son bienvenidas 😉

Ejemplo de upload simple para uno o varios archivos

rocketFileDado que me comentaron aun con el ultimo post que no se aclaraban muy bien como subir archivos esta vez no voy a poner una función si no un código de ejemplo para subir uno o varios archivos a nuestro servidor.
El código es muy fácil y esta muy comentado así que espero que no haya ningún problema en seguirlo o modificarlo.
Se trata de un formulario muy simple con una caja para subir el archivo y un botón de enviar. Se puede modificar y poner todas las cajas que queramos para subir todos los archivos que queramos. Como plus le he incorporado una sentencia que hace que si esa caja esta vacía no se envíe el formulario hasta que se complete.

la segunda parte hace una comprobación de si se ha enviado algún archivo para subir, si es así no pone nuestro formulario y en vez de eso pone todos los datos que podemos obtener de la subida del archivo. Si se ha enviado un archivo para subir pero ocurrió algún error, nos lo indicara también. En caso de no haber enviado nada pondrá el formulario.

Cada echo la lista de echo seguidos de comentarios son todas las variables que podemos usar en nuestro script. En caso de subir varios archivos a la vez este apartado se duplicara por cada archivo subido.

[PHP]







‘;

//direccion donde queremos dejar el archivo
$path = ‘./’;

//si se ha enviado uno o varios archivos no ponemos el formulario
if(count($_FILES)>0) {
//obtenemos todos los archivos uno por uno
foreach($_FILES as $name => $values){

//comprobamos que esten en la carpeta que nosotros queremos
if( move_uploaded_file($values[‘tmp_name’],$path.$values[‘name’]) ){

echo ‘El archivo ha sido subido correctamente.
‘;
echo ‘Otros datos del archivo:
‘;
echo ‘Nombre del objeto del formulario: ‘. $name. ‘
‘;
echo ‘Nombre original del archivo: ‘. $values[‘name’]. ‘
‘;
echo ‘Tipo de archivo: ‘. $values[‘type’]. ‘
‘;
echo ‘Nombre del archivo temporal: ‘. $values[‘tmp_name’]. ‘
‘;
echo ‘Error producido al subir el archivo: ‘. $values[‘error’]. ‘
‘;
echo ‘Tamaño del archivo: ‘. $values[‘size’]. ‘
‘;
echo ‘
‘;

} else {
//si no estan en la carpeta que nosotros queremos
echo ‘Ha ocurrido un error.
‘;

}
}
} else {
//muestra el formulario si no se ha realizado ningun envio de archivo
echo $fomulario;
}
?>


[/PHP]

El método de uso es muy sencillo. Copia el código de arriba, crea un archivo con extensión php, pega el codigo dentro y guardalo.
Una vez realizado esto solo tienes que cambiar el texto asociado a la variable $path de la linea 14 y poner la dirección de donde quieres que se guarden los archivos una vez en el servidor.
Un usuario “anónimo” ha echo un aporte a este articulo indicando que la función copy() no es la mas adecuada para este tipo de casos aun que sea la mas extendida entre los ejemplos. La mas adecuada es move_uploaded_file() como vemos en la linea 22 que realiza una comprobación previa de que el archivo que va a mover ha sido enviado por HTTP POST desde un formulario, y no es un archivo de dentro de nuestro servidor, evitando de esta manera problemas de seguridad.

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.