aMule Forum

Please login or register.

Login with username, password and session length
Advanced search  

News:

We're back! (IN POG FORM)

Author Topic: amulecmd usado en script de PHP  (Read 2369 times)

Lito

  • Newbie
  • Karma: 0
  • Offline Offline
  • Posts: 2
amulecmd usado en script de PHP
« on: May 27, 2007, 06:26:39 PM »

Hola a todos!!!

He realizado un script en PHP (por que mi bash es bastante limitado) para la descarga de las canciones de los 40 principales todas las semanas :)

La explicación es la siguiente:

1 ) Se descarga el HTML de la lista de los cuarenta
2 ) La parsea y se queda solo con la canción y el autor
3 ) Para cada una de las canciones lanza una llamada al sistema con el comando exec para realizar la búsqueda: exec('/usr/bin/amulecmd --command="Search global cancion artista"');
4 ) Hace una pausa de 30 segundos
5 ) Lanza el comando de obtención de resultados: exec('/usr/bin/amulecmd --command="results"', $resultados);
6 ) Los filtra y crea un array con el id y con los sources, despues los ordena por sources y se queda con el primero
7 ) Lanza el comando de descarga del número que le corresponde: exec('/usr/bin/amulecmd --command="download numero"');
8 ) Hace una pausa y continua con la siguiente canción

El script funciona correctamente salvo por dos problemas:

1 ) Cada vez que lanzo el comando de results (paso 5) me devuelve tambien los resultados de todas las búsquedas anteriores, con lo que se mezclan y obtengo el source de todas las búsquedas anteriores. En la última canción, el results me devuelve la lista con todas las canciones buscadas en el script.
2 ) Cada vez que lanzo el download, responde: "Argumento no válido. Teclea 'help download' para obtener mas ayuda.".

