Tu propio Network-Music-Player o como reciclar una PC obsoleta

Muchachos, encontré un cliente MPD para Windows que destroza incluso al GMPC (que debería ser el mejor, pero no).

Se llama "Cantata". La primera impresión es que es un soft diseñado para Windows 3.11... Pero a los 10 minutos de uso se van a dar cuenta que es el mejor, por lejos.

Incluso carga archivos cue que NINGUN otro cliente puede cargar. Tengo varios cue que con todos los demás clientes dan error, pero Cantanta los carga perfectamente.


También funciona en GNU/Linux...


Bueno, era eso nomás.
 

Dr. Zoidberg

Well-known-Papá Pitufo
Yo intente evaluar el "Cantata" hace un par de años, pero no logre instalarlo. Tal vez estsba muy crudo aún...
De todas formas solo lo iba a usar para hacer pruebas desde la PC por que controlo todo desde el celu.
 

Dr. Zoidberg

Well-known-Papá Pitufo
Ya estaba podrido de tener que subir la escalera a encender la PC donde está la música para luego bajar a encender el NMP, que ya sabemos que no soporta Wake-On-Lan (WOL) por que es muy viejo, así que se me ocurrió la idea modificar la página web de control remoto del NMP para desde ahí encender la PC que guarda la música que SI soporta WOL. Puede que no sea lo mejor, pero al menos me evito una subida de escaleras con la rodilla operada.

Así quedó la nueva página web del NMP:

76-control-remoto-web.png

Lo que está recuadrado en rojo es el nuevo botón que le agregué, y tiene por trabajo enviar un magic-packet WOL para despertar a la PC que guarda la música, que ahora vive hibernando en lugar de apagarse por completo.
De esta forma, solo enciendo el NMP y luego, con pulsar el botón "Wakeup music storage server" enciendo la otra PC sin moverme del lugar.
Para que esto funcione hay que instalar el programa etherwake (tan dificil como sudo apt-get install etherwake) e invocarlo con la dirección de capa MAC de la placa de red de la PC remota que quieren encender con WOL.

Lean este post anterior para ver que es lo mínimo necesario para que funcione el acceso vía página web.

Les dejo adjunto el archivo index.cgi (en formato zip) que se encarga de mostrar esa pantalla y ejecutar los comandos de cada botón. Si a alguien le sirve, me sentiré contento.
 

Adjuntos

Así quedó la nueva página web del NMP:

Ver el archivo adjunto 170395
Les dejo adjunto el archivo index.cgi (en formato zip) que se encarga de mostrar esa pantalla y ejecutar los comandos de cada botón. Si a alguien le sirve, me sentiré contento.
Hola Doc, por supuesto que sirve :cool:, en mi red tengo una página con los accesos a cada servicio que uso (el acceso web a mopidy, torrent y alguna pavada mas), me gustaría agregarle un botón para refrescar la base de datos pero no lo pude hacer, sería ejecutar el comando "mopidy local scan" o "mopidyctl local scan", no sé nada de programación así que mas que copiar una plantilla y cambiarle los links no pude hacer, ¿sería posible ejecutar el comando desde un botón en una página local?.

gracias y un saludo!
 

Dr. Zoidberg

Well-known-Papá Pitufo
sería ejecutar el comando "mopidy local scan" o "mopidyctl local scan", no sé nada de programación así que mas que copiar una plantilla y cambiarle los links no pude hacer, ¿sería posible ejecutar el comando desde un botón en una página local?
Claro que se puede, pero primero verificá el funcionamiento del comando ejecutándolo manualmente.
Si funciona OK, el cambio es simple:
Bash:
#!/bin/sh

# Perform shell variable expansion for any form data
eval "`/usr/bin/proccgi $*`"

echo -n "Content-type: text/html
Pragma: nocache
cache-control: no-cache, must-revalidate, no-store

