1#!/usr/bin/env python32import sys3import json4import subprocess56from typing import Optional789def load_sinks() -> list[tuple[str, str]]:10 lines = subprocess.check_output(['pactl', '-f', 'json', 'list', 'sinks'])11 sinks = json.loads(lines)12 return [(sink['name'], sink['description']) for sink in sinks]131415def select_sink() -> Optional[tuple[str, str]]:16 selected_sink_desc = None17 sinks = load_sinks()18 default_sink_name = subprocess.check_output(['pactl', 'get-default-sink']).decode().strip()1920 default_sink = ""2122 for sink in sinks:23 if default_sink_name == sink[0]:24 default_sink = sink[1]25 try:26 selected_sink_desc = subprocess.check_output(27 'printf "%s\n" "{}" | rofi -dmenu "$@" -select "{}"'.format(28 '\n'.join([sink[1] for sink in sinks]),29 default_sink,30 ),31 shell=True).decode('utf-8').strip()32 except subprocess.CalledProcessError as err:33 exit(err.returncode)3435 for sink in sinks:36 if selected_sink_desc == sink[1]:37 return sink3839 return None404142def main():43 sink = select_sink()44 if sink is not None:45 subprocess.run(['pactl', 'set-default-sink', sink[0]])46 else:47 subprocess.run(['rofi', '-e', 'Unknown Sink'])48 raise ValueError('Unknown Sink')495051if __name__ == '__main__':52 main()