87 lines
2.3 KiB
Bash
Executable File
87 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
#######################################
|
|
# 1) Obtener el nombre del sink por defecto
|
|
#######################################
|
|
default_sink="$(pactl get-default-sink)"
|
|
|
|
if [ -z "$default_sink" ]; then
|
|
echo '{"text":"","tooltip":"No default sink"}'
|
|
exit 0
|
|
fi
|
|
|
|
#######################################
|
|
# 2) Guardar pw-dump en un JSON temporal
|
|
#######################################
|
|
tmpfile="/tmp/pwdump.json"
|
|
pw-dump > "$tmpfile" 2>/dev/null
|
|
|
|
#######################################
|
|
# 3) Hallar el ID del Node cuyo node.name == default_sink
|
|
#######################################
|
|
sink_id="$(
|
|
jq -r --arg name "$default_sink" '
|
|
.[]
|
|
| select(.info.props["node.name"] == $name)
|
|
| .id
|
|
' "$tmpfile"
|
|
)"
|
|
|
|
if [ -z "$sink_id" ] || [ "$sink_id" = "null" ]; then
|
|
echo '{"text":"","tooltip":"Default sink node not found"}'
|
|
exit 0
|
|
fi
|
|
|
|
#######################################
|
|
# 4) Extraer la tasa de muestreo desde pw-dump
|
|
#######################################
|
|
rate="$(
|
|
jq -r --argjson id "$sink_id" '
|
|
.[]
|
|
| select(.id == $id)
|
|
| (.info.params.Format[].rate // 0)
|
|
' "$tmpfile"
|
|
)"
|
|
|
|
#######################################
|
|
# 5) Obtener la info detallada del Node con pw-cli info <sink_id>
|
|
# y extraer el códec (api.bluez5.codec)
|
|
#######################################
|
|
pw_cli_info="$(pw-cli info "$sink_id" 2>/dev/null)"
|
|
codec="$(echo "$pw_cli_info" \
|
|
| grep -F 'api.bluez5.codec' \
|
|
| sed -E 's/.*= "(.*)".*/\1/'
|
|
)"
|
|
|
|
# Si no se encontró nada, marcamos como N/A
|
|
[ -z "$codec" ] && codec="N/A"
|
|
|
|
[ -z "$rate" ] && rate="0"
|
|
|
|
# Si la tasa es 0, no mostrar nada en Waybar
|
|
if [ "$rate" = "0" ]; then
|
|
echo '{"text": "", "tooltip": ""}'
|
|
exit 0
|
|
fi
|
|
|
|
#######################################
|
|
# 6) Construir el texto principal de Waybar
|
|
# Ej.: "48000 Hz (APTX)" si es aptX/LDAC; si no, "48000 Hz"
|
|
#######################################
|
|
if [[ "$codec" =~ ^(aptx|aptX|ldac|LDAC|sbc|SBC)$ ]]; then
|
|
text="${rate} Hz (${codec^^})"
|
|
else
|
|
text="${rate} Hz"
|
|
fi
|
|
|
|
#######################################
|
|
# 7) Tooltip con: "<sink_name> - <rate> - <codec>"
|
|
#######################################
|
|
tooltip="${default_sink} - ${rate} - ${codec}"
|
|
|
|
#######################################
|
|
# 8) Imprimir en formato JSON para Waybar
|
|
#######################################
|
|
echo "{\"text\":\"$text\",\"tooltip\":\"$tooltip\"}"
|
|
|