79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
|
#!/bin/env python3
|
||
|
import argparse
|
||
|
import os
|
||
|
import signal
|
||
|
import subprocess
|
||
|
import sys
|
||
|
import tempfile
|
||
|
|
||
|
if len(sys.argv) > 1 and sys.argv[1] == '--subproc':
|
||
|
ramp_list = [' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█']
|
||
|
ramp_list.extend(
|
||
|
f'%{{F#{color.strip(" #")}}}█%{{F-}}'
|
||
|
for color in sys.argv[2].split(',')
|
||
|
if color
|
||
|
)
|
||
|
while True:
|
||
|
cava_input = input().strip().split()
|
||
|
cava_input = [int(i) for i in cava_input]
|
||
|
output = ''
|
||
|
for bar in cava_input:
|
||
|
if bar < len(ramp_list):
|
||
|
output += ramp_list[bar]
|
||
|
|
||
|
else:
|
||
|
output += ramp_list[-1]
|
||
|
|
||
|
print(output)
|
||
|
|
||
|
parser = argparse.ArgumentParser()
|
||
|
parser.add_argument('-f', '--framerate', type=int, default=60,
|
||
|
help='Framerate to be used by cava, default is 60')
|
||
|
parser.add_argument('-b', '--bars', type=int, default=8,
|
||
|
help='Amount of bars, default is 8')
|
||
|
parser.add_argument('-e', '--extra_colors', default='',
|
||
|
help='Color gradient used on higher values, separated by commas, default is')
|
||
|
parser.add_argument('-c', '--channels', choices=['stereo', 'left', 'right', 'average'],
|
||
|
help='Audio channels to be used, defaults to stereo')
|
||
|
|
||
|
opts = parser.parse_args()
|
||
|
conf_channels = ''
|
||
|
if opts.channels != 'stereo':
|
||
|
conf_channels = (
|
||
|
'channels=mono\n'
|
||
|
f'mono_option={opts.channels}'
|
||
|
)
|
||
|
|
||
|
conf_ascii_max_range = 20
|
||
|
|
||
|
cava_conf = tempfile.mkstemp('','polybar-cava-conf.')[1]
|
||
|
with open(cava_conf, 'w') as cava_conf_file:
|
||
|
cava_conf_file.write(
|
||
|
'[general]\n'
|
||
|
f'framerate={opts.framerate}\n'
|
||
|
f'bars={opts.bars}\n'
|
||
|
'autosense=1\n'
|
||
|
'sensitivity=200\n'
|
||
|
'[input]\n'
|
||
|
'sample_rate=44100\n'
|
||
|
'[output]\n'
|
||
|
'method=raw\n'
|
||
|
'data_format=ascii\n'
|
||
|
f'ascii_max_range={conf_ascii_max_range}\n'
|
||
|
'bar_delimiter=32'
|
||
|
+ conf_channels
|
||
|
)
|
||
|
|
||
|
cava_proc = subprocess.Popen(['cava', '-p', cava_conf], stdout=subprocess.PIPE)
|
||
|
self_proc = subprocess.Popen(['python3', __file__, '--subproc', opts.extra_colors], stdin=cava_proc.stdout)
|
||
|
|
||
|
def cleanup(sig, frame):
|
||
|
os.remove(cava_conf)
|
||
|
cava_proc.kill()
|
||
|
self_proc.kill()
|
||
|
sys.exit(0)
|
||
|
|
||
|
signal.signal(signal.SIGTERM, cleanup)
|
||
|
signal.signal(signal.SIGINT, cleanup)
|
||
|
|
||
|
self_proc.wait()
|