make a client
This commit is contained in:
parent
8ed01eb6a9
commit
1dd1169794
51
tstream
51
tstream
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Kimapr's streaming setup
|
# Kimapr's streaming setup
|
||||||
# how to use:
|
# how to use:
|
||||||
# install ncat, lua (tested with 5.4.3), and script
|
# install tmux, ncat, lua (tested with 5.4.3), and script
|
||||||
# mkdir ~/stream
|
# mkdir ~/stream
|
||||||
# make a text file ~/stream/welcome, it will be displayed on stream startup.
|
# make a text file ~/stream/welcome, it will be displayed on stream startup.
|
||||||
# make a text file ~/stream/the_end, it will be displayed on stream end.
|
# make a text file ~/stream/the_end, it will be displayed on stream end.
|
||||||
|
@ -10,6 +10,25 @@
|
||||||
# end the stream by exitting from the shell in the stream window
|
# end the stream by exitting from the shell in the stream window
|
||||||
# you can also replay past streams using `scriptreplay -O live -T live-timing` in ~/stream/hist/*/
|
# you can also replay past streams using `scriptreplay -O live -T live-timing` in ~/stream/hist/*/
|
||||||
|
|
||||||
|
echo "checking dependencies..."
|
||||||
|
if ! tmux -V; then
|
||||||
|
echo "tmux not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! ncat --version; then
|
||||||
|
echo "ncat not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! lua -v; then
|
||||||
|
echo "lua not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! script --version; then
|
||||||
|
echo "script not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "all tests pass!"
|
||||||
|
|
||||||
echo "usage: tstream <port> <width> <height> [max bandwidth in KiB/s (per-client)]"
|
echo "usage: tstream <port> <width> <height> [max bandwidth in KiB/s (per-client)]"
|
||||||
port=$1
|
port=$1
|
||||||
width=$2
|
width=$2
|
||||||
|
@ -18,15 +37,20 @@ bandwidth=$4
|
||||||
if [ "x$bandwidth" = "x" ]; then
|
if [ "x$bandwidth" = "x" ]; then
|
||||||
bandwidth=32
|
bandwidth=32
|
||||||
fi
|
fi
|
||||||
randid=`head -c 16 /dev/urandom | xxd -p`
|
unset TMUX
|
||||||
|
randid=`head -c 4 /dev/urandom | xxd -p`
|
||||||
name=`date -u +%Y-%m-%d_%H-%M-%S_UTC`
|
name=`date -u +%Y-%m-%d_%H-%M-%S_UTC`
|
||||||
tmux new-session -d -s wstream_$randid "clear;cat ~/stream/welcome;$SHELL"
|
tmux new-session -d -s wstream_$randid "tmux set status-left-length 100;clear;cat ~/stream/welcome;$SHELL"
|
||||||
tmux resize-window -t wstream_$randid -x $width -y $(($height - 1))
|
tmux resize-window -t wstream_$randid -x $(($width)) -y $(($height - 1))
|
||||||
tmux set-option -t wstream_$randid status-right "? viewers"
|
tmux set-option -t wstream_$randid status-right "? viewers"
|
||||||
cat >/tmp/tstream-helper_$randid <<EOF
|
cat >/tmp/tstream-helper_$randid <<EOF
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
tmux set status off
|
||||||
|
#tmux unbind -a
|
||||||
|
tmux set prefix None
|
||||||
clear
|
clear
|
||||||
TMUX= tmux attach -t wstream_$randid
|
TMUX= tmux attach -t wstream_$randid
|
||||||
|
sleep 2
|
||||||
clear
|
clear
|
||||||
cat ~/stream/the_end
|
cat ~/stream/the_end
|
||||||
for i in \$(seq 7); do
|
for i in \$(seq 7); do
|
||||||
|
@ -149,13 +173,23 @@ chmod +x /tmp/tstream-smarttail_$randid
|
||||||
cat >/tmp/tstream-cat_$randid <<EOF
|
cat >/tmp/tstream-cat_$randid <<EOF
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
vcrefresh='$vcrefresh'
|
vcrefresh='$vcrefresh'
|
||||||
echo "\$vcrefresh"
|
echo "SIZE $width $height"
|
||||||
{ sleep 5;/tmp/tstream-refresh_$randid; } &
|
echo "# Welcome to a text livestream."
|
||||||
echo "Welcome to Kimapr's stream. Please wait..."
|
echo "# Powered by tstream: https://gitlab.com/Kimapr/tstream"
|
||||||
|
echo "# Before you continue, make sure your terminal is exactly ${width}x$height sized, otherwise rendering errors would occur."
|
||||||
|
echo "# Here's one way to do it: disconnect, run the following command"
|
||||||
|
echo "# $ tmux new \"tmux resize-window -x $width -y $height; tmux set status off; \\\$SHELL\""
|
||||||
|
echo "# After executing the above command, a ${width}x$height sized terminal window would appear in your terminal. Then you can connect to the server the same way as you did before."
|
||||||
|
echo "# Alternatively, if your terminal supports dynamic resizing you can just resize your terminal to the right size, without disconnecting."
|
||||||
|
echo "# There's also a custom client that does it for you: https://gitlab.com/Kimapr/tstream/-/raw/master/tstream-client"
|
||||||
|
echo "# Press Return/Enter to continue..."
|
||||||
|
head -n 1;
|
||||||
|
{ sleep 0.5;/tmp/tstream-refresh_$randid; } &
|
||||||
echo \$((\$(cat /tmp/tstream-count_$randid) + 1)) > /tmp/tstream-count_$randid
|
echo \$((\$(cat /tmp/tstream-count_$randid) + 1)) > /tmp/tstream-count_$randid
|
||||||
sh -c "\$vcrefresh"
|
sh -c "\$vcrefresh"
|
||||||
/tmp/tstream-smarttail_$randid
|
/tmp/tstream-smarttail_$randid
|
||||||
echo \$((\$(cat /tmp/tstream-count_$randid) - 1)) > /tmp/tstream-count_$randid
|
echo \$((\$(cat /tmp/tstream-count_$randid) - 1)) > /tmp/tstream-count_$randid
|
||||||
|
sleep 1
|
||||||
sh -c "\$vcrefresh"
|
sh -c "\$vcrefresh"
|
||||||
EOF
|
EOF
|
||||||
chmod +x /tmp/tstream-cat_$randid
|
chmod +x /tmp/tstream-cat_$randid
|
||||||
|
@ -163,6 +197,7 @@ chmod +x /tmp/tstream-refresh_$randid
|
||||||
touch /tmp/tstream-seektimes_$randid
|
touch /tmp/tstream-seektimes_$randid
|
||||||
{
|
{
|
||||||
while true; do
|
while true; do
|
||||||
|
tmux set -t wstream_$randid status-left "`date +%H:%M` "
|
||||||
sleep 5
|
sleep 5
|
||||||
echo "$(lua -e "local file=io.open(\"$HOME/stream/hist/$name/live\")print(file:seek(\"end\")..\" \"..os.time())file:close()")" >>/tmp/tstream-seektimes_$randid
|
echo "$(lua -e "local file=io.open(\"$HOME/stream/hist/$name/live\")print(file:seek(\"end\")..\" \"..os.time())file:close()")" >>/tmp/tstream-seektimes_$randid
|
||||||
/tmp/tstream-refresh_$randid
|
/tmp/tstream-refresh_$randid
|
||||||
|
@ -175,7 +210,7 @@ tmux kill-session -t wstream_$randid
|
||||||
tmux kill-session -t stream_$randid
|
tmux kill-session -t stream_$randid
|
||||||
touch /tmp/tstream-death_$randid
|
touch /tmp/tstream-death_$randid
|
||||||
echo PLEASE WAIT...
|
echo PLEASE WAIT...
|
||||||
sleep 2;
|
sleep 1;
|
||||||
rm /tmp/tstream-death_$randid
|
rm /tmp/tstream-death_$randid
|
||||||
rm /tmp/tstream-helper_$randid
|
rm /tmp/tstream-helper_$randid
|
||||||
rm /tmp/tstream-refresh_$randid
|
rm /tmp/tstream-refresh_$randid
|
||||||
|
|
69
tstream-client
Executable file
69
tstream-client
Executable file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/bin/sh
|
||||||
|
if ! tmux -V 2>/dev/null >/dev/null; then
|
||||||
|
echo "tmux not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! lua -v 2>/dev/null >/dev/null; then
|
||||||
|
echo "lua not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! nc -h 2>/dev/null >/dev/null; then
|
||||||
|
echo "nc not installed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
RANDID=$(cat /dev/urandom | head -c 4 | xxd -p)
|
||||||
|
TMPDIR=/tmp/tstream_client_$RANDID
|
||||||
|
mkdir $TMPDIR
|
||||||
|
mkfifo $TMPDIR/datout
|
||||||
|
mkfifo $TMPDIR/nc_in
|
||||||
|
mkfifo $TMPDIR/nc_out
|
||||||
|
mkfifo $TMPDIR/arg_width
|
||||||
|
mkfifo $TMPDIR/arg_height
|
||||||
|
cat >$TMPDIR/ncread <<EOF
|
||||||
|
#!/usr/bin/env lua
|
||||||
|
local nc_out=io.open("$TMPDIR/nc_out")
|
||||||
|
local nc_in=io.open("$TMPDIR/nc_in","w")
|
||||||
|
local function wrfile(name,str)
|
||||||
|
local file=io.open("$TMPDIR/"..name,"w")
|
||||||
|
file:write(tostring(str))
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
while true do
|
||||||
|
local line=nc_out:read()
|
||||||
|
if not line then
|
||||||
|
wrfile("arg_width","40")
|
||||||
|
wrfile("arg_height","10")
|
||||||
|
wrfile("datout","error occured\n")
|
||||||
|
error("what!")
|
||||||
|
end
|
||||||
|
if line:match("SIZE .+") then
|
||||||
|
local w,h=line:match("SIZE (.-) (.+)")
|
||||||
|
w,h=tonumber(w),tonumber(h)
|
||||||
|
wrfile("arg_width",w)
|
||||||
|
wrfile("arg_height",h)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
nc_in:write("\n")
|
||||||
|
nc_in:flush()
|
||||||
|
local datout=io.open("$TMPDIR/datout","w")
|
||||||
|
while true do
|
||||||
|
datout:write(nc_out:read(1))
|
||||||
|
datout:flush()
|
||||||
|
end
|
||||||
|
EOF
|
||||||
|
chmod +x $TMPDIR/ncread
|
||||||
|
|
||||||
|
$TMPDIR/ncread &
|
||||||
|
{ cat $TMPDIR/nc_in | nc $@ | tee $TMPDIR/nc_out > /dev/null; } &
|
||||||
|
echo run
|
||||||
|
WIDTH=$(head -n 1 $TMPDIR/arg_width)
|
||||||
|
echo width $WIDTH
|
||||||
|
HEIGHT=$(head -n 1 $TMPDIR/arg_height)
|
||||||
|
echo height $HEIGHT
|
||||||
|
tmux new "tmux resize-window -x $WIDTH -y $HEIGHT;tmux set status off; cat $TMPDIR/datout"
|
||||||
|
jobs
|
||||||
|
kill %1
|
||||||
|
kill %2
|
||||||
|
rm -rf $TMPDIR
|
||||||
|
wait
|
Loading…
Reference in a new issue