#!/usr/bin/env python3 import os import sys import yaml def bypass_file_exists(func, *args): """ Exceptions for existing files are ignored. """ try: func(*args) except FileExistsError as e: print(e) def start_qutebrowser(args): """ Replace the current process with qutebrowser. """ os.execvp('qutebrowser', args) def generate_tab(url): full_url = f'https://{url}' return { 'active': True, 'history': [{ 'active': True, 'pinned': True, 'last_visited': '2021-09-16T12:22:57', 'scroll-pos': {'x': 0, 'y': 0}, 'zoom': 1.0, 'title': url, 'original-url': full_url, 'url': full_url }] } def restore_default_tabs(profile, path=None): """ Declarative way to enforce opened/favorite tabs. """ mapping = { 'default': [ 'mailbox.org', 'news.ycombinator.com', 'miniflux.rgoncalves.se', 'status.rgoncalves.se' ], 'work': [ 'mail.zoho.eu', 'cliq.zoho.eu', 'gitlab.viperdev.io', 'projects.zoho.eu', 'kb.viperdev.io', ] } assert mapping[profile] # Open file an cleanup with open(path, 'r') as file: data = yaml.safe_load(file) # Scrap existing tabs, # then filter pinned tabs original_tabs = data['windows'][0]['tabs'] tabs = [tab['history'][-1] for tab in original_tabs if len(tab['history']) != 0] tabs = [tab for tab in tabs if tab['pinned']] missing_urls = [url for url in mapping[profile] if not any(url in tab['url'] for tab in tabs)] for url in missing_urls: original_tabs.append(generate_tab(url)) original_tabs.sort(reverse=True, key=lambda k: k['history'][-1]['pinned']) # Persist tabs in yaml file with open(path, 'w') as file: yaml.dump(data, file) def main(): try: QB_PROFILE = f'{sys.argv[1]}' except IndexError: QB_PROFILE = 'default' """ restore_default_tabs( QB_PROFILE, path=f'{os.environ["HOME"]}/' + '.local/share/qutebrowser/sessions/default.yml' ) """ start_qutebrowser([' ']) sys.exit(0) QB_DIR = f'{os.environ["HOME"]}/.config/qutebrowser' QB_PROFILES_DIR = f'{QB_DIR}/_profiles' QB_PROFILE_DIR = f'{QB_PROFILES_DIR}/{QB_PROFILE}' QB_PROFILE_DIR_CONFIG = f'{QB_PROFILE_DIR}/config' QB_PROFILE_TAG = QB_PROFILE[0].lower() # Ensure directory existence for dir in [QB_PROFILES_DIR, QB_PROFILE_DIR, QB_PROFILE_DIR_CONFIG]: bypass_file_exists(os.mkdir, dir) # Ensure common files are shared with other profiles for file in ['config.py', 'bookmarks', 'greasemonkey']: bypass_file_exists(os.symlink, f'{QB_DIR}/{file}', f'{QB_PROFILE_DIR_CONFIG}/{file}') start_qutebrowser([ ' ', '--basedir', QB_PROFILE_DIR, '--set', 'window.title_format', f'[{QB_PROFILE_TAG}]', '--set', 'tabs.title.format', f'[{QB_PROFILE_TAG}] {{audio}}{{index}}: {{current_title}}' ]) if __name__ == '__main__': main()