#!/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" < Now Playing

Not Playing

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" < Now Playing EOF # Add cover if exists if [[ -f "$COVER_PATH" ]]; then echo "\"Cover\"" >> "$WEB_HTML" fi # Add metadata echo "
" >> "$WEB_HTML" echo "

$artist - $title

" >> "$WEB_HTML" echo "

$album ($year)

" >> "$WEB_HTML" echo "
" >> "$WEB_HTML" echo "" >> "$WEB_HTML" fi sleep "$INTERVAL" done