dotfiles

Alpine Linux dotfiles

git clone git://git.lin.moe/dotfiles.git

 1#!/usr/bin/env python3
 2import sys
 3import json
 4import subprocess
 5
 6from typing import Optional
 7
 8
 9def 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]
13
14
15def select_sink() -> Optional[tuple[str, str]]:
16    selected_sink_desc = None
17    sinks = load_sinks()
18    default_sink_name = subprocess.check_output(['pactl', 'get-default-sink']).decode().strip()
19
20    default_sink = ""
21
22    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)
34
35    for sink in sinks:
36        if selected_sink_desc == sink[1]:
37            return sink
38
39    return None
40
41
42def 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')
49
50
51if __name__ == '__main__':
52    main()