<!DOCTYPE html>
<html><head>
<style>
table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
}
th, td {
    padding: 12px;
}
</style>
<title>PolloX - NMP</title></head><body>"
case "$FORM_OKBTN" in
    "System")
        echo "<center><b>System information</b><br><br>"
        echo "<table><tr><td nowrap><pre>"
        /usr/bin/uptime
        echo "</pre></td></tr><tr><td nowrap><pre>"
        /sbin/ifconfig eth0
        echo "</pre></td></tr><tr><td nowrap><pre>"
        /usr/bin/free -m
        echo "</pre></td></tr><tr><td nowrap><pre>"
        cat /proc/asound/card*/pcm*p/sub*/hw_params
        echo "</pre></td></tr><tr><td nowrap><pre>"
        sensors
        echo "</pre></td></tr></table></center>"
        echo "<br></body></html>"
        exit 0
        ;;
    "Mount points")
        echo "<center>Status of mount points<br><br>"
        echo "<table><tr><td nowrap><pre>"
        /bin/df -h
        echo "</pre></td></tr></table></center>"
        echo "<br></body></html>"
        exit 0
        ;;
    "Wakeup music storage server")
        echo "<center>Waking up music storage</center>"
        /usr/sbin/etherwake poner:aca:la:mac:de:la:placa:de:red:donde:esta:la:musica
        echo "<br></body></html>"
        exit 0
        ;;
    "Reset")
        echo "<center>Restarting Player...</center>"
        /sbin/reboot
        echo "<br></body></html>"
        exit 0
        ;;
    "Shutdown")
        echo "<center>Shutting down Player...</center>"
        /sbin/poweroff
        echo "<br></body></html>"
        exit 0
        ;;
    "Suspend")
        echo "<center>Suspending Player...</center>"
        /usr/sbin/pm-suspend&
        echo "<br></body></html>"
        exit 0
        ;;
    "Hibernate")
        echo "<center>Hibernating Player...</center>"
        /usr/sbin/pm-hibernate&
        echo "<br></body></html>"
        exit 0
        ;;
    *)
cat << CLEOF
<center><form method="POST" action="/cgi-bin/index.cgi"><br>
<center><h2>PolloX - NMP</h2></center>
<table>
<tr><td align="center"><h2><b>System commands</b></h2></td></tr>
<tr><td align="center"><input type=submit value="System" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Mount points" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Wakeup music storage server" name=OKBTN></td></tr>
<!-- <tr><td align="center"><input type=submit value="Mount music" name=OKBTN></td></tr> -->
<tr><td align="center"><input type=submit value="Shutdown" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Suspend" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Hibernate" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Reset" name=OKBTN></td></tr>
</table></form></center>
CLEOF
    ;;
esac

echo "<br></body></html>"
El código de arriba es un shell-script y tiene la operación repartida en dos partes:
La primera es la que se encarga de ejecutar cada comando usando el nombre de cada botón como elemento de selección
Bash:
case "$FORM_OKBTN" in
    "System")
        echo "<center><b>System information</b><br><br>"
        echo "<table><tr><td nowrap><pre>"
        /usr/bin/uptime
        echo "</pre></td></tr><tr><td nowrap><pre>"
        /sbin/ifconfig eth0
        echo "</pre></td></tr><tr><td nowrap><pre>"
        /usr/bin/free -m
        echo "</pre></td></tr><tr><td nowrap><pre>"
        cat /proc/asound/card*/pcm*p/sub*/hw_params
        echo "</pre></td></tr><tr><td nowrap><pre>"
        sensors
        echo "</pre></td></tr></table></center>"
        echo "<br></body></html>"
        exit 0
        ;;
    "Mount points")
        echo "<center>Status of mount points<br><br>"
        echo "<table><tr><td nowrap><pre>"
        /bin/df -h
        echo "</pre></td></tr></table></center>"
        echo "<br></body></html>"
        exit 0
        ;;
    "Wakeup music storage server")
        echo "<center>Waking up music storage</center>"
        /usr/sbin/etherwake poner:aca:la:mac:de:la:placa:de:red:donde:esta:la:musica
        echo "<br></body></html>"
        exit 0
        ;;
    "Reset")
        echo "<center>Restarting Player...</center>"
        /sbin/reboot
        echo "<br></body></html>"
        exit 0
        ;;
    "Shutdown")
        echo "<center>Shutting down Player...</center>"
        /sbin/poweroff
        echo "<br></body></html>"
        exit 0
        ;;
    "Suspend")
        echo "<center>Suspending Player...</center>"
        /usr/sbin/pm-suspend&
        echo "<br></body></html>"
        exit 0
        ;;
    "Hibernate")
        echo "<center>Hibernating Player...</center>"
        /usr/sbin/pm-hibernate&
        echo "<br></body></html>"
        exit 0
        ;;
    *)
y la segunda es la que se encarga de dibujar los botones y enviar el comando al servidor para que este lo ejecute:
Bash:
<center><form method="POST" action="/cgi-bin/index.cgi"><br>
<center><h2>PolloX - NMP</h2></center>
<table>
<tr><td align="center"><h2><b>System commands</b></h2></td></tr>
<tr><td align="center"><input type=submit value="System" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Mount points" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Wakeup music storage server" name=OKBTN></td></tr>
<!-- <tr><td align="center"><input type=submit value="Mount music" name=OKBTN></td></tr> -->
<tr><td align="center"><input type=submit value="Shutdown" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Suspend" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Hibernate" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Reset" name=OKBTN></td></tr>
</table></form></center>
Entonces lo que hay que hacer es cambiar el nombre a uno de los botones (o agregar un boton nuevo, pero lo otro es más fácil), por ejemplo el de Reset, que quedaría:
Bash:
<tr><td align="center"><input type=submit value="Refrescar Base de Datos" name=OKBTN></td></tr>
Con eso, aparece un botón que dice "Refrescar Base de Datos"
Ahora tenemos que agregar la ejecución del comando que vos necesitás y para eso hay que modificar, en la primera parte, el bloque que correspondía al Reset, cambiándole el string de selección, el comando a ejecutar y el cartelito que escribe mientras trabaja. Antes era así:
Bash:
 "Reset")
        echo "<center>Restarting Player...</center>"
        /sbin/reboot
        echo "<br></body></html>"
        exit 0
        ;;
