dotfiles/files/.i3/py3status/microphone.py

84 lines
2.3 KiB
Python

# -*- coding: utf-8 -*-
"""
Displays and controls the mute status of the default microphone.
Displays whether the current microphone is muted or not. A click on the icon
will toggle this status. Relies on pulseaudio.
Configuration parameters:
format_muted: text displayed when muted
(default FontAwesome)
format_unmuted: text displayed when unmuted
(default FontAwesome)
Colors:
color_mute: when muted
color_unmute: when unmuted
"""
import subprocess
class NoMicrophone(Exception):
pass
class Error(Exception):
pass
class Py3status:
format_muted = '\uf131' # FontAwesome
format_unmuted = '\uf130' # FontAwesome
def microphone(self):
try:
isMute = self.__getMuteStatus__()
color = self.py3.COLOR_MUTE if isMute else self.py3.COLOR_UNMUTE
text = self.format_muted if isMute else self.format_unmuted
return {
'full_text': text,
'color': color,
}
except NoMicrophone:
return {
'full_text': '',
}
except Error:
return {
'full_text': '...',
}
def __getPaList__(self):
try:
paOutput = subprocess.check_output(["pacmd", "list-sources"])
except subprocess.CalledProcessError:
raise Error()
return paOutput.decode()
def __getMuteStatus__(self):
try:
paList = self.__getPaList__()
fromCurrent = paList[paList.index('* index:'):]
MUTED_STR = 'muted: '
fromMutestat = fromCurrent[fromCurrent.index(MUTED_STR)
+ len(MUTED_STR):]
return fromMutestat[:3] == 'yes'
except ValueError:
raise NoMicrophone()
def __toggleMuteStatus__(self):
try:
isMuted = self.__getMuteStatus__()
paList = self.__getPaList__()
fromCurrent = paList[paList.index('* index: ')+len('* index: '):]
sourceId = int(fromCurrent[:fromCurrent.index('\n')])
subprocess.call(['pacmd', 'set-source-mute', str(sourceId),
str(int(not isMuted))])
except ValueError:
raise NoMicrophone()
def on_click(self, event):
self.__toggleMuteStatus__()