dotfiles/.local/bin/waybar-mpris-wrapper.sh
2025-05-28 18:33:04 +02:00

70 lines
2.6 KiB
Bash
Executable File

#!/bin/bash
# Run waybar-mpris for a short time to capture a single output and exit
TRACK_INFO=$(timeout 0.1 waybar-mpris --position --autofocus)
# Check if TRACK_INFO is valid and non-empty
if [[ -z "$TRACK_INFO" ]]; then
echo "Error: No track information received." >&2
exit 1 # Exit silently if no track information is available
fi
# Remove any control characters and trailing whitespace
CLEAN_TRACK_INFO=$(echo "$TRACK_INFO" | tr -d '\000-\011\013\014\016-\037' | sed 's/[[:space:]]*$//')
# Debug print: Check the cleaned TRACK_INFO after initial sanitization
echo "Sanitized TRACK_INFO: '$CLEAN_TRACK_INFO'"
# Use `jq` to extract the `text` field from the cleaned JSON
TEXT=$(echo "$CLEAN_TRACK_INFO" | jq -r '.text')
# If TEXT extraction fails, print error and exit
if [[ -z "$TEXT" ]]; then
echo "Error: Failed to extract 'text' field from JSON. Check if TRACK_INFO is valid."
echo "$CLEAN_TRACK_INFO" | od -c # Print raw hex output for debugging
exit 1
fi
# Remove the specific `` symbol using its Unicode representation (\xEF\xA3\xA3) and trim leading spaces
TEXT_CLEANED=$(echo "$TEXT" | sed 's/\xEF\xA3\xA3//g' | sed 's/^[[:space:]]*//')
# Debug print: Check the TEXT after removing `` and trimming spaces
echo "Cleaned TEXT: '$TEXT_CLEANED'"
# If TEXT_CLEANED is empty, it means the player is paused or has no metadata
if [[ -z "$TEXT_CLEANED" ]]; then
# Output an empty JSON with placeholders
echo '{"artist": "", "album": "", "title": ""}'
exit 0
fi
# Use `awk` to extract artist, album, and title using a consistent separator
ARTIST=$(echo "$TEXT_CLEANED" | awk -F' - ' '{print $1}')
ALBUM=$(echo "$TEXT_CLEANED" | awk -F' - ' '{print $2}')
TITLE=$(echo "$TEXT_CLEANED" | awk -F' - ' '{print $3}' | sed 's/([^()]*)$//') # Remove time info in parentheses
# Debug print: Check the extracted values for ARTIST, ALBUM, and TITLE
echo "Extracted ARTIST: '$ARTIST'"
echo "Extracted ALBUM: '$ALBUM'"
echo "Extracted TITLE: '$TITLE'"
# Check if artist, album, and title are non-empty
if [[ -z "$ARTIST" || -z "$ALBUM" || -z "$TITLE" ]]; then
echo "Error: Could not extract artist, album, or title from the cleaned text." >&2
# Output an empty JSON with placeholders
echo '{"artist": "", "album": "", "title": ""}'
exit 0
fi
# Construct a JSON object for Waybar using `jq`
TRACK_JSON=$(jq -n --arg artist "$ARTIST" --arg album "$ALBUM" --arg title "$TITLE" \
'{artist: $artist, album: $album, title: $title}')
# Debug print: Check the final constructed JSON
echo "Generated TRACK_JSON: '$TRACK_JSON'"
# Output the final JSON for Waybar, ensuring proper newline at the end
echo "$TRACK_JSON"