y ahora quedaría:
Bash:
 "Refrescar Base de Datos")
        echo "<center>Releyendo musica...</center>"
        /ruta/al/mopidy local scan 
        echo "<br></body></html>"
        exit 0
        ;;
Y con eso debería ser suficiente.
 
Gracias Doc, el comando en forma manual funciona correctamente, lo vengo usando así desde que armé la primera versión (ya dos años??), voy a implementarlo en estos dias y les cuento como me fué.

Muchas gracias y un abrazo!
 

Dr. Zoidberg

Well-known-Papá Pitufo
Aprovechando un poco las vacaciones y la parva de cosas que tengo colgadas por hacer, decidí modificar un poco el control del NMP. Como ya comenté antes, el NMP está en el living de mi casa y la PC donde está la musica está en mi escritorio del primer piso, lo que me obliga a subir a escalera para encenderla antes de escuchar música y luego subir nuevamente para apagarla luego de la "sesión" de escucha. Como me operaron de una rodilla que quedó muy bien pero también me tengo que operar la otra, no me hace mucha gracia estar subiendo y bajando la escalera para estas cosas menores. Acá les paso un equema de como está la cosa:

77-esquema-conexiones-wifi.jpg

Por otra parte el NMP no admite WOL (Wake-On-Lan) por que es muuuy viejo así que no hay otra que encenderlo manualmente, pero como tiene un ACPI que anda "bien", al menos permite manejar la energía de forma remota y apagarlo, tal como mostré hace ya un tiempo.

Gestión de la PC con música
La solución al problema de la escalera es controlar por red el encendido y el apagado de la "PC con música". Encenderla es simple por que esta PC si que admite WOL (le tuve que flashear el último BIOS por que el viejo tenía pinchado el WOL y la gestión de la memoria), pero apagarla no es tan simple por que es una PC con Windows 7 y yo la voy a gestionar desde un celular con Android, el cual no quiero cargar con aplicaciones raras por que usa un Android Lineage muy liviano y con el que vuelaaaa!!!
Por suerte, Windows tiene un comando que permite gestionar el apagado del equipo y se llama shutdown (como era de esperarse ;)), pero hay que buscar alguna forma de dispararlo en forma remota sin tener que loguearse en Windows ni usar cosas raras. La solución llegó de la mano de un muy pequeño y liviano servidor web gratuito llamado tinyweb de la empresa Ritlabs. Este servidor ni siquiera se instala (pesa solo 77 Kb), tiene una estructura de directorios muy simple desde el cual puede servir las páginas web y tiene capacidad de ejecutar CGI. Vean la imagen para que no se hagan lío por que en la web mandan cualquier fruta:

78-directorios-tinyweb.jpg

