123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- #!/bin/sh
- # Assigning defaults
- query=""
- instance="https://nyaa.si"
- page="p=1"
- max=75
- type="c=0_0"
- filter="f=0"
- modifiers=0
- download=0
- while [ $# -gt 0 ]; do
- case "$1" in
- -l|--link)
- modifiers=$((modifiers|1))
- shift
- ;;
- -r|--rss)
- modifiers=$((modifiers|2))
- shift
- ;;
- -d|--download)
- download=1
- shift
- ;;
- -t|--type)
- case "$2" in
- all)
- type="c=0_0"
- ;;
- anime|art)
- type="c=1_0"
- ;;
- anime_mv|art_anime)
- type="c=1_1"
- ;;
- anime_english|art_doujin)
- type="c=1_2"
- ;;
- anime_other|art_games)
- type="c=1_3"
- ;;
- anime_raw|art_manga)
- type="c=1_4"
- ;;
- art_pictures)
- type="c=1_5"
- ;;
- audio|real_life)
- type="c=2_0"
- ;;
- lossless|real_life_pictures)
- type="c=2_1"
- ;;
- lossy|real_life_videos)
- type="c=2_2"
- ;;
- literature)
- type="c=3_0"
- ;;
- literature_english)
- type="c=3_1"
- ;;
- literature_other)
- type="c=3_2"
- ;;
- literature_raw)
- type="c=3_3"
- ;;
- live_action)
- type="c=4_0"
- ;;
- live_action_english)
- type="c=4_1"
- ;;
- live_action_pv)
- type="c=4_2"
- ;;
- live_action_other)
- type="c=4_3"
- ;;
- live_action_raw)
- type="c=4_4"
- ;;
- picture)
- type="c=5_0"
- ;;
- graphic)
- type="c=5_1"
- ;;
- photo)
- type="c=5_2"
- ;;
- software)
- type="c=6_0"
- ;;
- apps)
- type="c=6_1"
- ;;
- games)
- type="c=6_2"
- ;;
- *)
- printf "Invalid type: %s\n" "$2" 1>&2
- exit 1
- ;;
- esac
- shift
- shift
- ;;
- -T|--type-manual)
- if ! printf "%s" "$2" | grep -q -E '[0-9]+_[0-9]+'; then
- printf "Invalid type: %s\n" "$2"
- exit 1
- fi
- type="c=$2"
- shift
- shift
- ;;
- -f|--filter)
- case "$2" in
- none)
- filter="&f=0"
- ;;
- noremakes)
- filter="&f=1"
- ;;
- trusted)
- filter="&f=2"
- ;;
- *)
- printf "Invalid filter: %s\n" "$2" 1>&2
- exit 1
- ;;
- esac
- shift
- shift
- ;;
- -m|--max)
- if ! printf "%s" "$2" | grep -E -q '[0-9]+'; then
- printf "Max must be a number\n"
- exit 1
- fi
- max=$(($2 < 75 ? $2 : 75))
- shift
- shift
- ;;
- -p|--page)
- if ! printf "%s" "$2" | grep -E -q '[0-9]+'; then
- printf "Page must be a number\n"
- exit 1
- fi
- page="p=$2"
- shift
- shift
- ;;
- -i|--instance)
- instance=$(printf "%s" "$2" | sed "s/\/^//")
- shift
- shift
- ;;
- -s|--sukebei)
- instance="https://sukebei.nyaa.si"
- shift
- ;;
- -v|--version)
- printf "1.4.0\n"
- exit
- ;;
- -h|-?|--help)
- printf "nyaash
- Minimal nyaa query tool
- USAGE:
- nyaash [args] [query] [args]
- OPTIONS
- -d, --download open one of the magnets
- -f, --filter select filter (none, noremakes, trusted) (def. none)
- -i, --instance specify instance (including protocol)
- -l, --link output request link
- -m, --max maximum numbers of results (def.=max=75)
- -p, --page choose page
- -r, --rss output rss page (can be combined with -l)
- -s, --sukebei open one of the magnets
- -t, --type select torrent type (def. all)
- -T, --type-manual like -t but directly specify the value (ex 1_0 for anime)
- -h, --help print help
- -v, --version print version
- Accepted torrent types (-t option)
- all, anime, anime_mv, anime_english anime_other anime_raw, audio, lossless, lossy, literature, literature_english, literature_other, literature_raw, live_action, live_action_english, live_action_pv, live_action_other, live_action_raw, picture, graphic, photo, software, apps, games, art, art_anime, art_doujin, art_games, art_games, art_pictures, real_life, real_life_pictures, real_life_videos\n"
- exit
- ;;
- *)
- query="q=$1"
- shift
- ;;
- esac
- done
- # Checking output modifiers
- webpage=""
- case "$modifiers" in
- 1)
- curl -G -L -s -w "\n%{url_effective}\n" --data-urlencode "$query" --data-urlencode "$type" --data-urlencode "$filter" --data-urlencode "$page" "$instance" | tail -1
- exit
- ;;
- 2)
- curl -G -L -s --data-urlencode "$query" --data-urlencode "$type" --data-urlencode "$filter" --data-urlencode "$page" "$instance" --data-urlencode "page=rss"
- exit
- ;;
- 3)
- curl -G -L -s -w "\n%{url_effective}\n" --data-urlencode "$query" --data-urlencode "$type" --data-urlencode "$filter" --data-urlencode "$page" "$instance" --data-urlencode "page=rss" | tail -1
- exit
- ;;
- *)
- webpage="$(curl -G -L -s -w "\n%{url_effective}\n" --data-urlencode "$query" --data-urlencode "$type" --data-urlencode "$filter" --data-urlencode "$page" "$instance" | tail -1)"
- ;;
- esac
- # Querying nyaa and filtering torrent table
- torrents=$(lynx -source "$webpage" | grep -A 1000000000 '<tbody>' | grep -B 1000000000 '</tbody>' | sed -e '/<\/tbody>/d' -e '/<tbody>/d')
- # Parsing torrent table
- titles=$(printf "%s" "$torrents" | sed '/class="comments"/{N;d}' | grep -A 1 '<td colspan="2">' | sed -e '/<td colspan="2">/d' -e '/^--/d' -e 's/<\/a>//g' -e 's/^.*<a.*>//')
- magnets=$(printf "%s" "$torrents" | grep -E "<a href" | grep -o 'magnet:?xt=urn:btih:[0-9a-f]*')
- size=$(printf "%s" "$torrents" | grep -o -E '<td class="text-center">[0-9a-zA-Z. ]*</td>' | grep -o -E '[0-9]{1,4}(\.[0-9]{,4})? ([TGMKk]i)?B')
- date=$(printf "%s" "$torrents" | grep -o -E '<td class="text-center" data-timestamp="[0-9]*">.*</td>' | grep -o -E '[0-9]{4,4}-[0-9]{2,2}-[0-9]{2,2} [0-9]{2,2}:[0-9]{2,2}( ?([APap][mM]))?')
- type=$(printf "%s" "$torrents" | grep '<img src.*alt="' | sed -e 's/^.*alt="//' -e 's/" class="category-icon">//')
- extras=$(printf "%s" "$torrents" | grep -o -E '<td class="text-center">[0-9]*</td>' | sed -e 's/<td class="text-center">//' -e 's/<\/td>//')
- # Decoding html chars
- titles=$(printf "%s" "$titles" | sed 's/ / /g; s/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g; s/'/\'"'"'/g; s/“/\"/g; s/”/\"/g; s/"/\"/g')
- # Generating output
- if [ -n "$titles" ]; then
- length=$(printf "%s\n" "$magnets" | wc -l)
- length=$((length>max ? max : length))
- i=1
- while [ $length -ge $i ]; do
- printf "%s [%s]: %s\n" "$i" "$(printf "%s" "$type" | sed -n "$i"p)" "$(printf "%s" "$titles" | sed -n "$i"p)"
- printf "%s\n" "$(printf %s "$magnets" | sed -n "$i"p)"
- printf "size: %s date: %s\n" "$(printf "%s" "$size" | sed -n "$i"p)" "$(printf "%s" "$date" | sed -n "$i"p )"
- printf "seeds: %s leechs: %s downloads: %s\n\n" "$(printf "%s" "$extras" | sed -n "$((3*i-2))"p )" "$(printf "%s" "$extras" | sed -n "$((3*i-1))"p )" "$(printf "%s" "$extras" | sed -n "$((3*i))"p )"
- i=$((i+1))
- done
- # download prompt
- if [ $download -eq 1 ]; then
- selected=0
- while [ $selected -gt $length ] || [ $selected -le 0 ]; do
- printf "ID of the file to download (non-integer to exit)\n"
- read -r selected
- if ! printf "%s" "$selected" | grep -E -q "^ *[0-9]+ *$"; then
- selected=0
- break
- fi
- done
- if [ $selected -gt 0 ]; then
- xdg-open "$(printf "%s" "$magnets" | sed -n "$selected"p)" &
- fi
- fi
- fi
|