93 lines
2.1 KiB
Bash
Executable file
93 lines
2.1 KiB
Bash
Executable file
#!/usr/bin/env sh
|
|
|
|
# Will only work on macchina v0.7.3 or higher
|
|
# This script will download and run a video from youtube / any site supported by youtube-dl
|
|
# and display the video in macchina.
|
|
# The flow is
|
|
# youtube-dl -> ffmpeg -> jp2a -> macchina
|
|
# First argument is video url.
|
|
# Second argument is frame wait time.
|
|
|
|
PID=$$
|
|
DIR="/tmp/ffmpeg_$PID"
|
|
|
|
if [ -n "$1" ]; then
|
|
URL="$1"
|
|
else
|
|
URL=$(echo "aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1kUXc0dzlXZ1hjUQo=" | base64 -d)
|
|
fi
|
|
|
|
if [ -n "$2" ]; then
|
|
FRAME_WAIT_TIME=$2
|
|
else
|
|
FRAME_WAIT_TIME=5
|
|
fi
|
|
|
|
required="youtube-dl ffmpeg base64 awk jp2a macchina"
|
|
|
|
for r in "$required"; do
|
|
if ! [ -n "$(which "$r" 2>/dev/null)" ]; then # need the quotes
|
|
printf '\x1b[31m%s not found\x1b[0m\n' "$r"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# polling rate is .05 i.e. once every 50ms
|
|
WAIT=$(echo - | awk -v seconds="$FRAME_WAIT_TIME" '{print seconds/.05}')
|
|
|
|
trap_ctrlc() {
|
|
|
|
printf '\x1b[?25h' # shows cursor
|
|
if [ -n "$FFMPEG_PID" -a -d "/proc/$FFMPEG_PID" ]; then
|
|
kill -0 "$FFMPEG_PID"
|
|
wait "$FFMPEG_PID"
|
|
fi
|
|
|
|
if [ -n "$DIR" -a -d "$DIR" ]; then
|
|
rm -rf "$DIR" 2>/dev/null
|
|
fi
|
|
|
|
exit
|
|
}
|
|
|
|
mkdir "$DIR"
|
|
|
|
# youtube-dl -f best $URL -o - | ffmpeg -i pipe: -r 10 -update 1 "$DIR/out_%d.png" > /dev/null 2>&1 &
|
|
youtube-dl -f best "$URL" -o - 2>/dev/null | ffmpeg -i pipe: -r 10 "$DIR/out_%d.png" >/dev/null 2>&1 &
|
|
FFMPEG_PID=$!
|
|
|
|
trap trap_ctrlc INT
|
|
|
|
printf '\x1b[?25l' # hides the cursor
|
|
for img in "$(# increasing this too much will break it
|
|
seq 1 999999
|
|
)"; do
|
|
count=0
|
|
while ! [ -f "$DIR/out_$img.png" ]; do
|
|
sleep .05
|
|
count=$((count + 1))
|
|
if [ "$count" -ge "$WAIT" ]; then break; fi
|
|
done
|
|
printf '\x1b[s' # saves cursor position
|
|
target/debug/macchina --custom-ascii <(jp2a --color --width=50 "$DIR/out_$img".png)
|
|
# jp2a --color --width=50 $DIR/out_$img.png # just display the video wihout macchina
|
|
printf '\x1b[u'
|
|
if [ -f "$DIR/out_$img.png" ]; then
|
|
rm -f "$DIR/out_$img".png
|
|
fi
|
|
sleep .02
|
|
done
|
|
|
|
printf '\x1b[?25h' # shows cursor
|
|
|
|
if [ -n "$FFMPEG_PID" -a -d "/proc/$FFMPEG_PID" ]; then
|
|
kill -0 "$FFMPEG_PID"
|
|
wait "$FFMPEG_PID"
|
|
fi
|
|
|
|
if [ -n "$DIR" -a -d "$DIR" ]; then
|
|
rm -rf "$DIR" 2>/dev/null
|
|
fi
|
|
|
|
wait "$FFMPEG_PID"
|