From cb765ee3197f4647ed96f56057fe3e8284983980 Mon Sep 17 00:00:00 2001 From: Sn4il Date: Thu, 23 Nov 2023 21:28:59 +0300 Subject: Qutebrowser - redirects + Dracula theme --- qutebrowser/config.py | 13 + qutebrowser/dracula/INSTALL.md | 31 +++ qutebrowser/dracula/__init__.py | 0 .../dracula/__pycache__/__init__.cpython-39.pyc | Bin 0 -> 142 bytes .../dracula/__pycache__/draw.cpython-39.pyc | Bin 0 -> 2709 bytes qutebrowser/dracula/draw.py | 291 +++++++++++++++++++++ qutebrowser/redirects.py | 180 +++++++++++++ 7 files changed, 515 insertions(+) create mode 100644 qutebrowser/config.py create mode 100644 qutebrowser/dracula/INSTALL.md create mode 100644 qutebrowser/dracula/__init__.py create mode 100644 qutebrowser/dracula/__pycache__/__init__.cpython-39.pyc create mode 100644 qutebrowser/dracula/__pycache__/draw.cpython-39.pyc create mode 100644 qutebrowser/dracula/draw.py create mode 100644 qutebrowser/redirects.py diff --git a/qutebrowser/config.py b/qutebrowser/config.py new file mode 100644 index 0000000..c940ce2 --- /dev/null +++ b/qutebrowser/config.py @@ -0,0 +1,13 @@ +import dracula.draw + +# Load existing settings made via :set +config.load_autoconfig() +config.source("redirects.py") + + +dracula.draw.blood(c, { + 'spacing': { + 'vertical': 6, + 'horizontal': 8 + } +}) diff --git a/qutebrowser/dracula/INSTALL.md b/qutebrowser/dracula/INSTALL.md new file mode 100644 index 0000000..7c61e78 --- /dev/null +++ b/qutebrowser/dracula/INSTALL.md @@ -0,0 +1,31 @@ +### [qutebrowser](https://www.qutebrowser.org/) + +#### Install using Git + +If you are a git user, you can install the theme and keep up to date by cloning the repo: + + $ git clone https://github.com/dracula/qutebrowser-dracula-theme.git dracula + +#### Install manually + +Download using the [GitHub .zip download](https://github.com/dracula/qutebrowser.git) option and unzip. + +#### Activating theme + +- Find your *[qutebrowser configuration directory](https://www.qutebrowser.org/doc/help/configuring.html#configpy)* (see e.g. `:version` in qutebrowser). This folder should be located at the "config" location listed on qute://version, which is typically ~/.config/qutebrowser/ on Linux, ~/.qutebrowser/ on macOS, and %APPDATA%/qutebrowser/config/ on Windows. +- Move the repository folder to `dracula` inside the configuration directory. +- In your [qutebrowser config.py file](https://www.qutebrowser.org/doc/help/configuring.html#configpy), include the following: + +```python +import dracula.draw + +# Load existing settings made via :set +config.load_autoconfig() + +dracula.draw.blood(c, { + 'spacing': { + 'vertical': 6, + 'horizontal': 8 + } +}) +``` diff --git a/qutebrowser/dracula/__init__.py b/qutebrowser/dracula/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/qutebrowser/dracula/__pycache__/__init__.cpython-39.pyc b/qutebrowser/dracula/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000..8c626a4 Binary files /dev/null and b/qutebrowser/dracula/__pycache__/__init__.cpython-39.pyc differ diff --git a/qutebrowser/dracula/__pycache__/draw.cpython-39.pyc b/qutebrowser/dracula/__pycache__/draw.cpython-39.pyc new file mode 100644 index 0000000..1267675 Binary files /dev/null and b/qutebrowser/dracula/__pycache__/draw.cpython-39.pyc differ diff --git a/qutebrowser/dracula/draw.py b/qutebrowser/dracula/draw.py new file mode 100644 index 0000000..a1079a0 --- /dev/null +++ b/qutebrowser/dracula/draw.py @@ -0,0 +1,291 @@ +def blood(c, options = {}): + palette = { + 'background': '#282a36', + 'background-alt': '#282a36', + 'background-attention': '#181920', + 'border': '#282a36', + 'current-line': '#44475a', + 'selection': '#44475a', + 'foreground': '#f8f8f2', + 'foreground-alt': '#e0e0e0', + 'foreground-attention': '#ffffff', + 'comment': '#6272a4', + 'cyan': '#8be9fd', + 'green': '#50fa7b', + 'orange': '#ffb86c', + 'pink': '#ff79c6', + 'purple': '#bd93f9', + 'red': '#ff5555', + 'yellow': '#f1fa8c' + } + + spacing = options.get('spacing', { + 'vertical': 5, + 'horizontal': 5 + }) + + padding = options.get('padding', { + 'top': spacing['vertical'], + 'right': spacing['horizontal'], + 'bottom': spacing['vertical'], + 'left': spacing['horizontal'] + }) + + ## Background color of the completion widget category headers. + c.colors.completion.category.bg = palette['background'] + + ## Bottom border color of the completion widget category headers. + c.colors.completion.category.border.bottom = palette['border'] + + ## Top border color of the completion widget category headers. + c.colors.completion.category.border.top = palette['border'] + + ## Foreground color of completion widget category headers. + c.colors.completion.category.fg = palette['foreground'] + + ## Background color of the completion widget for even rows. + c.colors.completion.even.bg = palette['background'] + + ## Background color of the completion widget for odd rows. + c.colors.completion.odd.bg = palette['background-alt'] + + ## Text color of the completion widget. + c.colors.completion.fg = palette['foreground'] + + ## Background color of the selected completion item. + c.colors.completion.item.selected.bg = palette['selection'] + + ## Bottom border color of the selected completion item. + c.colors.completion.item.selected.border.bottom = palette['selection'] + + ## Top border color of the completion widget category headers. + c.colors.completion.item.selected.border.top = palette['selection'] + + ## Foreground color of the selected completion item. + c.colors.completion.item.selected.fg = palette['foreground'] + + ## Foreground color of the matched text in the completion. + c.colors.completion.match.fg = palette['orange'] + + ## Color of the scrollbar in completion view + c.colors.completion.scrollbar.bg = palette['background'] + + ## Color of the scrollbar handle in completion view. + c.colors.completion.scrollbar.fg = palette['foreground'] + + ## Background color for the download bar. + c.colors.downloads.bar.bg = palette['background'] + + ## Background color for downloads with errors. + c.colors.downloads.error.bg = palette['background'] + + ## Foreground color for downloads with errors. + c.colors.downloads.error.fg = palette['red'] + + ## Color gradient stop for download backgrounds. + c.colors.downloads.stop.bg = palette['background'] + + ## Color gradient interpolation system for download backgrounds. + ## Type: ColorSystem + ## Valid values: + ## - rgb: Interpolate in the RGB color system. + ## - hsv: Interpolate in the HSV color system. + ## - hsl: Interpolate in the HSL color system. + ## - none: Don't show a gradient. + c.colors.downloads.system.bg = 'none' + + ## Background color for hints. Note that you can use a `rgba(...)` value + ## for transparency. + c.colors.hints.bg = palette['background'] + + ## Font color for hints. + c.colors.hints.fg = palette['purple'] + + ## Hints + c.hints.border = '1px solid ' + palette['background-alt'] + + ## Font color for the matched part of hints. + c.colors.hints.match.fg = palette['foreground-alt'] + + ## Background color of the keyhint widget. + c.colors.keyhint.bg = palette['background'] + + ## Text color for the keyhint widget. + c.colors.keyhint.fg = palette['purple'] + + ## Highlight color for keys to complete the current keychain. + c.colors.keyhint.suffix.fg = palette['selection'] + + ## Background color of an error message. + c.colors.messages.error.bg = palette['background'] + + ## Border color of an error message. + c.colors.messages.error.border = palette['background-alt'] + + ## Foreground color of an error message. + c.colors.messages.error.fg = palette['red'] + + ## Background color of an info message. + c.colors.messages.info.bg = palette['background'] + + ## Border color of an info message. + c.colors.messages.info.border = palette['background-alt'] + + ## Foreground color an info message. + c.colors.messages.info.fg = palette['comment'] + + ## Background color of a warning message. + c.colors.messages.warning.bg = palette['background'] + + ## Border color of a warning message. + c.colors.messages.warning.border = palette['background-alt'] + + ## Foreground color a warning message. + c.colors.messages.warning.fg = palette['red'] + + ## Background color for prompts. + c.colors.prompts.bg = palette['background'] + + # ## Border used around UI elements in prompts. + c.colors.prompts.border = '1px solid ' + palette['background-alt'] + + ## Foreground color for prompts. + c.colors.prompts.fg = palette['cyan'] + + ## Background color for the selected item in filename prompts. + c.colors.prompts.selected.bg = palette['selection'] + + ## Background color of the statusbar in caret mode. + c.colors.statusbar.caret.bg = palette['background'] + + ## Foreground color of the statusbar in caret mode. + c.colors.statusbar.caret.fg = palette['orange'] + + ## Background color of the statusbar in caret mode with a selection. + c.colors.statusbar.caret.selection.bg = palette['background'] + + ## Foreground color of the statusbar in caret mode with a selection. + c.colors.statusbar.caret.selection.fg = palette['orange'] + + ## Background color of the statusbar in command mode. + c.colors.statusbar.command.bg = palette['background'] + + ## Foreground color of the statusbar in command mode. + c.colors.statusbar.command.fg = palette['pink'] + + ## Background color of the statusbar in private browsing + command mode. + c.colors.statusbar.command.private.bg = palette['background'] + + ## Foreground color of the statusbar in private browsing + command mode. + c.colors.statusbar.command.private.fg = palette['foreground-alt'] + + ## Background color of the statusbar in insert mode. + c.colors.statusbar.insert.bg = palette['background-attention'] + + ## Foreground color of the statusbar in insert mode. + c.colors.statusbar.insert.fg = palette['foreground-attention'] + + ## Background color of the statusbar. + c.colors.statusbar.normal.bg = palette['background'] + + ## Foreground color of the statusbar. + c.colors.statusbar.normal.fg = palette['foreground'] + + ## Background color of the statusbar in passthrough mode. + c.colors.statusbar.passthrough.bg = palette['background'] + + ## Foreground color of the statusbar in passthrough mode. + c.colors.statusbar.passthrough.fg = palette['orange'] + + ## Background color of the statusbar in private browsing mode. + c.colors.statusbar.private.bg = palette['background-alt'] + + ## Foreground color of the statusbar in private browsing mode. + c.colors.statusbar.private.fg = palette['foreground-alt'] + + ## Background color of the progress bar. + c.colors.statusbar.progress.bg = palette['background'] + + ## Foreground color of the URL in the statusbar on error. + c.colors.statusbar.url.error.fg = palette['red'] + + ## Default foreground color of the URL in the statusbar. + c.colors.statusbar.url.fg = palette['foreground'] + + ## Foreground color of the URL in the statusbar for hovered links. + c.colors.statusbar.url.hover.fg = palette['cyan'] + + ## Foreground color of the URL in the statusbar on successful load + c.colors.statusbar.url.success.http.fg = palette['green'] + + ## Foreground color of the URL in the statusbar on successful load + c.colors.statusbar.url.success.https.fg = palette['green'] + + ## Foreground color of the URL in the statusbar when there's a warning. + c.colors.statusbar.url.warn.fg = palette['yellow'] + + ## Status bar padding + c.statusbar.padding = padding + + ## Background color of the tab bar. + ## Type: QtColor + c.colors.tabs.bar.bg = palette['selection'] + + ## Background color of unselected even tabs. + ## Type: QtColor + c.colors.tabs.even.bg = palette['selection'] + + ## Foreground color of unselected even tabs. + ## Type: QtColor + c.colors.tabs.even.fg = palette['foreground'] + + ## Color for the tab indicator on errors. + ## Type: QtColor + c.colors.tabs.indicator.error = palette['red'] + + ## Color gradient start for the tab indicator. + ## Type: QtColor + c.colors.tabs.indicator.start = palette['orange'] + + ## Color gradient end for the tab indicator. + ## Type: QtColor + c.colors.tabs.indicator.stop = palette['green'] + + ## Color gradient interpolation system for the tab indicator. + ## Type: ColorSystem + ## Valid values: + ## - rgb: Interpolate in the RGB color system. + ## - hsv: Interpolate in the HSV color system. + ## - hsl: Interpolate in the HSL color system. + ## - none: Don't show a gradient. + c.colors.tabs.indicator.system = 'none' + + ## Background color of unselected odd tabs. + ## Type: QtColor + c.colors.tabs.odd.bg = palette['selection'] + + ## Foreground color of unselected odd tabs. + ## Type: QtColor + c.colors.tabs.odd.fg = palette['foreground'] + + # ## Background color of selected even tabs. + # ## Type: QtColor + c.colors.tabs.selected.even.bg = palette['background'] + + # ## Foreground color of selected even tabs. + # ## Type: QtColor + c.colors.tabs.selected.even.fg = palette['foreground'] + + # ## Background color of selected odd tabs. + # ## Type: QtColor + c.colors.tabs.selected.odd.bg = palette['background'] + + # ## Foreground color of selected odd tabs. + # ## Type: QtColor + c.colors.tabs.selected.odd.fg = palette['foreground'] + + ## Tab padding + c.tabs.padding = padding + c.tabs.indicator.width = 1 + c.tabs.favicons.scale = 1 + diff --git a/qutebrowser/redirects.py b/qutebrowser/redirects.py new file mode 100644 index 0000000..ba9aa32 --- /dev/null +++ b/qutebrowser/redirects.py @@ -0,0 +1,180 @@ +import random +import re +from qutebrowser.api import interceptor +from qutebrowser.extensions.interceptors import RedirectException +from qutebrowser.utils import message + +def fixScribePath(url): + """ Fix external medium blog to scribe translation. + Some paths from medium will go through a 'global identity' + path which messes up the actual url path we want to go + to and puts it in queries. This puts it back on the path. + """ + new_path = f"{url.path()}{url.query()}" + url.setQuery("") + url.setPath(re.sub(r"m/global-identity-2redirectUrl=", "", new_path)) + +redirects = { + "youtube": { + "source": ["youtube.com"], + "target": [ + "piped.thedroth.rocks", + ], + }, + "lbry": { + "source": ["odysee.com"], + "target": [ + "lbry.bcow.xyz", + "odysee.076.ne.jp", + "librarian.pussthecat.org", + "lbry.mutahar.rocks", + "lbry.vern.cc", + ], + }, + "reddit": { + "source": ["reddit.com"], + "target": [ + "td.vern.cc", + "teddit.adminforge.de", + "teddit.artemislena.eu", + "teddit.bus-hit.me", + "teddit.hostux.net", + "teddit.namazso.eu", + "teddit.net", + "teddit.pussthecat.org", + "teddit.sethforprivacy.com", + "teddit.totaldarkness.net", + "teddit.zaggy.nl", + ], + }, + "twitter": { + "source": ["twitter.com"], + "target": [ + "nitter.net", + "nitter.42l.fr", + "nitter.fdn.fr", + "nitter.1d4.us", + "nitter.kavin.rocks", + "nitter.unixfox.eu", + "nitter.namazso.eu", + "nitter.moomoo.me", + "bird.trom.tf", + "nitter.it", + "twitter.censors.us", + "nitter.grimneko.de", + "twitter.076.ne.jp", + "n.l5.ca", + "unofficialbird.com", + "nitter.ungovernable.men", + ], + }, + "imdb": { + "source": ["imdb.com"], + "target": [ + "libremdb.iket.me", + "libremdb.pussthecat.org", + "ld.vern.cc", + "binge.whatever.social", + "libremdb.lunar.icu", + ], + }, + "tiktok": { + "source": ["tiktok.com"], + "target": [ + "proxitok.pabloferreiro.es", + "proxitok.pussthecat.org", + "tok.habedieeh.re", + "proxitok.privacydev.net", + "proxitok.odyssey346.dev", + "tok.artemislena.eu", + "tok.adminforge.de", + "proxitok.manasiwibi.com", + "tik.hostux.net", + "tt.vern.cc", + "proxitok.mha.fi", + "proxitok.pufe.org", + "proxitok.marcopisco.com", + "cringe.whatever.social", + "proxitok.lunar.icu", + ], + }, + "imgur": { + "source": ["imgur.com"], + "target": [ + "imgur.artemislena.eu", + "ri.zzls.xyz", + "rimgo.bus-hit.me", + "rimgo.fascinated.cc", + "rimgo.hostux.net", + "rimgo.kling.gg", + "rimgo.lunar.icu", + "rimgo.marcopisco.com", + "rimgo.privacytools.io", + "rimgo.projectsegfau.lt", + "rimgo.pussthecat.org", + "rimgo.totaldarkness.net", + "rimgo.whateveritworks.org", + ], + }, + "medium": { + "source": ["medium.com"], + "target": [ + "scribe.rip", + "scribe.nixnet.services", + "scribe.citizen4.eu", + "scribe.bus-hit.me", + "scribe.froth.zone", + "scribe.privacydev.net", + "sc.vern.cc", + ], + "postprocess": fixScribePath + }, + "google": { + "source": ["google.com"], + "target": [ + "whoogle.dcs0.hu", + ], + }, + "wiki-en": { + "source": ["en.wikipedia.org"], + "target": [ + "wiki.thedroth.rocks", + ], + }, + "wiki-ru": { + "source": ["ru.wikipedia.org"], + "target": [ + "wiki.thedroth.rocks", + ], + }, +} + + +def rewrite(request: interceptor.Request): + if ( + request.resource_type != interceptor.ResourceType.main_frame + or request.request_url.scheme() in {"data", "blob"} + ): + return + + url = request.request_url + + for service in redirects.values(): + matched = False + for source in service["source"]: + if re.search(source, url.host()): + matched = True + + if matched: + target = service["target"][random.randint(0, len(service["target"]) - 1)] + if target is not None and url.setHost(target) is not False: + if "postprocess" in service: + service["postprocess"](url) + try: + request.redirect(url) + except RedirectException as e: + message.error(str(e)) + break + + +interceptor.register(rewrite) -- cgit v1.2.3