From 78fb89ef9c2d237cff4c067e7e2101d3ef78e40f Mon Sep 17 00:00:00 2001
From: MatthewOwens <matthew@owens.tech>
Date: Sun, 21 Jun 2020 18:26:38 +0100
Subject: [PATCH 1/1] initial dump

---
 auto-multimonitor | 12 +++++++
 booksplit         | 44 +++++++++++++++++++++++++
 brave-new-world   |  3 ++
 bt                | 32 +++++++++++++++++++
 camtoggle         |  4 +++
 colours.sh        | 41 ++++++++++++++++++++++++
 cpuhogs           |  3 ++
 cputemp           |  3 ++
 dproj             | 45 ++++++++++++++++++++++++++
 dsurf             |  5 +++
 dwmbar            |  7 ++++
 kb.sh             |  1 +
 linkhandler       | 22 +++++++++++++
 memhogs           |  3 ++
 mkbar.sh          | 81 +++++++++++++++++++++++++++++++++++++++++++++++
 mm.sh             |  2 ++
 netflix           |  2 ++
 papefix.sh        |  5 +++
 pokemon-emerald   |  3 ++
 rclick.sh         |  4 +++
 resolution        |  2 ++
 screen_blank.sh   |  1 +
 sss               |  3 ++
 tag               | 59 ++++++++++++++++++++++++++++++++++
 tearfix.sh        |  3 ++
 thecproglang      |  3 ++
 toRebuild.sh      | 10 ++++++
 unicode.sh        | 31 ++++++++++++++++++
 webview           | 16 ++++++++++
 whoneeds.sh       | 72 +++++++++++++++++++++++++++++++++++++++++
 30 files changed, 522 insertions(+)
 create mode 100755 auto-multimonitor
 create mode 100755 booksplit
 create mode 100755 brave-new-world
 create mode 100755 bt
 create mode 100755 camtoggle
 create mode 100755 colours.sh
 create mode 100755 cpuhogs
 create mode 100755 cputemp
 create mode 100755 dproj
 create mode 100755 dsurf
 create mode 100755 dwmbar
 create mode 100755 kb.sh
 create mode 100755 linkhandler
 create mode 100755 memhogs
 create mode 100755 mkbar.sh
 create mode 100755 mm.sh
 create mode 100755 netflix
 create mode 100755 papefix.sh
 create mode 100755 pokemon-emerald
 create mode 100755 rclick.sh
 create mode 100755 resolution
 create mode 100755 screen_blank.sh
 create mode 100755 sss
 create mode 100755 tag
 create mode 100755 tearfix.sh
 create mode 100755 thecproglang
 create mode 100755 toRebuild.sh
 create mode 100755 unicode.sh
 create mode 100755 webview
 create mode 100755 whoneeds.sh

