Files
2026-01-06 01:56:42 -06:00

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()
}