bashtube/webroot/watch.shs
4 raccoons in a trenchcoat. / luna vivian 96458c41a8 hide "likes" word when video likes are turned off
As the title already says, this hides the "likes" word right next to where the like counter is supposed to be, when the video creator turned the like counter off for the video.
2023-04-20 00:18:51 +02:00

245 lines
8.5 KiB
Bash
Executable file

#!/bin/bash
source "${cfg[namespace]}/code/common.sh"
if [[ ! -d "temp" ]]; then
mkdir "temp"
fi
declare -A strings
#if [[ ! "$(which haruhi-dl)" ]]; then
# strings[error]='Could not load video'
# source templates/head.sh
# source "${cfg[namespace]}/templates/header.shs"
# render strings "${cfg[namespace]}/templates/themes/${cfg[template]}/watch_error.t"
# return
#fi
if [[ "${get_data[v]}" ]]; then
if [[ "${get_data[v]}" == '18l' || "${get_data[v]}" == '5eFdt6Y_34E' ]]; then
strings[uploader]='MyMusicGroup'
strings[title]='█▬█ █ ▀█▀ Jeden Osiem L - Jak Zapomnieć (Oficjalny Teledysk)'
formats='[{
"format_id": "44",
"url": "https://sakamoto.pl/tmp/videoplayback_.webm",
"asr": 44100,
"format_note": "480p",
"fps": 25,
"height": 480,
"tbr": 867,
"width": 640,
"ext": "webm",
"vcodec": "vp8",
"acodec": "vorbis"
}]'
subs='[]'
if [[ "${r[host]}" == "${cfg[flash_host]}" ]]; then
url='http://f.sakamoto.pl/videoplayback_.flv'
fi
if [[ ${cfg[template]} != 'retro' ]]; then
meta[title]="${strings[title]}"
#source templates/head.sh
source "${cfg[namespace]}/templates/header.shs"
fi
else
cd temp
video=$(yt-dlp --all-subs --write-pages --cookies "${cfg[_cookies]}" -J "http://youtube.com/watch?v=${get_data[v]}")
if [[ $video == '' ]]; then # okay who did this
random_hash=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 24 | head -n 1)
video=$(yt-dlp --all-subs --write-pages --cookies ${cfg[_cookies]} -J "http://youtube.com/watch?v=${get_data[v]}" 2> output$random_hash.log)
if [[ $video == '' ]]; then # seriously WHO DID THIS
if [[ "${cfg[regionlock_proxy]}" == true ]]; then
# retrying w/ proxy!
video=$(yt-dlp --all-subs --write-pages --cookies ${cfg[_cookies]} --proxy "${cfg[regionlock_proxy_url]}" -J "http://youtube.com/watch?v=${get_data[v]}" 2> output$random_hash.log)
fi
output=$(cat output$random_hash.log)
rm output$random_hash.log
if [[ $video == '' ]]; then
if [[ $output == 'ERROR: Video unavailable' ]]; then
strings[error]='Video unavailable'
elif [[ $output == *'ERROR: Incomplete YouTube ID'* ]]; then
strings[error]='Incomplete YouTube ID'
else
strings[error]='Unexpected error has occured'
fi
cd ..
echo "BBBBBBB ${cfg[template]}" > /dev/stderr
#source templates/head.sh
source "${cfg[namespace]}/templates/header.shs"
render strings "${cfg[namespace]}/templates/themes/${cfg[template]}/watch_error.html"
return
fi
fi
fi
cd ..
strings[channel_id]=$(jq -r '.channel_url' <<< "$video" | sed -s 's/.*\/channel\///')
strings[uploader]=$(jq -r '.uploader' <<< "$video")
strings[title]=$(jq -r '.title' <<< "$video")
if [[ ${cfg[template]} != 'retro' ]]; then
meta[title]="${strings[title]}"
meta[description]="$(jq -r '.description' <<< "$video")"
meta[unsafe]="
<meta property='og:image' content='https://i.ytimg.com/vi/$(html_encode "${get_data[v]}")/hqdefault.jpg'>
<meta property='og:type' content='video.other'>
<meta property='video:duration' content='$(jq -r '.duration' <<< "$video")'>
"'<script type="application/ld+json">'"$(jq -c '{
"@context": "https://schema.org",
"@type": "VideoObject",
"name": .title,
"alternateName": .alt_title,
"description": .description,
"thumbnail": .thumbnails[-1].url,
"duration": ("PT" + (.duration | tostring) + "S"),
}' <<< "$video" | sed 's/</\&#60;/g;s/>/\&#62;/g;')"'</script>'
#source templates/head.sh
source "${cfg[namespace]}/templates/header.shs"
fi
formats=$(jq -c '[.formats[] | select(.protocol == "https") | {"format_id":.format_id,"url":.url,"ext":.ext,"width":.width,"height":.height,"format_note":.format_note,"acodec":.acodec,"vcodec":.vcodec,"abr":.abr,"fps":.fps}]' <<< "$video")
sub_array=()
for i in $(jq -r '.subtitles | keys[]' <<< "$video"); do
sub_array+=("$(jq '.subtitles.'"$i"'[] | select(.ext == "vtt").url | {"url": ., "lang":"'"$i"'"}' <<< "$video")")
done
subs=$(jq -s '.' <<< "${sub_array[@]}")
fi
if [[ "${r[host]}" == "${cfg[flash_host]}" ]]; then
IFS=$'\n'
urls=($(jq -r '.formats[] | select(.format_id == "22" or .format_id == "18").url' <<< "$video"))
unset IFS
if [[ "$url" == '' ]]; then
if [[ ${urls[1]} != '' ]]; then
url=${urls[1]}
else
url=${urls[0]}
fi
fi
declare -A player
player[url]=$(xxd -p <<< "$url" | sed -E 's/.{2}/%&/g' | tr -d '\n')
player_render="$(render player "${cfg[namespace]}/templates/components/player_flash.html")"
else
declare -A player
player[@formats]="$formats"
player[@subs]="$subs"
player_render="$(render player "${cfg[namespace]}/templates/components/player.html")"
fi
strings[upload_date]=$(date -d "$(echo $video | jq -r '.upload_date' | sed -E 's/..../&-/;s/....-../&-/')" "+%d %B %Y")
strings[view_count]=$(jq -r '.view_count' <<< "$video" | format_numbers)
like_count=$(jq -r '.like_count' <<< "$video" | format_numbers)
if [[ $like_count == 'null' ]]; then
strings[like_count]="Likes are turned off..."
else
strings[like_count]="$like_count"
strings[?like_state]=true
fi
strings[sub]=''
strings[id]="${get_data[v]}"
#<video id='player' src='$url' controls></video>
if [[ "${cookies[sh_session]}" != '' ]]; then
if [[ $(grep $(session_get_username "${cookies[sh_session]}") storage/faves | grep "${get_data[v]}") == '' ]]; then
strings[?fav]=true
else
strings[?unfav]=true
fi
if [[ $(grep $(session_get_username "${cookies[sh_session]}") storage/subscribed | grep "${strings[channel_id]}") == '' ]]; then
strings[?sub]=true
else
strings[?unsub]=true
fi
else
strings[?login]=true
strings[login_r]=$(sed -s 's/?/___/' <<< "${r[url]}")
fi
strings[description]=$(jq -r '.description' <<< "$video")
# youtube-dl modifies the filename when writing with --write-pages
# params restricted=True, is_id=False to https://github.com/ytdl-org/youtube-dl/blob/70d0d4f9beba0e5b6d95ee50ad62ae7ab5be9be1/youtube_dl/utils.py#L2079
# this accurately replicates the algorithm without as much complexity
written_id="$(sed -E -e 's/__+/_/g' \
-e 's/^_*(-_)?//' \
-e 's/^-/_/' \
<<< "${get_data[v]}")"
vid="$(cat "temp/${written_id}_https_-_"*"watch"*".dump")"
vid_json="$(tr -d '\n' <<< "$vid" | grep -Poh "ytInitialData.*?</script>" | sed 's/ytInitialData = //;s/<\/script>//')"
#strings[recommended]=$()
_jq_to_array '.contents.twoColumnWatchNextResults.secondaryResults.secondaryResults.results[] | .compactAutoplayRenderer.contents[0].compactVideoRenderer, .compactVideoRenderer |
if .videoId != null then
[.videoId,
.title.simpleText]
else
empty
end | @sh' <<< "$vid_json"
nested_declare rec
declare -A rec_
for (( x=0; x<${#_tmp[@]}; x=x+2 )); do
rec_[id]="${_tmp[$x]}"
rec_[title]="${_tmp[$((x+1))]}"
nested_add rec rec_
done
strings[_recommended]="rec"
strings[next]=""
if [[ "${get_data[playlist]}" ]]; then
playlist=$(yt-dlp --cookies ${cfg[_cookies]} -j --flat-playlist "https://www.youtube.com/playlist?list=${get_data[playlist]}")
IFS=$'\n'
video_title=($(jq -r '.title' <<< $playlist))
video_id=($(jq -r '.id' <<< $playlist))
for (( i=0; i<${#video_id[@]}; i++ )); do
if [[ "${video_id[$i]}" == "${get_data[v]}" ]]; then
next="${video_id[$((i+1))]}"
break
fi
done
[[ "$next" == '' ]] && next='dQw4w9WgXcQ'
strings[?playlist]=true
strings[playlist_id]="$(html_encode "${get_data[playlist]}")"
strings[next]="$next"
nested_declare list
declare -A list_
for (( i=0; i<${#video_id[@]}; i++ )); do
list_[id]="${video_id[$i]}"
list_[title]="${video_title[$i]}"
list_[playlist_id]="$(html_encode "${get_data[playlist]}")"
nested_add list list_
done
strings[_playlist]="list"
fi
if [[ ! "${strings[recommended]}" ]]; then
strings[recommended]='An error occurred during fetching recommended videos'
fi
if [[ ! "${strings[comments_list]}" ]]; then
strings[comments_list]='An error ocurred during fetching comments.'
fi
#[[ "${cfg[template]}" != "retro" ]] && source "${cfg[namespace]}/templates/header.shs"
strings[@player]="$player_render"
strings[@header]="$(cat "${cfg[namespace]}/templates/themes/${cfg[template]}/elements/top.html")"
strings[@footer]="$(cat "${cfg[namespace]}/templates/themes/${cfg[template]}/elements/footer.html")"
render strings "${cfg[namespace]}/templates/themes/${cfg[template]}/watch.html"
else
#source templates/head.sh
source "${cfg[namespace]}/templates/header.shs"
echo "<h1>hey uh...</h1>...you forgot to provide a video ID...<br><a href='/'>Go back to the homepage</a>"
fi