184 lines
4.0 KiB
Go
184 lines
4.0 KiB
Go
package main
|
|
|
|
import (
|
|
//"fmt"
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
func main() {
|
|
// check mount point
|
|
cmd := exec.Command("bash", "-c", `mountpoint -q /home/kar/Music/`)
|
|
log.Println("Verificando punto de montaje")
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
addr := checkConn()
|
|
mountDir(addr)
|
|
openConn()
|
|
}
|
|
log.Println("Carpeta montada")
|
|
openConn()
|
|
}
|
|
|
|
|
|
func restartService() {
|
|
log.Println("Reiniciando servicio mpd")
|
|
cmd := exec.Command("bash", "-c", fmt.Sprintf(`systemctl --user -M [email protected] restart --user mpd`))
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
log.Println("Error al reiniciar servicio mpd", err)
|
|
os.Exit(1)
|
|
}
|
|
log.Println("Recargando base de datos de mpd")
|
|
cmd = exec.Command("bash", "-c", fmt.Sprintf(`runuser -u kar -- mpc update`))
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
log.Println("Error al actualizar base de datos de mpd")
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func mountDir(addr string) {
|
|
cmd := exec.Command("bash", "-c", fmt.Sprintf(`mount %s:/server/music /home/kar/Music`, addr))
|
|
log.Printf("Montando carpeta desde el host %s\n", addr)
|
|
_, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Println("Error al montar carpeta")
|
|
os.Exit(1)
|
|
}
|
|
restartService()
|
|
}
|
|
|
|
func checkConn() string {
|
|
_, err := net.Dial("tcp", "192.168.2.11:2049")
|
|
if err != nil {
|
|
log.Println("Error al conectar al host 192.168.2.11")
|
|
_, err := net.Dial("tcp", "192.168.1.64:2049")
|
|
if err != nil {
|
|
log.Println("Error al conectar al host 192.168.1.64", err)
|
|
}
|
|
return "192.168.1.64"
|
|
}
|
|
return "192.168.2.11"
|
|
}
|
|
|
|
|
|
func openConn() {
|
|
err := godotenv.Load()
|
|
if err != nil {
|
|
log.Println("Error al leer .env", err)
|
|
os.Exit(1)
|
|
}
|
|
IP_SERVER := os.Getenv("IP_SERVER")
|
|
|
|
listener, err := net.Listen("tcp", IP_SERVER)
|
|
if err != nil {
|
|
log.Println("Error al abrir el puerto.", err)
|
|
}
|
|
defer listener.Close()
|
|
for {
|
|
conn, err := listener.Accept()
|
|
if err != nil {
|
|
log.Println("Error al aceptar la conexion.", err)
|
|
}
|
|
go menuController(conn)
|
|
}
|
|
}
|
|
|
|
func menuController(conn net.Conn) {
|
|
var out string
|
|
comandoRaw := make([]byte, 1024)
|
|
n, err := conn.Read(comandoRaw)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
comandoString := strings.TrimSpace(string(comandoRaw[:n]))
|
|
switch comandoString {
|
|
case "play":
|
|
out = playSong()
|
|
case "pause":
|
|
out = pauseSong()
|
|
case "info":
|
|
out = infoSong()
|
|
case "next":
|
|
out = nextSong()
|
|
case "addsong":
|
|
addSong(conn)
|
|
}
|
|
if out != "" {
|
|
_, err = conn.Write([]byte(out))
|
|
if err != nil {
|
|
log.Println("Error al enviar la informacion", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func playSong() string {
|
|
cmd := exec.Command("mpc", "play")
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Println("Error al reproducir musica", err)
|
|
}
|
|
return string(output)
|
|
}
|
|
|
|
func pauseSong() string {
|
|
cmd := exec.Command("mpc", "pause")
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Println("Error al pausar musica", err)
|
|
}
|
|
return string(output)
|
|
}
|
|
|
|
func infoSong() string {
|
|
cmd := exec.Command("mpc")
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Println("Error al solicitar informacion", err)
|
|
}
|
|
return string(output)
|
|
}
|
|
|
|
func nextSong() string {
|
|
cmd := exec.Command("mpc", "next")
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
log.Println("Error al reproducir siguiente cancion", err)
|
|
}
|
|
return string(output)
|
|
}
|
|
|
|
func addSong(conn net.Conn) {
|
|
defer conn.Close()
|
|
cmd := exec.Command("mpc", "listall")
|
|
cmd.Stdout = conn
|
|
cmd.Run()
|
|
if tcpConn, ok := conn.(*net.TCPConn); ok {
|
|
tcpConn.CloseWrite()
|
|
}
|
|
bufSong := make([]byte, 1024)
|
|
n, err := conn.Read(bufSong)
|
|
if err != nil {
|
|
log.Println("Error al recibir cancion", err)
|
|
}
|
|
fmt.Printf("%s, agregado por %s\n", strings.TrimSpace(string(bufSong[:n])), conn.RemoteAddr())
|
|
cmdmpc := exec.Command("bash", "-c", fmt.Sprintf(`runuser -u kar -- mpc insert %q && mpc next`, strings.TrimSpace(string(bufSong[:n]))))
|
|
out, err := cmdmpc.CombinedOutput()
|
|
if strings.TrimSpace(string(out)) == "MPD error: Not playing" {
|
|
log.Println("Cancion agregada")
|
|
} else {
|
|
if err != nil {
|
|
log.Println("Error al agregar cancion", err)
|
|
}
|
|
}
|
|
_ = playSong()
|
|
conn.Close()
|
|
}
|