diff --git a/dotfiles/.local/bin/commands b/dotfiles/.local/bin/commands index 8c1d8f2..442fd8f 100755 --- a/dotfiles/.local/bin/commands +++ b/dotfiles/.local/bin/commands @@ -114,6 +114,109 @@ def resilient_vlc(stream=None): pass time.sleep(1.0) +def eternal_firefox( + tabs=None, + profile=None, + group_name=None, + window_position=None, + debug=None, +): + import os + import datetime + import pprint + import subprocess + import time + if debug is None: + debug = False + if tabs is None: + raise RuntimeError('no tabs provided') + if profile is None: + raise RuntimeError('no profile provided') + if group_name is None: + raise RuntimeError('no group provided') + if window_position is None: + #window_position = '1,600,0,600,540' + raise RuntimeError('no window-position provided') + while True: + os.system(r'''date''') + with subprocess.Popen([ + 'firefox', + '-P', profile, + *tabs, + ]) as p: + try: + if debug: + assert subprocess.check_call(['notify-send', '%s:Starting' % group_name]) == 0 + + #t3 = '' + for k in range(300): + t1 = subprocess.check_output(r''' + swaymsg -t get_tree | jq -r '..|try select(.pid== %d)' + ''' % p.pid, shell=True).decode('utf-8') + if len(t1) > 10: + break + #time.sleep(0.1) + #t1 = subprocess.check_output(['wmctrl', '-p', '-l']).decode('utf-8') + #t4 = [o for o in t1.splitlines() if str(p.pid) in o] + #if len(t4) == 1: + # t3 = t4[0] + # break + + #if t3 == '': + # raise RuntimeError + + #t2 = t3.split()[0] + #assert os.system('wmctrl -i -r %s -e %s' % (t2, window_position)) == 0 + assert os.system(r''' + swaymsg '[pid="{{PID}}"] move absolute position {{X}}px {{Y}}px' + '''.replace('{{PID}}', str(p.pid)) \ + .replace('{{X}}', str(window_position[1])) \ + .replace('{{Y}}', str(window_position[2]))) == 0 + + #assert os.system('wmctrl -i -r %s -b add,below' % t2) == 0 + + if False: + for tab in tabs[1:]: + time.sleep(10) + assert subprocess.check_call([ + 'firefox', + '-P', profile, + '--new-tab', + tab, + ]) == 0 + + + if debug: + assert subprocess.check_call(['notify-send', '%s:Started' % group_name]) == 0 + + start = datetime.datetime.now() + is_to_restart = lambda : (datetime.datetime.now() - start).total_seconds() >= 900 * 4 + while not is_to_restart(): + if not p.poll() is None: + break + time.sleep(10) + + if debug: + assert subprocess.check_call(['notify-send', '%s:Closing' % group_name]) == 0 + + #assert os.system('wmctrl -i -c %s' % t2) == 0 + assert os.system(r''' + swaymsg '[pid="%d"] kill' + ''' % (p.pid,)) == 0 + + except: + import traceback + import pprint + pprint.pprint(traceback.format_exc()) + finally: + try: + p.wait(20) + except subprocess.TimeoutExpired: + pprint.pprint([p.pid, '20 seconds timeout', 'kill']) + p.kill() + if debug: + assert subprocess.check_call(['notify-send', '%s:Closed' % group_name]) == 0 + def status(): return ' | '.join([ subprocess.check_output(o, shell=True).decode('utf-8').strip() @@ -196,6 +299,14 @@ try: eternal_oom() elif sys.argv[1] == 'resilient-vlc': resilient_vlc(sys.argv[2:]) + elif sys.argv[1] == 'eternal-firefox': + eternal_firefox( + profile=sys.argv[2], + group_name=sys.argv[3], + window_position=json.loads(sys.argv[4]), + debug=bool(sys.argv[5]), + tabs=sys.argv[6:], + ) else: raise NotImplementedError except: