87 lines
3.2 KiB
Bash
Executable File
87 lines
3.2 KiB
Bash
Executable File
#!/bin/sh
|
|
set -u
|
|
base=/data/opt/alice-backend
|
|
runtime="$base/spotify"
|
|
cd "$base" || exit 1
|
|
umask 077
|
|
exec 8>/tmp/alice-spotify.lock
|
|
flock -n 8 || exit 1
|
|
export PULSE_SERVER=unix:/tmp/alice-pulse/native
|
|
export PULSE_RUNTIME_PATH=/tmp/alice-pulse
|
|
export PULSE_COOKIE=/tmp/alice-pulse/cookie
|
|
export PULSE_STATE_PATH="$base/spotify-state"
|
|
export PULSE_SINK=music
|
|
pulse=
|
|
soloist=
|
|
janitor=
|
|
timer=
|
|
stopping=0
|
|
|
|
terminate() {
|
|
stopping=1
|
|
for child in "$timer" "$soloist" "$pulse" "$janitor"; do
|
|
[ -z "$child" ] || kill -TERM "$child" 2>/dev/null || true
|
|
done
|
|
}
|
|
trap terminate TERM INT HUP
|
|
trap terminate EXIT
|
|
mkdir -p "$PULSE_RUNTIME_PATH" "$PULSE_STATE_PATH" "$base/soloist-data" /tmp/alice-spotify-cache
|
|
if ! grep -q ' /tmp/alice-spotify-cache ' /proc/mounts; then
|
|
mount -t tmpfs -o size=32m,mode=0700,nosuid,nodev,noexec tmpfs /tmp/alice-spotify-cache || exit 1
|
|
fi
|
|
chmod 700 "$PULSE_RUNTIME_PATH" "$PULSE_STATE_PATH" "$base/soloist-data" /tmp/alice-spotify-cache
|
|
if [ ! -f "$PULSE_COOKIE" ]; then dd if=/dev/urandom of="$PULSE_COOKIE" bs=256 count=1 2>/dev/null; fi
|
|
: >/tmp/alice-cache.log
|
|
./music-control -cache-janitor /tmp/alice-spotify-cache >>/tmp/alice-cache.log 2>&1 8>&- &
|
|
janitor=$!
|
|
|
|
bound_logs() {
|
|
for log in /tmp/alice-pulse.log /tmp/alice-soloist.log /tmp/alice-cache.log; do
|
|
if [ -f "$log" ] && [ "$(wc -c < "$log")" -gt 524288 ]; then : > "$log"; fi
|
|
done
|
|
}
|
|
|
|
# Session restoration requires network and wall time valid for TLS.
|
|
while [ "$stopping" -eq 0 ] && { [ "$(date +%s)" -lt 1700000000 ] || ! ip route | grep -q '^default '; }; do
|
|
sleep 3 & timer=$!; wait "$timer" || true; timer=
|
|
done
|
|
|
|
while [ "$stopping" -eq 0 ]; do
|
|
: >/tmp/alice-pulse.log
|
|
"$runtime/run" "$runtime/bin/pulseaudio" -n --daemonize=no --exit-idle-time=-1 --dl-search-path="$runtime/lib" --file="$runtime/etc/alice.pa" --log-target=stderr >>/tmp/alice-pulse.log 2>&1 8>&- &
|
|
pulse=$!
|
|
ready=0
|
|
for second in 1 2 3 4 5; do
|
|
[ "$stopping" -eq 0 ] || break
|
|
if "$runtime/pactl" info >/dev/null 2>&1; then ready=1; break; fi
|
|
sleep 1
|
|
done
|
|
if [ "$ready" -eq 1 ] && [ "$stopping" -eq 0 ]; then
|
|
if [ -r station-volume ]; then
|
|
volume=$(cat station-volume)
|
|
case "$volume" in
|
|
[0-9]|[1-9][0-9]|100) "$runtime/pactl" set-sink-volume station "$volume%" || true ;;
|
|
esac
|
|
fi
|
|
if [ -x "$base/room-eq.sh" ]; then
|
|
"$base/room-eq.sh" restore >>/tmp/alice-pulse.log 2>&1 || :
|
|
fi
|
|
: >/tmp/alice-soloist.log
|
|
"$runtime/run" "$runtime/soloist/soloist" --device-name "Pepega Mini 2" --api-key "$(cat "$base/soloist-key")" --data-dir "$base/soloist-data" --cache-dir /tmp/alice-spotify-cache --cache-size 100 --ws 127.0.0.1:9090 >>/tmp/alice-soloist.log 2>&1 8>&- &
|
|
soloist=$!
|
|
while [ "$stopping" -eq 0 ] && kill -0 "$soloist" 2>/dev/null && kill -0 "$pulse" 2>/dev/null; do
|
|
bound_logs
|
|
sleep 3 & timer=$!; wait "$timer" || true; timer=
|
|
done
|
|
fi
|
|
for child in "$soloist" "$pulse"; do
|
|
if [ -n "$child" ]; then kill -TERM "$child" 2>/dev/null || true; wait "$child" 2>/dev/null || true; fi
|
|
done
|
|
soloist=
|
|
pulse=
|
|
bound_logs
|
|
if [ "$stopping" -eq 0 ]; then sleep 5 & timer=$!; wait "$timer" || true; timer=; fi
|
|
done
|
|
[ -z "$janitor" ] || wait "$janitor" 2>/dev/null || true
|
|
umount /tmp/alice-spotify-cache || true
|