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.

Mejora de emule y actualización de servidores

emuleEn estas fechas cuando familias y amigos se reúnen, y mas cuando eres informático, una pregunta rsuena al rededor… “¿que le pasa a mi emule?¿por que no tiene servidores?” ah, ¿que os pensabais que iba a ser otra? jejeje
El problema desde hace un tiempo a esta parte es que los servidores de emule empiezan a caer, y los repositorios desde donde todos los actualizábamos también de manera que tenemos que hacer unas pequeñas modificaciones.

Para que nuestro emule vuelva a funcionar tenemos que actualizarpincha sobre los siguientes enlaces..

http://ed2k.2x4u.de/fiee1n0h/max/server.met
http://esel-paradies.de/server/server.met
http://immissionsdaten.de/server.met
http://lakenet.i-networx.de/server.met
http://mullah5.tripod.com/server.met
http://ocbmaurice.dyns.net/pl/slist.pl?download/server-max.met
http://ottokar.i-networx.de/server.met
http://profesor666.no-ip.org:3000/server.met
http://users.servicios.retecal.es/ljpadillam/Baltab/server.met
http://usuarios.lycos.es/guillespi/server.met
http://vlom.yo.lv/donkey/server.met
http://www.donkeysupport.de/index.php?met=server-max
http://www.edonkey2000.com/server.met
http://www.gruk.org/server.met
http://www.hot.ee/ed2kest/server.met
http://www.peerates.net/servers.php
http://www.picsystems.net/emule/servermet/all_server.met
http://www.server-met.de/dl.php?load=max&trace=34170739.9444

Cada uno de los enlaces es un nuevo grupo de servidores.

servidorSi queremos mantener actualizada la lista cada vez que iniciemos el emule, solo tenemos que pinchar sobre Preferencias y en la ventana que sale, sobre servidor. Aquí, activamos las 3 casillas que aparecen al principio.. Auto-actualizar y los otros dos de actualizar lista de servidores. Una vez realizado esto pulsamos sobre el boton Editar... lo que mostrara una ventana de Bloc de notas. Pegamos las direcciones que funcionaron de arriba separadas con saltos de linea y guardamos. Pulsamos en aceptar y cerramos emule.
Al volver a abrir debería buscar los servidores y cargarlos de nuevo.

Opciones adicionalesSi a demas queremos mejorar sustancialmente la velocidad de descarga (a costa de algo del ancho de banda) solo tenemos que abrir Preferencias y en la ventana que sale Opciones adicionales. Una vez aqui, vemos que los dos primeros datos son Nuevas conexiones máx. y Máx conexiones a medio abrir. En el primero debería ponerse un numero algo.. como 100 (sin excederse.. podéis hacer pruebas) y en el segundo un numero menor a 99 (yo recomiendo un 80 o 95..) también deberíais probar.. depende de conexiones…

Con estas recomendaciones debería ser suficiente para tener un emule con buena velocidad si tenéis los puertos abiertos

Lang_detect(), detecta en que lenguaje esta un texto con PHP

libreria de idiomasSi, con todos los diccionarios online y con todos los traductores que existen hoy en día es muy fácil cambiar un texto de un lenguaje a otro pero, ¿como saber en que lenguaje esta para decidir que idioma de origen seleccionamos?
Pues como siempre, google al rescate!. La Google AJAX Language API nos ayuda a decidirlo a partir de un simple extracto, y como siempre, para no complicarnos os dejo una función sencilla y unos ejemplos.

[PHP]
function lang_detect($texto){
$url = ‘http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=’.urlencode($texto);
if(strlen($url)>2000){ $url = substr($url, 0, 1999); }
$response = file_get_contents($url);
preg_match_all(‘!{“responseData”: {“language”:”(.+)”,”isReliable”:(.+),”confidence”:(.+)}, “responseDetails”: (.+), “responseStatus”: (.+)}!U’,$response,$s);
$o[‘language’] = $s[1][0];
$o[‘isReliable’] = $s[2][0];
$o[‘confidence’] = $s[3][0];
$o[‘responseDetails’] = $s[4][0];
$o[‘responseStatus’] = $s[5][0];
return $o;
unset($o,$s);
}
[/PHP]

