#!/bin/sh PROG="$(basename "$0")" ## VARIABLES # copy command and deps variable deps="pup curl clipp transmission-cli" 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" logn() { >&2 printf '%s\n' "$*"; } die() { logn "$@" exit 1 } confirm() { >&2 printf '%s' "$1" head -n 1 | grep -q "[yY]" } # 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"; } trap "exit 2" INT trap "cleanup" EXIT ## OPTIONS while getopts ":hm:rs:c:fd" opt; do case $opt in h) >&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 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)) 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 3 # Get the torrents with module if [ "${skip:-0}" -eq 1 ]; then module="$(tail -n 1 "$links")" else mkdir -p "$tmp" query="$( if [ "${query:="$*"}" ]; then printf "%s" "$query" else >&2 printf ' > ' head -n 1 fi | tr ' ' '+' )" [ "$query" ] || exit 4 # shellcheck source=/usr/local/lib/$PROG/nyaa.sh disable=SC1091 . "$MODULES_PATH/$module" rm -f "$results" "$links" get_torrents [ -f "$results" ] || die "No results." # Save which module was used (hack) printf "%s\n" "$module" >>"$links" fi # Default sorting if unset command -v sort_results >/dev/null || sort_results() { sort -k3 -n -r; } # select result from "$results" for choice in $( # Select result(s) from the result file sorted with sort_results # with fzf awk '{print NR, $0}' "$results" | sort_results | column -t -l 3 | fzf -m --with-nth 2.. | awk 'BEGIN{OFS=" "} {print $1}' ); do printf 'choice: %s\n' "$(sed -n "${choice}p" "$results" | cut -f 3-)" magnet="$(get_magnet "$choice")" [ "$magnet" ] || exit 5 if [ -z "$noaskfiles" ] && confirm 'files?'; then 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 fi if [ -z "$noaskdownload" ] && confirm 'download?'; then [ "$category" ] || category="$(printf '%s' "$categories" | tr ' ' '\n' | fzf)" [ "$category" ] || exit 6 transmission-remote debuc.com -a "$magnet" -w "/downloads/$category" elif confirm "copy?"; then echo "$magnet" | clipp fi done