From cc1c39d20d1763495ffcac14d4e3f8bba0782da7 Mon Sep 17 00:00:00 2001 From: Tobias Reisinger Date: Fri, 8 Mar 2024 21:33:36 +0100 Subject: [PATCH] Add linkwarden for qutebrowser --- .config/env.d/30-services | 2 + .config/environment | 4 ++ .config/qutebrowser/config.py | 2 + .config/qutebrowser/keybindings.py | 3 ++ .config/qutebrowser/linkwarden.py | 47 +++++++++++++++++++ .../userscripts/qutebrowser-linkwarden | 39 +++++++++++++++ 6 files changed, 97 insertions(+) create mode 100644 .config/qutebrowser/linkwarden.py create mode 100755 .config/qutebrowser/userscripts/qutebrowser-linkwarden diff --git a/.config/env.d/30-services b/.config/env.d/30-services index 7050bf6..c28bd25 100755 --- a/.config/env.d/30-services +++ b/.config/env.d/30-services @@ -2,6 +2,8 @@ export DRONE_SERVER='https://ci.serguzim.me' +export LINKWARDEN_URL="https://bookmarks.serguzim.me" + export OPENFAAS_URL="https://faas.serguzim.me" export WOODPECKER_SERVER="https://ci.serguzim.me" diff --git a/.config/environment b/.config/environment index ccaf910..5f8ff9e 100644 --- a/.config/environment +++ b/.config/environment @@ -46,6 +46,10 @@ export QT_QPA_PLATFORMTHEME="qt5ct" export PASSWORD_STORE_ENABLE_EXTENSIONS=true +export STCONFDIR="$XDG_CONFIG_HOME/syncthing" +export STDATADIR="$XDG_DATA_HOME/syncthing" +export STNODEFAULTFOLDER="true" + export TERMINAL="alacritty" export TIME_STYLE="long-iso" diff --git a/.config/qutebrowser/config.py b/.config/qutebrowser/config.py index c0ba757..a45c01c 100644 --- a/.config/qutebrowser/config.py +++ b/.config/qutebrowser/config.py @@ -1,9 +1,11 @@ import keybindings import common +import linkwarden config.load_autoconfig() keybindings.init(config) common.init(c) +linkwarden.init() import socket if socket.gethostname() == 'portalo': diff --git a/.config/qutebrowser/keybindings.py b/.config/qutebrowser/keybindings.py index 2e8756a..c931824 100644 --- a/.config/qutebrowser/keybindings.py +++ b/.config/qutebrowser/keybindings.py @@ -24,6 +24,9 @@ def init(c): c.bind(',Po', 'spawn --userscript qutebrowser-keepassxc --only-otp --key ' + gpg_key, mode='normal') c.bind(',Pp', 'spawn --userscript qutebrowser-keepassxc --autotype --key ' + gpg_key, mode='normal') + c.unbind('M') + c.bind('M', 'spawn --userscript qutebrowser-linkwarden', mode='normal') + c.bind(',q', 'spawn --userscript qr {url}') c.bind(',Q', 'hint links spawn --userscript qr {hint-url}') diff --git a/.config/qutebrowser/linkwarden.py b/.config/qutebrowser/linkwarden.py new file mode 100644 index 0000000..2edf0f0 --- /dev/null +++ b/.config/qutebrowser/linkwarden.py @@ -0,0 +1,47 @@ +import os +import json +import urllib.request + +linkwarden_url = os.environ.get('LINKWARDEN_URL') +linkwarden_token = os.environ.get('LINKWARDEN_TOKEN') + +def get_links(cursor): + request = urllib.request.Request(linkwarden_url + "/api/v1/links?sort=0&cursor=" + str(cursor), headers={ + 'Authorization': 'Bearer ' + linkwarden_token + }) + response = urllib.request.urlopen(request) + data = response.read().decode("utf-8") + data = data.replace("\\n", " ").replace("\\r", " ").replace("\\t", " ") + data = ' '.join(data.split()) + return json.loads(data).get("response", []) + +def init(): + if linkwarden_url is None or linkwarden_token is None: + return + + links = [] + cursor = 0 + + while True: + new_links = get_links(cursor) + links += new_links + if len(new_links): + cursor = new_links[-1]["id"] + else: + break + + with open(os.path.expanduser("~/.config/qutebrowser/bookmarks/urls"), "w+") as f: + for link in links: + url = link.get("url") + if not url: + continue + + title = link.get("name") + if not title: + title = link.get("description") + if not title: + title = "" + + f.write(url + " " + title + "\n") + + f.close() diff --git a/.config/qutebrowser/userscripts/qutebrowser-linkwarden b/.config/qutebrowser/userscripts/qutebrowser-linkwarden new file mode 100755 index 0000000..b38886b --- /dev/null +++ b/.config/qutebrowser/userscripts/qutebrowser-linkwarden @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +get_collections() { + curl -H "Authorization: Bearer $LINKWARDEN_TOKEN" \ + -H "Accept: application/json" \ + "$LINKWARDEN_URL/api/v1/collections" 2>/dev/null \ + | jq -r '.response | map_values(.name)[]' +} + +collection=$(get_collections | $DMENU -p "Collection: ") +url=$QUTE_URL +name=$(echo "$QUTE_TITLE" | $DMENU -p "Title: ") + +payload=$(jq -n \ + --arg u "$url" \ + --arg n "$name" \ + --arg c "$collection" \ + '{ + url: $u, + name: $n, + collection: {name: $c}, + tags: [] + }') + +response=$(curl -sS --fail-with-body \ + -H "Authorization: Bearer $LINKWARDEN_TOKEN" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -X POST \ + -d "$payload" \ + "$LINKWARDEN_URL/api/v1/links" 2>&1) + +code="$?" + +if [ "$code" -ne 0 ] +then + response=$(echo "$response" | sed 's/"/\\"/g' | sed 's/$/ - /g' | tr -d '\n' | sed 's/ - $//g') + echo "message-error \"Failed to save link: $response\"" >> "$QUTE_FIFO" +fi