mirror of
https://github.com/ksyasuda/aniwrapper.git
synced 2024-10-28 04:44:11 -07:00
update to scrape gogoplay
This commit is contained in:
parent
9ad13ae95a
commit
44438b3a47
@ -193,7 +193,7 @@ aniwrapper -C
|
||||
aniwrapper -Q <query>
|
||||
|
||||
# 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
|
||||
aniwrapper -T <path_to_config>
|
||||
@ -258,7 +258,7 @@ ani-cli -H
|
||||
ani-cli -s
|
||||
|
||||
# choose quality
|
||||
ani-cli -q <high|normal (default)|low>
|
||||
ani-cli -q <best (default)|1080p|720p|480p|360p|worst>
|
||||
|
||||
# choose rofi theme from presets
|
||||
ani-cli -t <aniwrapper (default)|dracula|fancy|flamingo|material|nord|onedark>
|
||||
|
183
ani-cli
183
ani-cli
@ -49,44 +49,7 @@ logger() {
|
||||
[ "$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() {
|
||||
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"
|
||||
episodes=$ep_choice_start
|
||||
if [ -n "$ep_choice_end" ]; then
|
||||
@ -110,23 +73,48 @@ get_dpage_link() {
|
||||
fi
|
||||
|
||||
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() {
|
||||
dpage_url=$1
|
||||
|
||||
video_links=$(curl -s "https://sbplay2.com/d/$dpage_url" | sed -n -E 's/.*a href="#" onclick="download_video([^"]*)".*/\1/p' | head -1)
|
||||
logger "VIDEO LINKS: $video_links" 1> /dev/stderr
|
||||
m=$(printf "%s" "$quality" | cut -c1)
|
||||
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
|
||||
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')
|
||||
if [ -z "$video_link" ]; then
|
||||
err "$quality quality doesn't exist, falling back to normal 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')
|
||||
fi
|
||||
|
||||
video_links=$(decrypt_link "$dpage_url")
|
||||
case $quality in
|
||||
best)
|
||||
video_link=$(printf '%s' "$video_links" | head -n 4 | tail -n 1)
|
||||
;;
|
||||
worst)
|
||||
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
|
||||
err "Current video quality is not available (defaulting to best quality)"
|
||||
quality=best
|
||||
video_link=$(printf '%s' "$video_links" | head -n 4 | tail -n 1)
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
printf '%s' "$video_link"
|
||||
}
|
||||
|
||||
@ -138,10 +126,6 @@ dep_ch() {
|
||||
done
|
||||
}
|
||||
|
||||
run_stmt() {
|
||||
printf "%s\n" "$1" | sqlite3 -noheader "$HISTORY_DB"
|
||||
}
|
||||
|
||||
notification() {
|
||||
msg="$*"
|
||||
if command -v "notify-send" > /dev/null; then
|
||||
@ -151,16 +135,22 @@ notification() {
|
||||
fi
|
||||
}
|
||||
|
||||
generate_span() {
|
||||
msg="$*"
|
||||
span="<span foreground='#ecbe7b' style='italic' size='small'>$msg</span>"
|
||||
printf "%s\n" "$span"
|
||||
}
|
||||
|
||||
#####################
|
||||
## Database Code ##
|
||||
#####################
|
||||
|
||||
run_stmt() {
|
||||
printf "%s\n" "$1" | sqlite3 -noheader "$HISTORY_DB"
|
||||
}
|
||||
|
||||
# Return number of matches for anime/episode in db
|
||||
check_db() {
|
||||
# Return number of matches for anime/episode in db
|
||||
# args:
|
||||
# $1: anime name: str
|
||||
# $2: either 'search' or 'watch' for which db to query
|
||||
# logger "BEGIN check_db()"
|
||||
if [[ "$1" == "directory" ]]; then
|
||||
stmt="SELECT DISTINCT COUNT(*) \
|
||||
FROM file_history \
|
||||
@ -182,7 +172,6 @@ check_db() {
|
||||
fi
|
||||
res=$(run_stmt "$stmt")
|
||||
return $res
|
||||
# logger "END check_db... Result -> $res"
|
||||
}
|
||||
|
||||
# return true (0) if $source_dt > $target_dt
|
||||
@ -236,9 +225,9 @@ update_date() {
|
||||
run_stmt "$stmt"
|
||||
}
|
||||
|
||||
# inserts into search/watch history db
|
||||
# check the anime_name/id
|
||||
insert_history() {
|
||||
# inserts into search/watch history db
|
||||
# check the anime_name/id
|
||||
datetime=$(date +'%Y-%m-%d %H:%M:%S')
|
||||
logger "Checking if ($*) exists in db"
|
||||
check_db "$@"
|
||||
@ -276,18 +265,15 @@ sync_search_history() {
|
||||
errs=0
|
||||
while read -r line; do
|
||||
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'")
|
||||
if [[ "$res" -eq 0 ]]; then
|
||||
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
|
||||
((++errs))
|
||||
continue
|
||||
fi
|
||||
((++cnt))
|
||||
fi
|
||||
# logger
|
||||
done < <(sqlite3 -list -noheader "$temp_db" "SELECT DISTINCT * FROM search_history")
|
||||
logger "$cnt rows inserted into search_history table"
|
||||
logger "$errs errors on insert"
|
||||
@ -298,11 +284,8 @@ sync_watch_history() {
|
||||
errs=0
|
||||
while read -r line; do
|
||||
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
|
||||
while read -r ep; do
|
||||
# logger
|
||||
episode_num=$(awk -F '|' '{print $1}' <<< "$ep")
|
||||
watch_date=$(awk -F '|' '{print $NF}' <<< "$ep")
|
||||
if ! insert_history "$anime_name" "$episode_num" "$watch_date"; then
|
||||
@ -426,6 +409,10 @@ find_media() {
|
||||
esac
|
||||
}
|
||||
|
||||
#####################
|
||||
## main code ##
|
||||
#####################
|
||||
|
||||
# get query
|
||||
get_search_query() {
|
||||
# Get search history
|
||||
@ -450,15 +437,39 @@ get_search_query() {
|
||||
fi
|
||||
}
|
||||
|
||||
generate_span() {
|
||||
msg="$*"
|
||||
span="<span foreground='#ecbe7b' style='italic' size='small'>$msg</span>"
|
||||
printf "%s\n" "$span"
|
||||
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
|
||||
'
|
||||
}
|
||||
|
||||
#####################
|
||||
## Anime selection ##
|
||||
#####################
|
||||
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
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
anime_selection() {
|
||||
# Select anime from query results
|
||||
@ -568,10 +579,6 @@ anime_selection() {
|
||||
EOF
|
||||
}
|
||||
|
||||
##################
|
||||
## Ep selection ##
|
||||
##################
|
||||
|
||||
episode_selection() {
|
||||
ep_choice_start="1"
|
||||
if [ "$is_rofi" -eq 1 ]; then
|
||||
@ -652,7 +659,8 @@ open_episode() {
|
||||
|
||||
dpage_link=$(get_dpage_link "$anime_id" "$episode")
|
||||
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
|
||||
episode=$temp_ep
|
||||
@ -661,9 +669,7 @@ open_episode() {
|
||||
|
||||
if [ "$is_download" -eq 0 ]; then
|
||||
kill "$PID" > /dev/null 2>&1
|
||||
logger "PLAYING VIDEO: $video_url"
|
||||
logger "REFERRER: $referer_link"
|
||||
nohup "$player_fn" --http-header-fields="Referer:$referer_link" "$video_url" > /dev/null 2>&1 &
|
||||
nohup "$player_fn" --http-header-fields="Referer:$dpage_link" "$video_url" > /dev/null 2>&1 &
|
||||
PID=$!
|
||||
if command -v "notify-send" > /dev/null; then
|
||||
notify-send -i "$ANIWRAPPER_ICON_PATH" "Playing $anime_id - Episode $episode"
|
||||
@ -672,18 +678,17 @@ open_episode() {
|
||||
fi
|
||||
else
|
||||
logger "Downloading episode $episode ..."
|
||||
logger "$video_url"
|
||||
dl_dir="${ddir// /}/$anime_id"
|
||||
# add 0 padding to the episode name
|
||||
episode=$(printf "%03d" "$episode")
|
||||
{
|
||||
mkdir -p "$dl_dir" || die "Could not create directory"
|
||||
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 "$MAISAN_ICON_PATH" "Download failed for ${anime_id//-/ } - Episode: $episode. Please retry or check your internet connection"
|
||||
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_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
|
||||
}
|
||||
|
||||
############
|
||||
# Start Up #
|
||||
############
|
||||
|
||||
# to clear the colors when exited using SIGINT
|
||||
trap "printf '$c_reset'" INT HUP
|
||||
|
||||
# option parsing
|
||||
scrape=query
|
||||
quality=normal
|
||||
quality=best
|
||||
is_rofi=1
|
||||
is_download=0
|
||||
download_dir="."
|
||||
|
@ -11,7 +11,7 @@ CFG_FILE="$CFG_DIR/themes/aniwrapper.rasi"
|
||||
DEFAULT_DOWNLOAD="$HOME/Videos/sauce"
|
||||
ROFI_THEME="aniwrapper.rasi"
|
||||
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
|
||||
DPI=96
|
||||
GET_QUALITY=0
|
||||
@ -85,9 +85,9 @@ run() {
|
||||
get_quality() {
|
||||
if [ "$IS_ROFI" -eq 1 ]; then
|
||||
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:" \
|
||||
-sep '|' <<< "$QUALITIES")
|
||||
-sep '|' -only-match <<< "$QUALITIES")
|
||||
QUALITY=$(awk '{print $2}' <<< "$selection")
|
||||
else
|
||||
printf "%s" "Enter quality [$QUALITIES]: "
|
||||
|
Loading…
Reference in New Issue
Block a user