#!/bin/sh instance=$(jj -i config.json instance) pref_video_quality=$(jj -i config.json prefer_quality_video) torrent_enabled=$(jj -i config.json torrent_enabled) rpcport=9095 instance_hist='instance.hist' ordering='title' default_player_command='mpv --network-timeout=30 --profile=low-latency' instance_point="https://$instance/api/v1" torrent_init() { if [ "$torrent_enabled" = 'true' ]; then transmission-daemon -T -g transmission-daemon -w temp --password '' -p $rpcport fi } peertube_api_check_ratelimit() { curl -s --head "$instance_point/" | grep rate } peertube_api_version_server() { curl -s --compressed "$instance_point/config" | jj serverVersion | cut -f 1 -d. } peertube_api_get_all_videos() { 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 } 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 } peertube_api_get_video() { curl -s --compressed "$instance_point/videos/$1" } peertube_menu_videos() { echo "Avalaible $(jj -i preload total) videos" sub_menu=1 page=0 while [ $sub_menu -eq 1 ]; do names=$(jj -i preload -l 'data.#.name') menu_videos_choice=$(echo "Main menu\n$names\nNext page" | fzy) case $menu_videos_choice in "Main menu") sub_menu=0 ;; "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 ;; *) video_uuid=$(jj -i preload data.#[name="$menu_videos_choice"].uuid) if [ "$1" = 'lives' ]; then peertube_menu_stream $video_uuid else peertube_menu_video $video_uuid fi ;; esac done } peertube_menu_video() { 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) 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) echo "Channel: $channel" echo "Description video:\n$desc" menu_video_choice=$(echo "Play\nBack\nMain menu" | fzy) case $menu_video_choice in "Main menu") sub2_menu=0 && sub_menu=0 ;; "Back") sub2_menu=0 ;; "Play") if [ -z "$video_url" ]; then echo "Resolution $pref_video_quality"'p not avalaible' echo 'Please choice:' 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) fi if [ "$torrent_enabled" = 'true' ]; then transmission-remote $rpcport -a $torrent_url curl -s --tcp-fastopen --output - $video_url | $default_player_command - transmission-remote $rpcport -t 1 -rad else curl -s --tcp-fastopen --output - $video_url | $default_player_command - fi ;; esac done } 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) 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" echo "Description video:\n$desc" menu_video_choice=$(echo "Play\nWait mode\nBack\nMain menu" | fzy) case $menu_video_choice in "Main menu") sub2_menu=0 && sub_menu=0 ;; "Back") sub2_menu=0 ;; "Play") $default_player_command $playlist_stream ;; "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 ;; esac done } menu_settings() { sub_menu=1 while [ $sub_menu -eq 1 ]; do 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 "Main menu") sub_menu=0 ;; "$default_res") 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 ;; "$torrent_set") case $torrent_enabled in 'true') jj -i config.json torrent_enabled -v 'false' -o config.json export torrent_enabled='false' transmission-remote $rpcport --exit ;; 'false') jj -i config.json torrent_enabled -v 'true' -o config.json export torrent_enabled='true' torrent_init ;; esac esac done } version=$(peertube_api_version_server) torrent_init videosmenu='All Videos' videosmenulocal='Local Videos' streamsmenu='Live streams' changepod='Switch instance' settings='Settings' checkapilimits='Check API limits (debug)' Exit='Exit' while true; do choice=$(echo "$videosmenu\n$videosmenulocal\n$streamsmenu\n$changepod\n$settings\n$checkapilimits\n$Exit" | fzy) case "$choice" in "$videosmenu") peertube_api_get_all_videos 0 peertube_menu_videos 'all' ;; "$videosmenulocal") peertube_api_get_local_videos 0 peertube_menu_videos 'local' ;; "$streamsmenu") peertube_api_get_live_streams 0 peertube_menu_videos 'lives' ;; "$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" export version=$(peertube_api_version_server) 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 ;; "$Exit") if [ $torrent_enabled = 'true' ]; then transmission-remote $rpcport --exit; fi exit 0 ;; esac done