Remote ID3 función
Ayer echando un vistazo a muxtape, un servicio muy minimalista y sencillo me di cuenta que subiendo la canción ya obtenía el titulo y el arista. La verdad es que me llamo la atención y estuve jugando un poco con las funciones ID3, pero al probar en un archivo remoto me decía que nanai de la china. Estuve buscando y encontré unas clases que usaban fseek y claro tampoco me valían.Al final por phpclassess di con una que buscaba en archivos remoto, pero como ya tenia el gusanillo decidí crear una función.
function ID3($mp3='') {
//etiquetas ID3
$ID3 = array(
'title' => 'TIT2',
'artist' => 'TPE1',
'album' => 'TALB'
);
//miramos si es un archivo mp3
if(substr($mp3, -3, 3) != 'mp3') return false;
//abrimos parte del archivo y leemos
$fp = fopen($mp3, 'r');
$data = fread($fp, 3000);
fclose($fp);
//comprobamos que tiene ID3
if(substr($data, 0, 3) != 'ID3') return false;
//parseamos los tags
foreach($ID3 as $type => $key) {
//existe el tag?
if(strpos($data, $key)) {
//existe entre tags o es el ultimo?
if(!preg_match('!'.$key.'(.*)[A-Z]{3}[A-Z1-4]{1}!Us', $data, $tag)) $tag = explode($key, $data);
//algo raro pasa con los caracteres asi que limpiamos
$info = $tag[1];
$info = str_replace(' ', '...', $info);
$info = preg_replace('![^A-Za-z0-9\./\'\(\)]+!','',$info);
$info = str_replace('...', ' ', $info);
$ID3[$type] = $info;
} else {
//si no lo encontramos lo borramos
$ID3[$type] = '';
}
}
//devolvemos el nuevo array
return $ID3;
}
//print_r(ID3('http://algunaweb.com/mp3.mp3'));
La función devuelve el titulo, el artista y el álbum de la canción, en caso de no poder parsear devuelve false.
He tenido bastantes problemas dando con la solución para arreglar un poco los textos, asi que es posible que más de una vez te encuentres con 7 o caracteres extraños.
Ver post
Comentar
Juan Manuel Lemus#1 hace 116 días
Vaya chico, tu si que eres un gran experto. Haber cuando das un cursito de expresiones regulares. Muy buena la función, seguro que la usaré.
hanok#2 hace 116 días
Gracias por compartir la función! la verdad es que se le puede sacar mucho partido...
Apoyo lo de las expresiones regulares ;)
Saludos
DrSlump#3 hace 116 días
No funciona simplemente descargando los 3 primeros kilobytes del fichero (como haces), guardándolos en un fichero temporal o un string stream y utilizar alguna de las librerías ya existentes?
Para el filtrado que haces, entiendo que primero reemplazas los espacios normales por '...' para eliminar los saltos de línea, tabuladores, etc. Yo normalmente hago limpieza de espacios reemplazando todo lo que pilla s por un espacio y limitar el número de espacios a uno.
Primero normaliza todo a espacios simples y luego elimina las secuencias de espacios por uno solo. De todas formas en el caso concreto de tu función debería bastar con incluir un espacio en blanco dentro de la clase negada.
$info = preg_replace('![^A-Za-z0-9./\'() ]+!','',$info);
Para aprender expresiones regulares, os recomiendo la aplicación RegExBuddy [1]. Por 30eur es una excelente utilidad para aprender, probar y optimizar las expresiones.
[1] www.regexbuddy.com
IceBeat#4 hace 116 días
@Juan Manuel Lemus y @hanok hace tiempo escribi un articulo sobre expresiones, pero ya tiene un tiempo ehh, http://icebeat.bitacoras.com/post/62/uso-de-los-modificadores-en-expresiones
@DrSlump mi idea era no guardarlo en ningún lado, acceder directamente.
Realizando la función probé de muchas formas, una de ellas con mi sanitize pero no se portaba como debía, luego una sin negación pero en firefox me hacia extraños, es como si los caracteres ocuparan 3, con lo que apenas podía hacer nada.
Al final con tanto dolor de cabeza no me percate que metiendo el espacio en la expresión podría funcionar.
Un saludo y gracias de nuevo.