#!/bin/sh workdir="$HOME/.local/share/peertube-cli" instance=$(jj -i $workdir/config.json instance) pref_video_quality=$(jj -i $workdir/config.json prefer_quality_video) torrent_enabled=$(jj -i $workdir/config.json torrent_enabled) rpcport=9095 instance_hist="$workdir/instance.hist" ordering='title' tempvideostor=$(mktemp -d) default_player_command="mpv --hwdec --network-timeout=30 --profile=low-latency --cache=yes --cache-on-disk=yes --cache-dir=$tempvideostor --cache-unlink-files=immediate" mkdir -p $workdir if [ ! -f "$workdir/config.json" ]; then cp -r config.json transmission-daemon $workdir echo 'config created' fi instance_point="https://$instance/api/v1" default_curl_opt() { curl -s --compressed "$@" } torrent_init() { if [ "$torrent_enabled" = 'true' ]; then tmp_dir=$(mktemp -d) transmission-daemon -T -g $workdir/transmission-daemon -w $tmp_dir --password '' -p $rpcport fi } check_connect() { if [ -n "$(curl --head -s "$instance_point"/config | grep 'HTTP/. 200')" ]; then echo 'OK' else echo fi } peertube_api_check_ratelimit() { default_curl_opt --head "$instance_point/" | grep rate } peertube_api_version_server() { default_curl_opt "$instance_point/config" | jj serverVersion | cut -f 1 -d. } peertube_api_get_all_videos() { default_curl_opt "$instance_point/videos?count=100&start=$1" | jj -p | tee $workdir/preload >> /dev/null } peertube_api_get_local_videos() { if [ "$version" -gt 3 ]; then default_curl_opt "$instance_point/videos?count=100&start=$1&isLocal=true" | jj -p | tee $workdir/preload >> /dev/null else default_curl_opt "$instance_point/videos?count=100&start=$1&filter=local" | jj -p | tee $workdir/preload >> /dev/null fi } peertube_api_get_live_streams() { default_curl_opt "$instance_point/videos?count=100&start=$1&isLive=true&sort=-publishedAt" | jj -p | tee $workdir/preload >> /dev/null } peertube_api_get_livechat() { versions_plugin_livechat='6.0.0 5.9.0 5.8.0 5.7.1 5.7.0 5.6.0 5.5.0 5.4.0 5.3.0' for version_chat in $versions_plugin_livechat; do link_on_chat="https://$instance/plugins/livechat/$version_chat/router/webchat/room/$1" curl -s --head $link_on_chat | grep "HTTP\/. 200" if [ $? -eq 0 ]; then echo "$link_on_chat" chat_found=1 break fi done if [ -z $chat_found ]; then echo 'Chat not avalaible' fi } peertube_api_get_video() { default_curl_opt "$instance_point/videos/$1" } peertube_api_get_fulldescription() { default_curl_opt "$instance_point/videos/$1/description" | jj description } peertube_menu_videos() { echo "Avalaible $(jj -i $workdir/preload total) videos" sub_menu=1 page=0 while [ $sub_menu -eq 1 ]; do names=$(jj -i $workdir/preload -l 'data.#.name' | nl -s: -v0 -w1) 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 ;; *) index=$(echo "$menu_videos_choice" | cut -f 1 -d:) video_uuid=$(jj -i $workdir/preload data."$index".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) support_author=$(echo "$get_video" | jj support) if [ -n "$support_author" ]; then echo "Support/Donate: $support_author" fi 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" fulldescr= if [ -n "$desc" ]; then echo "Description video:\n$desc" echo '_____' fulldescr="\nFull description" fi menu_video_choice=$(echo "Play$fulldescr\nShare\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 ;; "Full description") fulldesc=$(peertube_api_get_fulldescription "$1") echo "$fulldesc" | less -e ;; "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)" ;; 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) support_author=$(echo "$get_video" | jj support) if [ -n "$support_author" ]; then echo "Support/Donate: $support_author" fi 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" fulldescr= if [ -n "$desc" ]; then echo "Description stream:\n$desc" echo '_____' fulldescr="\nFull description" fi menu_video_choice=$(echo "Play\nWait mode$fulldescr\nShare\nLive chat\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" ;; "Full description") fulldesc=$(peertube_api_get_fulldescription "$1") echo "$fulldesc" | less -e ;; "Share") echo "Link: https://$instance/w/$1" echo "Direct link: $playlist_stream" ;; "Live chat") peertube_api_get_livechat "$(echo "$get_video" | jj uuid)" ;; 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 $workdir/config.json prefer_quality_video -v "$resolution" -o $workdir/config.json export pref_video_quality="$resolution" ;; "$torrent_set") case $torrent_enabled in 'true') jj -i $workdir/config.json torrent_enabled -v 'false' -o $workdir/config.json export torrent_enabled='false' transmission-remote $rpcport --exit ;; 'false') jj -i $workdir/config.json torrent_enabled -v 'true' -o $workdir/config.json export torrent_enabled='true' torrent_init ;; esac esac done } if [ -z $(check_connect) ]; then echo 'Connect error...' echo 'Please retry later or switch instance' else echo "Connected to $instance" fi version=$(peertube_api_version_server) torrent_init videosmenu='All Videos' videosmenulocal='Local Videos' streamsmenu='Live streams' manualinput='Manual URL' changepod='Switch instance' settings='Settings' checkapilimits='Check API limits (debug)' Exit='Exit' while true; do choice=$(echo "$videosmenu\n$videosmenulocal\n$streamsmenu\n$manualinput\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' ;; "$manualinput") echo 'Type' type_choice=$(echo "Video\nStream" | fzy) echo 'Input link:' read url url=$(echo "$url" | rev | cut -f1 -d/ | rev) case $type_choice in "Video") peertube_menu_video "$url" ;; "Stream") peertube_menu_stream "$url" ;; esac ;; "$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 $workdir/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" if [ -z $(check_connect) ]; then echo 'Connect error...' echo 'Please retry later or switch instance' else echo "Connected to $instance" fi export version=$(peertube_api_version_server) conf_instance_state=$(echo 'Permanent\nTemporaly' | fzy) if [ "$conf_instance_state" = 'Permanent' ]; then jj -i $workdir/config.json instance -v "$instance" -o $workdir/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