#!/bin/ksh # dexec_browser # A multi browser launcher # # 1. choose input source # (filtered-, full history, clipboad, manual entry) # 2. choose how to handle the input # (can suggest a matching default) # 3. choose which browser to use # (can suggest a matching default) . ${HOME}/.bin/_config BROWSER=luakit HISTFILE="${HOME}/.browser_history" touch "${HISTFILE}" # show history file # EXPECTS: $HISTFILE $DMENU_CMD # PROVIDES: $INPUT read_input() { local S=$( { echo "paste_from_clipboard"; tail -r ${HISTFILE}; } \ | awk '!seen[$0]++' \ | ${DMENU_CMD} -p "Bookmarks" -l 20) case "${S}" in paste_from_clipboard) S=$(xclip -o | head -n 1); ;; esac [ -z "${S}" ] && exit 0 INPUT="${S}" } # Decide how to open the thing # EXPECTS: $INPUT $DMENU_CMD # PROVIDES: $URI choose_wrapper() { local SE="OPEN URL Amazon Amazon Order ID CPAN Crates.io DuckDuckGo Web Search DuckDuckGo Image Search Startpage Web Search Kagi Web Search GLIB Documentation Github LibSOUP Documentation Webkit Documentation Marc Info MessageID Marc Info OpenBSD Misc List Marc Info OpenBSD Ports CVS Marc Info OpenBSD Ports List Marc Info OpenBSD Tech List PDF Viewer SearX Web Search SearX Image Search Torrent Leech Wikipedia DE Wikipedia EN InternetMovieDataBase (IMDB) OpenStreetMap (OSM) Grep.app Google Maps Youtube Zalando" local C="$(printf '%s' "${INPUT}" \ | head -n 1)" case "${C}" in *::*) DEFAULT="CPAN (default)"; ;; http*) DEFAULT="OPEN (default)"; ;; 192.168.*) DEFAULT="OPEN (default)"; C="http://${C}"; ;; 10.20.*) DEFAULT="OPEN (default)"; C="http://${C}"; ;; ???-???????-???????) DEFAULT="Amazon Order ID (default)"; ;; gopher*) DEFAULT="OPEN (default)"; ;; g_*) DEFAULT="GLIB Documentation (default)"; ;; [Ss]oup_*) DEFAULT="LibSOUP Documentation (default)"; ;; [Ww]ebkit_*) DEFAULT="Webkit Documentation (default)"; ;; www.*) DEFAULT="OPEN (default)"; C="http://${C}"; ;; \<*@*\>) DEFAULT="Marc Info Message ID (default)"; ;; *.com|*.de|*.net|*.org) DEFAULT="OPEN (default)"; C="http://${C}"; ;; *.at|*.ch|*.social) DEFAULT="OPEN (default)"; C="http://${C}" ;; *.io|*.sh|*.pw|*.party) DEFAULT="OPEN (default)"; C="http://${C}"; ;; *.coffee|*.me|*.cloud) DEFAULT="OPEN (default)"; C="http://${C}"; ;; *.[a-zA-Z]*/*) DEFAULT="OPEN (default)"; C="http://${C}"; ;; *) DEFAULT="DuckDuckGo Web Search (default)"; ;; esac local S="$(printf "%s\n%s" "${DEFAULT}" "${SE}" \ | ${DMENU_CMD} -p "Search Where?" -l 20)" C=$(echo "$C" | sed 's/ /%20/g') case "${S}" in OPEN*) URI="${C}"; ;; Amazon) URI="https://www.amazon.de/s?k=${C}&rh=p_n_enc-merchantbin%3AA3JWKAKR8XB7XF"; ;; Amazon*O*) URI="https://www.amazon.de/gp/your-account/order-details/ref=ppx_yo_dt_b_order_details_o00?orderID=${C}"; ;; CPAN*) URI="https://metacpan.org/search?q=${C}"; ;; Crate*) URI="https://crates.io/search?q=${C}"; ;; Grep*) URI="https://grep.app/search?q=${C}"; ;; GLIB*) URI="https://docs.gtk.org/glib/flags.UriFlags.html?q=${C}"; ;; LibSOUP*) URI="https://libsoup.org/libsoup-3.0/index.html?q=${C}"; ;; Github) URI="https://github.com/search?q=${C}"; ;; D*Web*) URI="https://html.duckduckgo.com/html?q=${C}"; ;; Startpage*) URI="https://eu.startpage.com/do/search?prfe=00d4bb7f075582be9304aaad813ac6b4dc4bd733a098955c35c0586a99eaddf123ac81f1301f1e4f06fd014082141134ec5e0c5441250cf4c05557bed28fcfbced8de0007d01a0254332962533&query=${C}"; ;; D*Ima*) URI="https://duckduckgo.com/?q=${C}&iax=images&ia=images"; ;; S*Web*) URI="https://searx.bar/search?q=${C}&category_general=on"; ;; Kagi*Web*) URI="https://kagi.com/search?q=${C}"; ;; Webkit*) URI="https://webkitgtk.org/reference/webkit2gtk/2.42.5/?q=${C}"; ;; S*Ima*) URI="https://searx.bar/search?q=${C}&category_images=on"; ;; Tor*Lee*) URI="https://www.torrentleech.org/torrents/browse/index/query/${C}"; ;; W*DE*) URI="https://de.m.wikipedia.org/wiki/Spezial:Suche/${C}"; ;; W*EN*) URI="https://en.m.wikipedia.org/wiki/Spezial:Search/${C}"; ;; *IMDB*) URI="https://www.imdb.com/find?q=${C}"; ;; O*S*M*) URI="https://www.openstreetmap.org/search?query=${C}"; ;; G*Maps) URI="https://www.google.com/maps/place/${C}"; ;; You*be) URI="https://m.youtube.com/results?sp=mAEA&search_query=${C}" ;; M*I*ID*) URI="https://marc.info/?i=$(printf '%s' "${C}" | tr -d '<>')"; ;; M*I*P*List) URI="https://marc.info/?l=openbsd-ports&s=${C}&q=b"; ;; M*I*T*List) URI="https://marc.info/?l=openbsd-tech&s=${C}&q=b"; ;; M*I*M*List) URI="https://marc.info/?l=openbsd-misc&s=${C}&q=b"; ;; M*I*P*CVS) URI="https://marc.info/?l=openbsd-ports-cvs&s=${C}&q=b"; ;; Zalando) URI="https://www.zalando.de/herren/?q=${C}"; ;; *) exit 0 ;; esac } # Which browser shall we use? # EXPECTS: $URI $DMENU_CMD # PROVIDES: $BROWSER choose_browser() { case "${URI}" in gopher://*) DEFAULT="Lagrange (default)"; ;; gemini://*) DEFAULT="Lagrange (default)"; ;; *console.hetzner.cloud*) DEFAULT="Firefox (default)"; ;; *youtube.com/watch*) DEFAULT="Mpv (default)"; ;; *media.ccc.de/v/*) DEFAULT="Mpv (default)"; ;; *.pdf|*.cb|*.ps) DEFAULT="Zathura (default)"; ;; *.mp4|*.m4v|*.mkv) DEFAULT="Mpv (default)"; ;; *) DEFAULT="$BROWSER (default)"; ;; esac local S="${DEFAULT}\nLuakit\nVimb\nFirefox\nChrome\nQutebrowser\nWyeb\nNetsurf\nTor-Browser\nDillo\nSurf\nMpv" case $(echo "${S}" | ${DMENU_CMD} -p "Browser" -l 20) in [Nn]etsurf*) BROWSER=netsurf-gtk3 ;; [Vv]imb*) BROWSER="vimb --no-maximize" ;; [Dd]illo*) BROWSER=dillo; ;; [Qq]uteb*r*) BROWSER="qutebrowser -R" ;; [Ss]urf*) BROWSER=surf ;; [Oo]tter*r*) BROWSER=otter-browser ;; [Ll]uakit*) BROWSER="luakit -Un" ;; [Cc]hrome*) BROWSER=chrome ;; [Ff]irefox*) BROWSER=firefox ;; [Tt]or-B*r*) BROWSER=tor-browser ;; [Zz]athura*) BROWSER=zathura ;; [Ll]agrange*) BROWSER=lagrange ;; [Ww]yeb*) BROWSER=wyeb ;; [Mm]pv*) BROWSER="mpv" ;; *) exit 0;; esac } save_history() { printf '%s\n' "${INPUT}" | sed 's/^ *//g;s/ *$//g' >> "${HISTFILE}" } # main program starts here. read_input choose_wrapper choose_browser save_history $BROWSER "$(printf '%s' "${URI}" | sed 's/ /%20/g')" &