Skip to content

Instantly share code, notes, and snippets.

@mykola2312
Created November 21, 2024 21:45
Show Gist options
  • Save mykola2312/8952a10457bb65aa48a7d8f5210c86ec to your computer and use it in GitHub Desktop.
Save mykola2312/8952a10457bb65aa48a7d8f5210c86ec to your computer and use it in GitHub Desktop.
MPTV2 - script to keep MPV running
#!/usr/bin/env bash
# AUTHOR: mykola2312
# LICENSE: BSD-2Clause
# REQUIREMENTS: multimedia/mpv textproc/jq net/socat
# mpv: https://www.freshports.org/multimedia/mpv/
# jq: https://www.freshports.org/textproc/jq/
# socat: https://www.freshports.org/net/socat/
MPV="$(which mpv)"
MPV_SOCK="/tmp/mptv2-mpv.sock"
IPTV_URL=""
SPAWN_GRACE_PERIOD=5
INQUIRE_INTERVAL=1
MAX_ATTEMPTS=1
mpv_pid=""
mpv_playback=""
mpv_last_playback=""
mpv_attempt=0
function mpv_running() {
if [ -z "$mpv_pid" ]; then
return 1 # false
else
ps -p "$mpv_pid" 2>&1 >/dev/null
return $?
fi
return 1
}
function mpv_spawn() {
$MPV "$IPTV_URL" --input-ipc-server="$MPV_SOCK" </dev/null &>/dev/null &
mpv_pid="$!"
sleep "$SPAWN_GRACE_PERIOD"
}
function mpv_kill() {
kill -9 "$mpv_pid" 2>&1 >/dev/null
}
function mpv_respawn() {
mpv_attempt="0"
mpv_playback=""
mpv_last_playback=""
mpv_kill
mpv_spawn
}
function mpv_inquire() {
reply=$(echo '{ "command": ["get_property", "playback-time"] }' | socat - "UNIX-CONNECT:$MPV_SOCK" 2>&1)
if [ $? -ne 0 ]; then
return 1
fi
mpv_playback=$(echo "$reply" | jq -e '.data' -)
if [ $? -ne 0 ]; then
return 1
fi
echo "this $mpv_playback last $mpv_last_playback"
}
mpv_spawn
while true; do
if mpv_running; then
if mpv_inquire; then
if [ -z "$mpv_last_playback" ]; then
# first inquire - just set last playback
mpv_last_playback="$mpv_playback"
elif [ "$mpv_playback" == "$mpv_last_playback" ]; then
# playback stuck - increment attempt
mpv_attempt=$((mpv_attempt + 1))
if [ "$mpv_attempt" -gt "$MAX_ATTEMPTS" ]; then
mpv_respawn
fi
else
# new inquire returns different playback, unstuck, so reset attempts
mpv_last_playback="$mpv_playback"
mpv_attempt="0"
fi
else
# failed to inquire - dead process?
# SPAWN_GRACE_PERIOD must be long enough, to cover MPV spawn and UNIX socket creation
# otherwise, respawn loop will happen
mpv_respawn
fi
else
mpv_respawn
fi
sleep "$INQUIRE_INTERVAL"
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment