Mp3Spider Wiki
¿ Que es Mp3Spider ?
Es un metabuscador de musica, donde se usan variados servidores para encontrar miles de mp3s
Servidores
Hasta el momento, solo para testear el programa ,mp3spider esta buscando en 2 servidores:
¿ Como Busca ?
Cada servidor tiene un link de buqueda, por ejemplo: Goear tiene el siguiente link de búsqueda
- http:// goear.com/reqsearch.php?q={q}&p={p} :
donde :
- {q} es la query de búsqueda
- {p} es la pagina de paginación de resultados
Ejemplo:
esto buscará el término daddy mostrando la página 0 de los resultados de busqueda. Ahora veamos un trozo del código de fuente de esa pagina
<a target='_parent' href='http://www.goear.com/listen/34597f7/tyna-q-ft.-deejay-kmx---best-feeling-(deejay-kmx-2007-remix)-tyna-q-ft.-deejay-kmx---best-feeling-(deej'>Tyna Q Ft. DeeJay kMx - Best Feeling (DeeJay kMx 2007 Remix) - (tyna q ft. deejay kmx - best feeling (deej)</a>con eso nos podemos dar cuenta de lo siguiente:
- 34597f7 Es la id del mp3
- Tyna Q Ft. DeeJay kMx - Best Feeling (DeeJay kMx 2007 Remix) Es el titulo de la canción
- (tyna q ft. deejay kmx - best feeling (deej) Es elArtista
Estos datos lo podemos sacar desde el código de fuente mediante ingeniería inversa y Expresiones Regulares. La expresión regular que necesitamos para sacar esos datos es la siguiente:
<[^>] target='_parent' href='http://www.goear.com/listen/(.[^/]+)/(.[^']*)'>(.[^>]+) - \\((.[^<]+)\\)</[^>]+>con esto agrupo datos quedando los siguientes grupos:
- 1 Es la id
- 3 Es el título
- 4 Es el artista
Con eso ya obtenemos los resultados desde goear
¿ Cómo Descarga ?
Hay dos formas de sacar el link de un mp3 , según los servidores:
- A partir de la id sin conectarse al servidor
- Conectándose al servidor con la id
Por ejemplo para obtener el link de descarga de goear es necesario conectarse al servidor para sacar el link. Hay que conectarse a
http://www.goear.com/files/xmlfiles/{primer caracter de la id}/secm{id}.xml
Ejemplo : http://www.goear.com/files/xmlfiles/3/secm34597f7.xml
eso nos devuelve un documento xml donde está el link de descarga
<songs> <song path="http://www.goear.com/files/sst3/mp3files/10012007/be15aad388c11eeb464a102e0b8915a0.mp3" bild="img/s.jpg" artist="tyna q ft. deejay kmx - best feeling (deej" title="Tyna Q Ft. DeeJay kMx - Best Feeling (DeeJay kMx 2007 Remix)"/> </songs>
Nuevamente con Expresiones Regulares podemos sacar desde ese xml el link de descarga. La siguiente expresion es para sacar la url del mp3
<song path=\"(.+)\" bild=\"(.+)\" artist=\"(.+)\" title=\"(.+)\"/>Grupos:
- 1 url de descarga
Creando Motores de Búsqueda
Sabiendo como buscar y como descargar se pueden crear los motores de búsqueda en PHP como el siguiente:
<?PHP
//GOEAR
$a = array(
"SEARCH" => array(
"URL" => "http://77.67.11.180/reqsearch.php?q={q}&p={p}",
"PAGE" => '$p',
"DATA" => array(
array(
"REGS" => "<[^>] target='_parent' href='http://www.goear.com/listen/(.[^/]+)/(.[^']*)'>(.[^>]+) - \\((.[^<]+)\\)</[^>]+>",
"GROUPS" => array(
"ID" => 1,
"TITLE" => 3,
"ARTIST" => 4
)
)
)
),
"DOWNLOAD" => array(
"TXT_REP" => "http://www.goear.com/files/xmlfiles/{'{1}'.substring(0,1)}/secm{1}.xml",
"CONNECTION" => "true",
"DATA" => array(
array(
"REGS" => "<song path=\"(.+)\" bild=\"(.+)\" artist=\"(.+)\" title=\"(.+)\"/>",
"GROUPS" => array(
"ID" => 1,
)
)
)
)
);
?>
Como podemos ver es solo un arreglo bidimensional con los datos necesarios para buscar y descargar para poder manipularlos desde Java a ese arreglo lo serializamos y lo codificamos en base64 (para evitar problemas con comillas " al deserializarlo) . Actualmente tengo los dos servidores de prueba asi:
<?PHP
//GOEAR
$a = array(
"SEARCH" => array(
"URL" => "http://77.67.11.180/reqsearch.php?q={q}&p={p}",
"PAGE" => '$p',
"DATA" => array(
array(
"REGS" => "<[^>] target='_parent' href='http://www.goear.com/listen/(.[^/]+)/(.[^']*)'>(.[^>]+) - \\((.[^<]+)\\)</[^>]+>",
"GROUPS" => array(
"ID" => 1,
"TITLE" => 3,
"ARTIST" => 4
)
)
)
),
"DOWNLOAD" => array(
"TXT_REP" => "http://www.goear.com/files/xmlfiles/{'{1}'.substring(0,1)}/secm{1}.xml",
"CONNECTION" => "true",
"DATA" => array(
array(
"REGS" => "<song path=\"(.+)\" bild=\"(.+)\" artist=\"(.+)\" title=\"(.+)\"/>",
"GROUPS" => array(
"ID" => 1,
)
)
)
)
);
//ESNIPS
$b = array(
"SEARCH" => array(
"URL" => "http://www.esnips.com/_t_/{q}?to=120&page5=1&gen=Any+Gender&page4={p}&sort=0&page3=1&cnt=Any+Country&page2=1&uf=0&page1=1&page0=1&pageUsers=1&from=13&t=1&page={q}&cur=0&st=4&pp=24&m=4&q={q}",
"PAGE" => '($p+1)',
"DATA" => array(
array(
"REGS" => "<a href='/doc/(.[^/]+)/(.[^']+)'>(.[^<]+).mp3</a>",
"GROUPS" => array(
"ID" => 1,
"TITLE" => 2,
"ARTIST" => 2
)
)
)
),
"DOWNLOAD" => array(
"TXT_REP" => "http://www.esnips.com/nsdoc/{1}/ts_id/{(new Date().getTime()).toString().replace('.','')}/ns_flash/file88.mp3",
"CONNECTION" => "false"
)
);
echo '{ "motores": [{ "id": "'.md5(serialize($a)).'", "JSONMotor":"' .base64_encode(serialize($a)).'" },{ "id": "'.md5(serialize($b)).'", "JSONMotor":"' .base64_encode(serialize($b)).'" }] }';
?>
quedando como éste código JSON http://serv03mp3.orgfree.com/motores.php luego ese archivo JSON es tomado por el programa Java , lo pasa a objeto decodifica y unserializa los motores, dejandolos listo para usarlos desde Java
Uso de clases (Busqueda/Descarga) Java
Aqui dejo la forma de uso
try {
//Los Motores JSON Serializados en PHP
MotorLoad load = new MotorLoad("http://turr0n.vtrbandaancha.net/EstebanFuentealba/motores.php");
//#####
//# Buscar En un Motor
//#####
//Creo un objeto de Mp3SpiderSearch
Iterator it = load.getMotores().entrySet().iterator();
while(it.hasNext()) {
final Mp3SpiderSearch search = new Mp3SpiderSearch("jackson", 0, ((Motor) ((Map.Entry)it.next()).getValue()));
//Agrego el evento que se lanzara cuando encuentre resultados
search.getMatch().addOnResult(new EventResultListener() {
public void onMp3SpiderResult(EventResult e) {
System.out.println(e.getResult());
}
});
//llamo al metodo que crea la busqueda
new Thread(new Runnable() {
public void run() {
try {
search.create();
} catch (ScriptException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (MalformedURLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}).start();
}
//#####
//# Descargar a Partir de una ID, Ejemplo: ID=56f18bf
//#####
//Creo un Objeto de Mp3SpiderDownload
//Mp3SpiderDownload down = new Mp3SpiderDownload("56f18bf", load.getMotores().get("1323ab68182ba07ba90b1dcc48379d28"));
Mp3SpiderDownload down = new Mp3SpiderDownload("22xwYlgwQVo/w730", load.getMotores().get("4ffb6d5809708ab1e745c190cfac82c7"));
//Agrego un listener para cuando saque el link de descarga
down.getMatch().addOnGrabber(new EventLinkGrabberListener() {
public void onGrabberLink(EventLinkGrabber e) {
System.out.println("Link de Descarga: "+e.getSource().toString());
}
});
//llamo al metodo que busca el link de descarga
down.linkGrabber();
} catch (MalformedURLException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}