El directorio www lo pueden colgar de donde quieran (yo tengo un disco aparte del que usa el Sistema Operativo y ahí lo puse) lo que sí es importante que respeten esa estructura (en bin está el ejecutable, en log...los logs y las páginas las sirve a partir de root). Una característica de este servidor web es que si no encuentra una página web llamada index.htm o index.html en la carpeta root, entonces busca y ejecuta alguna página web llamada index y de cualquier extensión ejecutble (bueee..no cualquiera pero lean el faq de Ritlabs) en el directorio cgi-bin. Entonces ahí creé una página que se llama index.cmd con el siguiente contenido:
Código:
@echo off
@shutdown /h /f
Que básicamente suprime cualquier salida por pantalla e invoca al comando shutdown para que pase la PC a hibernación sin preguntarle a nadie y con eso logramos que la PC se vaya a dormir hasta que la despertemos con un magic-packet WOL. Poner la PC con música en hibernación es muy simple y solo requiere una petición http a su dirección IP (algo del tipo http://192.168.xxx.yyy con lo que el servidor ejecutará index.cmd)

Hay que mencionar algo importante, y es que este servidor web NO ES UN SERVICIO de Windows, por lo tanto requiere iniciar sesión para arrancarlo manualmente o por el grupo Inicio, lo cual resulta bastante incómodo. Como soy un maestro para estas cosas, bajé el Windows Resource Kit que contiene una herramienta llamada srvany.exe que permite autoinstalarse como servicio y luego arrancar - también como servicio - cualquier programa que se me ocurra. Pues bueno, usé ese programa para ejecutar tinyweb como servicio y así no tener que iniciar sesión. Les copio una imagen de las claves del registro que hay que tocar para que funcione todo OK, y también LEAN lean la documentación del srvany.

79-claves-registro.jpg

Lo que está tachado corresponde a la estructura de directorios que ustedes elijan, usen la mía como referencia y modifiquen asu antojo sin hacer lío. Acá tienen como se usa la aplicacion srvany del WRK.

Gestion desde el NMP
Ahora hay que retocar un poco la gestión web remota del NMP para incorporar el encendido y apagado remoto de la PC con música desde un único punto y con la m;inima cantidad de recursos. Para eso, modifiqué el archivo index.cgi que había subido antes y que reside en el servidor web del NMP, y quedó de esta forma:
Bash:
#!/bin/sh

# Perform shell variable expansion for any form data
eval "`/usr/bin/proccgi $*`"

echo -n "Content-type: text/html
Pragma: nocache
cache-control: no-cache, must-revalidate, no-store

<!DOCTYPE html>
<html><head>
<style>
table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
}
th, td {
    padding: 12px;
}
</style>
<title>PolloX - NMP</title></head><body><h2>"
case "$FORM_OKBTN" in
    "System")
        echo "<center><b>System information</b><br><br>"
        echo "<table><tr><td nowrap><pre>"
        /usr/bin/uptime
        echo "</pre></td></tr><tr><td nowrap><pre>"
        /sbin/ifconfig eth0
        echo "</pre></td></tr><tr><td nowrap><pre>"
        /usr/bin/free -m
        echo "</pre></td></tr><tr><td nowrap><pre>"
        cat /proc/asound/card*/pcm*p/sub*/hw_params
        echo "</pre></td></tr><tr><td nowrap><pre>"
        sensors
        echo "</pre></td></tr></table></center>"
        echo "<br></h2></body></html>"
        exit 0
        ;;
    "Mount points")
        echo "<center>Status of mount points<br><br>"
        echo "<table><tr><td nowrap><pre>"
        /bin/df -h
        echo "</pre></td></tr></table></center>"
        echo "<br></h2></body></html>"
        exit 0
        ;;
    "Wakeup music storage server")
        echo "<center>Waking up music storage</center>"
        /usr/sbin/etherwake Aca:va:la:mac:de:la:placa:de_red
        echo "<br></h2></body></html>"
        exit 0
        ;;
    "Hibernate music storage server")
        echo "<center>Hibernating music storage</center>"
        /usr/bin/wget -q -t 1 -T 3 http://aca.va.la_ip.de_la_pc
        echo "<br></h2></body></html>"
        exit 0
        ;;
    "Reset")
        echo "<center>Restarting Player...</center>"
        /sbin/reboot
        echo "<br></h2></body></html>"
        exit 0
        ;;
    "Shutdown")
        echo "<center>Shutting down Player...</center>"
        /sbin/poweroff
        echo "<br></h2></body></html>"
        exit 0
        ;;
    *)
cat << CLEOF
<center><form method="POST" action="/cgi-bin/index.cgi"><br>
<center><h1>PolloX - NMP</h1></center>
<table>
<tr><td align="center"><h2><b>System commands</b></h2></td></tr>
<tr><td align="center"><input type=submit value="System" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Mount points" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Wakeup music storage server" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Hibernate music storage server" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Shutdown" name=OKBTN></td></tr>
<tr><td align="center"><input type=submit value="Reset" name=OKBTN></td></tr>
</table></form></center>
CLEOF
    ;;
esac

echo "<br></body></html>"
Ustedes deben modificar las direcciones MAC de "Wakeup music storage server" y la IP de "Hibernate music storage server" de acuerdo a su configuración de red, pero NO CAMBIEN los parámetros de operación del wget por que pueden tener problemas al encender la PC si recién la apagaron y también para recuperar el control de pagina web del celular.

También es seguro que deban instalar etherwake y wget si es que no vienen incluidos en su instalación. Tendrán que fijarse, pero es muy simple:
Código:
sudo apt-get update
sudo apt-get upgrade

sudo apt-get install etherwake
sudo apt-get install wget
En el celular se verá algo como esto (usando el navegador Via):

76-control-remoto-web.jpg

Y eso es todo.
 
Última edición:
Interesante propuesta, gracias por compartirla (en mi caso no va a ser necesaria esta implementación, pero es interesante saber que se puede hacer eso).
PD: todavía no me puse con el tema del refresco de la base de datos :sleep::sleep:(n)
 

Arriba