diff --git a/ani-cli b/ani-cli new file mode 100755 index 0000000..6ae5eb5 --- /dev/null +++ b/ani-cli @@ -0,0 +1,316 @@ +#!/bin/sh + +# dependencies: grep sed curl video_player +# video_player ( needs to be able to play urls ) +player_fn="vlc" + +prog="ani-cli" +logfile="${XDG_CACHE_HOME:-$HOME/.cache}/ani-hsts" + +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 line; do + printf "%s\n" "$line" + done <<-EOF + USAGE: $prog + -h show this help text + -d download episode + -H continue where you left off + EOF +} + + +die () { + printf "$c_red%s$c_reset\n" "$*" >&2 + exit 1 +} + +err () { + printf "$c_red%s$c_reset\n" "$*" >&2 +} + +search_anime () { + # get anime name along with its id + search=$1 + titlepattern='.*_https:\1_p') + + curl -s "$dpage_url" | + sed -n -E "s/^[[:space:]]*sources:\[\{file\: '([^']*)'.*/\1/p" | sed 1q +} + +dep_ch () { + for dep; do + if ! command -v "$dep" >/dev/null ; then + die "Program \"$dep\" not found. Please install it." + fi + done +} + +# get query +get_search_query () { + if [ -z "$*" ]; then + printf "Search Anime: " + read -r query + else + query=$* + fi +} + +# create history file +[ -f "$logfile" ] || : > "$logfile" + +##################### +## Anime selection ## +##################### + +anime_selection () { + search_results=$* + menu_format_string='[%d] %s\n' + menu_format_string_c1="$c_blue[$c_cyan%d$c_blue] $c_reset%s\n" + menu_format_string_c2="$c_blue[$c_cyan%d$c_blue] $c_yellow%s$c_reset\n" + + count=1 + while read anime_id; do + # alternating colors for menu + [ $((count % 2)) -eq 0 ] && + menu_format_string=$menu_format_string_c1 || + menu_format_string=$menu_format_string_c2 + + printf "$menu_format_string" "$count" "$anime_id" + count=$((count+1)) + done <<-EOF + $search_results + EOF + + # User input + printf "$c_blue%s$c_green" "Enter number: " + read choice + printf "$c_reset" + + # Check if input is a number + [ "$choice" -eq "$choice" ] 2>/dev/null || die "Invalid number entered" + + # Select respective anime_id + count=1 + while read anime_id; do + if [ $count -eq $choice ]; then + selection_id=$anime_id + break + fi + count=$((count+1)) + done <<-EOF + $search_results + EOF + + [ -z "$selection_id" ] && die "Invalid number entered" + + read last_ep_number <<-EOF + $(search_eps "$selection_id") + EOF +} + +################## +## Ep selection ## +################## + +episode_selection () { + [ $is_download -eq 1 ] && + printf "Range of episodes can be specified: start_number end_number\n" + + printf "${c_blue}Choose episode $c_cyan[1-%d]$c_reset:$c_green " $last_ep_number + read ep_choice_start ep_choice_end + printf "$c_reset" + +} + +open_episode () { + anime_id=$1 + episode=$2 + + # clear the screen + printf '\x1B[2J\x1B[1;1H' + if [ $episode -lt 1 ] || [ $episode -gt $last_ep_number ]; then + err "Episode out of range" + printf "${c_blue}Choose episode $c_cyan[1-%d]$c_reset:$c_green " $last_ep_number + read episode + printf "$c_reset" + fi + + printf "Getting data for episode %d\n" $episode + + video_url=$(get_links "$anime_id" "$episode") + + case $video_url in + *streamtape*) + # If direct download not available then scrape streamtape.com + BROWSER=${BROWSER:-firefox} + printf "scraping streamtape.com\n" + video_url=$(curl -s "$video_url" | sed -n -E ' + /^