2022-04-05 11:05:58 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
instance=$(jj -i config.json instance)
|
|
|
|
pref_video_quality=$(jj -i config.json prefer_quality_video)
|
2022-04-05 16:16:13 +00:00
|
|
|
torrent_enabled=$(jj -i config.json torrent_enabled)
|
2022-04-05 18:26:43 +00:00
|
|
|
rpcport=9095
|
2022-04-05 11:05:58 +00:00
|
|
|
instance_hist='instance.hist'
|
|
|
|
ordering='title'
|
|
|
|
default_player_command='mpv --network-timeout=30 --profile=low-latency'
|
|
|
|
|
|
|
|
instance_point="https://$instance/api/v1"
|
|
|
|
|
2022-04-05 16:16:13 +00:00
|
|
|
torrent_init()
|
|
|
|
{
|
|
|
|
if [ "$torrent_enabled" = 'true' ]; then
|
2022-04-05 18:26:43 +00:00
|
|
|
transmission-daemon -T -g transmission-daemon -w temp --password '' -p $rpcport
|
2022-04-05 16:16:13 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2022-04-06 13:23:40 +00:00
|
|
|
check_connect()
|
|
|
|
{
|
|
|
|
if [ -n "$(curl --head -s $instance_point/config | grep 'HTTP\/. 200')" ]; then
|
|
|
|
echo 'OK'
|
|
|
|
else
|
|
|
|
echo
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2022-04-05 11:05:58 +00:00
|
|
|
peertube_api_check_ratelimit()
|
|
|
|
{
|
|
|
|
curl -s --head "$instance_point/" | grep rate
|
|
|
|
}
|
|
|
|
|
2022-04-05 20:10:55 +00:00
|
|
|
peertube_api_version_server()
|
|
|
|
{
|
|
|
|
curl -s --compressed "$instance_point/config" | jj serverVersion | cut -f 1 -d.
|
|
|
|
}
|
|
|
|
|
2022-04-05 11:05:58 +00:00
|
|
|
peertube_api_get_all_videos()
|
|
|
|
{
|
2022-04-05 20:10:55 +00:00
|
|
|
curl -s --compressed "$instance_point/videos?count=100&start=$1" | jj -p | tee preload >> /dev/null
|
|
|
|
}
|
|
|
|
|
|
|
|
peertube_api_get_local_videos()
|
|
|
|
{
|
|
|
|
if [ $version -gt 3 ]; then
|
|
|
|
curl -s --compressed "$instance_point/videos?count=100&start=$1&isLocal=true" | jj -p | tee preload >> /dev/null
|
|
|
|
else
|
|
|
|
curl -s --compressed "$instance_point/videos?count=100&start=$1&filter=local" | jj -p | tee preload >> /dev/null
|
|
|
|
fi
|
2022-04-05 11:05:58 +00:00
|
|
|
}
|
|
|
|
|
2022-04-05 22:12:47 +00:00
|
|
|
peertube_api_get_live_streams()
|
|
|
|
{
|
|
|
|
curl -s --compressed "$instance_point/videos?count=100&start=$1&isLive=true&sort=-publishedAt" | jj -p | tee preload >> /dev/null
|
|
|
|
}
|
|
|
|
|
2022-04-05 11:05:58 +00:00
|
|
|
peertube_api_get_video()
|
|
|
|
{
|
|
|
|
curl -s --compressed "$instance_point/videos/$1"
|
|
|
|
}
|
|
|
|
|
2022-04-06 11:11:24 +00:00
|
|
|
peertube_api_get_fulldescription()
|
|
|
|
{
|
|
|
|
curl -s --compressed "$instance_point/videos/$1/description" | jj description
|
|
|
|
}
|
|
|
|
|
2022-04-05 11:05:58 +00:00
|
|
|
peertube_menu_videos()
|
|
|
|
{
|
|
|
|
echo "Avalaible $(jj -i preload total) videos"
|
|
|
|
sub_menu=1
|
2022-04-05 20:37:09 +00:00
|
|
|
page=0
|
2022-04-05 11:05:58 +00:00
|
|
|
while [ $sub_menu -eq 1 ]; do
|
2022-04-06 23:47:33 +00:00
|
|
|
names=$(jj -i preload -l 'data.#.name' | nl -s: -v0 -w1)
|
2022-04-05 20:37:09 +00:00
|
|
|
menu_videos_choice=$(echo "Main menu\n$names\nNext page" | fzy)
|
2022-04-05 11:05:58 +00:00
|
|
|
case $menu_videos_choice in
|
|
|
|
"Main menu") sub_menu=0 ;;
|
2022-04-05 20:37:09 +00:00
|
|
|
"Next page")
|
|
|
|
if [ "$1" = 'all' ]; then
|
|
|
|
page=$(expr $page + 100)
|
|
|
|
peertube_api_get_all_videos $page
|
|
|
|
else
|
|
|
|
page=$(expr $page + 100)
|
|
|
|
peertube_api_get_local_videos $page
|
|
|
|
fi ;;
|
2022-04-05 11:05:58 +00:00
|
|
|
*)
|
2022-04-06 23:47:33 +00:00
|
|
|
index=$(echo $menu_videos_choice | cut -f 1 -d:)
|
|
|
|
video_uuid=$(jj -i preload data.$index.uuid)
|
2022-04-05 22:12:47 +00:00
|
|
|
if [ "$1" = 'lives' ]; then
|
|
|
|
peertube_menu_stream $video_uuid
|
|
|
|
else
|
|
|
|
peertube_menu_video $video_uuid
|
|
|
|
fi ;;
|
2022-04-05 11:05:58 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
peertube_menu_video()
|
|
|
|
{
|
2022-04-05 18:26:43 +00:00
|
|
|
clear
|
2022-04-05 11:05:58 +00:00
|
|
|
sub2_menu=1
|
|
|
|
get_video=$(peertube_api_get_video $1)
|
|
|
|
while [ $sub2_menu -eq 1 ]; do
|
|
|
|
name=$(echo $get_video | jj name)
|
|
|
|
desc=$(echo $get_video | jj description)
|
|
|
|
channel=$(echo $get_video | jj channel.name)
|
2022-04-06 11:23:50 +00:00
|
|
|
support_author=$(echo $get_video | jj support)
|
|
|
|
if [ -n "$support_author" ]; then
|
|
|
|
echo "Support/Donate: $support_author"
|
|
|
|
fi
|
2022-04-05 22:31:15 +00:00
|
|
|
check_hls_empty=$(echo $get_video | jj streamingPlaylists.0)
|
|
|
|
if [ -z $check_hls_empty ]; then
|
|
|
|
hls=''
|
|
|
|
else
|
|
|
|
hls='streamingPlaylists.0.'
|
|
|
|
fi
|
|
|
|
video_url=$(echo $get_video | jj "$hls"files.#[resolution.id=$pref_video_quality].fileUrl)
|
|
|
|
torrent_url=$(echo $get_video | jj "$hls"files.#[resolution.id=$pref_video_quality].torrentUrl)
|
2022-04-05 11:05:58 +00:00
|
|
|
echo "Channel: $channel"
|
2022-04-06 11:34:07 +00:00
|
|
|
fulldescr=
|
|
|
|
if [ -n "$desc" ]; then
|
|
|
|
echo "Description video:\n$desc"
|
|
|
|
echo '_____'
|
|
|
|
fulldescr="\nFull description"
|
|
|
|
fi
|
2022-04-06 16:01:10 +00:00
|
|
|
menu_video_choice=$(echo "Play$fulldescr\nShare\nBack\nMain menu" | fzy)
|
2022-04-05 11:05:58 +00:00
|
|
|
case $menu_video_choice in
|
|
|
|
"Main menu") sub2_menu=0 && sub_menu=0 ;;
|
|
|
|
"Back") sub2_menu=0 ;;
|
|
|
|
"Play")
|
|
|
|
if [ -z "$video_url" ]; then
|
2022-04-05 17:36:11 +00:00
|
|
|
echo "Resolution $pref_video_quality"'p not avalaible'
|
2022-04-05 11:05:58 +00:00
|
|
|
echo 'Please choice:'
|
2022-04-05 22:31:15 +00:00
|
|
|
resolution=$(echo $get_video | jj -l "$hls"files.#.resolution.label | fzy)
|
|
|
|
video_url=$(echo $get_video | jj "$hls"files.#[resolution.label=$resolution].fileUrl)
|
|
|
|
torrent_url=$(echo $get_video | jj "$hls"files.#[resolution.label=$resolution].torrentUrl)
|
2022-04-05 11:05:58 +00:00
|
|
|
fi
|
2022-04-05 17:36:11 +00:00
|
|
|
|
2022-04-05 16:16:13 +00:00
|
|
|
if [ "$torrent_enabled" = 'true' ]; then
|
2022-04-05 18:26:43 +00:00
|
|
|
transmission-remote $rpcport -a $torrent_url
|
2022-04-05 17:36:11 +00:00
|
|
|
curl -s --tcp-fastopen --output - $video_url | $default_player_command -
|
2022-04-05 18:26:43 +00:00
|
|
|
transmission-remote $rpcport -t 1 -rad
|
2022-04-05 16:16:13 +00:00
|
|
|
else
|
2022-04-05 17:36:11 +00:00
|
|
|
curl -s --tcp-fastopen --output - $video_url | $default_player_command -
|
2022-04-05 16:16:13 +00:00
|
|
|
fi ;;
|
2022-04-06 11:11:24 +00:00
|
|
|
"Full description")
|
|
|
|
fulldesc=$(peertube_api_get_fulldescription $1)
|
|
|
|
echo "$fulldesc" | less -e ;;
|
2022-04-06 16:01:10 +00:00
|
|
|
|
|
|
|
"Share")
|
|
|
|
echo "Link: https://$instance/w/$1"
|
|
|
|
echo "Direct links:"
|
|
|
|
echo "$(echo $get_video | jj -l "$hls"files.#.resolution.label)"
|
|
|
|
echo "$(echo $get_video | jj -l "$hls"files.#.fileUrl)" ;;
|
2022-04-05 11:05:58 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2022-04-05 22:12:47 +00:00
|
|
|
peertube_menu_stream()
|
|
|
|
{
|
|
|
|
clear
|
|
|
|
sub2_menu=1
|
|
|
|
get_video=$(peertube_api_get_video $1)
|
|
|
|
while [ $sub2_menu -eq 1 ]; do
|
|
|
|
name=$(echo $get_video | jj name)
|
|
|
|
desc=$(echo $get_video | jj description)
|
|
|
|
channel=$(echo $get_video | jj channel.name)
|
2022-04-06 11:23:50 +00:00
|
|
|
support_author=$(echo $get_video | jj support)
|
|
|
|
if [ -n "$support_author" ]; then
|
|
|
|
echo "Support/Donate: $support_author"
|
|
|
|
fi
|
2022-04-05 22:12:47 +00:00
|
|
|
playlist_stream=$(echo $get_video | jj streamingPlaylists.0.playlistUrl)
|
|
|
|
state=$(echo $get_video | jj state.label)
|
|
|
|
echo "Status: $state"
|
|
|
|
#torrent_url=$(echo $get_video | jj streamingPlaylists.0.files.#[resolution.id=$pref_video_quality].torrentUrl)
|
|
|
|
echo "Channel: $channel"
|
2022-04-06 11:34:07 +00:00
|
|
|
fulldescr=
|
|
|
|
if [ -n "$desc" ]; then
|
|
|
|
echo "Description stream:\n$desc"
|
|
|
|
echo '_____'
|
|
|
|
fulldescr="\nFull description"
|
|
|
|
fi
|
2022-04-06 16:01:10 +00:00
|
|
|
menu_video_choice=$(echo "Play\nWait mode$fulldescr\nShare\nBack\nMain menu" | fzy)
|
2022-04-05 22:12:47 +00:00
|
|
|
case $menu_video_choice in
|
|
|
|
"Main menu") sub2_menu=0 && sub_menu=0 ;;
|
|
|
|
"Back") sub2_menu=0 ;;
|
|
|
|
"Play") $default_player_command $playlist_stream ;;
|
2022-04-06 00:25:25 +00:00
|
|
|
|
|
|
|
"Wait mode")
|
|
|
|
playlist_stream=$(echo $get_video | jj streamingPlaylists.0.playlistUrl)
|
|
|
|
echo 'Wait mode enabled...'
|
|
|
|
echo 'Stream will be played when published state'
|
|
|
|
while [ -z $playlist_stream ]; do
|
|
|
|
get_video=$(peertube_api_get_video $1)
|
|
|
|
playlist_stream=$(echo $get_video | jj streamingPlaylists.0.playlistUrl)
|
|
|
|
wait=15
|
|
|
|
while [ $wait -gt 0 ]; do
|
|
|
|
date
|
|
|
|
sleep 1
|
|
|
|
wait=$(expr $wait - 1)
|
|
|
|
done
|
|
|
|
done
|
|
|
|
clear
|
|
|
|
echo 'Stream PUBLISHED!'
|
|
|
|
$default_player_command $playlist_stream
|
|
|
|
;;
|
2022-04-06 11:11:24 +00:00
|
|
|
"Full description")
|
|
|
|
fulldesc=$(peertube_api_get_fulldescription $1)
|
2022-04-06 16:01:10 +00:00
|
|
|
echo "$fulldesc" | less -e ;;
|
|
|
|
|
|
|
|
"Share")
|
|
|
|
echo "Link: https://$instance/w/$1"
|
2022-04-06 17:20:25 +00:00
|
|
|
echo "Direct link: $playlist_stream" ;;
|
2022-04-05 22:12:47 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2022-04-05 11:05:58 +00:00
|
|
|
menu_settings()
|
|
|
|
{
|
|
|
|
sub_menu=1
|
|
|
|
while [ $sub_menu -eq 1 ]; do
|
2022-04-05 16:16:13 +00:00
|
|
|
default_res="Default resolution (current: $pref_video_quality)"
|
|
|
|
torrent_set="Torrent (current: $torrent_enabled)"
|
|
|
|
set_name=$(echo "Main menu\n$default_res\n$torrent_set" | fzy)
|
|
|
|
case $set_name in
|
2022-04-05 11:05:58 +00:00
|
|
|
"Main menu") sub_menu=0 ;;
|
|
|
|
|
2022-04-05 16:16:13 +00:00
|
|
|
"$default_res")
|
2022-04-05 11:05:58 +00:00
|
|
|
resolution=$(echo '144\n240\n288\n480\n720\n1080' | fzy)
|
|
|
|
jj -i config.json prefer_quality_video -v $resolution -o config.json
|
|
|
|
export pref_video_quality=$resolution ;;
|
2022-04-05 16:16:13 +00:00
|
|
|
|
|
|
|
"$torrent_set")
|
|
|
|
case $torrent_enabled in
|
|
|
|
'true')
|
|
|
|
jj -i config.json torrent_enabled -v 'false' -o config.json
|
|
|
|
export torrent_enabled='false'
|
2022-04-05 18:26:43 +00:00
|
|
|
transmission-remote $rpcport --exit ;;
|
2022-04-05 16:16:13 +00:00
|
|
|
|
|
|
|
'false')
|
|
|
|
jj -i config.json torrent_enabled -v 'true' -o config.json
|
|
|
|
export torrent_enabled='true'
|
|
|
|
torrent_init ;;
|
|
|
|
esac
|
2022-04-05 11:05:58 +00:00
|
|
|
esac
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2022-04-06 13:23:40 +00:00
|
|
|
if [ -z $(check_connect) ]; then
|
|
|
|
echo 'Connect error...'
|
|
|
|
echo 'Please retry later or switch instance'
|
2022-04-06 18:48:54 +00:00
|
|
|
else
|
|
|
|
echo "Connected to $instance"
|
2022-04-06 13:23:40 +00:00
|
|
|
fi
|
2022-04-05 20:10:55 +00:00
|
|
|
version=$(peertube_api_version_server)
|
2022-04-05 16:16:13 +00:00
|
|
|
torrent_init
|
2022-04-05 11:05:58 +00:00
|
|
|
videosmenu='All Videos'
|
|
|
|
videosmenulocal='Local Videos'
|
2022-04-05 22:12:47 +00:00
|
|
|
streamsmenu='Live streams'
|
2022-04-05 11:05:58 +00:00
|
|
|
changepod='Switch instance'
|
|
|
|
settings='Settings'
|
|
|
|
checkapilimits='Check API limits (debug)'
|
|
|
|
Exit='Exit'
|
|
|
|
|
|
|
|
while true; do
|
2022-04-05 22:12:47 +00:00
|
|
|
choice=$(echo "$videosmenu\n$videosmenulocal\n$streamsmenu\n$changepod\n$settings\n$checkapilimits\n$Exit" | fzy)
|
2022-04-05 11:05:58 +00:00
|
|
|
|
|
|
|
case "$choice" in
|
|
|
|
|
|
|
|
"$videosmenu")
|
2022-04-05 20:37:09 +00:00
|
|
|
peertube_api_get_all_videos 0
|
|
|
|
peertube_menu_videos 'all' ;;
|
2022-04-05 11:05:58 +00:00
|
|
|
|
|
|
|
"$videosmenulocal")
|
2022-04-05 20:37:09 +00:00
|
|
|
peertube_api_get_local_videos 0
|
|
|
|
peertube_menu_videos 'local' ;;
|
2022-04-05 22:12:47 +00:00
|
|
|
|
|
|
|
"$streamsmenu")
|
|
|
|
peertube_api_get_live_streams 0
|
|
|
|
peertube_menu_videos 'lives' ;;
|
2022-04-05 11:05:58 +00:00
|
|
|
|
|
|
|
"$changepod")
|
|
|
|
empty=0
|
|
|
|
case $(echo 'Recently used\nChoice from list\nManual input' | fzy) in
|
|
|
|
"Recently used")
|
|
|
|
if [ -s $instance_hist ]; then
|
|
|
|
touch $instance_hist && instance=$(cat $instance_hist | fzy)
|
|
|
|
else
|
|
|
|
echo 'No recently used instances...'
|
|
|
|
empty=1
|
|
|
|
fi ;;
|
|
|
|
|
|
|
|
"Choice from list") instance=$(jj -l -i config.json public_list_instances | sed 's/"//g' | fzy) ;;
|
|
|
|
|
|
|
|
"Manual input") echo "Type instance (ex. $instance):" && read instance ;;
|
|
|
|
esac
|
|
|
|
if [ $empty -eq 0 ]; then
|
|
|
|
echo $instance >> $instance_hist
|
|
|
|
cat $instance_hist | sort | uniq | tee $instance_hist 1>>/dev/null
|
|
|
|
export instance
|
|
|
|
export instance_point="https://$instance/api/v1"
|
2022-04-06 13:23:40 +00:00
|
|
|
if [ -z $(check_connect) ]; then
|
|
|
|
echo 'Connect error...'
|
|
|
|
echo 'Please retry later or switch instance'
|
2022-04-06 18:48:54 +00:00
|
|
|
else
|
|
|
|
echo "Connected to $instance"
|
2022-04-06 13:23:40 +00:00
|
|
|
fi
|
2022-04-05 20:10:55 +00:00
|
|
|
export version=$(peertube_api_version_server)
|
2022-04-05 11:05:58 +00:00
|
|
|
conf_instance_state=$(echo 'Permanent\nTemporaly' | fzy)
|
|
|
|
if [ "$conf_instance_state" = 'Permanent' ]; then
|
|
|
|
jj -i config.json instance -v $instance -o config.json
|
|
|
|
else
|
|
|
|
echo ''
|
|
|
|
fi
|
|
|
|
clear
|
|
|
|
fi ;;
|
|
|
|
|
|
|
|
"$settings") menu_settings ;;
|
|
|
|
|
|
|
|
"$checkapilimits") peertube_api_check_ratelimit ;;
|
|
|
|
|
2022-04-05 16:16:13 +00:00
|
|
|
"$Exit")
|
2022-04-05 20:10:55 +00:00
|
|
|
if [ $torrent_enabled = 'true' ]; then transmission-remote $rpcport --exit; fi
|
2022-04-05 16:16:13 +00:00
|
|
|
exit 0 ;;
|
2022-04-05 11:05:58 +00:00
|
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
done
|