En cada paso imprimo cada comando que ejecuta así como el resultado, si ejecuto eses mismos comandos desde consola el resultado es el mismo :(

Aquí está mi script:

Code: [Select]
<?php
/*
* los40.php
*
* Descarga la lista de canciones de los cuarenta principales usando
* la consola de amule: amulecmd
*/

$ok false;

// Compruebo si ya esta lanzado el amuled
exec('/bin/ps -ef | grep "amuled -f" | grep -v grep'$ps);

foreach (
$ps as $v) {
  if (
strstr($v'/usr/bin/amuled -f')) {
    
$ok true;
  }
}

if (!
$ok) {
  echo 
"\nArrancando amuled";

  
exec('/usr/bin/amuled -f');

  
// Arranco el amuled en caso de que no se encuentre
  // en ejecucion y espero un tiempo para que conecte
  
sleep(60);
}

// Me descargo el codigo fuente de la lista de los 40
exec('curl http://www.los40.com/actualidad/listas/lista40.html > los40.log');

$log file_get_contents('los40.log');

// Busco todas las canciones de la lista
preg_match_all('#<FONT class="negro">([^<]+)</FONT>#'$log$atopado);

foreach (
$atopado[1] as $v) {
  
// Limpio cada fila y solo permito palabras de 4 letras o mas
  
$v str_replace(array('"''('')'), ''trim($v));
  
$palabras explode(' '$v);

  foreach (
$palabras as $k2 => $v2) {
    if (
strlen($v2) < 4) {
      unset(
$palabras[$k2]);
    }
  }

  
$v implode(' '$palabras);

  if (empty(
$v)) {
    continue;
  }

  echo 
"\n\n\nBuscando: /usr/bin/amulecmd --command=\"Search global $v\"";

  
exec('/usr/bin/amulecmd --command="Search global '.$v.'"');

  
// Hace una pausa para la busqueda
  
sleep(30);

  echo 
"\n\nResultados: /usr/bin/amulecmd --command=\"results\"\n";

  
exec('/usr/bin/amulecmd --command="results"'$resultados);

  
$lista = array();
  
$i 0;

  foreach (
$resultados as $v2) {
    
// Para cada fila de resultados compruebo que contiene
    // lo que realmente necesito
    
if (!preg_match('/^[0-9]+\. /'$v2)) {
      continue;
    }

    if (!
strstr($v2'.mp3')) {
      continue;
    }

    
// Guardo los elementos que me interesan de cada
    // fila de resultados
    
$partes explode(' '$v2);

    echo 
"\nListado: $v2";

    
$lista['id']['k'.$i] = intval($partes[0]);

    
$source end($partes);

    
$lista['sources']['k'.$i] = intval($source);
    
$lista['resultado']['k'.$i] = $v2;

    
$i++;
  }

  
// Continua si no hay resultado
  
if (count($lista['id']) == 0) {
    continue;
  }

  
// Ordena por sources ascendente y se queda
  // en el primer resultado
  
arsort($lista['sources']);

  
$k2 key($lista['sources']);

  echo 
"\n\nDescargando: /usr/bin/amulecmd --command=\"download ".$lista['id'][$k2]."\" (".$lista['resultado'][$k2].")";

  unset(
$resultado);

  
exec('/usr/bin/amulecmd --command="download '.$lista['id'][$k2].'"'$resultado);

  echo 
"\n\n".implode("\n"$resultado);

  
sleep(10);
}
?>


Y se ejecuta como:

Code: [Select]
php -f los40.php

Muchas gracias por vuestra ayuda!!

Lito.
« Last Edit: May 27, 2007, 06:45:43 PM by Lito »
Logged

darksidex

  • Mule Farmer
  • Full Member
  • ***
  • Karma: 4
  • Offline Offline
  • Posts: 194
Re: amulecmd usado en script de PHP
« Reply #1 on: May 28, 2007, 10:13:34 AM »

En el paso 7, para el donwload, podrías usar el comando ed2k tal que
Code: [Select]
exec('/usr/bin/ed2k \"'.$lista['id'][$k2].'\"', $resultado);

Sobre el otro problema, no sabría decirte, nunca he usado las búsquedas con amulecmd
Logged
First of all, I apologize for my bad english. :D

Lito

  • Newbie
  • Karma: 0
  • Offline Offline
  • Posts: 2
Re: amulecmd usado en script de PHP
« Reply #2 on: May 28, 2007, 11:50:37 PM »

Muchas gracias, tengo que probarlo, pero por ahora me he montado otro script para salir al paso.

Este lo que hace es buscar la canción en http://www.emugle.com/ y despues parsear los resultados para obtener el enlace ed2k y añadirlo al emule con amulecdm add.

Es este, espero que os sea de utilidad:

Code: [Select]
<?php
/*
* los40.php
*
* Descarga la lista de canciones de los cuarenta principales usando
* la consola de amule: amulecmd
*/

$ok false;

// Compruebo si ya esta lanzado el amuled
exec('/bin/ps -ef | grep "amuled -f" | grep -v grep'$ps);

foreach (
$ps as $v) {
  if (
strstr($v'/usr/bin/amuled -f')) {
    
$ok true;
  }
}

if (!
$ok) {
  echo 
"\nArrancando amuled";

  
exec('/usr/bin/amuled -f');

  
// Arranco el amuled en caso de que no se encuentre
  // en ejecucion y espero un tiempo para que conecte
  
sleep(60);
}

// Me descargo el codigo fuente de la lista de los 40
// exec('curl http://www.los40.com/actualidad/listas/lista40.html > los40.log');
//$log = file_get_contents('los40.log');
echo "\nDescargando Lista 40 principales: http://www.los40.com/actualidad/listas/lista40.html";

$log file_get_contents('http://www.los40.com/actualidad/listas/lista40.html');

// Busco todas las canciones de la lista
preg_match_all('#<B>([^<]+)</B></A>#'$log$artistas);
preg_match_all('#<FONT class="negro">([^\(]+)\([^<]+</FONT>#'$log$cancions);

foreach (
$cancions[1] as $k => $v) {
  
// Limpio cada fila y solo permito palabras de 4 letras o mas
  
$v str_replace(array('"''('')','.',','), ''trim($v));
  
$palabras explode(' '$v);

  foreach (
$palabras as $k2 => $v2) {
    if (
strlen($v2) < 4) {
      unset(
$palabras[$k2]);
    }
  }

  
$v implode(' '$palabras);

  if (empty(
$v)) {
    continue;
  }

  
$artista str_replace(array('"''('')','.',','), ''trim($artistas[1][$k]));
  
$palabras explode(' '$artista);

  foreach (
$palabras as $k2 => $v2) {
    if (
strlen($v2) < 4) {
      unset(
$palabras[$k2]);
    }
  }

  
$artista implode(' '$palabras);

  echo 
"\n\nBuscando: http://www.emugle.com/search.php?q=".urlencode($artista)."+".urlencode($v)."&t=Audio&Submit=Search&f=0";

  
$resultado file_get_contents('http://www.emugle.com/search.php?q='.urlencode($artista).'+'.urlencode($v).'&t=Audio&Submit=Search&f=1');
  
$resultado str_replace(array('<b>','</b>'), '' ,$resultado);

  unset(
$link);

  
preg_match('#ed2k://\|file\|[^<]+#'$resultado$link);

  if (
strstr($link[0], 'ed2k://|file|')) {
    echo 
"\n\nDescargando: ".$link[0]."\n";

    
exec('/usr/bin/amulecmd --command="add '.$link[0].'"');
  } else {
    echo 
"\n\nSen Resultados: $artista $v\n";
  }
}
?>


Este funciona sin problemas.

Lo lanzo como cron los lunes para que me coja la lista todas las semanas ;)

Code: [Select]
php -f los40.php
En el código algún \n para salto de linea aparece sin la barra invertida.

Un saludo,
Lito.
« Last Edit: May 28, 2007, 11:52:40 PM by Lito »
Logged