#!/bin/sh c_red="\033[1;31m" c_green="\033[1;32m" c_yellow="\033[1;33m" c_blue="\033[1;34m" c_magenta="\033[1;35m" c_cyan="\033[1;36m" c_reset="\033[0m" help_text () { while IFS= read -r line; do printf "%s\n" "$line" done <<-EOF Usage: ${0##*/} [-d | -p ] [] ${0##*/} [-v] [] ${0##*/} -h Options: -h show helptext -d download video -p download video to specified directory -v use VLC as the media player EOF } err () { printf "$c_red%s$c_reset\n" "$*" >&2 } get_query () { [ -z "$*" ] && printf "${c_green}Search>${c_reset} " && read -r query || query=$* query=$(printf "%s" "$query" | tr " " "+") } input() { printf "$c_yellow Episode??(1-%s)>$c_reset " "$1" read -r x while [ -z "$x" ] || ! [ "$x" -eq "$x" ] 2>/dev/null || [ "$x" -lt "1" ] 2>/dev/null || [ "$x" -gt "$1" ] 2>/dev/null ;do err "Invalid choice" printf "$c_yellow Episode??(1-%s)>$c_reset " "$1" read -r x done ep_no=$x unset x } stream () { case $player_fn in vlc) uname -a | grep -qE "[Aa]ndroid" && am start --user 0 -a android.intent.action.VIEW -d "$1" -n org.videolan.vlc/org.videolan.vlc.gui.video.VideoPlayerActivity -e "title" "$2" > /dev/null 2>&1 || setsid -f "$player_fn" --http-referrer="$base_url" "$1" > /dev/null 2>&1;; mpv) uname -a | grep -qE "[Aa]ndroid" && am start --user 0 -a android.intent.action.VIEW -d "$1" -n is.xyz.mpv/.MPVActivity > /dev/null 2>&1 || setsid -f "$player_fn" "$1" --referrer="$base_url" --force-media-title="$2" > /dev/null 2>&1;; esac } download () { printf "${c_blue}Downloading %s${c_reset}\n" "$2" case $1 in *m3u8) ffmpeg -loglevel error -stats -referer "$base_url" -i "$1" -c copy "$download_dir/$u2.mp4";; *) aria2c --summary-interval=0 -x 16 -s 16 --referer="$base_url" "$1" --dir=$download_dir -o "$2.mp4" --download-result=hide;; esac } get_show() { printf "${c_blue}Searching query.." results=$(curl -s "$base_url/?s=$query" | sed -nE 's_^[[:space:]]*.$_\1_p') [ -z "$results" ] && printf "\33[2K\r${c_red}No search results found${c_reset}" && exit 0 printf "\33[2K\r${c_green}Results found\n" result=$(printf "%s" "$results" | fzf --layout="reverse" --border --height=10) [ -z "$result" ] && err "No hentai selected" && exit 0 printf "${c_magenta}selected $result\n${c_blue}Fetching episode list" ep_list=$(curl -s "$base_url/tvshows/$result/" | sed -nE 's_^[[:space:]]*.$_\1_p' | tac) noofeps=$(printf "%s\n" "$ep_list" | wc -l) printf "\33[2K\r${c_green}Episodes list fetched\n" [ "$noofeps" -eq 1 ] && ep_no=1 || input "$noofeps" get_ep_link } get_ep_link(){ tput clear printf "${c_blue}Loading Episode $ep_no" ep_id=$(printf "%s" "$ep_list" | sed -n "${ep_no}p") id=$(curl -s "$base_url/$ep_id/" | sed -nE "s/.*?p=(.*)'.*/\1/p") display=$(printf "%s" "$ep_id" | cut -d'/' -f2- | tr "-" " ") [ -z "$id" ] && printf "\33[2K\r${c_red}Episode doesn't exist on this site${c_reset}" || play_link } play_link() { printf "\33[2K\r${c_blue}Fetching video link" data="$(curl -s "$(curl -s "$base_url/wp-admin/admin-ajax.php" -d "action=get_player_contents&a=$id" -H "X-Requested-With:XMLHttpRequest" | tr -d '\\' | sed -nE 's/.*src="(.*)" width.*,.*/\1/p')")" video_link="$(printf "%s" "$data" | sed -nE 's/[[:space:]]*$c_reset " read choice case $choice in d) download "$video_link" "$display";; n) ep_no=$((ep_no + 1)) [ "$ep_no" -gt "$noofeps" ] && err "Episode out of range" && ep_no=$((ep_no-1)) || get_ep_link;; p) ep_no=$((ep_no - 1)) [ "$ep_no" -lt "1" ] && err "Episode out of range" && ep_no=$((ep_no+1)) || get_ep_link;; e) input "$noofeps" get_ep_link;; q) break;; *) err "invalid choice";; esac done