#!/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', 'userscripts'):
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()