chrome: improvements to python launch script

Co-authored-by: Guy Kloss <guy@kloss.nz>
Co-authored-by: Ian Leonard <antonlacon@gmail.com>
Signed-off-by: Ian Leonard <antonlacon@gmail.com>
This commit is contained in:
Ian Leonard 2022-12-29 07:02:26 +00:00 committed by Rudi Heitbaum
parent ecb6f6c7b5
commit cc5dd53dca

View File

@ -2,17 +2,20 @@
# Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv)
# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
import json
import linecache
import os import os
import shlex
import subprocess
import sys import sys
import time import time
import xbmcaddon
import subprocess
import json
import xbmc import xbmc
import xbmcaddon
__addon__ = xbmcaddon.Addon(); __addon__ = xbmcaddon.Addon();
__path__ = os.path.join(__addon__.getAddonInfo('path'), 'bin') + '/' __path__ = os.path.join(__addon__.getAddonInfo('path'), 'bin')
pauseXBMC = __addon__.getSetting("PAUSE_XBMC") pauseXBMC = __addon__.getSetting("PAUSE_XBMC")
@ -27,41 +30,53 @@ def resumeXbmc():
xbmc.audioResume() xbmc.audioResume()
xbmc.enableNavSounds(True) xbmc.enableNavSounds(True)
def _print_exception():
exc_type, exc_obj, tb = sys.exc_info()
frame = tb.tb_frame
lineno = tb.tb_lineno
filename = frame.f_code.co_filename
linecache.checkcache(filename)
line = linecache.getline(filename, lineno, frame.f_globals)
xbmc.log(f'## Chrome Addon Error: in ({filename}, line {lineno}\n"{line.strip()}"):\n{repr(exc_obj)}', xbmc.LOGERROR)
def startchrome(args): def startchrome(args):
try: try:
new_env = os.environ.copy() chrome_env = {
new_env['VAAPI_MODE'] = __addon__.getSetting('VAAPI_MODE') 'VAAPI_MODE': __addon__.getSetting('VAAPI_MODE'),
new_env['WINDOW_MODE'] = __addon__.getSetting('WINDOW_MODE') 'WINDOW_MODE': __addon__.getSetting('WINDOW_MODE'),
new_env['RASTER_MODE'] = __addon__.getSetting('RASTER_MODE') 'RASTER_MODE': __addon__.getSetting('RASTER_MODE'),
new_env['DARK_MODE'] = __addon__.getSetting('DARK_MODE') 'DARK_MODE': __addon__.getSetting('DARK_MODE')
}
# sound settings as environment variable
if __addon__.getSetting('USE_CUST_AUDIODEVICE') == 'true': if __addon__.getSetting('USE_CUST_AUDIODEVICE') == 'true':
audio_device = __addon__.getSetting('CUST_AUDIODEVICE_STR') audio_device = __addon__.getSetting('CUST_AUDIODEVICE_STR')
else: else:
audio_device = getAudioDevice() audio_device = getAudioDevice()
chrome_env['AUDIO_DEVICE_TYPE'] = getAudioDeviceType(audio_device)
new_env['AUDIO_DEVICE_TYPE'] = getAudioDeviceType(audio_device) if chrome_env['AUDIO_DEVICE_TYPE'] == 'ALSA':
if new_env['AUDIO_DEVICE_TYPE'] == "ALSA":
new_env['ALSA_DEVICE'] = ''
alsa_device = getAlsaAudioDevice(audio_device) alsa_device = getAlsaAudioDevice(audio_device)
if not alsa_device == None and not alsa_device == '': chrome_env['ALSA_DEVICE'] = alsa_device if alsa_device else ''
new_env['ALSA_DEVICE'] = alsa_device
# chrome user-agent string
if __addon__.getSetting('USE_CUST_USERAGENT') == 'true': if __addon__.getSetting('USE_CUST_USERAGENT') == 'true':
new_env['USER_AGENT'] = __addon__.getSetting('CUST_USERAGENT_STR') chrome_env['USER_AGENT'] = __addon__.getSetting('CUST_USERAGENT_STR')
chrome_params = args + ' ' + \ # launch chrome
__addon__.getSetting('HOMEPAGE') new_env = os.environ.copy()
subprocess.call(__path__ + 'chrome-start ' + chrome_params, shell=True, env=new_env) new_env.update(chrome_env)
except Exception as e: chrome_execute = ([os.path.join(__path__, 'chrome-start')]
xbmc.log('## Chrome Error:' + repr(e), xbmc.LOGERROR) + args
+ [__addon__.getSetting('HOMEPAGE')])
subprocess.call(chrome_execute, env=new_env)
except Exception:
_print_exception()
xbmc.log(f'## Chrome Addon Error: chrome env: {chrome_env}, audio device: {audio_device}', xbmc.LOGERROR)
def isRuning(pname): def isRunning(pname):
tmp = os.popen("ps -Af").read() '''Returns True/False if pname is running'''
pcount = tmp.count(pname) running_commands = subprocess.run(shlex.split('ps -Ao comm'), text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if pcount > 0: return pname in running_commands.stdout
return True
return False
def getAudioDevice(): def getAudioDevice():
return json.loads(xbmc.executeJSONRPC(json.dumps({ return json.loads(xbmc.executeJSONRPC(json.dumps({
@ -74,20 +89,26 @@ def getAudioDevice():
})))['result']['value'] })))['result']['value']
def getAudioDeviceType(dev): def getAudioDeviceType(dev):
if dev:
if dev.startswith("ALSA:"): if dev.startswith("ALSA:"):
return "ALSA" return "ALSA"
if dev.startswith("PULSE:"): elif dev.startswith("PULSE:"):
return "PULSE" return "PULSE"
return None else:
# backwards compatibility of device string
return "ALSA"
return "ALSA"
def getAlsaAudioDevice(dev): def getAlsaAudioDevice(dev):
if not dev.startswith('ALSA:'):
return dev
dev = dev.split("ALSA:")[1] dev = dev.split("ALSA:")[1]
if dev == "@": if dev == "@":
return None return None
if dev.startswith("@:"): if dev.startswith("@:"):
dev = dev.split("@:")[1] dev = dev.split("@:")[1]
if dev.startswith("CARD="): if dev.startswith("CARD="):
dev = "plughw:" + dev dev = f'plughw:{dev}'
return dev return dev
if (not __addon__.getSetting("firstrun")): if (not __addon__.getSetting("firstrun")):
@ -95,19 +116,19 @@ if (not __addon__.getSetting("firstrun")):
__addon__.openSettings() __addon__.openSettings()
try: try:
args = ' '.join(sys.argv[1:]) args = sys.argv[1:]
except: except Exception:
args = "" args = ''
if args == 'widevine': if args == 'widevine':
install_widevine() install_widevine()
elif args == 'flash': elif args == 'flash':
install_flash() install_flash()
else: else:
if not isRuning('chrome'): if not isRunning('chrome'):
pauseXbmc() pauseXbmc()
startchrome(args) startchrome(args)
while isRuning('chrome'): while isRunning('chrome'):
time.sleep(1) time.sleep(1)
resumeXbmc() resumeXbmc()