60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
'''
|
|
Module of MacOS API for plyer.battery.
|
|
'''
|
|
|
|
from os import environ
|
|
from subprocess import Popen, PIPE
|
|
from plyer.facades import Battery
|
|
from plyer.utils import whereis_exe
|
|
|
|
|
|
class OSXBattery(Battery):
|
|
'''
|
|
Implementation of MacOS battery API.
|
|
'''
|
|
|
|
def _get_state(self):
|
|
old_lang = environ.get('LANG', '')
|
|
environ['LANG'] = 'C'
|
|
|
|
status = {"isCharging": None, "percentage": None}
|
|
|
|
ioreg_process = Popen(
|
|
["ioreg", "-rc", "AppleSmartBattery"],
|
|
stdout=PIPE
|
|
)
|
|
output = ioreg_process.communicate()[0]
|
|
|
|
environ['LANG'] = old_lang
|
|
|
|
if not output:
|
|
return status
|
|
|
|
is_charging = max_capacity = current_capacity = None
|
|
for line in output.decode('utf-8').splitlines():
|
|
if 'IsCharging' in line:
|
|
is_charging = line.rpartition('=')[-1].strip()
|
|
if 'MaxCapacity' in line:
|
|
max_capacity = float(line.rpartition('=')[-1].strip())
|
|
if 'CurrentCapacity' in line:
|
|
current_capacity = float(line.rpartition('=')[-1].strip())
|
|
|
|
if is_charging:
|
|
status['isCharging'] = is_charging == "Yes"
|
|
|
|
if current_capacity and max_capacity:
|
|
status['percentage'] = 100.0 * current_capacity / max_capacity
|
|
|
|
return status
|
|
|
|
|
|
def instance():
|
|
'''
|
|
Instance for facade proxy.
|
|
'''
|
|
import sys
|
|
if whereis_exe('ioreg'):
|
|
return OSXBattery()
|
|
sys.stderr.write("ioreg not found.")
|
|
return Battery()
|