diff --git a/README.md b/README.md index 92fea6e81..12bb40293 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@

-A cli to browse and watch anime (alone AND with friends). This tool scrapes the site allanime. +A cli to browse and watch anime (alone AND with friends). This tool scrapes the site allanime.

@@ -71,11 +71,9 @@ Otherwise you're likely to see an error like the following: ` "/usr/bin/ani-cli: #### Debian -Wget is replaced with wget2 to ensure compatibility with all Debian releases. - ```sh -wget -qO- https://Wiener234.github.io/ani-cli-ppa/KEY.gpg | sudo tee /etc/apt/trusted.gpg.d/ani-cli.asc -wget -qO- https://Wiener234.github.io/ani-cli-ppa/ani-cli-debian.list | sudo tee /etc/apt/sources.list.d/ani-cli-debian.list +curl -s https://Wiener234.github.io/ani-cli-ppa/KEY.gpg | sudo tee /etc/apt/trusted.gpg.d/ani-cli.asc +curl -s https://Wiener234.github.io/ani-cli-ppa/ani-cli-debian.list | sudo tee /etc/apt/sources.list.d/ani-cli-debian.list sudo apt update sudo apt install ani-cli ``` @@ -142,7 +140,7 @@ cd .. && rm -rf ./ani-cli *To install (with Homebrew) the dependencies required on Mac OS, you can run:* ```sh -brew install wget grep aria2 ffmpeg git fzf && \ +brew install curl grep aria2 ffmpeg git fzf && \ brew install --cask iina ``` *Why iina and not mpv? Drop-in replacement for mpv for MacOS. Integrates well with OSX UI. Excellent support for M1. Open Source.* @@ -214,7 +212,7 @@ git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf ~/.fzf/install mkdir ~/.aria2c -wget -O ~/.aria2c/aria2-1.36.0.tar.bz2 https://github.com/q3aql/aria2-static-builds/releases/download/v1.36.0/aria2-1.36.0-linux-gnu-64bit-build1.tar.bz2 +curl -o ~/.aria2c/aria2-1.36.0.tar.bz2 https://github.com/q3aql/aria2-static-builds/releases/download/v1.36.0/aria2-1.36.0-linux-gnu-64bit-build1.tar.bz2 tar xvf ~/.aria2c/aria2-1.36.0.tar.bz2 -C ~/.aria2c/ cp ~/.aria2c/aria2-1.36.0-linux-gnu-64bit-build1/aria2c ~/.local/bin/ chmod +x ~/.local/bin/aria2c @@ -253,7 +251,7 @@ press enter("A" button on Steam Deck) on questions ```sh mkdir ~/.aria2c -wget -O ~/.aria2c/aria2-1.36.0.tar.bz2 https://github.com/q3aql/aria2-static-builds/releases/download/v1.36.0/aria2-1.36.0-linux-gnu-64bit-build1.tar.bz2 +curl -o ~/.aria2c/aria2-1.36.0.tar.bz2 https://github.com/q3aql/aria2-static-builds/releases/download/v1.36.0/aria2-1.36.0-linux-gnu-64bit-build1.tar.bz2 tar xvf ~/.aria2c/aria2-1.36.0.tar.bz2 -C ~/.aria2c/ cp ~/.aria2c/aria2-1.36.0-linux-gnu-64bit-build1/aria2c ~/.local/bin/ chmod +x ~/.local/bin/aria2c @@ -349,7 +347,7 @@ flatpak uninstall io.mpv.Mpv - grep - sed -- wget (v.1.21.3) +- curl - mpv - Video Player - iina - mpv replacement for MacOS - aria2c - Download manager @@ -365,7 +363,6 @@ flatpak uninstall io.mpv.Mpv * [dra-cla](https://github.com/CoolnsX/dra-cla): ani-cli equivalent for korean dramas (Shell) * [kaa.si-cli](https://github.com/Soviena/kaa.si-cli): Stream anime from kaa.si and sync with anilist (Python) * [lobster](https://github.com/justchokingaround/lobster): Life action movies and series fom the terminal (Shell) -* [manga-cli](https://github.com/7USTIN/manga-cli): Read manga in the cli (Shell) * [mangal](https://github.com/metafates/mangal): Download & read manga from any source with anilist sync (Go) * [mov-cli](https://github.com/mov-cli/mov-cli): Watch movies/shows in the cli (Python/Shell) * [saikou](https://github.com/saikou-app/saikou): Best android app for anime/manga with anilist integration (Kotlin) diff --git a/ani-cli b/ani-cli index 04b95730b..c86eba8bc 100755 --- a/ani-cli +++ b/ani-cli @@ -1,6 +1,6 @@ #!/bin/sh -version_number="4.0.9" +version_number="4.1.0" # UI @@ -17,7 +17,7 @@ launcher() { nth() { stdin=$(cat -) [ -z "$stdin" ] && return 1 - line_count="$(printf "%s\n" "$stdin" | wc -l)" + line_count="$(printf "%s\n" "$stdin" | wc -l | tr -d "[:space:]")" [ "$line_count" -eq 1 ] && printf "%s" "$stdin" | cut -f2,3 && return 0 prompt="$1" multi_flag="" @@ -77,7 +77,7 @@ version_info() { } update_script() { - update="$(wget -q -O - -U "$agent" "https://raw.githubusercontent.com/pystardust/ani-cli/master/ani-cli")" || die "Connection error" + update="$(curl -s --cipher "AES256-SHA256" --tls-max "1.2" -A "$agent" "https://raw.githubusercontent.com/pystardust/ani-cli/master/ani-cli")" || die "Connection error" update="$(printf '%s\n' "$update" | diff -u "$0" -)" if [ -z "$update" ]; then printf "Script is up to date :)\n" @@ -102,10 +102,10 @@ dep_ch() { # extract the video links from reponse of embed urls, extract mp4 links form m3u8 lists get_links() { - episode_link="$(wget -q -O - "https://blog.allanime.pro/apivtwo/clock.json?id=$*" -U "$agent" | sed 's|},{|\n|g' | sed -nE 's|.*link":"([^"]*)".*"resolutionStr":"([^"]*)".*|\2 >\1|p;s|.*hls","url":"([^"]*)".*"hardsub_lang":"en-US".*|\1|p')" + episode_link="$(curl -e "https://allanime.co" -s --cipher "AES256-SHA256" "https://allanimenews.com/apivtwo/clock.json?id=$*" -A "$agent" | sed 's|},{|\n|g' | sed -nE 's|.*link":"([^"]*)".*"resolutionStr":"([^"]*)".*|\2 >\1|p;s|.*hls","url":"([^"]*)".*"hardsub_lang":"en-US".*|\1|p')" case "$episode_link" in *crunchyroll*) - wget -q -O - "$episode_link" -U "$agent" | sed 's|^#.*x||g; s|,.*|p|g; /^#/d; $!N; s|\n| >|' | sort -nr + curl -e "https://allanime.co" -s --cipher "AES256-SHA256" --tls-max "1.2" "$episode_link" -A "$agent" | sed 's|^#.*x||g; s|,.*|p|g; /^#/d; $!N; s|\n| >|' | sort -nr ;; *repackager.wixmp.com*) extract_link=$(printf "%s" "$episode_link" | cut -d'>' -f2 | sed 's|repackager.wixmp.com/||g;s|\.urlset.*||g') @@ -119,7 +119,7 @@ get_links() { else extract_link=$(printf "%s" "$episode_link" | head -1 | cut -d'>' -f2) relative_link=$(printf "%s" "$extract_link" | sed 's|[^/]*$||') - wget -q -O - "$extract_link" -U "$agent" | sed 's|^#.*x||g; s|,.*|p|g; /^#/d; $!N; s|\n| >|' | sed "s|>|>${relative_link}|g" | sort -nr + curl -e "https://allanime.co/" -s --cipher "AES256-SHA256" --tls-max "1.2" "$extract_link" -A "$agent" | sed 's|^#.*x||g; s|,.*|p|g; /^#/d; $!N; s|\n| >|' | sed "s|>|>${relative_link}|g" | sort -nr fi ;; *) [ -n "$episode_link" ] && printf "%s\n" "$episode_link" ;; @@ -136,9 +136,9 @@ provider_init() { # generates links based on given provider generate_link() { case $1 in - 1) provider_init 'wixmp' '/Default :/p' ;; # wixmp(default)(m3u8)(multi) -> (mp4)(multi) + 1) provider_init 'wixmp' '/Default :/p' ;; # wixmp(default)(m3u8)(multi) -> (mp4)(multi) 2) provider_init 'pstatic' '/Default B :/p' ;; # pstatic(default backup)(mp4)(multi) - 3) provider_init 'vrv' '/Ac :/p' ;; # vrv(crunchyroll)(m3u8)(multi) + 3) provider_init 'vrv' '/Ac :/p' ;; # vrv(crunchyroll)(m3u8)(multi) 4) provider_init 'sharepoint' '/S-mp4 :/p' ;; # sharepoint(mp4)(single) 5) provider_init 'usercloud' '/Uv-mp4 :/p' ;; # usercloud(mp4)(single) *) provider_init 'gogoanime' '/Luf-mp4 :/p' ;; # gogoanime(m3u8)(multi) @@ -159,7 +159,7 @@ select_quality() { # gets embed urls, collects direct links into provider files, selects one with desired quality into $episode get_episode_url() { # get the embed urls of the selected episode - resp=$(wget -q -O - "https://allanime.site/watch/$id/episode-$ep_no-$mode" -U "$agent" | tr '{}' '\n' | sed 's|\\u002F|\/|g;s|\\||g' | sed -nE 's|.*sourceUrl":".*clock\?id=([^"]*)".*sourceName":"([^"]*)".*|\2 :\1|p') + resp=$(curl -e "https://allanime.co" -s --cipher "AES256-SHA256" --tls-max "1.2" "https://api.allanime.co/allanimeapi?variables=%7B%22showId%22%3A%22$id%22%2C%22translationType%22%3A%22$mode%22%2C%22countryOrigin%22%3A%22ALL%22%2C%22episodeString%22%3A%22$ep_no%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%221f0a5d6c9ce6cd3127ee4efd304349345b0737fbf5ec33a60bbc3d18e3bb7c61%22%7D%7D" -A "$agent" | tr '{}' '\n' | sed 's|\\u002F|\/|g;s|\\||g' | sed -nE 's|.*sourceUrl":".*clock\?id=([^"]*)".*sourceName":"([^"]*)".*|\2 :\1|p') # generate links into sequential files provider=1 i=0 @@ -177,12 +177,12 @@ get_episode_url() { # search the query and give results search_anime() { - wget -q -O - "https://allanime.site/allanimeapi?variables=%7B%22search%22%3A%7B%22allowAdult%22%3Atrue%2C%22allowUnknown%22%3Atrue%2C%22query%22%3A%22$*%22%7D%2C%22limit%22%3A40%2C%22page%22%3A1%2C%22translationType%22%3A%22$mode%22%2C%22countryOrigin%22%3A%22ALL%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%229c7a8bc1e095a34f2972699e8105f7aaf9082c6e1ccd56eab99c2f1a971152c6%22%7D%7D" -U "$agent" | sed 's|Show|\n|g' | sed -nE "s|.*_id\":\"([^\"]*)\",\"name\":\"(.*)\",\"english.*\"$mode\":([1-9][^,]*).*|\1\t\2 (\3 episode)|p" | sed 's/\\//g;s/"//g' + curl -e "https://allanime.co" -s --cipher "AES256-SHA256" --tls-max "1.2" "https://api.allanime.co/allanimeapi?variables=%7B%22search%22%3A%7B%22allowAdult%22%3Atrue%2C%22allowUnknown%22%3Atrue%2C%22query%22%3A%22$*%22%7D%2C%22limit%22%3A40%2C%22page%22%3A1%2C%22translationType%22%3A%22$mode%22%2C%22countryOrigin%22%3A%22ALL%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%229c7a8bc1e095a34f2972699e8105f7aaf9082c6e1ccd56eab99c2f1a971152c6%22%7D%7D" -A "$agent" | sed 's|Show|\n|g' | sed -nE "s|.*_id\":\"([^\"]*)\",\"name\":\"(.*)\",\"english.*\"$mode\":([1-9][^,]*).*|\1\t\2 (\3 episode)|p" | sed 's/\\//g;s/"//g' } # get the episodes list of the selected anime episodes_list() { - wget -q -O - "https://allanime.site/anime/$*" -U "$agent" | sed 's|\\||g' | sed -nE "s|.*$mode\":\[([0-9.\",]*)\].*|\1|p" | sed 's|,|\n|g; s|"||g' | sort -n -k 1 + curl -e "https://allanime.co" -s "https://api.allanime.co/allanimeapi?variables=%7B%22_id%22%3A%22$*%22%7D&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%22f73a8347df0e3e794f8955a18de6e85ac25dfc6b74af8ad613edf87bb446a854%22%7D%7D" -A "$agent" | sed 's|\\||g' | sed -nE "s|.*$mode\":\[([0-9.\",]*)\].*|\1|p" | sed 's|,|\n|g; s|"||g' | sort -n -k 1 } # PLAYING @@ -225,9 +225,9 @@ play_episode() { catt) nohup catt cast "$episode" >/dev/null 2>&1 & ;; *) nohup "$player_function" "$episode" >/dev/null 2>&1 & ;; esac - update_history replay="$episode" unset episode + update_history wait } @@ -235,8 +235,8 @@ play() { start=$(printf "%s" "$ep_no" | grep -Eo "^[0-9]+(\.[0-9])?") end=$(printf "%s" "$ep_no" | grep -Eo "[0-9]+(\.[0-9])?$") [ -z "$end" ] || [ "$end" = "$start" ] && unset start end - line_count=$(printf "%s\n" "$ep_no" | wc -l) - if [ "$line_count" != 1 ] || [ -n "$start" ] ; then + line_count=$(printf "%s\n" "$ep_no" | wc -l | tr -d "[:space:]") + if [ "$line_count" != 1 ] || [ -n "$start" ]; then [ -z "$start" ] && start=$(printf "%s\n" "$ep_no" | head -n1) [ -z "$end" ] && end=$(printf "%s\n" "$ep_no" | tail -n1) range=$(printf "%s\n" "$ep_list" | sed -nE "/^${start}\$/,/^${end}\$/p") @@ -252,7 +252,6 @@ play() { fi } - # MAIN # setup @@ -304,7 +303,7 @@ while [ $# -gt 0 ]; do -c | --continue) search=history ;; -d | --download) player_function=download ;; -D | --delete) - : > "$histfile" + : >"$histfile" exit 0 ;; -V | --version) version_info ;; @@ -321,7 +320,7 @@ while [ $# -gt 0 ]; do shift done printf "\33[2K\r\033[1;34mChecking dependencies...\033[0m\n" -dep_ch "wget" "sed" "grep" "fzf" || true +dep_ch "curl" "sed" "grep" "fzf" || true case "$player_function" in debug) ;; download) dep_ch "ffmpeg" "aria2c" ;; @@ -355,7 +354,7 @@ history) if [ "$use_external_menu" = "0" ]; then printf "Search anime: " && read -r query else - query=$(: | external_menu "" "Search anime:") + query=$(: | external_menu "" "Search anime: ") fi done query=$(printf "%s" "$query" | sed "s| |%20|g") @@ -384,9 +383,11 @@ while cmd=$(printf "next\nreplay\nprevious\nselect\nchange_quality\nquit" | nth replay) episode="$replay";; previous) ep_no=$(printf "%s" "$ep_list" | sed -n "/^${ep_no}$/{g;1!p;};h") 2>/dev/null ;; select) ep_no=$(printf "%s" "$ep_list" | nth "Select episode: " "$multi_selection_flag") ;; - change_quality) episode=$(printf "%s" "$links" | sed -n '/^\([0-9]*p\)/p' | launcher) - quality=$(printf "%s" "$episode" | grep -oE "^[0-9]+") - episode=$(printf "%s" "$episode" | cut -d'>' -f2);; + change_quality) + episode=$(printf "%s" "$links" | sed -n '/^\([0-9]*p\)/p' | launcher) + quality=$(printf "%s" "$episode" | grep -oE "^[0-9]+") + episode=$(printf "%s" "$episode" | cut -d'>' -f2) + ;; *) exit 0 ;; esac [ -z "$ep_no" ] && die "Out of range"