Skip to content

Instantly share code, notes, and snippets.

@fsantand
Created February 8, 2024 23:49
Show Gist options
  • Save fsantand/846fbdd9ed2db5c89838b138a2e48ceb to your computer and use it in GitHub Desktop.
Save fsantand/846fbdd9ed2db5c89838b138a2e48ceb to your computer and use it in GitHub Desktop.
Wireplumber switcher for rofi/dmenu
#!/usr/bin/python3
import sys
import subprocess
"""
Wireplumber sink/source switcher
It lets you pass your sinks/sources into a dmenu dropdown
for ease of access
Usage:
./wireplumber_audio_switcher.py <Sinks|Sources>
"""
GROUP_DELIMITER = " ├─"
ITEM_DELIMITER = " │ "
ACCEPTED_GROUPS = set(["Sinks:", "Sources:"])
def clean_line(line: str):
line = line.replace(GROUP_DELIMITER, "").replace(ITEM_DELIMITER, "").replace(":", "")
vol_index = line.find("[")
if vol_index > 0:
line = line[:vol_index]
if "*" in line:
line = line.replace("*", "")
splitted = line.split(".")
splitted[1] = f"<b>{splitted[1].strip()} *</b>"
line = ". ".join(splitted)
return line.strip()
def parse_wpctl_status():
found_audio_tab = False
current_subgroup = None
processed_data = {}
output = subprocess.run(
"wpctl status -k",
shell=True,
encoding="utf-8",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
for line in output.stdout.split("\n"):
if not found_audio_tab and line == "Audio":
found_audio_tab = True
elif found_audio_tab:
if line == "":
found_audio_tab = False
break
elif line == ITEM_DELIMITER:
current_subgroup = None
continue
elif line.startswith(GROUP_DELIMITER):
current_subgroup = clean_line(line)
processed_data[current_subgroup] = []
continue
elif current_subgroup and line.startswith(ITEM_DELIMITER):
processed_data[current_subgroup].append(clean_line(line))
continue
return processed_data
def pipe_into_dmenu(output):
output = subprocess.run(
f"echo '{output}' | rofi -dmenu -markup-rows",
shell=True,
encoding="utf-8",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
if output.returncode != 0:
return None
return output.stdout
output = parse_wpctl_status()
sink = pipe_into_dmenu("\n".join(output[sys.argv[1]]))
if sink:
sink_id = sink.split(".")[0]
subprocess.run(
f"wpctl set-default {sink_id}",
shell=True
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment