From 6b377d7856af5d966fa2b6e6ae6e8fa6b18b1c9b Mon Sep 17 00:00:00 2001 From: coolnsx Date: Sun, 2 Jul 2023 18:06:47 +0530 Subject: [PATCH] Nothing to see here, move along --- .functions | 2 +- ani-new | 96 +++++++++++++------------- fap-cli | 170 ++++++++++++++++++++++++---------------------- rss | 9 ++- tor-bay | 25 +++---- tor-cli | 16 ++--- torrent | 43 ++++++------ youtube | 24 +++---- yt-music | 195 +++++++++++++++++++++++++++-------------------------- 9 files changed, 293 insertions(+), 287 deletions(-) diff --git a/.functions b/.functions index 4c3efbe..b869c3c 100644 --- a/.functions +++ b/.functions @@ -1,7 +1,7 @@ #!/bin/sh menu_droid () { - fzf --prompt="$1" "$2" + fzf --prompt="$1" $2 } menu_linux () { diff --git a/ani-new b/ani-new index 3aec647..ec78650 100755 --- a/ani-new +++ b/ani-new @@ -1,64 +1,59 @@ #!/bin/sh -down () { - info_$os "$3 links fetched.." - choice=$(printf "stream\ndownload\ncast\nnext mirror" | menu_$os "??") - [ -z "$choice" ] && exit 0 - [ "$choice" = "stream" ] && player_$os "$2" "$title" && info_$os "opening $title" "mpv" && exit 0 - [ "$choice" = "cast" ] && info_$os "casting $title" "podcast" && catt cast "$2" && exit 0 - [ "$choice" = "next mirror" ] && return 0 - info_$os "Downloading $title" "downloader" - case $2 in - *m3u*) $terminal hls -n 300 -ro "$download_dir/$title" "$2" || (error_$os "Downloading failed $title" && exit 0) ;; - *) $terminal aria2c -U "$agent" --check-certificate=false -d "$download_dir" --summary-interval=0 -x 16 -s 16 --referer="$1" "$2" -o "$title.mp4" --download-result=hide || (error_$os "Downloading failed $title" && exit 0) ;; - esac - info_$os "Episode Downloaded $title" - exit 0 +down() { + info_$os "$3 links fetched.." + choice=$(printf "stream\ndownload\ncast\nnext mirror" | menu_$os "??") + [ -z "$choice" ] && exit 0 + [ "$choice" = "stream" ] && player_$os "$2" "$title" && info_$os "opening $title" "mpv" && exit 0 + [ "$choice" = "cast" ] && info_$os "casting $title" "podcast" && catt cast "$2" && exit 0 + [ "$choice" = "next mirror" ] && return 0 + info_$os "Downloading $title" "downloader" + case $2 in + *m3u*) $terminal hls -n 300 -ro "$download_dir/$title" "$2" || (error_$os "Downloading failed $title" && exit 0) ;; + *) $terminal aria2c -U "$agent" --check-certificate=false -d "$download_dir" --summary-interval=0 -x 16 -s 16 --referer="$1" "$2" -o "$title.mp4" --download-result=hide || (error_$os "Downloading failed $title" && exit 0) ;; + esac + info_$os "Episode Downloaded $title" + exit 0 } decrypt_allanime() { - for result in $(printf '%s' "$1" | xxd -r -p | od -An -v -t u1) - do - for char in $(printf "%s" "1234567890123456789" | grep -o .) - do - decimal_char="$(printf "%02d" "'$char'")" - : $((result ^= decimal_char)) - done - - #shellcheck disable=SC2059 - printf "\\$(printf "%03o" "$result")" - done + for hex in $(printf '%s' "$1" | sed 's/../&\n/g'); do + dec=$(printf '%d' "0x$hex") + xor=$((dec ^ 48)) + oct=$(printf "%03o" "$xor") + #shellcheck disable=SC2059 + printf "\\$oct" + done } -provider_run(){ - info_$os "Fetching $1 links" - provider_id="$(decrypt_allanime "$(printf "%s" "$data" | sed -n "$2" | head -1 | cut -d':' -f2)" | sed "s/\/clock/\/clock\.json/")" - [ -z "$provider_id" ] && return 0 - provider_video=$(curl -s "https://embed.ssbcontent.site$provider_id" | sed 's|},{|\n|g' | sed -nE 's|.*link":"([^"]*)".*"resolutionStr":"([^"]*)".*|\1|p;s|.*hls","url":"([^"]*)".*"hardsub_lang":"en-US".*|\1|p' | head -1) - [ -z "$provider_video" ] && return 0 - [ -n "$3" ] && printf "%s : %s\n" "$1" "$provider_video" && return 0 - case $provider_video in - *crunchyroll*) down "$base_url" "$(curl -s "$provider_video" -A "$agent" | sed -n '/x1080/{n;p;}')" "$1" ;; - *repackager.wixmp.com*) down "$base_url" "$(printf %s "$provider_video" | cut -d',' -f1,2 | tr -d ',' | sed 's|repackager.wixmp.com/||g')/mp4/file.mp4" "$1" ;; - *) down "$base_url" "$provider_video" "$1" ;; - esac +provider_run() { + info_$os "Fetching $1 links" + provider_id="$(decrypt_allanime "$(printf "%s" "$data" | sed -n "$2" | head -1 | cut -d':' -f2)" | sed "s/\/clock/\/clock\.json/")" + [ -z "$provider_id" ] && return 0 + provider_video=$(curl -s "https://embed.ssbcontent.site$provider_id" | sed 's|},{|\n|g' | sed -nE 's|.*link":"([^"]*)".*"resolutionStr":"([^"]*)".*|\1|p;s|.*hls","url":"([^"]*)".*"hardsub_lang":"en-US".*|\1|p' | head -1) + [ -z "$provider_video" ] && return 0 + [ -n "$3" ] && printf "%s : %s\n" "$1" "$provider_video" && return 0 + case $provider_video in + *repackager.wixmp.com*) down "$base_url" "$(printf %s "$provider_video" | cut -d',' -f1,2 | tr -d ',' | sed 's|repackager.wixmp.com/||g')/mp4/file.mp4" "$1" ;; + *) down "$base_url" "$provider_video" "$1" ;; + esac } base_url="https://api.allanime.day" agent="Mozilla/5.0" case $(uname -o) in - *ndroid*) - os="droid" - download_dir="/sdcard" - script_dir="$HOME" - ;; - *) - os="linux" - download_dir="$HOME/Downloads" - terminal="foot -e" - script_dir="$HOME/repos_scripts" - ;; + *ndroid*) + os="droid" + download_dir="/sdcard" + script_dir="$HOME" + ;; + *) + os="linux" + download_dir="$HOME/Downloads" + terminal="foot -e" + script_dir="$HOME/repos_scripts" + ;; esac # shellcheck source=./.functions @@ -66,9 +61,8 @@ esac trap "exit 0" INT HUP info_$os "Parsing $base_url.. Please wait..." - query="query( \$search: SearchInput \$limit: Int \$page: Int \$translationType: VaildTranslationTypeEnumType \$countryOrigin: VaildCountryOriginEnumType ) { shows( search: \$search limit: \$limit page: \$page translationType: \$translationType countryOrigin: \$countryOrigin ) { edges { _id name lastEpisodeInfo __typename } }}" -[ -z "$1" ] && url=$(curl -e 'https://allanime.to' -s --cipher 'AES256-SHA256' -G "${base_url}/api" -d "variables=%7B%22search%22%3A%7B%22sortBy%22%3A%22Recent%22%2C%22allowAdult%22%3Atrue%2C%22allowUnknown%22%3Atrue%7D%2C%22limit%22%3A40%2C%22page%22%3A1%2C%22translationType%22%3A%22sub%22%2C%22countryOrigin%22%3A%22JP%22%7D" --data-urlencode "query=$query" -A "$agent" | sed 's|Show|\n|g' | sed -nE 's|.*_id":"([^"]*)","name":"([^"]*)".*sub":\{"episodeString":"([^"]*)".*|\1\t\2 Episode \3|p' | menu_$os "Select Anime: " '--with-nth 2..' | tr ':' ' ' | tr -s ' ') || url=$(printf "%s" "$1" | sed -nE 's|.*/watch/(.*)-sub|\1|p') +[ -z "$1" ] && url=$(curl -e 'https://allanime.to' -s --cipher 'AES256-SHA256' -G "${base_url}/api" -d "variables=%7B%22search%22%3A%7B%22sortBy%22%3A%22Recent%22%2C%22allowAdult%22%3Atrue%2C%22allowUnknown%22%3Atrue%7D%2C%22limit%22%3A40%2C%22page%22%3A1%2C%22translationType%22%3A%22sub%22%2C%22countryOrigin%22%3A%22JP%22%7D" --data-urlencode "query=$query" -A "$agent" | sed 's|Show|\n|g' | sed -nE 's|.*_id":"([^"]*)","name":"([^"]*)".*sub":\{"episodeString":"([^"]*)".*|\1\t\2 Episode \3|p' | menu_$os "Select Anime: " '--with-nth 2..' | tr ':' ' ' | tr -s ' ') || url=$(printf "%s" "$1" | sed -nE 's|.*/watch/(.*)-sub|\1|p') [ -z "$url" ] && error_$os "No anime selected" && exit 0 title=$(printf "%s" "$url" | cut -f2-) @@ -77,7 +71,7 @@ ep_no=$(printf "%s" "$url" | sed 's/.*Episode //g') info_$os "Loading Episode $title.." episode_embed_gql="query (\$showId: String!, \$translationType: VaildTranslationTypeEnumType!, \$episodeString: String!) { episode( showId: \$showId translationType: \$translationType episodeString: \$episodeString ) { episodeString sourceUrls }}" -data=$( curl -e https://allanime.to -sL --cipher AES256-SHA256 -G "{$base_url}/api" --data-urlencode "variables={\"showId\":\"$id\",\"translationType\":\"sub\",\"countryOrigin\":\"ALL\",\"episodeString\":\"$ep_no\"}" --data-urlencode "query=$episode_embed_gql" -A 'Mozilla/5.0 (Windows NT 6.1; Win64; rv:109.0) Gecko/20100101 Firefox/109.0' | tr '{}' '\n' | sed 's|\\u002F|\/|g;s|\\||g' | sed -nE 's|.*sourceUrl":"#?([^"]*)".*sourceName":"([^"]*)".*|\2 :\1|p') +data=$(curl -e https://allanime.to -sL --cipher AES256-SHA256 -G "{$base_url}/api" --data-urlencode "variables={\"showId\":\"$id\",\"translationType\":\"sub\",\"countryOrigin\":\"ALL\",\"episodeString\":\"$ep_no\"}" --data-urlencode "query=$episode_embed_gql" -A 'Mozilla/5.0 (Windows NT 6.1; Win64; rv:109.0) Gecko/20100101 Firefox/109.0' | tr '{}' '\n' | sed 's|\\u002F|\/|g;s|\\||g' | sed -nE 's|.*sourceUrl":"##([^"]*)".*sourceName":"([^"]*)".*|\2 :\1|p') info_$os "Fetching Embed links" #dropbox links diff --git a/fap-cli b/fap-cli index bbcc84e..ac2304d 100755 --- a/fap-cli +++ b/fap-cli @@ -8,10 +8,10 @@ c_magenta="\033[1;35m" c_cyan="\033[1;36m" c_reset="\033[0m" -help_text () { +help_text() { while IFS= read -r line; do - printf "%s\n" "$line" - done <<-EOF + printf "%s\n" "$line" + done <<-EOF Usage: ${0##*/} [-d | -p ] [] ${0##*/} [-v] [] @@ -25,86 +25,90 @@ help_text () { EOF } -err () { - printf "$c_red%s$c_reset\n" "$*" >&2 +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 " " "+") +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 + 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 +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 +download() { + printf "${c_blue}Downloading %s${c_reset}\n" "$2" + case $1 in + *m3u8) + hls -n 300 -ro "$download_dir/$2" "$1" + ;; + *) + 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 + 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 +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";; + 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;; + 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;; + 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;; + input "$noofeps" + get_ep_link + ;; q) - break;; + break + ;; *) - err "invalid choice";; + err "invalid choice" + ;; esac done diff --git a/rss b/rss index d15e04a..ab40670 100755 --- a/rss +++ b/rss @@ -1,12 +1,11 @@ #!/bin/sh - if [ "$(uname -o)" = "Android" ]; then - os="droid" - script_dir="$HOME" + os="droid" + script_dir="$HOME" else - os="linux" - script_dir="$HOME/repos_scripts" + os="linux" + script_dir="$HOME/repos_scripts" fi . $script_dir/.functions diff --git a/tor-bay b/tor-bay index 0c152c2..48dbb54 100755 --- a/tor-bay +++ b/tor-bay @@ -2,24 +2,25 @@ #this script uses the piratesbay api to search for torrents cal_size() { - printf "%.03f\n" "$(($1/1000))e-6" + printf "%.03f\n" "$(($1 / 1000))e-6" } display() { - for i in $(seq $(printf "%s\nlol" "$2" | wc -l));do - printf "[%s GB;S:%s\n" "$(cal_size "$(printf "%s" "$1" | sed -n "${i}p")")" "$(printf "%s" "$2" | sed -n "${i}p")" & done - wait + for i in $(seq $(printf "%s\nlol" "$2" | wc -l)); do + printf "[%s GB;S:%s\n" "$(cal_size "$(printf "%s" "$1" | sed -n "${i}p")")" "$(printf "%s" "$2" | sed -n "${i}p")" & + done + wait } case $(uname -o) in - *ndroid*) - os="droid" - script_dir="$HOME" - ;; - *) - os="linux" - script_dir="$HOME/repos_scripts" - ;; + *ndroid*) + os="droid" + script_dir="$HOME" + ;; + *) + os="linux" + script_dir="$HOME/repos_scripts" + ;; esac . $script_dir/.functions diff --git a/tor-cli b/tor-cli index 973ec72..329076d 100755 --- a/tor-cli +++ b/tor-cli @@ -1,14 +1,14 @@ #!/bin/sh case $(uname -o) in - *ndroid*) - os="droid" - script_dir="$HOME" - ;; - *) - os="linux" - script_dir="$HOME/repos_scripts" - ;; + *ndroid*) + os="droid" + script_dir="$HOME" + ;; + *) + os="linux" + script_dir="$HOME/repos_scripts" + ;; esac . $script_dir/.functions diff --git a/torrent b/torrent index 6519d8c..2e94b1f 100755 --- a/torrent +++ b/torrent @@ -6,18 +6,18 @@ c_yellow="\033[1;33m" c_cyan="\033[1;36m" c_reset="\033[0m" -down(){ - tput reset - info_$os "Torrent: Downloading" - aria2c -d Downloads --select-file=$2 --seed-time=0 $1 && info_$os "Torrent: Download complete" && rm -f $file || error_$os "Torrent: Error!!" +down() { + tput reset + info_$os "Torrent: Downloading" + aria2c -d Downloads --select-file=$2 --seed-time=0 $1 && info_$os "Torrent: Download complete" && rm -f $file || error_$os "Torrent: Error!!" } if [ "$(uname -o)" = "Android" ]; then - os="droid" - script_dir="$HOME" + os="droid" + script_dir="$HOME" else - os="linux" - script_dir="$HOME/repos_scripts" + os="linux" + script_dir="$HOME/repos_scripts" fi . $script_dir/.functions @@ -28,16 +28,19 @@ printf "${c_yellow}Download>>\n${c_green}[f]ull torrent\n${c_cyan}[p]artial torr printf "${c_reset}\n\tenter choice:" read -r ch case $ch in - f) - down "$magnet";; - p) - aria2c --dir=$HOME/.cache --bt-metadata-only=true --bt-save-metadata=true "$magnet" - tput reset - aria2c --show-files=true $HOME/.cache/*.torrent - printf "Enter file idx(default=all):" - read -r ind - down "$HOME/.cache/*.torrent" "$ind" - rm -f $HOME/.cache/*.torrent;; - q) - exit 0;; + f) + down "$magnet" + ;; + p) + aria2c --dir=$HOME/.cache --bt-metadata-only=true --bt-save-metadata=true "$magnet" + tput reset + aria2c --show-files=true $HOME/.cache/*.torrent + printf "Enter file idx(default=all):" + read -r ind + down "$HOME/.cache/*.torrent" "$ind" + rm -f $HOME/.cache/*.torrent + ;; + q) + exit 0 + ;; esac diff --git a/youtube b/youtube index 71632ce..0ec754c 100755 --- a/youtube +++ b/youtube @@ -1,5 +1,3 @@ - - #!/bin/sh # script for downloading videos/audios from sites... # defining shell colors for distinction @@ -11,12 +9,12 @@ c_magenta="\033[1;35m" c_cyan="\033[1;36m" c_reset="\033[0m" -part(){ - printf "${c_magenta}Enter Starting Point(hh:mm:ss)or(mm:ss)${c_reset}:" - read start - printf "${c_yellow}Enter Upto Seconds:${c_cyan}" - read dur - ffmpeg -loglevel error -stats -i $(yt-dlp -f "$3" --get-url "$1") -ss $start -t $dur /sdcard/$(date +%s).$2 +part() { + printf "${c_magenta}Enter Starting Point(hh:mm:ss)or(mm:ss)${c_reset}:" + read start + printf "${c_yellow}Enter Upto Seconds:${c_cyan}" + read dur + ffmpeg -loglevel error -stats -i $(yt-dlp -f "$3" --get-url "$1") -ss $start -t $dur /sdcard/$(date +%s).$2 } #program starts from here.. @@ -27,9 +25,9 @@ printf "${c_yellow}Download>>\n${c_blue}[a]Audio only\n${c_magenta}[f]part of Au printf "\n${c_reset}Enter choice:${c_green}" read choice case $choice in - a) yt-dlp -f 'ba' -x --audio-format mp3 "$x" -o "/sdcard/%(title)s.%(ext)s" && termux-notification -c "audio downloaded";; - f) part "$x" "mp3" "ba" && termux-notification -c "audio downloaded";; - v) yt-dlp "$x" -o "/sdcard/%(title)s.%(ext)s" && termux-notification -c "video downloaded";; - p) part "$x" "mp4" "b" && termux-notification -c "video downloaded";; - q) exit 0;; + a) yt-dlp -f 'ba' -x --audio-format mp3 "$x" -o "/sdcard/%(title)s.%(ext)s" && termux-notification -c "audio downloaded" ;; + f) part "$x" "mp3" "ba" && termux-notification -c "audio downloaded" ;; + v) yt-dlp "$x" -o "/sdcard/%(title)s.%(ext)s" && termux-notification -c "video downloaded" ;; + p) part "$x" "mp4" "b" && termux-notification -c "video downloaded" ;; + q) exit 0 ;; esac diff --git a/yt-music b/yt-music index 359303b..caa1cb4 100755 --- a/yt-music +++ b/yt-music @@ -1,34 +1,34 @@ #!/bin/sh -help(){ - case $1 in - search*) - name="search_play" - args='"search_query"' - description="this function first searches the $args, then opens the menu(fzf,[d|be]menu,[t|r|w]ofi) with the results,then calls the play function to play the music" - ;; - play) - name="play" - args='"valid_youtube_url_or_id"' - description="immediately plays the $args in mpv(audio only)" - ;; - loop) - name="loop" - args='"print"' - description="this function runs in a loop to play the next music if the current music is successfully finished +help() { + case $1 in + search*) + name="search_play" + args='"search_query"' + description="this function first searches the $args, then opens the menu(fzf,[d|be]menu,[t|r|w]ofi) with the results,then calls the play function to play the music" + ;; + play) + name="play" + args='"valid_youtube_url_or_id"' + description="immediately plays the $args in mpv(audio only)" + ;; + loop) + name="loop" + args='"print"' + description="this function runs in a loop to play the next music if the current music is successfully finished this function should be put as background process or put it in startup passing print argument will show the progress to stdout" - ;; - play*) - name="play_next" - args='"menu"' - description="immediately plays the next song stored in $logdir/next file in mpv if argument is empty + ;; + play*) + name="play_next" + args='"menu"' + description="immediately plays the next song stored in $logdir/next file in mpv if argument is empty passing $args argument will show the $args(fzf,[d|be]menu,[t|r|w]ofi) for selecting what should be played" - ;; - *) - name="[ ]" - args="[ ]" - description=" + ;; + *) + name="[ ]" + args="[ ]" + description=" search_play search_query searches first then plays the music in mpv @@ -39,10 +39,11 @@ help(){ tip: type ${0##*/} help to get individual help " - esac - while read -r line; do - printf "%s\n" "$line" - done <<-EOF + ;; + esac + while read -r line; do + printf "%s\n" "$line" + done <<-EOF Usage : ${0##*/} $name $args @@ -50,46 +51,46 @@ help(){ Description : $description EOF - exit 0 + exit 0 } -get_data(){ - curl -X POST -A "$agent" -s "$base_url/youtubei/v1/$1?key=AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30&prettyPrint=false" -H "content-type:application/json" -H "x-youtube-client-name:67" -H "x-youtube-client-version:1.20221128.01.00" -d "$2" -b "$cookie" -e "$base_url/$3" -c "$cookie" +get_data() { + curl -X POST -A "$agent" -s "$base_url/youtubei/v1/$1?key=AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30&prettyPrint=false" -H "content-type:application/json" -H "x-youtube-client-name:67" -H "x-youtube-client-version:1.20221128.01.00" -d "$2" -b "$cookie" -e "$base_url/$3" -c "$cookie" } -loop(){ - #this function does exactly what it says, it should run in the background, u can even put this in startup - #it plays next song after the current song get played completely,it does nothing until u run the search_play function then this script kicks in - #call it by script-name "loop" "print" for printing the remaining time in terminal - #call it by script-name "loop" for anonymously - trap "rm -f $logdir/next;exit" INT HUP TERM - while true;do - sleep 4 - pos=$(echo '{ "command": ["get_property", "time-remaining"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^\.]*).*_\1_p') - while [ -n "$pos" ];do - pos=$(echo '{ "command": ["get_property", "time-remaining"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^\.]*).*_\1_p') - [ -z "$1" ] || printf "\033[2K\rnext music in $pos second(s)%s" "$(echo '{ "command": ["get_property", "pause"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^,]*).*_\1_p' | sh && printf " (paused)")" - [ -z "$pos" ] && printf "\033[2K\r\n" - sleep 2 - done - pos=$(echo '{ "command": ["get_property", "time-remaining"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^\.]*).*_\1_p') - pgrep -f "mpvsocket" >/dev/null || exit 0 - [ -z "$pos" ] && pgrep -f "mpvsocket" > /dev/null && [ -n "$(cat "$logdir/next")" ] && play "$(shuf -n1 "$logdir/next")" "$1" - done +loop() { + #this function does exactly what it says, it should run in the background, u can even put this in startup + #it plays next song after the current song get played completely,it does nothing until u run the search_play function then this script kicks in + #call it by script-name "loop" "print" for printing the remaining time in terminal + #call it by script-name "loop" for anonymously + trap "rm -f $logdir/next;exit" INT HUP TERM + while true; do + sleep 4 + pos=$(echo '{ "command": ["get_property", "time-remaining"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^\.]*).*_\1_p') + while [ -n "$pos" ]; do + pos=$(echo '{ "command": ["get_property", "time-remaining"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^\.]*).*_\1_p') + [ -z "$1" ] || printf "\033[2K\rnext music in $pos second(s)%s" "$(echo '{ "command": ["get_property", "pause"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^,]*).*_\1_p' | sh && printf " (paused)")" + [ -z "$pos" ] && printf "\033[2K\r\n" + sleep 2 + done + pos=$(echo '{ "command": ["get_property", "time-remaining"]}' | socat - /tmp/mpvsocket | sed -nE 's_.*data":([^\.]*).*_\1_p') + pgrep -f "mpvsocket" >/dev/null || exit 0 + [ -z "$pos" ] && pgrep -f "mpvsocket" >/dev/null && [ -n "$(cat "$logdir/next")" ] && play "$(shuf -n1 "$logdir/next")" "$1" + done } -play(){ - #this function does all the heavy lifting of extracting url from given videoId - #it's also callable, u can use this function to play ur custom youtube URLs - #call it by script-name "play" "valid_youtube_id_or_url" - title=$(printf "%s" "$1" | cut -f1) - id=$(printf "%s" "$1" | cut -f2 | cut -d"=" -f2 | cut -d"/" -f4 | cut -d'&' -f1) - [ -z "$id" ] && printf "[ youtube ] Invalid link\n" && exit 1 +play() { + #this function does all the heavy lifting of extracting url from given videoId + #it's also callable, u can use this function to play ur custom youtube URLs + #call it by script-name "play" "valid_youtube_id_or_url" + title=$(printf "%s" "$1" | cut -f1) + id=$(printf "%s" "$1" | cut -f2 | cut -d"=" -f2 | cut -d"/" -f4 | cut -d'&' -f1) + [ -z "$id" ] && printf "[ youtube ] Invalid link\n" && exit 1 - #get song's audio url - random_no=$(head /dev/urandom | tr -dc '0-2' | cut -c1) - droid_agent="com.google.android.youtube/18.10.36 (Linux; U; Android 1$random_no) gzip" - json="{ + #get song's audio url + random_no=$(head /dev/urandom | tr -dc '0-2' | cut -c1) + droid_agent="com.google.android.youtube/18.10.36 (Linux; U; Android 1$random_no) gzip" + json="{ \"context\": { \"client\": { \"clientName\": \"ANDROID\", @@ -111,58 +112,58 @@ play(){ \"contentCheckOk\": true, \"racyCheckOk\": true }" - - audio_url=$(curl -X POST -A "$droid_agent" -s "https://www.youtube.com/youtubei/v1/player?key=AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w&prettyPrint=false" -H "content-type:application/json" -d "$json" -b "$cookie" | sed -nE 's_.*itag":251,"url":"([^"]*)".*_\1_p') - if [ -n "$2" ];then - printf "Name >> %s\n" "$title" - printf "videoID >> %s\n" "$id" - printf "Audio URL >> %s\n" "$audio_url" - fi - - curl -s "https://i.ytimg.com/vi/$id/hqdefault.jpg" -o - | convert - -crop 270x270+105+45 "$logdir/default.jpg" && notify-send -r 5 -i "$logdir/default.jpg" "Now Playing" "$title" -t 5000 - pgrep -f "mpvsocket" > /dev/null || (setsid -f mpv --really-quiet --input-ipc-server=/tmp/mpvsocket --idle --quiet >/dev/null && sleep 1) - echo "{ \"command\": [\"loadfile\", \"$audio_url\", \"replace\"] }" | socat - /tmp/mpvsocket - cut -d':' -f2 "$logdir/current" > "$logdir/prev" - prev_id=$(cut -d'>' -f2 "$logdir/prev") - printf "currently playing : %s >%s\n" "$title" "$id" > "$logdir/current" - #next songs data - json_next="{ + audio_url=$(curl -X POST -A "$droid_agent" -s "https://www.youtube.com/youtubei/v1/player?key=AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39w&prettyPrint=false" -H "content-type:application/json" -d "$json" -b "$cookie" | sed -nE 's_.*itag":251,"url":"([^"]*)".*_\1_p') + if [ -n "$2" ]; then + printf "Name >> %s\n" "$title" + printf "videoID >> %s\n" "$id" + printf "Audio URL >> %s\n" "$audio_url" + fi + + curl -s "https://i.ytimg.com/vi/$id/hqdefault.jpg" -o - | convert - -crop 270x270+105+45 "$logdir/default.jpg" && notify-send -r 5 -i "$logdir/default.jpg" "Now Playing" "$title" -t 5000 + pgrep -f "mpvsocket" >/dev/null || (setsid -f mpv --really-quiet --input-ipc-server=/tmp/mpvsocket --idle --quiet >/dev/null && sleep 1) + echo "{ \"command\": [\"loadfile\", \"$audio_url\", \"replace\"] }" | socat - /tmp/mpvsocket + cut -d':' -f2 "$logdir/current" >"$logdir/prev" + prev_id=$(cut -d'>' -f2 "$logdir/prev") + printf "currently playing : %s >%s\n" "$title" "$id" >"$logdir/current" + + #next songs data + json_next="{ \"enablePersistentPlaylistPanel\": true, \"tunerSettingValue\": \"AUTOMIX_SETTING_NORMAL\", \"playlistId\": \"RDAMVM$id\", \"isAudioOnly\": true, \"context\": $(cat "$logdir/context") }" - get_data "next" "$json_next" | sed 's/playlistPanelVideoRenderer/\n/g' | sed -nE 's_.*text":"(.*)"}.*longBylineText":\{"runs":\[\{"text":"([^"]*)","navigationEndpoint.*videoId":"([^"]*)".*_\1 - \2\t\3_p' | sed "/$id/d;/$prev_id/d" > "$next_data" & - pgrep -f "yt-music loop" || setsid -f $HOME/repos_scripts/yt-music loop + get_data "next" "$json_next" | sed 's/playlistPanelVideoRenderer/\n/g' | sed -nE 's_.*text":"(.*)"}.*longBylineText":\{"runs":\[\{"text":"([^"]*)","navigationEndpoint.*videoId":"([^"]*)".*_\1 - \2\t\3_p' | sed "/$id/d;/$prev_id/d" >"$next_data" & + pgrep -f "yt-music loop" || setsid -f $HOME/repos_scripts/yt-music loop } -search_play(){ - #run this if u r starting the script first time like this - #call this by "script-name" "search_play" "search_query" - [ -z "$1" ] && query=$(:| menu "Yt-music [Search]:") || query="$1" - [ -z "$query" ] && notify-send "Err.. Search query empty" -u critical -r 5 && exit 1 - curl -A "$agent" -s "$base_url/" -c "$cookie" | sed -nE 's|.*INNERTUBE_CONTEXT":(.*),"INNERTUBE_CONTEXT_CLIENT_NAME.*|\1|p' > "$logdir/context" +search_play() { + #run this if u r starting the script first time like this + #call this by "script-name" "search_play" "search_query" + [ -z "$1" ] && query=$(: | menu "Yt-music [Search]:") || query="$1" + [ -z "$query" ] && notify-send "Err.. Search query empty" -u critical -r 5 && exit 1 + curl -A "$agent" -s "$base_url/" -c "$cookie" | sed -nE 's|.*INNERTUBE_CONTEXT":(.*),"INNERTUBE_CONTEXT_CLIENT_NAME.*|\1|p' >"$logdir/context" - json_search="{ + json_search="{ \"context\" : $(cat "$logdir/context"), \"query\": \"$query\", \"params\": \"EgWKAQIIAWoKEAMQBBAJEAoQBQ%3D%3D\" }" - res=$(get_data "search" "$json_search" "search?q=$(printf "%s" "$1" | tr ' ' '+')" | sed 's/watchEndpoint"/\n/g' | sed -nE 's_.*videoId":"([^"]*)",.*label":"Play ([^"]*)".*_\2\t\1_p' | menu "Yt-music [Play]:") - [ -z "$res" ] || play "$res" "verbose" + res=$(get_data "search" "$json_search" "search?q=$(printf "%s" "$1" | tr ' ' '+')" | sed 's/watchEndpoint"/\n/g' | sed -nE 's_.*videoId":"([^"]*)",.*label":"Play ([^"]*)".*_\2\t\1_p' | menu "Yt-music [Play]:") + [ -z "$res" ] || play "$res" "verbose" } -play_next(){ - #call this by script-name "play_next" for playing next song immediately - #or add "menu" after "play_next" to show menu for selecting and playing next song immediately - #like this script-name "play_next" "menu" - [ -z "$1" ] && play "$(shuf -n1 "$logdir/next")" "verbose" || (pgrep -f "mpvsocket" && notify-send -r 5 -i "$logdir/default.jpg" "$(cut -d">" -f1 "$logdir/current" | tr ':' '\n')" && play "$(menu "YT-music [play-next]: " < "$logdir/next")" "verbose") +play_next() { + #call this by script-name "play_next" for playing next song immediately + #or add "menu" after "play_next" to show menu for selecting and playing next song immediately + #like this script-name "play_next" "menu" + [ -z "$1" ] && play "$(shuf -n1 "$logdir/next")" "verbose" || (pgrep -f "mpvsocket" && notify-send -r 5 -i "$logdir/default.jpg" "$(cut -d">" -f1 "$logdir/current" | tr ':' '\n')" && play "$(menu "YT-music [play-next]: " <"$logdir/next")" "verbose") } -menu(){ - bemenu --fn 'IBM Plex Sans 15' -i -c -W 0.5 -B 3 -p "$1" -l 26 +menu() { + bemenu --fn 'IBM Plex Sans 15' -i -c -W 0.5 -B 3 -p "$1" -l 26 } logdir="/tmp/yt-music"