La primera y única variable que usa lang_detect() es el texto del que queremos saber en que idioma esta. Como resultado nos dará un array con varios datos como el factor de acierto que puede tener la detección (confidence) o el lenguaje en el que esta escrito (language).
Para mas información sobre el resto de parámetros devueltos podéis leer la documentación.

Ejemplo uno texto e italiano:
[PHP]
$texto = ‘ciao mondo crudele’;
$resultado = lang_detect($texto);
echo resultado[‘language’];
[/PHP]

Ejemplo dos, texto en español:
[PHP]
$texto = ‘Hola mundo!!’;
$resultado = lang_detect($texto);
print_r(resultado);
[/PHP]

Revision del proyecto Proyector Laser de video

proyector laser RGBHace ya mas de año y pico que publique la idea de realizar una pantalla de alta definición casera a partir del movimiento de 3 punteros láser y después de tantos comentarios y visitas al tema creo que ha llegado la hora de aclararnos un poco sobre que se pretende conseguir y cuales son los pasos para conseguirlo.

La idea principal era realizar una pantalla OpenHardware, que cualquiera pudiera mejorar mientras decidan compartir esas mejoras con los demás. De esta manera todos tendremos pantallas de bajo coste y podremos hacer llegar la información a mas lugares. Por esto una de las principales cosas que buscaba era que fuera de montaje sencillo y asequible, para que no fuera muy costoso para cualquiera poder experimentar.

Por todo esto y para empezar unificando pense en utiizar como referencia los conectores que mas se utilizan desde que puse el articulo hasta la actualizad, los conectores VGA. Estos permiten utilizar salidas independientes para cada color (Rojo, Verde y Azul) y a demas tomar una señal cuadrada que indica cuando cambia de linea o de punto (sincronismo vertical u horizontal). Pero de todas formas para realizar esta idea hace falta superar algunos retos electrónicos y opticos:

Como ya se comento en el anterior articulo, el ingenio funcionaria a partir de unas piezas espejadas móviles que orientaran los haces de luz a cada punto de la pantalla. Esto se conseguiría utilizando un primer sistema que moviera el haz de derecha a izquierda creando lineas de puntos, y un segundo que moviera cada linea un punto mas abajo creando los cuadros de imagen. La utilización de esta tecnología hace que el tamaño y resolución de la pantalla pueda ser cambiado digitalmente sin utilizar piezas adicionales (llegando hasta unos limites claro).

El primer reto a superar para conseguirlo seria realizar un sistema espejado que pueda moverse al menos a 50Hz. En un primer momento para mejorar el montaje se opto por utilizar motores de CD o DVD viejos para conseguir la velocidad necesaria utilizando un engranaje dentado para hacer reflejar los haces de luz, pero pronto comunicaron que esto era igual de facil de montar como de que las lineas se vieran borrosas por la sujeción de los elementos. Por lo tanto creo que volvemos a la opción inicial.
Podríamos utilizar un altavoz, como sistema móvil, espejeando su membrana a partir de un spray cromado o utilizando algún recubrimiento de este tipo y acoplarle un circuito de transistor que utilice las señales de salida de sincronismo del conector VGA (pines13-5 y 15-10) para, directamente sin mas controladores se produzca la vibración. Lo que no se, es si tendríamos que utilizar algún elemento mas entre medias para conectarlo y poder por lo tanto hacer que la potencia en el altavoz sea suficiente.

esquema de Pines VGAEl segundo reto seria crear un circuito electrónico que permita, a partir de la potencia de cada color poder pasar la potencia proporcional al láser. Esto seria muy parecido al anterior… con un circuito de transistor que permita variar a partir de 2 potenciómetros la tensión máxima y mínima de entrada al láser nos iría genial. de esa manera podríamos regular la cromática del conjunto por separado.

Difraccion de haces laserEl ultimo reto sería óptico..
3 láser de respectivos colores para formar un punto de color necesitan estar muy bien alineados para que no desdoblen la imagen, lo que ahora se consigue con espejos que filtran espectros de color. Y este es el punto flaco del proyecto. Si utilizamos un solo conjunto móvil para los 3 láser hay que unificarlos antes de proyectarlos contra el primer espejo, por lo que a mi solo se me ha ocurrido utilizar fibra óptica. Un hilo de fibra óptica se conectaría a cada láser unificando las puntas de los 3 en un solo extremo que enfocaríamos hacia el espejo, el efecto seria casi el mismo que el de las pantallas actuales de pixeles.