GHOSCHT
cbf62f5bfb
python script to easily switch audio sinks/sources with rofi script originally taken from some github user
87 lines
2.2 KiB
Python
87 lines
2.2 KiB
Python
#!/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)
|