mirror of
https://github.com/ksyasuda/aniwrapper.git
synced 2024-11-22 03:19:53 -08:00
update to scrape gogoplay
This commit is contained in:
parent
9ad13ae95a
commit
44438b3a47
@ -193,7 +193,7 @@ aniwrapper -C
|
|||||||
aniwrapper -Q <query>
|
aniwrapper -Q <query>
|
||||||
|
|
||||||
# Choose rofi theme from presets
|
# Choose rofi theme from presets
|
||||||
aniwrapper -t <aniwrapper (default)|dracula|fancy|flamingo|material|nord|onedark>
|
aniwrapper -t <aniwrapper (default)|dracula|doomone|fancy|flamingo|material|nord|onedark>
|
||||||
|
|
||||||
# Specify custom rofi config
|
# Specify custom rofi config
|
||||||
aniwrapper -T <path_to_config>
|
aniwrapper -T <path_to_config>
|
||||||
@ -258,7 +258,7 @@ ani-cli -H
|
|||||||
ani-cli -s
|
ani-cli -s
|
||||||
|
|
||||||
# choose quality
|
# choose quality
|
||||||
ani-cli -q <high|normal (default)|low>
|
ani-cli -q <best (default)|1080p|720p|480p|360p|worst>
|
||||||
|
|
||||||
# choose rofi theme from presets
|
# choose rofi theme from presets
|
||||||
ani-cli -t <aniwrapper (default)|dracula|fancy|flamingo|material|nord|onedark>
|
ani-cli -t <aniwrapper (default)|dracula|fancy|flamingo|material|nord|onedark>
|
||||||
|
177
ani-cli
177
ani-cli
@ -49,44 +49,7 @@ logger() {
|
|||||||
[ "$VERBOSE" -eq 1 ] && printf "%s\n" "$*" >&2
|
[ "$VERBOSE" -eq 1 ] && printf "%s\n" "$*" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
search_anime() {
|
|
||||||
# get anime name along with its id
|
|
||||||
logger "NUM ARGS: $#"
|
|
||||||
if [[ $# -gt 1 ]]; then
|
|
||||||
# if multi-word query, concatenate into one string and replace spaces with '-'
|
|
||||||
search="$*"
|
|
||||||
search="${search// /-}"
|
|
||||||
else
|
|
||||||
# if one word, remove leading or trailing whitespace
|
|
||||||
search="${1// /}"
|
|
||||||
fi
|
|
||||||
logger "Search Query: $search"
|
|
||||||
titlepattern='<a href="/category/'
|
|
||||||
curl -s "$BASE_URL//search.html" \
|
|
||||||
-G \
|
|
||||||
-d "keyword=$search" |
|
|
||||||
sed -n -E '
|
|
||||||
s_^[[:space:]]*<a href="/category/([^"]*)" title="([^"]*)".*_\1_p
|
|
||||||
'
|
|
||||||
}
|
|
||||||
|
|
||||||
search_eps() {
|
|
||||||
# get available episodes for anime_id
|
|
||||||
anime_id=$1
|
|
||||||
|
|
||||||
curl -s "$BASE_URL/category/$anime_id" |
|
|
||||||
sed -n -E '
|
|
||||||
/^[[:space:]]*<a href="#" class="active" ep_start/{
|
|
||||||
s/.* '\''([0-9]*)'\'' ep_end = '\''([0-9]*)'\''.*/\2/p
|
|
||||||
q
|
|
||||||
}
|
|
||||||
'
|
|
||||||
}
|
|
||||||
|
|
||||||
check_input() {
|
check_input() {
|
||||||
logger "Checking input"
|
|
||||||
logger "EP START: $ep_choice_start"
|
|
||||||
logger "EP END: $ep_choice_end"
|
|
||||||
[ "$ep_choice_start" -eq "$ep_choice_start" ] 2> /dev/null || die "Invalid number entered: $ep_choice_start"
|
[ "$ep_choice_start" -eq "$ep_choice_start" ] 2> /dev/null || die "Invalid number entered: $ep_choice_start"
|
||||||
episodes=$ep_choice_start
|
episodes=$ep_choice_start
|
||||||
if [ -n "$ep_choice_end" ]; then
|
if [ -n "$ep_choice_end" ]; then
|
||||||
@ -110,23 +73,48 @@ get_dpage_link() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
printf '%s' "$anime_page" |
|
printf '%s' "$anime_page" |
|
||||||
sed -n -E 's/.*rel="13" data-video="([^"]*)".*/\1/p' | cut -d/ -f5
|
sed -n -E 's/^[[:space:]]*<a href="#" rel="100" data-video="([^"]*)".*/\1/p' |
|
||||||
|
sed 's/^/https:/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
decrypt_link() {
|
||||||
|
logger "BEGIN: decrypt_link()" > /dev/stderr
|
||||||
|
ajax_url="https://gogoplay.io/encrypt-ajax.php"
|
||||||
|
|
||||||
|
#get the id from the url
|
||||||
|
video_id=$(printf "$1" | cut -d\? -f2 | cut -d\& -f1 | sed 's/id=//g')
|
||||||
|
logger "video_id -> $video_id" > /dev/stderr
|
||||||
|
|
||||||
|
#construct ajax parameters
|
||||||
|
secret_key='3235373436353338353932393338333936373634363632383739383333323838'
|
||||||
|
iv='34323036393133333738303038313335'
|
||||||
|
ajax=$(printf "$video_id" | openssl enc -aes256 -K "$secret_key" -iv "$iv" -a)
|
||||||
|
logger "ajax -> $ajax" > /dev/stderr
|
||||||
|
|
||||||
|
#send the request to the ajax url
|
||||||
|
curl -s -H 'x-requested-with:XMLHttpRequest' "$ajax_url" -d "id=$ajax" -d "time=69420691337800813569" | tr '"' '\n' | sed -nE 's/.*cdn\.com.*/\0/p' | sed 's/\\//g'
|
||||||
|
logger "END: decrypt_link()" > /dev/stderr
|
||||||
}
|
}
|
||||||
|
|
||||||
get_video_quality() {
|
get_video_quality() {
|
||||||
dpage_url=$1
|
dpage_url=$1
|
||||||
|
video_links=$(decrypt_link "$dpage_url")
|
||||||
video_links=$(curl -s "https://sbplay2.com/d/$dpage_url" | sed -n -E 's/.*a href="#" onclick="download_video([^"]*)".*/\1/p' | head -1)
|
case $quality in
|
||||||
logger "VIDEO LINKS: $video_links" 1> /dev/stderr
|
best)
|
||||||
m=$(printf "%s" "$quality" | cut -c1)
|
video_link=$(printf '%s' "$video_links" | head -n 4 | tail -n 1)
|
||||||
h=$(printf "%s" "$video_links" | cut -d\' -f6)
|
;;
|
||||||
logger "constructed video link -> https://sbplay2.com/dl?op=download_orig&id=$dpage_url&mode=$m&hash=$h" 1> /dev/stderr
|
worst)
|
||||||
video_link=$(curl -s "https://sbplay2.com/dl?op=download_orig&id=$dpage_url&mode=$m&hash=$h" | sed -n -E 's/<a href="([^"]*.mp4)".*/\1/p')
|
video_link=$(printf '%s' "$video_links" | head -n 1)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
video_link=$(printf '%s' "$video_links" | grep -iE "${quality}" | head -n 1)
|
||||||
if [ -z "$video_link" ]; then
|
if [ -z "$video_link" ]; then
|
||||||
err "$quality quality doesn't exist, falling back to normal quality"
|
err "Current video quality is not available (defaulting to best quality)"
|
||||||
video_link=$(curl -s "https://sbplay2.com/dl?op=download_orig&id=$dpage_url&mode=n&hash=$h" | sed -n -E 's/<a href="([^"]*.mp4)".*/\1/p')
|
quality=best
|
||||||
|
video_link=$(printf '%s' "$video_links" | head -n 4 | tail -n 1)
|
||||||
fi
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
printf '%s' "$video_link"
|
printf '%s' "$video_link"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,10 +126,6 @@ dep_ch() {
|
|||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
run_stmt() {
|
|
||||||
printf "%s\n" "$1" | sqlite3 -noheader "$HISTORY_DB"
|
|
||||||
}
|
|
||||||
|
|
||||||
notification() {
|
notification() {
|
||||||
msg="$*"
|
msg="$*"
|
||||||
if command -v "notify-send" > /dev/null; then
|
if command -v "notify-send" > /dev/null; then
|
||||||
@ -151,16 +135,22 @@ notification() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generate_span() {
|
||||||
|
msg="$*"
|
||||||
|
span="<span foreground='#ecbe7b' style='italic' size='small'>$msg</span>"
|
||||||
|
printf "%s\n" "$span"
|
||||||
|
}
|
||||||
|
|
||||||
#####################
|
#####################
|
||||||
## Database Code ##
|
## Database Code ##
|
||||||
#####################
|
#####################
|
||||||
|
|
||||||
check_db() {
|
run_stmt() {
|
||||||
|
printf "%s\n" "$1" | sqlite3 -noheader "$HISTORY_DB"
|
||||||
|
}
|
||||||
|
|
||||||
# Return number of matches for anime/episode in db
|
# Return number of matches for anime/episode in db
|
||||||
# args:
|
check_db() {
|
||||||
# $1: anime name: str
|
|
||||||
# $2: either 'search' or 'watch' for which db to query
|
|
||||||
# logger "BEGIN check_db()"
|
|
||||||
if [[ "$1" == "directory" ]]; then
|
if [[ "$1" == "directory" ]]; then
|
||||||
stmt="SELECT DISTINCT COUNT(*) \
|
stmt="SELECT DISTINCT COUNT(*) \
|
||||||
FROM file_history \
|
FROM file_history \
|
||||||
@ -182,7 +172,6 @@ check_db() {
|
|||||||
fi
|
fi
|
||||||
res=$(run_stmt "$stmt")
|
res=$(run_stmt "$stmt")
|
||||||
return $res
|
return $res
|
||||||
# logger "END check_db... Result -> $res"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# return true (0) if $source_dt > $target_dt
|
# return true (0) if $source_dt > $target_dt
|
||||||
@ -236,9 +225,9 @@ update_date() {
|
|||||||
run_stmt "$stmt"
|
run_stmt "$stmt"
|
||||||
}
|
}
|
||||||
|
|
||||||
insert_history() {
|
|
||||||
# inserts into search/watch history db
|
# inserts into search/watch history db
|
||||||
# check the anime_name/id
|
# check the anime_name/id
|
||||||
|
insert_history() {
|
||||||
datetime=$(date +'%Y-%m-%d %H:%M:%S')
|
datetime=$(date +'%Y-%m-%d %H:%M:%S')
|
||||||
logger "Checking if ($*) exists in db"
|
logger "Checking if ($*) exists in db"
|
||||||
check_db "$@"
|
check_db "$@"
|
||||||
@ -276,18 +265,15 @@ sync_search_history() {
|
|||||||
errs=0
|
errs=0
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
anime_name=$(awk -F '|' '{print $2}' <<< "$line")
|
anime_name=$(awk -F '|' '{print $2}' <<< "$line")
|
||||||
# logger "Checking if $anime_name has been searched..."
|
|
||||||
res=$(sqlite3 -noheader "$HISTORY_DB" "SELECT COUNT(*) FROM search_history WHERE anime_name = '$anime_name'")
|
res=$(sqlite3 -noheader "$HISTORY_DB" "SELECT COUNT(*) FROM search_history WHERE anime_name = '$anime_name'")
|
||||||
if [[ "$res" -eq 0 ]]; then
|
if [[ "$res" -eq 0 ]]; then
|
||||||
search_date=$(awk -F '|' '{print $3}' <<< "$line")
|
search_date=$(awk -F '|' '{print $3}' <<< "$line")
|
||||||
# logger "Not found in db... Adding ($anime_name|$search_date) to search history..."
|
|
||||||
if ! sqlite3 "$HISTORY_DB" "INSERT INTO search_history(anime_name, search_date) VALUES('$anime_name', '$search_date')"; then
|
if ! sqlite3 "$HISTORY_DB" "INSERT INTO search_history(anime_name, search_date) VALUES('$anime_name', '$search_date')"; then
|
||||||
((++errs))
|
((++errs))
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
((++cnt))
|
((++cnt))
|
||||||
fi
|
fi
|
||||||
# logger
|
|
||||||
done < <(sqlite3 -list -noheader "$temp_db" "SELECT DISTINCT * FROM search_history")
|
done < <(sqlite3 -list -noheader "$temp_db" "SELECT DISTINCT * FROM search_history")
|
||||||
logger "$cnt rows inserted into search_history table"
|
logger "$cnt rows inserted into search_history table"
|
||||||
logger "$errs errors on insert"
|
logger "$errs errors on insert"
|
||||||
@ -298,11 +284,8 @@ sync_watch_history() {
|
|||||||
errs=0
|
errs=0
|
||||||
while read -r line; do
|
while read -r line; do
|
||||||
anime_name="${line/ //}"
|
anime_name="${line/ //}"
|
||||||
# some spacing for log messages
|
|
||||||
# logger && logger "ANIME: $anime_name"
|
|
||||||
# for each episode of $anime_name on the remote machine, check local
|
# for each episode of $anime_name on the remote machine, check local
|
||||||
while read -r ep; do
|
while read -r ep; do
|
||||||
# logger
|
|
||||||
episode_num=$(awk -F '|' '{print $1}' <<< "$ep")
|
episode_num=$(awk -F '|' '{print $1}' <<< "$ep")
|
||||||
watch_date=$(awk -F '|' '{print $NF}' <<< "$ep")
|
watch_date=$(awk -F '|' '{print $NF}' <<< "$ep")
|
||||||
if ! insert_history "$anime_name" "$episode_num" "$watch_date"; then
|
if ! insert_history "$anime_name" "$episode_num" "$watch_date"; then
|
||||||
@ -426,6 +409,10 @@ find_media() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#####################
|
||||||
|
## main code ##
|
||||||
|
#####################
|
||||||
|
|
||||||
# get query
|
# get query
|
||||||
get_search_query() {
|
get_search_query() {
|
||||||
# Get search history
|
# Get search history
|
||||||
@ -450,15 +437,39 @@ get_search_query() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_span() {
|
search_anime() {
|
||||||
msg="$*"
|
# get anime name along with its id
|
||||||
span="<span foreground='#ecbe7b' style='italic' size='small'>$msg</span>"
|
logger "NUM ARGS: $#"
|
||||||
printf "%s\n" "$span"
|
if [[ $# -gt 1 ]]; then
|
||||||
|
# if multi-word query, concatenate into one string and replace spaces with '-'
|
||||||
|
search="$*"
|
||||||
|
search="${search// /-}"
|
||||||
|
else
|
||||||
|
# if one word, remove leading or trailing whitespace
|
||||||
|
search="${1// /}"
|
||||||
|
fi
|
||||||
|
logger "Search Query: $search"
|
||||||
|
titlepattern='<a href="/category/'
|
||||||
|
curl -s "$BASE_URL//search.html" \
|
||||||
|
-G \
|
||||||
|
-d "keyword=$search" |
|
||||||
|
sed -n -E '
|
||||||
|
s_^[[:space:]]*<a href="/category/([^"]*)" title="([^"]*)".*_\1_p
|
||||||
|
'
|
||||||
}
|
}
|
||||||
|
|
||||||
#####################
|
search_eps() {
|
||||||
## Anime selection ##
|
# get available episodes for anime_id
|
||||||
#####################
|
anime_id=$1
|
||||||
|
|
||||||
|
curl -s "$BASE_URL/category/$anime_id" |
|
||||||
|
sed -n -E '
|
||||||
|
/^[[:space:]]*<a href="#" class="active" ep_start/{
|
||||||
|
s/.* '\''([0-9]*)'\'' ep_end = '\''([0-9]*)'\''.*/\2/p
|
||||||
|
q
|
||||||
|
}
|
||||||
|
'
|
||||||
|
}
|
||||||
|
|
||||||
anime_selection() {
|
anime_selection() {
|
||||||
# Select anime from query results
|
# Select anime from query results
|
||||||
@ -568,10 +579,6 @@ anime_selection() {
|
|||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
##################
|
|
||||||
## Ep selection ##
|
|
||||||
##################
|
|
||||||
|
|
||||||
episode_selection() {
|
episode_selection() {
|
||||||
ep_choice_start="1"
|
ep_choice_start="1"
|
||||||
if [ "$is_rofi" -eq 1 ]; then
|
if [ "$is_rofi" -eq 1 ]; then
|
||||||
@ -652,7 +659,8 @@ open_episode() {
|
|||||||
|
|
||||||
dpage_link=$(get_dpage_link "$anime_id" "$episode")
|
dpage_link=$(get_dpage_link "$anime_id" "$episode")
|
||||||
video_url=$(get_video_quality "$dpage_link")
|
video_url=$(get_video_quality "$dpage_link")
|
||||||
referer_link="https://sbplay2.com"
|
logger "Download link: $video_url"
|
||||||
|
logger "Video url: $video_url"
|
||||||
|
|
||||||
if [ $half_ep -eq 1 ]; then
|
if [ $half_ep -eq 1 ]; then
|
||||||
episode=$temp_ep
|
episode=$temp_ep
|
||||||
@ -661,9 +669,7 @@ open_episode() {
|
|||||||
|
|
||||||
if [ "$is_download" -eq 0 ]; then
|
if [ "$is_download" -eq 0 ]; then
|
||||||
kill "$PID" > /dev/null 2>&1
|
kill "$PID" > /dev/null 2>&1
|
||||||
logger "PLAYING VIDEO: $video_url"
|
nohup "$player_fn" --http-header-fields="Referer:$dpage_link" "$video_url" > /dev/null 2>&1 &
|
||||||
logger "REFERRER: $referer_link"
|
|
||||||
nohup "$player_fn" --http-header-fields="Referer:$referer_link" "$video_url" > /dev/null 2>&1 &
|
|
||||||
PID=$!
|
PID=$!
|
||||||
if command -v "notify-send" > /dev/null; then
|
if command -v "notify-send" > /dev/null; then
|
||||||
notify-send -i "$ANIWRAPPER_ICON_PATH" "Playing $anime_id - Episode $episode"
|
notify-send -i "$ANIWRAPPER_ICON_PATH" "Playing $anime_id - Episode $episode"
|
||||||
@ -672,18 +678,17 @@ open_episode() {
|
|||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
logger "Downloading episode $episode ..."
|
logger "Downloading episode $episode ..."
|
||||||
logger "$video_url"
|
|
||||||
dl_dir="${ddir// /}/$anime_id"
|
dl_dir="${ddir// /}/$anime_id"
|
||||||
# add 0 padding to the episode name
|
# add 0 padding to the episode name
|
||||||
episode=$(printf "%03d" "$episode")
|
episode=$(printf "%03d" "$episode")
|
||||||
{
|
{
|
||||||
mkdir -p "$dl_dir" || die "Could not create directory"
|
mkdir -p "$dl_dir" || die "Could not create directory"
|
||||||
if command -v "notify-send" > /dev/null; then
|
if command -v "notify-send" > /dev/null; then
|
||||||
aria2c -x 16 -s 16 --referer="$referer_link" "$video_url" --dir="$dl_dir" -o "$episode.mp4" --download-result=hide &&
|
aria2c -x 16 -s 16 --referer="$dpage_link" "$video_url" --dir="$dl_dir" -o "$episode.mp4" --download-result=hide &&
|
||||||
notify-send -i "$ANIWRAPPER_ICON_PATH" "Download complete for ${anime_id//-/ } - Episode: $episode" ||
|
notify-send -i "$ANIWRAPPER_ICON_PATH" "Download complete for ${anime_id//-/ } - Episode: $episode" ||
|
||||||
notify-send -i "$MAISAN_ICON_PATH" "Download failed for ${anime_id//-/ } - Episode: $episode. Please retry or check your internet connection"
|
notify-send -i "$MAISAN_ICON_PATH" "Download failed for ${anime_id//-/ } - Episode: $episode. Please retry or check your internet connection"
|
||||||
else
|
else
|
||||||
aria2c -x 16 -s 16 --referer="$referer_link" "$video_url" --dir="$dl_dir" -o "$episode.mp4" --download-result=hide &&
|
aria2c -x 16 -s 16 --referer="$dpage_link" "$video_url" --dir="$dl_dir" -o "$episode.mp4" --download-result=hide &&
|
||||||
printf "${c_green}Downloaded complete for %s - Episode: %s${c_reset}\n" "${anime_id//-/ }" "$episode" ||
|
printf "${c_green}Downloaded complete for %s - Episode: %s${c_reset}\n" "${anime_id//-/ }" "$episode" ||
|
||||||
printf "${c_red}Download failed for %s - Episode: %s, please retry or check your internet connection${c_reset}\n" "${anime_id//-/ }" "$episode"
|
printf "${c_red}Download failed for %s - Episode: %s, please retry or check your internet connection${c_reset}\n" "${anime_id//-/ }" "$episode"
|
||||||
|
|
||||||
@ -724,16 +729,12 @@ stream() {
|
|||||||
episode_selection
|
episode_selection
|
||||||
}
|
}
|
||||||
|
|
||||||
############
|
|
||||||
# Start Up #
|
|
||||||
############
|
|
||||||
|
|
||||||
# to clear the colors when exited using SIGINT
|
# to clear the colors when exited using SIGINT
|
||||||
trap "printf '$c_reset'" INT HUP
|
trap "printf '$c_reset'" INT HUP
|
||||||
|
|
||||||
# option parsing
|
# option parsing
|
||||||
scrape=query
|
scrape=query
|
||||||
quality=normal
|
quality=best
|
||||||
is_rofi=1
|
is_rofi=1
|
||||||
is_download=0
|
is_download=0
|
||||||
download_dir="."
|
download_dir="."
|
||||||
|
@ -11,7 +11,7 @@ CFG_FILE="$CFG_DIR/themes/aniwrapper.rasi"
|
|||||||
DEFAULT_DOWNLOAD="$HOME/Videos/sauce"
|
DEFAULT_DOWNLOAD="$HOME/Videos/sauce"
|
||||||
ROFI_THEME="aniwrapper.rasi"
|
ROFI_THEME="aniwrapper.rasi"
|
||||||
THEMES="aniwrapper (default)|dracula|doomone|fancy|flamingo|material|nord|onedark"
|
THEMES="aniwrapper (default)|dracula|doomone|fancy|flamingo|material|nord|onedark"
|
||||||
QUALITIES="1. high|2. normal (default)|3. low"
|
QUALITIES="1. best (default)|2. 1080p|3. 720p|4. 360p|5. worst"
|
||||||
QUALITY=normal
|
QUALITY=normal
|
||||||
DPI=96
|
DPI=96
|
||||||
GET_QUALITY=0
|
GET_QUALITY=0
|
||||||
@ -85,9 +85,9 @@ run() {
|
|||||||
get_quality() {
|
get_quality() {
|
||||||
if [ "$IS_ROFI" -eq 1 ]; then
|
if [ "$IS_ROFI" -eq 1 ]; then
|
||||||
selection=$(rofi -dpi "$DPI" -dmenu -config "$CFG_FILE" \
|
selection=$(rofi -dpi "$DPI" -dmenu -config "$CFG_FILE" \
|
||||||
-l 3 -selected-row 1 \
|
-l 5 -selected-row 0 \
|
||||||
-theme-str 'listview {columns: 1;}' -p "Choose video quality:" \
|
-theme-str 'listview {columns: 1;}' -p "Choose video quality:" \
|
||||||
-sep '|' <<< "$QUALITIES")
|
-sep '|' -only-match <<< "$QUALITIES")
|
||||||
QUALITY=$(awk '{print $2}' <<< "$selection")
|
QUALITY=$(awk '{print $2}' <<< "$selection")
|
||||||
else
|
else
|
||||||
printf "%s" "Enter quality [$QUALITIES]: "
|
printf "%s" "Enter quality [$QUALITIES]: "
|
||||||
|
Loading…
Reference in New Issue
Block a user