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:
<?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:
php -f los40.php
Muchas gracias por vuestra ayuda!!
Lito.