summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-rwxr-xr-xbin/common/askpass13
-rwxr-xr-xbin/common/gt121
-rwxr-xr-xbin/extra/aivpn30
-rwxr-xr-xbin/extra/clock64
-rwxr-xr-xbin/extra/ddsurf4
-rwxr-xr-xbin/extra/igdl21
-rwxr-xr-xbin/extra/mtr23
-rwxr-xr-xbin/extra/muz-sync10
-rwxr-xr-xbin/extra/myalscore.sh7
-rwxr-xr-xbin/extra/spschedule2
-rwxr-xr-xbin/extra/trl4
-rwxr-xr-xbin/extra/trmv13
-rwxr-xr-xbin/extra/ytplay2
-rw-r--r--bin/guiscripts/mega.sh67
-rwxr-xr-xbin/guiscripts/osurf2
-rwxr-xr-xbin/guiscripts/osurf-fill127
-rwxr-xr-xbin/guiscripts/osurf-txt18
-rwxr-xr-xbin/guiscripts/osurfls8
-rwxr-xr-xbin/guiscripts/osurftabs12
-rwxr-xr-xbin/guiscripts/osurftxts22
-rwxr-xr-xbin/guiscripts/record100
-rwxr-xr-xbin/guiscripts/setbg5
-rwxr-xr-xbin/guiscripts/startw4
-rwxr-xr-xbin/guiscripts/yt4
-rwxr-xr-xbin/menuscripts/keyadd2
-rwxr-xr-xbin/menuscripts/mpass2
-rwxr-xr-xbin/menuscripts/mpass-otp2
-rwxr-xr-xbin/menuscripts/tsh21
28 files changed, 686 insertions, 24 deletions
diff --git a/bin/common/askpass b/bin/common/askpass
new file mode 100755
index 0000000..2725dbf
--- /dev/null
+++ b/bin/common/askpass
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# We can figure out the password for the key based on $1
+# which is in the following form:
+# Enter passphrase for key 'path/to/key':
+# The point is to retrieve the path and use the final name of the key
+# find the according password.
+key="$(printf '%s\n' "$1" |
+ cut -f 2 -d \' |
+ awk -F '/' '{print $NF}')"
+pass="keys/$(hostname)/ssh/$key"
+
+pass show "$pass" | head -n 1
diff --git a/bin/common/gt b/bin/common/gt
new file mode 100755
index 0000000..c679b23
--- /dev/null
+++ b/bin/common/gt
@@ -0,0 +1,121 @@
+#!/bin/sh
+
+# Git Trach, track the state of multiple repos from a single file.
+
+# dependencies:
+# - git
+# - $EDITOR: -e
+
+repos=$HOME/sync/share/git-track.txt
+# prevent file not found errors
+touch "$repos"
+
+help() {
+ >&2 cat <<EOF
+usage: gt [OPTION]
+-a PATH add repo
+-s update and show status of each repo
+-c COMMAND run 'git COMMAND' in each repo
+-h show this help
+-l list repos
+-e edit repos in $EDITOR
+EOF
+}
+
+# fetch repository prettily, outputs nothing if failed
+fetch() {
+ # fetch with one-line printing of progress
+ git fetch --progress 2>/dev/null | while read -r line
+ # \r\033[0K : clear current line
+ do >&2 printf '\r\033[0K%s' "$line"
+ done
+}
+
+# Print repositories prettily
+# This function function prints animations (eg. clearing the line)
+# to stderr and the final status line is outputted to stdout.
+status() {
+ while read -r repo
+ do
+ repo_pretty="$(printf '%s' "$repo" | sed "s@$HOME@~@" )"
+
+ # absolute path
+ cd "$repo"
+
+ # replace line with status
+ >&2 printf '\r\033[0K'
+
+ status="$(git status --porcelain 2> /dev/null | awk '{print $1}' | uniq | tr -d '\n')"
+ remote="$(git branch -v 2>/dev/null |
+ sed '/^*/!d;s/ahead/↑/;s/behind/↓/;s/[^↓↑]*//g')"
+
+ printf '%s %s %s\n' "$repo_pretty" "$status" "$remote"
+ done < "$repos"
+}
+
+# run git command in each repo
+# $1: command
+repos_cmd() {
+ while read -r repo
+ do
+ repo_pretty="$(printf '%s' "$repo" | sed "s@$HOME@~@" )"
+ printf ''\''%s'\'' in %s' "$1" "$repo_pretty"
+ (
+ cd "$repo"
+ git "$1" > /dev/null 2>&1
+ [ $? -gt 0 ] && s="x" || s="o"
+ printf '\r\033[0K%s: %s\n' "$repo_pretty" "$s"
+ )
+ done < "$repos"
+}
+
+# no options
+if [ -z "$1" ]
+then
+ help
+ exit 1
+fi
+
+while getopts ":a:c:f:lshe" opt
+do
+ case "$opt" in
+ a)
+ cd "$OPTARG" || exit 1
+ r="$(git rev-parse --show-toplevel)"
+ [ "$r" ] || exit 2
+
+ if grep "$r" "$repos" > /dev/null 2>&1
+ then
+ >&2 printf 'added already.\n'
+ exit 2
+ fi
+
+ printf '%s\n' "$r" >> "$repos"
+
+ >&2 printf 'added.\n' ;;
+ c) f_command=1; f_arg="$OPTARG" ;;
+ s) f_status=1 ;;
+ l) cat "$repos" ;;
+ e) $EDITOR "$repos" ;;
+ f) repos="$OPTARG" ;;
+ h) help ;;
+ :) >&2 printf -- '-%s requires argument\n' "$OPTARG"; exit 1 ;;
+ ?) >&2 printf -- 'Invalid option: -%s\n' "$OPTARG"; exit 1 ;;
+ esac
+done
+
+# commands hereafter must happen in order
+
+[ "$(wc -l < "$repos")" -gt 0 ] || exit 0
+
+if [ "$f_command" ]
+then
+ repos_cmd "$f_arg"
+fi
+
+if [ "$f_status" ]
+then
+ status
+fi
+
+# eval "herbe $(status | sed 's/"/\"/g;s/.*/"&"/' | tr '\n' ' ')"
diff --git a/bin/extra/aivpn b/bin/extra/aivpn
new file mode 100755
index 0000000..841d926
--- /dev/null
+++ b/bin/extra/aivpn
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+err() { printf "%s\n" "$@"; }
+
+if [ "$1" = "-k" ]
+then
+ pgrep -f -- "ssh.*-L.*vm" | xargs kill
+ exit
+fi
+
+err "I: Waiting for connectivity..."
+while ! ssh -o ConnectTimeout=1 -o BatchMode=yes vm 2>&1 | grep "Permission denied" > /dev/null
+do sleep 1
+done
+
+
+export SSH_ASKPASS="sshpass"
+export SSH_ASKPASS_REQUIRE="prefer"
+export PASSWORD="zot/quickemu"
+
+err "I: Activating vpn"
+ssh vm "rasdial \"vpn.student.ehb.be\""
+
+keyadd ehb/ai
+ssh -f -N -L 2222:10.2.160.41:22 vm
+
+keyadd ehb/vm_int
+ssh -f -N -L 2223:10.2.160.9:22 vm
+ssh -f -N -L 2224:10.2.160.10:22 vm
+ssh -f -N -L 2225:10.2.160.11:22 vm
diff --git a/bin/extra/clock b/bin/extra/clock
new file mode 100755
index 0000000..bd6efd2
--- /dev/null
+++ b/bin/extra/clock
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+clocks="${XDG_DATA_HOME:-$HOME}"/clocks.csv
+
+if [ ! -f "$clocks" ]
+then
+ printf 'start,end,message\n' > "$clocks"
+fi
+
+# print clocks file prettily
+if [ "$1" = "-p" ]
+then
+ # empty
+ [ "$(wc -l < "$clocks")" -eq 1 ] && exit
+
+ timefmt="%y%m%d-%T"
+ IFS=","
+ # skip csv header
+ tail -n +2 "$clocks" |
+ while read -r start end message
+ do
+ printf "%s - %s | %s\n" "$(date -d "@$start" +"$timefmt" )" "$(date -d "@$end" +"$timefmt")" "$message"
+ done
+ exit
+fi
+
+# edit clocks file in $EDITOR
+if [ "$1" = "-e" ]
+then
+ $EDITOR "$clocks"
+ exit
+fi
+
+trap 'exit 0' INT # The proper way to exit
+
+while true
+do
+ >&2 printf ' > '
+ message="$(head -n 1)"
+
+ [ "$message" ] || exit 1
+ printf '\033[1A' # move cursor up once: https://en.wikipedia.org/wiki/ANSI_escape_code
+
+ start_time="$(date +%s)"
+ start_time_pretty="$(date -d "@$start_time" +%R)"
+ >&2 printf -- '\r%s- > %s' "$start_time_pretty" "$message"
+
+ # Wait for EOF
+ cat > /dev/null 2>&1
+
+ end_time="$(date +%s)"
+ end_time_pretty="$(date -d "@$end_time" +%R)"
+ >&2 printf -- '\r%s-%s > %s\n' "$start_time_pretty" "$end_time_pretty" "$message"
+
+ if printf '%s' "$message" | grep ',' > /dev/null
+ then
+ # escape potential double quotes
+ message="$(printf '%s' "$message" | sed -e 's/"/""/g')"
+ message="\"$message\""
+ fi
+
+ # save clocked time and message
+ printf '%s,%s,%s\n' "$start_time" "$end_time" "$message" >> "$clocks"
+done
diff --git a/bin/extra/ddsurf b/bin/extra/ddsurf
new file mode 100755
index 0000000..a3ae0d1
--- /dev/null
+++ b/bin/extra/ddsurf
@@ -0,0 +1,4 @@
+#!/bin/sh
+f="$(mktemp)"
+awk '!x[$2]++' ~/.config/surf/history.txt > "$f"
+mv "$f" ~/.config/surf/history.txt
diff --git a/bin/extra/igdl b/bin/extra/igdl
new file mode 100755
index 0000000..1973187
--- /dev/null
+++ b/bin/extra/igdl
@@ -0,0 +1,21 @@
+#!/bin/sh
+lock="/tmp/igdl.lock"
+
+if [ -f "$lock" ]
+then
+ herbe "already downloading."
+ exit 1
+fi
+
+
+url="$(clipo)"
+out="/tmp/igdl.mp4"
+
+touch "$lock"
+herbe "igdl" "downloading: $url" &
+yt-dlp "$url" -o "$out" || rm "$lock"
+
+printf '%s' "$out" | clipp
+herbe "igdl" "copied path."
+
+rm "$lock"
diff --git a/bin/extra/mtr b/bin/extra/mtr
new file mode 100755
index 0000000..486a9b8
--- /dev/null
+++ b/bin/extra/mtr
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+list_categories()
+{
+ cat <<EOF
+music
+anime
+movies
+shows
+other
+software
+games
+isos
+books
+EOF
+}
+
+category="$(list_categories | commander -cl)"
+[ "$category" ] || exit 1
+
+transmission-remote debuc.com -a "$(clipo)" -w "/downloads/$category"
+
+notify-send "mtr" "added to <b>$category</b>"
diff --git a/bin/extra/muz-sync b/bin/extra/muz-sync
new file mode 100755
index 0000000..a81ef74
--- /dev/null
+++ b/bin/extra/muz-sync
@@ -0,0 +1,10 @@
+#!/bin/sh
+trap "exit 1" INT
+
+music="$(xdg-user-dir MUSIC)"
+>&2 printf "music: %s\n" "$music"
+
+# recursive, links, fuzzy, partial, progress
+while ! rsync -rlyP --size-only db:/media/basilisk/music/sorted/ "$music"
+do :
+done
diff --git a/bin/extra/myalscore.sh b/bin/extra/myalscore.sh
new file mode 100755
index 0000000..ef68bcc
--- /dev/null
+++ b/bin/extra/myalscore.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+[ "$1" ] || exit 1
+query="$(printf '%s' "$*" | sed 's/\s/%20/g')"
+curl -s "https://myanimelist.net/search/prefix.json?type=all&keyword=$query&v=1" \
+ -H 'Accept: application/json, text/javascript, */*; q=0.01' |
+ jq -r '.categories[].items[] | [.payload.score, .name] | join(" ")'
diff --git a/bin/extra/spschedule b/bin/extra/spschedule
new file mode 100755
index 0000000..b0dd70a
--- /dev/null
+++ b/bin/extra/spschedule
@@ -0,0 +1,2 @@
+#!/bin/sh
+curl -s 'https://subsplease.org/api/?f=schedule&tz=UTC' | jq -r ".schedule.$(date +%A).[] | [.time, .title] | join(\" \")"
diff --git a/bin/extra/trl b/bin/extra/trl
index bd4c2c5..55d65ee 100755
--- a/bin/extra/trl
+++ b/bin/extra/trl
@@ -41,10 +41,10 @@ then
fi
[ "$word" ] || exit 1
-primary="$(languages | fzf)"
+primary="$(languages | fzf --prompt="from:")"
[ "$primary" ] || exit 1
-secondary="$(languages | fzf)"
+secondary="$(languages | fzf --prompt="to:")"
[ "$secondary" ] || exit 1
curl -s "https://context.reverso.net/translation/$primary-$secondary/$word" \
diff --git a/bin/extra/trmv b/bin/extra/trmv
new file mode 100755
index 0000000..22d9e48
--- /dev/null
+++ b/bin/extra/trmv
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+trr() { transmission-remote 192.168.178.79 "$@"; }
+
+id="$(trr -t all -l | tail -n +2 | head -n -1 | fzf | awk '{print $1}')"
+[ "$id" ] || exit 1
+name="$(trr -t "$id" -i | grep '^\s*Name:' | cut -f 4- -d ' ')"
+location="$(trr -t "$id" -i | grep '^\s*Location:' | cut -f 4- -d ' ')"
+
+>&2 printf '#%s\n' "$id"
+>&2 printf "old name: %s\n" "$name"
+>&2 printf 'new name: '
+trr -t "$id" --path "$name" --rename "$(head -n 1)"
diff --git a/bin/extra/ytplay b/bin/extra/ytplay
index 66204c4..5243364 100755
--- a/bin/extra/ytplay
+++ b/bin/extra/ytplay
@@ -1,4 +1,4 @@
#!/bin/sh
url="$(ytlink)"
-notify-send "playing: $url" &
+herbe "playing: $url" &
yt-dlp -o - "$url" | mpv -
diff --git a/bin/guiscripts/mega.sh b/bin/guiscripts/mega.sh
new file mode 100644
index 0000000..cafca0a
--- /dev/null
+++ b/bin/guiscripts/mega.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+
+URL=""
+
+if [[ $1 =~ ^https?:\/\/mega(\.co)?\.nz ]]; then
+ URL="$1"
+fi
+
+if [[ ! $URL ]]; then
+ echo "Usage: ${0##*/} url" >&2
+ exit 1
+fi
+
+CURL="curl -Y 1 -y 10"
+
+missing=false
+for cmd in openssl; do
+ if [[ ! $(command -v "$cmd" 2>&1) ]]; then
+ missing=true
+ echo "${0##*/}: $cmd: command not found" >&2
+ fi
+done
+if $missing; then
+ exit 1
+fi
+
+if [[ $URL =~ .*/file/[^#]*#[^#]* ]]; then
+ id="${URL#*file/}"; id="${id%%#*}"
+ key="${URL##*file/}"; key="${key##*#}"
+else
+ id="${URL#*!}"; id="${id%%!*}"
+ key="${URL##*!}"
+fi
+
+raw_hex=$(echo "${key}=" | tr '\-_' '+/' | tr -d ',' | base64 -d -i 2>/dev/null | od -v -An -t x1 | tr -d '\n ')
+hex=$(printf "%016x" \
+ $(( 0x${raw_hex:0:16} ^ 0x${raw_hex:32:16} )) \
+ $(( 0x${raw_hex:16:16} ^ 0x${raw_hex:48:16} ))
+)
+
+json=$($CURL -s -H 'Content-Type: application/json' -d '[{"a":"g", "g":"1", "p":"'"$id"'"}]' 'https://g.api.mega.co.nz/cs?id=&ak=') || exit 1; json="${json#"[{"}"; json="${json%"}]"}"
+file_url="${json##*'"g":'}"; file_url="${file_url%%,*}"; file_url="${file_url//'"'/}"
+
+json=$($CURL -s -H 'Content-Type: application/json' -d '[{"a":"g", "p":"'"$id"'"}]' 'https://g.api.mega.co.nz/cs?id=&ak=') || exit 1
+at="${json##*'"at":'}"; at="${at%%,*}"; at="${at//'"'/}"
+
+json=$(echo "${at}==" | tr '\-_' '+/' | tr -d ',' | openssl enc -a -A -d -aes-128-cbc -K "$hex" -iv "00000000000000000000000000000000" -nopad | tr -d '\0'); json="${json#"MEGA{"}"; json="${json%"}"}"
+file_name="${json##*'"n":'}"
+if [[ $file_name == *,* ]]; then
+ file_name="${file_name%%,*}"
+fi
+file_name="${file_name//'"'/}"
+
+aria2c -x 15 -o "$file_name" "$file_url"
+cat "$file_name" | openssl enc -d -aes-128-ctr -K "$hex" -iv "${raw_hex:32:16}0000000000000000" > "temp.new"
+mv -f temp.new "$file_name"
+
+echo "$file_url"
+echo "$file_name"
+echo "$hex"
+echo "${raw_hex:32:16}0000000000000000"
+sleep 5
+echo "Downloading... (press Ctrl + C to Cancel)"
+
+aria2c -x 16 -s 16 -o "$file_name" "$file_url"
+cat "$file_name" | openssl enc -d -aes-128-ctr -K "$hex" -iv "${raw_hex:32:16}0000000000000000" > "temp.new"
+mv -f temp.new "$file_name"
diff --git a/bin/guiscripts/osurf b/bin/guiscripts/osurf
new file mode 100755
index 0000000..6923848
--- /dev/null
+++ b/bin/guiscripts/osurf
@@ -0,0 +1,2 @@
+#!/bin/sh
+tabbed -c -dn tabbed-surf -r 2 surf -e '' "$1"
diff --git a/bin/guiscripts/osurf-fill b/bin/guiscripts/osurf-fill
new file mode 100755
index 0000000..43af807
--- /dev/null
+++ b/bin/guiscripts/osurf-fill
@@ -0,0 +1,127 @@
+#!/bin/sh
+
+# Fills a password for a given website
+# original script by Avalon Williams (avalonwilliams@protonmail.com)
+# This version uses the window id to know the url of the surf window
+# and to know which fifo it must use. Then it injects javascript code.
+# that will fill the forms with the credentials
+
+# dependencies:
+# - surf fifo patch (http://surf.suckless.org/patches/fifo/)
+# - xprop
+# - 'pass' with password store in form dir/url/pass.gpg
+
+# $1: winid
+
+fifodir="$HOME/.config/surf/fifo"
+if [ -z "${winid:=$1}" ]
+then
+ winid="$(osurfls | dmenu -c -F -i | cut -f1 -d' ')"
+fi
+[ "$winid" ] || exit 1
+fifo="$fifodir/$winid"
+[ -p "$fifo" ] || exit 2
+
+# Get only domain name + top-level domain
+url="$(xprop -id "$winid" _SURF_URI |
+ cut -f 2 -d'"' |
+ sed 's,^.*://\([^/]*\)/.*,\1,' |
+ sed -r -e 's/^([^.]+)\.([^.]+)\.([^.]+)$/\2.\3/')"
+[ "$url" ] || exit 3
+>&2 printf 'url: %s\n' "$url"
+
+# get pass with url and ask if multiple are found
+pass="$({ find $PASSWORD_STORE_DIR/websites/ -type f -name '*.gpg' |
+ grep "$url/" || echo; } | head -n 1 |
+ sed "s,$PASSWORD_STORE_DIR/,,;s/\.gpg$//" |
+ dmenu -c)"
+# if dmenu was stopped, exit
+[ $? -gt 0 ] && exit 4
+
+# if no password was found, search through password store manually with dmenu
+if [ -z "$pass" ]
+then
+ store="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
+ while [ -d "$store/$file" ]
+ do
+ choice="$(find "$store/$file" \
+ -maxdepth 1 -mindepth 1 \
+ -not -name '.*' -type d -printf "%y\t%f\n" -o \
+ -not -name '.*' -not -type d -printf "%y\t%f\n" |
+ sort -k1 -k2 |
+ cut -f 2 | sed 's/\.gpg$//' |
+ dmenu -c)"
+ [ "$choice" ] || exit 1
+ [ -z "$file" ] && file="$choice" || file="$file/$choice"
+ done
+ pass="$file"
+fi
+>&2 printf 'pass: %s\n' "$pass"
+herbe "filling ${pass#websites/}" &
+
+# Get password and username in variables with only one call to 'pass'
+# escape single quotes
+eval "$(pass show "$pass" |
+ sed -n "1s/'/'\\\\''/g;1s/.*/password='&'/p;s/^login: \?\(.\+\)/username='\1'/p")"
+printf '%s : %s\n' "$username" "$password"
+
+# Escape quotes and backslashes for javascript
+javascript_escape() {
+ printf '%s' "$1" | sed -s 's,['\''"\\\\],\\\\&,g'
+}
+
+js() {
+cat <<EOF
+ function isVisible(elem) {
+ var style = elem.ownerDocument.defaultView.getComputedStyle(elem, null);
+ if (style.getPropertyValue("visibility") !== "visible" ||
+ style.getPropertyValue("display") === "none" ||
+ style.getPropertyValue("opacity") === "0") {
+ return false;
+ }
+ return elem.offsetWidth > 0 && elem.offsetHeight > 0;
+ };
+ function hasPasswordField(form) {
+ var inputs = form.getElementsByTagName("input");
+ for (var j = 0; j < inputs.length; j++) {
+ var input = inputs[j];
+ if (input.type == "password" || input.autocomplete == "password" || input.name == "password") {
+ return true;
+ }
+ }
+ return false;
+ };
+ function loadData2Form (form) {
+ var inputs = form.getElementsByTagName("input");
+ for (var j = 0; j < inputs.length; j++) {
+ var input = inputs[j];
+ if (isVisible(input) && (input.type == "text" || input.type == "email")) {
+ input.focus();
+ input.value = "$(javascript_escape "$username")";
+ input.blur();
+ console.log("user: $(javascript_escape "$username")")
+ }
+ if (input.type == "password" || input.name == "password" || input.autocomplete == "password" || input.id == "password" ) {
+ input.focus();
+ input.value = "$(javascript_escape "$password")";
+ input.blur();
+ console.log("password: $(javascript_escape "$password")")
+ }
+ console.log(input)
+ }
+ };
+ var forms = document.getElementsByTagName("form");
+ for (i = 0; i < forms.length; i++) {
+ if (hasPasswordField(forms[i])) {
+ loadData2Form(forms[i]);
+ // forms[i].submit();
+ }
+ }
+EOF
+}
+
+printjs() {
+ js | sed 's,//.*$,,' | tr '\n' ' '
+}
+
+echo "inject $(printjs)" >> "$fifo"
diff --git a/bin/guiscripts/osurf-txt b/bin/guiscripts/osurf-txt
new file mode 100755
index 0000000..9a1d4f4
--- /dev/null
+++ b/bin/guiscripts/osurf-txt
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# open a link from a txt file in surf
+
+# dependencies: surf, osurf, dmenu
+
+winid="$1"
+>&2 printf 'winid: %s\n' "$winid"
+tabs="$HOME/dl/txtabs"
+
+f="$(find "$tabs" -type f -printf '%f\n' | dmenu -c)"
+[ "$f" ] || exit 1
+f="$tabs"/"$f"
+>&2 printf 'f: %s\n' "$f"
+
+url="$(dmenu -c < "$f")"
+
+printf 'loaduri %s' "$url" > $HOME/.config/surf/fifo/$winid
diff --git a/bin/guiscripts/osurfls b/bin/guiscripts/osurfls
new file mode 100755
index 0000000..0abdd35
--- /dev/null
+++ b/bin/guiscripts/osurfls
@@ -0,0 +1,8 @@
+#!/bin/sh
+find "$HOME/.config/surf/fifo" -type p -printf '%f\n' |
+while read -r winid
+do
+ title="$(xprop -id "$winid" 2> /dev/null | awk -F'"' '/^_NET_WM_NAME/ {print $2}')"
+ [ "$title" ] || continue
+ printf '%s %s\n' "$winid" "$title"
+done \ No newline at end of file
diff --git a/bin/guiscripts/osurftabs b/bin/guiscripts/osurftabs
new file mode 100755
index 0000000..d41424b
--- /dev/null
+++ b/bin/guiscripts/osurftabs
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+# list surf tabbed windows
+
+# dependencies: lsw, dmenu, xprop
+# expects the tabbed windows to be named 'tabbed-surf'
+lsw | cut -f1 -d' ' |
+ while read -r winid
+ do
+ [ "tabbed-surf" = "$(xprop -id "$winid" WM_CLASS | cut -f2 -d'"')" ] &&
+ printf '%s %s\n' "$winid" "$(xprop -id "$winid" WM_NAME | cut -f2 -d'"')"
+ done
diff --git a/bin/guiscripts/osurftxts b/bin/guiscripts/osurftxts
new file mode 100755
index 0000000..ef60166
--- /dev/null
+++ b/bin/guiscripts/osurftxts
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# open all links in txt file into one tabbed surf
+
+# dependencies: surf, osurf, dmenu
+
+# $1: file path for non interactive use
+if [ -z "$1" ]
+then
+ d="$HOME/dl/txtabs"
+ f="$(find "$d" -type f -printf '%f\n' | dmenu)"
+ [ "$f" ] || exit 1
+ f="$d"/"$f"
+else
+ [ -f "$1" ] || exit 1
+ f="$1"
+fi
+
+winid="$(osurf "$(head -n 1 "$f")")"
+tail -n +2 "$f" | while read -r url;
+ do surf -e "$winid" "$url" &
+ done
diff --git a/bin/guiscripts/record b/bin/guiscripts/record
new file mode 100755
index 0000000..df4b6e6
--- /dev/null
+++ b/bin/guiscripts/record
@@ -0,0 +1,100 @@
+#!/bin/sh
+
+# record - record an area of the screen
+
+lock="/tmp/record.lock"
+
+# dependencies: ffmpeg, hacksaw (part), xwininfo & lsw (window), xdotool (active)
+# optional:
+# - hacksaw: part
+# - xwininfo, lsw, commander: window
+# - xdotool: active
+# - xdg-user-dir
+
+audio=
+
+# $1: width
+# $2: height
+# $3: x
+# $4: y
+# $5: output dir
+# $6: output name
+record_cmd()
+{
+ if [ -f "$lock" ]
+ then
+ >&2 printf 'already recording, please stop recording first\n'
+ exit 1
+ else
+ touch "$lock"
+ fi
+
+ herbe "started recording." &
+ w=$(($3 + $3 % 2))
+ h=$(($4 + $4 % 2))
+ ffmpeg $audio \
+ -v 16 \
+ -r 30 \
+ -f x11grab \
+ -s "${w}x${h}" \
+ -i ":0.0+$1,$2" \
+ -preset slow \
+ -c:v h264 \
+ -pix_fmt yuv420p \
+ -crf 20 \
+ "$5/$6.mp4"
+ printf '%s\n' "$5/$6.mp4"
+ rm -f "$lock"
+ herbe "stopped recording." &
+}
+
+if [ -d "$1" ]
+then
+ dir="$1"
+ shift
+else
+ dir="$(which xdg-user-dir > /dev/null 2>&1 && xdg-user-dir VIDEOS)"
+ [ "$dir" ] && dir="$dir/records" || dir="$HOME/vids/records"
+fi
+mkdir -p "$dir"
+
+if [ "$1" = "-a" ]
+then
+ audio="-f pulse -ac 2 -i default"
+ shift
+fi
+
+if [ "$1" = "-l" ]
+then
+ find vids/records/ -type f | sort | tail -n 1
+ exit
+fi
+
+current=$(date +%F_%H-%M-%S)
+
+[ "$1" ] && option="$1" || option="$(printf 'active\nwindow\npart\nstop\nfull\naudio' | commander -c)"
+case "$option" in
+ active)
+ record_cmd $(xwininfo -id "$(xdotool getactivewindow)" |
+ sed -e '/Absolute\|Width:\|Height:/!d;s/.*:\s*//' | tr '\n' ' ') $dir $current
+ ;;
+
+ window)
+ winid="$(lsw | commander -cxl | cut -d' ' -f1)"
+ [ "$winid" ] || exit 1
+ values="$(xwininfo -id "$winid" | sed -e '/Absolute\|Width:\|Height:/!d;s/.*:\s*//' | tr '\n' ' ')"
+ [ "$values" ] || exit 1
+ record_cmd $values $dir $current
+ ;;
+
+ part)
+ hacksaw | {
+ IFS=+x read -r w h x y
+ record_cmd $w $h $x $y $dir $current
+ }
+ ;;
+ stop) kill "$(pgrep ffmpeg | xargs ps | grep 'x11grab' | awk '{print $1}')"; rm -f "$lock" ;;
+ full) record_cmd 0 0 1920 1080 $dir $current ;;
+ audio) $0 -a; exit ;;
+ help|*) >&2 printf 'record [dir] (active|window|part|stop|full)\n' ;;
+esac
diff --git a/bin/guiscripts/setbg b/bin/guiscripts/setbg
new file mode 100755
index 0000000..a4109ab
--- /dev/null
+++ b/bin/guiscripts/setbg
@@ -0,0 +1,5 @@
+#!/bin/sh
+cd "$HOME/pics/wallpapers" || exit 1
+bg="$(find . -type f -printf '%f\n' | sed 's@^\./@@' | dmenu -c -x)"
+[ "$bg" ] || exit 1
+feh --no-fehbg --bg-scale "$bg"
diff --git a/bin/guiscripts/startw b/bin/guiscripts/startw
index 0383f48..dbf4450 100755
--- a/bin/guiscripts/startw
+++ b/bin/guiscripts/startw
@@ -1,8 +1,4 @@
#!/bin/sh
-
eval "$(keychain --dir "$XDG_CONFIG_HOME/keychain" --eval --quiet --agents gpg,ssh)"
eval "$(keychain --dir "$XDG_CONFIG_HOME/keychain" --eval --quiet --agents gpg 3A626DD20A32EB2E5DD9CE71CFD9ABC97158CD5D 2> /dev/null)"
-
-(cd ~/.config/waybar/ && ln -sf hyprland.jsonc config.jsonc)
-
Hyprland
diff --git a/bin/guiscripts/yt b/bin/guiscripts/yt
new file mode 100755
index 0000000..72f6e92
--- /dev/null
+++ b/bin/guiscripts/yt
@@ -0,0 +1,4 @@
+#!/bin/sh
+link="$(ytfzf -D -I l)"
+[ "$link" ] || exit 1
+yt-dlp $@ -o - "$link" | mpv -
diff --git a/bin/menuscripts/keyadd b/bin/menuscripts/keyadd
index 12519ec..4e7949f 100755
--- a/bin/menuscripts/keyadd
+++ b/bin/menuscripts/keyadd
@@ -2,7 +2,7 @@
log()
{
- notify-send -t 1000 "keyadd" "$1"
+ notify-send -t 1000 "keyadd" "$1" &
>&2 printf '%s\n' "$1"
}
diff --git a/bin/menuscripts/mpass b/bin/menuscripts/mpass
index 7348321..f513b16 100755
--- a/bin/menuscripts/mpass
+++ b/bin/menuscripts/mpass
@@ -14,7 +14,7 @@ list_pswds()
while [ -d "$store/$file" ]
do
- choice="$(list_pswds "$store/$file" | dmenu -c -g 4 -l 4)"
+ choice="$(list_pswds "$store/$file" | commander -c)"
[ "$choice" ] || exit 1
[ -z "$file" ] && file="$choice" || file="$file/$choice"
done
diff --git a/bin/menuscripts/mpass-otp b/bin/menuscripts/mpass-otp
index 52d1341..2be6186 100755
--- a/bin/menuscripts/mpass-otp
+++ b/bin/menuscripts/mpass-otp
@@ -1,7 +1,7 @@
#!/bin/sh
pass="$(find "$PASSWORD_STORE_DIR"/keys/otp -iname "*.gpg" |
sed "/^\./d;s#^$PASSWORD_STORE_DIR/keys/otp/##;s/\.gpg$//" |
- commander -c)"
+ dmenu -c)"
[ "$pass" ] || exit 1
pass otp -c keys/otp/"$pass"
notify-send -t 1000 "mpass" "copied $pass"
diff --git a/bin/menuscripts/tsh b/bin/menuscripts/tsh
index aac27ee..0c57ee0 100755
--- a/bin/menuscripts/tsh
+++ b/bin/menuscripts/tsh
@@ -5,8 +5,8 @@ PROG="$(basename "$0")"
# copy command and deps variable
deps="pup curl $MENUCMD"
-LIBPFX=/home/aluc/.local/share/tsh
-module='1337x.sh' # default module
+MODULES_PATH=$HOME/.local/share/tsh
+module='nyaa.sh' # default module
# Files
export tmp="/tmp/$PROG"
@@ -83,7 +83,7 @@ cleanup ()
done
}
-list_modules () { find -L "$LIBPFX" -type f -printf "%f\n"; }
+list_modules () { find -L "$MODULES_PATH" -type f -printf "%f\n"; }
# get a query from user based on MENUCMD
get_query ()
@@ -121,14 +121,6 @@ show_files()
rm -f "$tmp"/.torrent
}
-# Select a type after having displayed them with 'show_types'
-select_type()
-{
- for type in $categories
- do printf "%s\n" "$type"
- done | fzf
-}
-
trap "exit 1" INT
trap "cleanup" EXIT
@@ -179,7 +171,7 @@ then
# Get results
rm -f "$results" "$links"
# shellcheck source=/usr/local/lib/$PROG/nyaa.sh disable=SC1091
- . "$LIBPFX/$module"
+ . "$MODULES_PATH/$module"
[ -f "$results" ] || die "No results."
# Save which module was used
@@ -190,7 +182,7 @@ fi
# acquire get_magnet function
# shellcheck source=/usr/local/lib/$PROG/nyaa.sh disable=SC1091
-getfunctions=1 . "$LIBPFX/$module"
+getfunctions=1 . "$MODULES_PATH/$module"
# select result from "$results"
for choice in $(select_result | xargs)
@@ -205,7 +197,8 @@ do
if [ "$noaskdownload" ] || confirm 'download?'
then
- [ "${category:-$(select_type)}" ] || exit 1
+ [ "$category" ] || category="$(printf '%s' "$categories" | tr ' ' '\n' | fzf)"
+ [ "$category" ] || exit 2
transmission-remote debuc.com -a "$magnet" -w "/downloads/$category"
elif confirm "copy?"
then