summaryrefslogtreecommitdiff
path: root/bin/menuscripts/tsh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/menuscripts/tsh')
-rwxr-xr-xbin/menuscripts/tsh208
1 files changed, 208 insertions, 0 deletions
diff --git a/bin/menuscripts/tsh b/bin/menuscripts/tsh
new file mode 100755
index 0000000..0c57ee0
--- /dev/null
+++ b/bin/menuscripts/tsh
@@ -0,0 +1,208 @@
+#!/bin/sh
+
+PROG="$(basename "$0")"
+## VARIABLES
+# copy command and deps variable
+deps="pup curl $MENUCMD"
+
+MODULES_PATH=$HOME/.local/share/tsh
+module='nyaa.sh' # default module
+
+# Files
+export tmp="/tmp/$PROG"
+files="seeds sizes names html tmp_types"
+# Use export so that these variables can be used inside of modules
+for file in $files
+do eval "export $file=$tmp/$file"
+done
+# Files not in $files won't be deleted
+export results="$tmp/results"
+export links="$tmp/links"
+
+categories="music anime movies shows other software games isos books"
+
+if [ "$WAYLAND_DISPLAY" ]
+then
+ clipp() { wl-copy -n; }
+ deps="$deps wl-copy"
+else
+ clipp() { xclip -selection clipboard -r; }
+ deps="$deps xclip"
+fi
+## FUNCTIONS
+
+help ()
+{
+ >&2 cat <<-EOF
+ Usage: $PROG [options] query
+ Options:
+ -h Show this help message and exit
+ -r Skip getting pages and use last results
+ -s OPTION Sort results based on the specified OPTION
+ Available options: seeds, size, name
+ -m MODULE Select a module, if MODULE is 'list',
+ lists out available modules
+ -c CATEGORY Select category
+ -f Do not list files
+ -d Download without confirming
+ EOF
+}
+
+log () { >&2 printf '%s' "$*"; }
+logn () { >&2 printf '%s\n' "$*"; }
+die () { logn "$@"; exit 1; }
+
+confirm()
+{
+ log "$1"
+ head -n 1 | grep -q "[yY]"
+}
+
+dependencies ()
+{
+ for p in $deps
+ do
+ if ! command -v "$p" > /dev/null
+ then
+ logn "E: Program '$p' not found."
+ error=1
+ fi
+ done
+ [ "${error:-0}" -eq 1 ] && exit 1
+}
+
+# shellcheck disable=SC2046
+# (we use word splitting on purpose)
+isOnline () { grep -q '1' $(echo /sys/class/net/*/carrier | sed 's#/sys/class/net/lo/carrier ##'); }
+
+# Remove temp files and quit
+cleanup ()
+{
+ for file in $files
+ do eval "rm -f \$$file"
+ done
+}
+
+list_modules () { find -L "$MODULES_PATH" -type f -printf "%f\n"; }
+
+# get a query from user based on MENUCMD
+get_query ()
+{
+ isOnline || exit 1
+ if [ "${query:="$*"}" ]
+ then
+ printf "%s" "$query"
+ else
+ log ' > '
+ head -n 1
+ fi | tr ' ' '+'
+}
+
+# Select a result from the result file sorterd with sort_results
+# and select with fzf
+select_result ()
+{
+ command -v sort_results > /dev/null || sort_results() { sort -k3 -n -r; }
+ awk '{print NR, $0}' "$results" |
+ sort_results |
+ column -t -l 3 |
+ fzf -m --with-nth 2.. |
+ awk '{print $1}'
+}
+
+show_files()
+{
+ hash="${1##*btih:}"
+ hash="${hash%%&*}"
+
+ # Download the torrent file from a torrent website
+ curl -s "https://itorrents.org/torrent/${hash}.torrent" > "$tmp"/.torrent
+ transmission-show "$tmp"/.torrent | sed -n '/^FILES/,$p' | head -n -1 | tail -n +3 >&2
+ rm -f "$tmp"/.torrent
+}
+
+trap "exit 1" INT
+trap "cleanup" EXIT
+
+## OPTIONS
+skip=0
+while getopts ":hm:rs:c:fd" opt
+do
+ case $opt in
+ h) help && exit ;;
+ c)
+ [ "$OPTARG" = "list" ] && >&2 printf '%s\n' "$categories" && exit
+ category="$(printf '%s\n' "$categories" | tr ' ' '\n' | grep -m 1 "^$OPTARG")"
+ [ -z "$category" ] && die "No valid category for '$OPTARG'"
+ logn "category: $category" ;;
+ f) noaskfiles="1" ;;
+ d) noaskdownload="1" ;;
+ m)
+ [ "$OPTARG" = "list" ] && list_modules && exit
+ module="$(list_modules | grep -m 1 "^$OPTARG")"
+ [ -z "$module" ] && die "No valid module for '$OPTARG'"
+ logn "module: $module" ;;
+ r)
+ [ ! -r "$results" ] && die "No previous results found."
+ skip=1 ;;
+ s)
+ case $OPTARG in
+ "seeds") sort_results() { sort -k3 -n -r; } ;;
+ "size") sort_results() { sort -k2 -h -r; } ;;
+ "name") sort_results() { sort -k4; } ;;
+ *) die "argument '$OPTARG' not seeds,size,name" ;;
+ esac ;;
+ :) die "Option -$OPTARG requires an argument" ;;
+ ?) die "Invalid option: -$OPTARG" ;;
+ esac
+done
+shift $((OPTIND - 1))
+
+dependencies
+
+# Get the torrents with module
+if [ $skip -ne 1 ]
+then
+ mkdir -p "$tmp"
+
+ query="$(get_query "$*")"
+ [ "$query" ] || exit 1
+
+ # Get results
+ rm -f "$results" "$links"
+ # shellcheck source=/usr/local/lib/$PROG/nyaa.sh disable=SC1091
+ . "$MODULES_PATH/$module"
+ [ -f "$results" ] || die "No results."
+
+ # Save which module was used
+ printf "%s\n" "$module" >> "$links"
+else
+ module="$(tail -n 1 "$links")"
+fi
+
+# acquire get_magnet function
+# shellcheck source=/usr/local/lib/$PROG/nyaa.sh disable=SC1091
+getfunctions=1 . "$MODULES_PATH/$module"
+
+# select result from "$results"
+for choice in $(select_result | xargs)
+do
+ printf 'choice: %s\n' "$(sed -n "${choice}p" "$results" | cut -f 3-)"
+ magnet="$(get_magnet "$choice")"
+ [ "$magnet" ] || exit 1
+
+ if [ -z "$noaskfiles" ] && confirm 'files?'; then
+ show_files "$magnet"
+ fi
+
+ if [ "$noaskdownload" ] || confirm 'download?'
+ then
+ [ "$category" ] || category="$(printf '%s' "$categories" | tr ' ' '\n' | fzf)"
+ [ "$category" ] || exit 2
+ transmission-remote debuc.com -a "$magnet" -w "/downloads/$category"
+ elif confirm "copy?"
+ then
+ echo "$magnet" | clipp
+ fi
+
+done