summaryrefslogblamecommitdiffstats
path: root/.bin/qb
blob: 3caf57eabd231aff8b78837977bf5cdc18a4b8bb (plain) (tree)

































































































































                                                                              
#!/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()
remember that computers suck.