summarylogtreecommitdiffstats
path: root/sqlchctl
blob: ddf3f01fe3145a26ca0b45394f17b8e6bb995738 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/sqlch"
STATION_FILE="$CONFIG_DIR/stations"
LAST_PLAYED="$CONFIG_DIR/last"
SOCKET="/tmp/mpvsocket"

mkdir -p "$CONFIG_DIR"
touch "$STATION_FILE" "$LAST_PLAYED"

play() {
  if [[ -z "${1:-}" ]]; then
    echo "No station name or URL provided." >&2
    exit 1
  fi

  local input="$1"
  local url name

  echo "[DEBUG] Input received: $input" >&2

  # Safe lookup loop to support spaces
  while IFS='=' read -r name url; do
    if [[ "$name" == "$input" ]]; then
      break
    fi
  done < "$STATION_FILE"

  if [[ -z "$url" ]]; then
    # Fallback: assume it's a raw URL
    url="$input"
    name="$input"
  fi

  if [[ -z "$url" ]]; then
    notify-send "sqlch Error" "Station '$input' not found."
    echo "❌ Could not resolve: $input" >&2
    exit 1
  fi

  if [[ -S "$SOCKET" ]]; then
    echo "quit" | socat - "$SOCKET" 2>/dev/null || true
    rm -f "$SOCKET"
    sleep 0.5
  fi

  echo "$name" > "$LAST_PLAYED"
  notify-send "🎶 Now Playing" "$name"
  echo "[DEBUG] Playing station: $url" >&2

  mpv --no-video --input-ipc-server="$SOCKET" --ao=pulse "$url" > /dev/null 2>&1 &
}


stop() {
  if [[ -S "$SOCKET" ]]; then
    echo "quit" | socat - "$SOCKET" 2>/dev/null || true
    rm -f "$SOCKET"
    notify-send "⛔ Stopped" "Playback stopped."
  else
    echo "No stream is currently active."
  fi
}

status() {
  if [[ -S "$SOCKET" ]]; then
    local name
    name=$(<"$LAST_PLAYED")
    echo "Now playing: $name"
  else
    echo "sqlch: Not Playing"
  fi
}

case "${1:-}" in
  play) play "${2:-}" ;;
  stop) stop ;;
  status) status ;;
  *) echo "Usage: sqlchctl {play <name>|stop|status}" ;;
esac