Last updated January 19, 2010 15:47, by EstebanFuentealba
= 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:
*[http://www.goear.com]
*[http://www.esnips.com]
= ¿ 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:
*http://goear.com/reqsearch.php?q=daddy&p=0
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
<pre><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></pre>
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:
<pre>
<[^>] target='_parent' href='http://www.goear.com/listen/(.[^/]+)/(.[^']*)'>(.[^>]+) - \\((.[^<]+)\\)</[^>]+>
</pre>
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
<pre>
http://www.goear.com/files/xmlfiles/{primer caracter de la id}/secm{id}.xml
</pre>
Ejemplo :
http://www.goear.com/files/xmlfiles/3/secm34597f7.xml
eso nos devuelve un documento xml donde está el link de descarga
<pre>
<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>
</pre>
Nuevamente con Expresiones Regulares podemos sacar desde ese xml el link de descarga. La siguiente expresion es para sacar la url del mp3
<pre>
<song path=\"(.+)\" bild=\"(.+)\" artist=\"(.+)\" title=\"(.+)\"/>
</pre>
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:
<pre name="php">
<?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,
)
)
)
)
);
?>
</pre>
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:
<pre name="php">
<?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)).'" }] }';
?>
</pre>
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
<pre name="java">
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);
}
</pre>





