moves.sh (1409B)
1 #!/bin/sh 2 # make a list of moves from start to end for each move. 3 4 # output moves to tty with some delay. 5 # Show PGN and human speech-like text for the moves. 6 output_tty() { 7 while read -r moves; do 8 clear 9 ./fen -o tty "$fen" "$moves" 10 echo "" 11 ./fen -o pgn "$fen" "$moves" 12 echo "" 13 ./fen -o speak -l "$fen" "$moves" 14 sleep 2 15 done 16 } 17 18 # create an animated gif. 19 # Dependencies: ffmpeg, ImageMagick, etc. 20 output_gif() { 21 tmppal="$(mktemp '/tmp/palette_XXXXXXXX.png')" 22 tmpdir="$(mktemp -d '/tmp/fen_gif_XXXXXXXX')" 23 24 n=1 25 while read -r moves; do 26 f="$tmpdir/$n.svg" 27 ./fen -o svg "$fen" "$moves" > "$f" 28 test -s "$f" || break 29 30 dest="$tmpdir/$n.png" 31 convert "$f" "$dest" 32 33 n=$((n + 1)) 34 done 35 36 # generate palette for gif. 37 rm -f "$tmppal" 38 ffmpeg -loglevel error -stats -i "$tmpdir/%d.png"\ 39 -vf palettegen "$tmppal" 40 41 # create video / animation. 42 # wait longer for last frame. 43 ffmpeg -loglevel error -stats -framerate 1\ 44 -i "$tmpdir/%d.png" \ 45 -i "$tmppal" \ 46 -lavfi 'tpad=stop_mode=clone:stop_duration=4[v];[v]paletteuse[out]' \ 47 -map '[out]' \ 48 -f gif \ 49 - 50 51 rm -rf "$tmpdir" 52 rm -f "$tmppal" 53 } 54 55 if [ "$1" = "" ] || [ "$2" = "" ]; then 56 echo "$0 <fen> <moves>" >&2 57 exit 1 58 fi 59 60 fen="$1" 61 m="$2" 62 while [ "$m" != "" ]; do 63 prevmoves="$m" 64 echo "$m" 65 66 m="${m% }" 67 m="${m%[^ ]*}" 68 m="${m% }" 69 70 test "$prevmoves" = "$m" && break # same, break also 71 done | \ 72 sort | \ 73 output_gif 74 75 #output_tty