z4z/z4z.bash
2026-03-02 21:52:00 +01:00

80 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Paths
MPV_SOCKET="/tmp/mpv-socket"
WEB_ROOT="/home/xbl/z4z"
COVER_PATH="$WEB_ROOT/cover.jpg"
WEB_HTML="$WEB_ROOT/index.html"
INTERVAL=0.5
last_path=""
while true; do
# Get current file path, pause state, state
path=$(echo '{ "command": ["get_property", "path"] }' | socat - "$MPV_SOCKET" 2>/dev/null | jq -r '.data')
paused=$(echo '{ "command": ["get_property", "pause"] }' | socat - "$MPV_SOCKET" 2>/dev/null | jq -r '.data // false')
# If MPV is stopped
if [[ -z "$path" || "$path" == "null" ]]; then
last_path=""
# Write "Not Playing" HTML
cat > "$WEB_HTML" <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Now Playing</title>
<link rel="stylesheet" href="/style.css">
</head>
<body>
<h2>Not Playing</h2>
</body>
</html>
EOF
sleep "$INTERVAL"
continue
fi
# If track changed
if [[ "$path" != "$last_path" ]]; then
last_path="$path"
# Extract cover art (first video stream / album art)
ffmpeg -y -i "$path" -map 0:v? -c copy "$COVER_PATH" 2>/dev/null || rm -f "$COVER_PATH"
# Fetch metadata
metadata=$(echo '{ "command": ["get_property", "metadata"] }' | socat - "$MPV_SOCKET")
title=$(echo "$metadata" | jq -r '.data.title // .data.TITLE // empty')
artist=$(echo "$metadata" | jq -r '.data.artist // .data.ARTIST // empty')
album=$(echo "$metadata" | jq -r '.data.album // .data.ALBUM // empty')
year=$(echo "$metadata" | jq -r '.data.date // .data.DATE // empty')
# Write index.html dynamically
cat > "$WEB_HTML" <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Now Playing</title>
<link rel="stylesheet" href="/style.css">
</head>
<body>
EOF
# Add cover if exists
if [[ -f "$COVER_PATH" ]]; then
echo "<img id=\"cover\" src=\"/cover.jpg\" alt=\"Cover\">" >> "$WEB_HTML"
fi
# Add metadata
echo "<div id=\"overlay\">" >> "$WEB_HTML"
echo "<h1>$artist - $title</h1>" >> "$WEB_HTML"
echo "<h2>$album ($year)</h2>" >> "$WEB_HTML"
echo "</div>" >> "$WEB_HTML"
echo "</body></html>" >> "$WEB_HTML"
fi
sleep "$INTERVAL"
done