dots/configs/home/config/polybar/old/scripts/cava.py

79 lines
2.3 KiB
Python
Raw Normal View History

2022-04-03 01:11:04 +02:00
#!/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()