diff --git a/auto-multimonitor b/auto-multimonitor
new file mode 100755
index 0000000..eb76a23
--- /dev/null
+++ b/auto-multimonitor
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# Vertical monitor is connected as DP-0, Horizontal monitor is connected as HDMI-0
+# Horizontal monitor is disconnected for the PS4. This script monitors the output
+# of xrandr and runs the multimonitor script if needed
+
+MMSCRIPT=~/.screenlayout/multimonitor.sh
+HDMI=$(xrandr | grep -c HDMI-0)
+
+if [[ HDMI -eq 1 ]]; then
+	$MMSCRIPT
+fi
diff --git a/booksplit b/booksplit
new file mode 100755
index 0000000..3d0ab07
--- /dev/null
+++ b/booksplit
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+# Requires ffmpeg (audio splitting) and my `tag` wrapper script.
+
+[ ! -f "$2" ] && printf "The first file should be the audio, the second should be the timecodes.\\n" && exit
+
+echo "Enter the album/book title:"; read -r booktitle
+
+echo "Enter the artist/author:"; read -r author
+
+echo "Enter the publication year:"; read -r year
+
+inputaudio="$1"
+
+# Get a safe file name from the book.
+escbook="$(echo "$booktitle" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+
+! mkdir -p "$escbook" && echo "Do you have write access in this directory?" && exit 1
+
+# As long as the extension is in the tag script, it'll work.
+ext="opus"
+#ext="${1#*.}"
+
+# Get the total number of tracks from the number of lines.
+total="$(wc -l < "$2")"
+
+while read -r x;
+do
+	end="$(echo "$x" | cut -d' ' -f1)"
+	[ -n "$start" ] &&
+	echo "From $start to $end; $track $title"
+	file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+	[ -n "$start" ] && echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -to "$end" -vn "$file" &&
+		echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
+	title="$(echo "$x" | cut -d' ' -f 2-)"
+	esctitle="$(echo "$title" | iconv -cf UTF-8 -t ASCII//TRANSLIT | tr -d '[:punct:]' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | sed "s/-\+/-/g;s/\(^-\|-\$\)//g")"
+	track="$((track+1))"
+	start="$end"
+done < "$2"
+# The last track must be done outside the loop.
+echo "From $start to the end: $title"
+file="$escbook/$(printf "%.2d" "$track")-$esctitle.$ext"
+echo "Splitting \"$title\"..." && ffmpeg -nostdin -y -loglevel -8 -i "$inputaudio" -ss "$start" -vn "$file" &&
+		echo "Tagging \"$title\"..." && tag -a "$author" -A "$booktitle" -t "$title" -n "$track" -N "$total" -d "$year" "$file"
diff --git a/brave-new-world b/brave-new-world
new file mode 100755
index 0000000..15ba322
--- /dev/null
+++ b/brave-new-world
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+mupdf ~/documents/books/BraveNewWorld.pdf
diff --git a/bt b/bt
new file mode 100755
index 0000000..155174e
--- /dev/null
+++ b/bt
@@ -0,0 +1,32 @@
+#!/bin/bash
+function connect()
+{
+	echo  -e "connect E8:AB:FA:25:43:EE\n" | bluetoothctl
+}
+
+function disconnect()
+{
+	echo -e "disconnect\n" | bluetoothctl
+}
+
+function usage()
+{
+	echo "Usage: $0 {c|d}"
+	echo "_C_onnect/_D_isconnect from bluetooth headphones"
+}
+
+if [[ $# -ne 1 ]]; then
+	usage
+	exit 1
+fi
+
+if [[ $1 == "c" ]]; then
+	connect
+	exit 0
+elif [[ $1 == "d" ]]; then
+	disconnect
+	exit 0
+else
+	usage
+	exit 0
+fi
diff --git a/camtoggle b/camtoggle
new file mode 100755
index 0000000..affd652
--- /dev/null
+++ b/camtoggle
@@ -0,0 +1,4 @@
+#!/bin/bash
+#pkill -f /dev/video || mpv --geometry=-0-0 --autofit=30% --no-cache-pause /dev/video0
+#pkill -f camout.mkv || ffmpeg -f mjpg -video_size 640x480 -i /dev/video0 camout.mkv ; mpv --geometry=-0-0 --autofit=30% camout.mkv
+pkill -f vlc || cvlc v4l2:///dev/video0 --live-caching=10 
diff --git a/colours.sh b/colours.sh
new file mode 100755
index 0000000..38ae137
--- /dev/null
+++ b/colours.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+#
+# colorbars - smpte color bars in bash
+#
+
+echo
+
+for y in {0..13};
+  do
+  echo -n "           "
+  for color in 7 3 6 2 5 1 4;
+    do tput setab $color
+    printf "        ";
+  done
+  tput sgr0
+  echo;
+done
+
+for y in {0..1};
+  do
+  echo -n "           "
+  for color in 4 0 5 0 6 0 7;
+    do tput setab $color
+    printf "        ";
+  done
+  tput sgr0
+  echo;
+done
+
+for y in {0..4};
+  do
+  echo -n "           "
+  for color in 4 4 4 4 4 7 7 7 7 7 5 5 5 5 5 0 0 0 0 0 0 0 0 0 0 0 0 0;
+      do tput setab $color
+      printf "  ";
+  done
+  tput sgr0
+  echo;
+done
+
+echo
diff --git a/cpuhogs b/cpuhogs
new file mode 100755
index 0000000..7cb903b
--- /dev/null
+++ b/cpuhogs
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+ps axch -o cmd:15,%cpu --sort=-%cpu | sed 11q
diff --git a/cputemp b/cputemp
new file mode 100755
index 0000000..866c81c
--- /dev/null
+++ b/cputemp
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+sensors | awk '/^temp1:/ {print $2}'
diff --git a/dproj b/dproj
new file mode 100755
index 0000000..0044ed2
--- /dev/null
+++ b/dproj
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+rootDir='/home/mokou/git/cecse'
+proj=$(ls $rootDir | dmenu  -l 10 \
+	-fn 'xos4 Terminus-15' -nb '#1c1c1c' -sb '#b35050')
+
+[ -z $proj ] && exit
+
+# creating the project if it doesn't exist
+projExists=$(find $rootDir -maxdepth 1 -type d -name $proj)
+if [ -z $projExists ]; then
+	cd $rootDir
+	notify-send 'cecse' "creating $proj module, please wait..."
+	./scripts/new_module $proj
+	notify-send 'cecse' "adding owens.tech remotes..."
+	ssh git@owens.tech "mkdir cecse/$proj.git cecse/test-$proj.git;\ 
+		cd $proj.git; git init --bare; cd ../$test-proj.git;\ 
+		git init --bare"
+	cd $proj
+	git remote set-url --add --push origin git@github.com:cecse/$proj.git
+	git remote set-url --add --push origin git@owens.tech:cecse/$proj.git
+	cd ../test-$proj
+	git remote set-url --add --push origin git@github.com:cecse/$proj.git
+	git remote set-url --add --push origin git@owens.tech:cecse/$proj.git
+	cd ..
+fi
+
+(tmux has-session -t $proj)
+sessionExists="$?"
+
+if [ $sessionExists -eq 1 ]; then
+	cd $rootDir/$proj
+	tmux new-session -d -s $proj
+
+	# rename default window
+	tmux rename-window -t $proj.0 'src'
+	tmux new-window -t $proj -n 'tests'
+	tmux new-window -t $proj -n 'build'
+	tmux send-keys -t $proj:src 'cd src;ls' C-m
+	tmux send-keys -t $proj:tests "cd test-$proj;ls" C-m
+	tmux send-keys -t $proj:build 'ls' C-m
+fi
+
+client=$(tmux list-clients | grep -v '0 ' | cut -d: -f1)
+tmux switch-client -c $client -t $proj
diff --git a/dsurf b/dsurf
new file mode 100755
index 0000000..7c07c56
--- /dev/null
+++ b/dsurf
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+site=$(cat ~/.surf/bookmarks | dmenu  -l 10 \
+	-fn 'xos4 Terminus-15' -nb '#1c1c1c' -sb '#b35050')
+[ -z "$site" ] || surf -b $site
diff --git a/dwmbar b/dwmbar
new file mode 100755
index 0000000..e9c1106
--- /dev/null
+++ b/dwmbar
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# statusbar loop
+while true; do
+	xsetroot -name "$(date +"%F %T")"
+	sleep 1s
+done
diff --git a/kb.sh b/kb.sh
new file mode 100755
index 0000000..893c283
--- /dev/null
+++ b/kb.sh
@@ -0,0 +1 @@
+setxkbmap gb && setxkbmap -option caps:swapescape
diff --git a/linkhandler b/linkhandler
new file mode 100755
index 0000000..bb6f6d9
--- /dev/null
+++ b/linkhandler
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+# Feed script a url or file location.
+# If an image, it will view in feh,
+# if a video or gif, it will view in mpv
+# if a music file or pdf, it will download,
+# otherwise it opens link in browser.
+
+# If no url given. Opens browser. For using script as $BROWSER.
+[ -z "$1" ] && { "$BROWSER"; exit; }
+
+case "$1" in
+	*mkv|*webm|*mp4|*youtube.com/watch*|*youtube.com/playlist*|*youtu.be*|*hooktube.com*|*bitchute.com*)
+		setsid mpv -quiet "$1" >/dev/null 2>&1 & ;;
+	*png|*jpg|*jpe|*jpeg|*gif)
+		curl -sL "$1" > "/tmp/$(echo "$1" | sed "s/.*\///")" && feh -a "/tmp/$(echo "$1" | sed "s/.*\///")"  >/dev/null 2>&1 & ;;
+	*mp3|*flac|*opus|*mp3?source*)
+		setsid tsp curl -LO "$1" >/dev/null 2>&1 & ;;
+	*)
+		if [ -f "$1" ]; then "$TERMINAL" -e "$EDITOR $1"
+		else setsid $BROWSER "$1" >/dev/null 2>&1 & fi ;;
+esac
diff --git a/memhogs b/memhogs
new file mode 100755
index 0000000..b0c8475
--- /dev/null
+++ b/memhogs
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+ps axch -o cmd:15,%mem --sort=-%mem | sed 11q
diff --git a/mkbar.sh b/mkbar.sh
new file mode 100755
index 0000000..0be8eef
--- /dev/null
+++ b/mkbar.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+#
+# z3bra - (c) wtfpl 2014
+# Fetch infos on your computer, and print them to stdout every second.
+
+clock() {
+	date '+%Y-%m-%d %H:%M:%S'
+}
+
+battery() {
+	BATC=/sys/class/power_supply/BAT1/capacity
+	BATS=/sys/class/power_supply/BAT1/status
+
+	test "`cat $BATS`" = "Charging" && echo -n '+' || echo -n '-'
+
+	sed -n p $BATC
+}
+
+volume() {
+	amixer get Master | sed -n 'N;s/^.*\[\([0-9]\+%\).*$/\1/p'
+}
+
+cpuload() {
+	LINE=`ps -eo pcpu |grep -vE '^\s*(0.0|%CPU)' |sed -n '1h;$!H;$g;s/\n/ +/gp'`
+	bc <<< $LINE
+}
+
+memused() {
+	read t f <<< `grep -E 'Mem(Total|Free)' /proc/meminfo |awk '{print $2}'`
+	bc <<< "scale=2; 100 - $f / $t * 100" | cut -d. -f1
+}
+
+network() {
+	read lo int1 int2 <<< `ip link | sed -n 's/^[0-9]: \(.*\):.*$/\1/p'`
+	if iwconfig $int1 >/dev/null 2>&1; then
+		wifi=$int1
+		eth0=$int2
+	else
+		wifi=$int2
+		eth0=$int1
+	fi
+	ip link show $eth0 | grep 'state UP' >/dev/null && int=$eth0 ||int=$wifi
+
+	#int=eth0
+
+	ping -c 1 8.8.8.8 >/dev/null 2>&1 && 
+		echo "$int connected" || echo "$int disconnected"
+}
+
+groups() {
+	cur=`xprop -root _NET_CURRENT_DESKTOP | awk '{print $3}'`
+	tot=`xprop -root _NET_NUMBER_OF_DESKTOPS | awk '{print $3}'`
+
+	for w in `seq 0 $((cur - 1))`; do line="${line}="; done
+		line="${line}|"
+	for w in `seq $((cur + 2)) $tot`; do line="${line}="; done
+		echo $line
+}
+
+nowplaying() {
+   cur=`mpc current`
+	# this line allow to choose whether the output will scroll or not
+	test "$1" = "scroll" && PARSER='skroll -n20 -d0.5 -r' || PARSER='cat'
+	test -n "$cur" && $PARSER <<< $cur || echo "- stopped -"
+}
+
+# This loop will fill a buffer with our infos, and output it to stdout.
+while :; do
+    buf=""
+	buf="${buf} %{F#ffffff}[$(groups)]"
+#buf="${buf} %{c}NET: $(network) -"
+	buf="${buf} %{c}%{F#b35050}$(nowplaying)"
+	buf="${buf} %{r}%{F#ffffff}CPU: $(cpuload)% | "
+	buf="${buf} RAM: $(memused)% |"
+#buf="${buf} VOL: $(volume)"
+	buf="${buf} $(clock)"
+
+	echo $buf
+	# use `nowplaying scroll` to get a scrolling output!
+	sleep 1 # The HUD will be updated every second
+	done
diff --git a/mm.sh b/mm.sh
new file mode 100755
index 0000000..05611b3
--- /dev/null
+++ b/mm.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+xrandr --output DVI-I-0 --off --output DVI-I-1 --off --output HDMI-0 --mode 1920x1080 --pos 0x511 --rotate normal --output DP-0 --mode 1920x1080 --pos 1920x0 --rotate left --output DP-1 --off --output DVI-D-0 --off
diff --git a/netflix b/netflix
new file mode 100755
index 0000000..601ce42
--- /dev/null
+++ b/netflix
@@ -0,0 +1,2 @@
+#!/bin/bash
+qtwebflix
diff --git a/papefix.sh b/papefix.sh
new file mode 100755
index 0000000..d75b14c
--- /dev/null
+++ b/papefix.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+cd ~/pictures/wallpapers/vaporwave/
+#feh --bg-scale bust.jpg 156890-free-download-vaporwave-iphone-wallpaper-1080x1920-notebook.jpg
+feh --bg-scale moonscape.jpg purple-rain-vert.jpg
diff --git a/pokemon-emerald b/pokemon-emerald
new file mode 100755
index 0000000..5c62245
--- /dev/null
+++ b/pokemon-emerald
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+mgba ~/games/gba/Pokemon\ -\ Emerald\ Version\ \(U\).gba
diff --git a/rclick.sh b/rclick.sh
new file mode 100755
index 0000000..1a0efa7
--- /dev/null
+++ b/rclick.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+while(true)
+	xdotool click 2
diff --git a/resolution b/resolution
new file mode 100755
index 0000000..afec231
--- /dev/null
+++ b/resolution
@@ -0,0 +1,2 @@
+#!/bin/sh
+xrandr --output DisplayPort-0 --off --output DisplayPort-1 --off --output DisplayPort-2 --mode 1920x1080 --pos 2011x0 --rotate right --output HDMI-A-0 --primary --mode 1920x1080 --pos 0x673 --rotate normal
diff --git a/screen_blank.sh b/screen_blank.sh
new file mode 100755
index 0000000..9c132fc
--- /dev/null
+++ b/screen_blank.sh
@@ -0,0 +1 @@
+xset s noblank && xset -dpms
diff --git a/sss b/sss
new file mode 100755
index 0000000..b794460
--- /dev/null
+++ b/sss
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+import /tmp/ss.png
diff --git a/tag b/tag
new file mode 100755
index 0000000..c23be4e
--- /dev/null
+++ b/tag
@@ -0,0 +1,59 @@
+#!/bin/sh
+
+err() { echo "Usage:
+	tag [OPTIONS] file
+Options:
+	-a: artist/author
+	-t: song/chapter title
+	-A: album/book title
+	-n: track/chapter number
+	-N: total number of tracks/chapters
+	-d: year of publication
+	-g: genre
+	-c: comment
+You will be prompted for title, artist, album and track if not given." && exit 1 ;}
+
+while getopts "a:t:A:n:N:d:g:c:f:" o; do case "${o}" in
+	a) artist="${OPTARG}" ;;
+	t) title="${OPTARG}" ;;
+	A) album="${OPTARG}" ;;
+	n) track="${OPTARG}" ;;
+	N) total="${OPTARG}" ;;
+	d) date="${OPTARG}" ;;
+	g) genre="${OPTARG}" ;;
+	c) comment="${OPTARG}" ;;
+	f) file="${OPTARG}" ;;
+	*) printf "Invalid option: -%s\\n" "$OPTARG" && err ;;
+esac done
+
+shift $((OPTIND - 1))
+
+file="$1"
+
+[ ! -f "$file" ] && echo "Provide file to tag." && err
+
+[ -z "$title" ] && echo "Enter a title." && read -r title
+[ -z "$artist" ] && echo "Enter an artist." && read -r artist
+[ -z "$album" ] && echo "Enter an album." && read -r album
+[ -z "$track" ] && echo "Enter a track number." && read -r track
+
+case "$file" in
+	*.ogg) echo "Title=$title
+Artist=$artist
+Album=$album
+Track=$track
+Total=$total
+Date=$date
+Genre=$genre
+Comment=$comment" | vorbiscomment -w "$file" ;;
+	*.opus) echo "Title=$title
+Artist=$artist
+Album=$album
+Track=$track
+Total=$total
+Date=$date
+Genre=$genre
+Comment=$comment" | opustags -i -S "$file" ;;
+	*.mp3) eyeD3 -Q --remove-all -a "$artist" -A "$album" -t "$title" -n "$track" -N "$total" -Y "$date" "$file" ;;
+	*) echo "File type not implemented yet." ;;
+esac
diff --git a/tearfix.sh b/tearfix.sh
new file mode 100755
index 0000000..f0cd30b
--- /dev/null
+++ b/tearfix.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+cd ~/scripts;
+nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }" && ./mm.sh
diff --git a/thecproglang b/thecproglang
new file mode 100755
index 0000000..d8ce42d
--- /dev/null
+++ b/thecproglang
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+mupdf ~/documents/books/The\ C\ Programming\ Language\ -\ 2nd\ Edition\ -\ Ritchie\ Kernighan.pdf
diff --git a/toRebuild.sh b/toRebuild.sh
new file mode 100755
index 0000000..4059cda
--- /dev/null
+++ b/toRebuild.sh
@@ -0,0 +1,10 @@
+    #!/bin/bash
+
+
+    while read pkg; do
+
+	        mapfile -t files < <(pacman -Qlq $pkg | grep -v /$)
+
+	        grep -Fq libstdc++.so.6 "${files[@]}" 2>/dev/null && echo $pkg
+			                                                                      
+			    done < <(pacman -Qmq)
diff --git a/unicode.sh b/unicode.sh
new file mode 100755
index 0000000..8e85db1
--- /dev/null
+++ b/unicode.sh
@@ -0,0 +1,31 @@
+fast_chr() {
+    local __octal
+    local __char
+    printf -v __octal '%03o' $1
+    printf -v __char \\$__octal
+    REPLY=$__char
+}
+
+function unichr {
+    local c=$1    # Ordinal of char
+    local l=0    # Byte ctr
+    local o=63    # Ceiling
+    local p=128    # Accum. bits
+    local s=''    # Output string
+
+    (( c < 0x80 )) && { fast_chr "$c"; echo -n "$REPLY"; return; }
+
+    while (( c > o )); do
+        fast_chr $(( t = 0x80 | c & 0x3f ))
+        s="$REPLY$s"
+        (( c >>= 6, l++, p += o+1, o>>=1 ))
+    done
+
+    fast_chr $(( t = p | c ))
+	    echo -n "$REPLY$s"
+}
+
+## test harness
+for (( i=0x0000; i<0xE000; i++ )); do
+    unichr $i
+	done
diff --git a/webview b/webview
new file mode 100755
index 0000000..8348ea4
--- /dev/null
+++ b/webview
@@ -0,0 +1,16 @@
+#!/bin/bash
+ext="${1##*.}"
+mpvFiles="mkv mp4 gif"
+fehFiles="png jpg jpeg jpe"
+wgetFiles="mp3 flac opus mp3?source=feed pdf"
+
+if echo $fehFiles | grep -w $ext > /dev/null; then
+	nohup feh "$1" >/dev/null &
+elif echo $mpvFiles | grep -w $ext > /dev/null; then
+	nohup mpv --loop --quiet "$1" > /dev/null &
+elif echo $wgetFiles | grep -w $ext > /dev/null; then
+	nohup wget "$1" >/dev/null &
+else
+	#nohup $BROWSER "$1" >/dev/null &
+	nohup surf "$1" >/dev/null &
+fi
diff --git a/whoneeds.sh b/whoneeds.sh
new file mode 100755
index 0000000..92540e4
--- /dev/null
+++ b/whoneeds.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+# whoneeds package : shows explicitly installed packages that require some package
+
+# we use associative arrays to get uniqueness for "free"
+typeset -A root_packages
+typeset -A walked_nodes
+query="$1"
+
+function walk_nodes () {
+    local package="$1"
+
+    # if we've walked this node before, skip. This drastically
+    # reduces overhead for a relatively cheap operation
+    [[ "${walked_nodes[$package]}" -eq 1 ]] && return 0
+    walked_nodes["$package"]=1
+
+    # we do this so that we can make a single call to pacman
+    # to get both bits of information that we require
+    result=( $(LC_ALL=c pacman -Qi "$package" | awk -F':' \
+      'BEGIN { tag = ""; dependents = ""; explicit = 0 }
+       {
+          # since the formatting of the pacman output is more for human
+          # consumption than programmatic, we find ourselves with the following need.
+          # if we have two fields, then we know we have a proper identifier on the line
+          # so we store the identifier as a current tag
+          # All identifier checks are made against the current tag, which allows us
+          # to deal with instances where "Required By" spans lines
+          if (NF == 2) { tag = $1 }
+          if (tag ~ /^Required By[ ]*$/) {  dependents = dependents $(NF) }
+          if ($1 ~ /^Install Reason $/ && $2 ~/^ Explicitly installed/) { explicit = 1 }
+       }
+       END { print explicit,dependents}') )
+
+    # and if we hit an issue retrieving package information
+    if [[ ${#result[*]} -lt 2 ]]; then
+            echo "error: could not get information on $package" 1>&2
+            exit 3
+    fi
+    if [[ ${result[0]} -eq 1 ]]; then
+        # we found an explicitly installed package that relies on
+        # the original query. Add it to our array, provided it isn't
+        # the original query, as that would be useless information
+        [[ "$query" != "$package" ]] && root_packages["$package"]=1
+    fi
+    if [[ "${result[1]}" != "None" ]]; then
+        # iterate over our 'Required By:' packages
+        dependents="${result[@]:1:${#result[*]}}"
+        for i in "$dependents"; do
+            walk_nodes "$i"
+        done
+    fi
+}
+
+if [ $# -ne 1 ]; then
+    echo "error: unexpected number of arguments" 1>&2
+    echo "Usage: $(basename $0) <package-name>"
+    exit 2
+fi
+
+walk_nodes "$1"
+echo "Packages that depend on [$query]"
+if [[ -n "${!root_packages[*]}" ]]; then
+    for pkg in "${!root_packages[@]}"; do
+        echo "  $pkg"
+    done | sort
+    exit 0
+fi
+echo "  None"
+exit 1
+
+# vim: set ts=4 sw=4 et:
+
-- 
2.20.1