add a separate script to generate a gif or tty animation from FEN + moves - chess-puzzles - chess puzzle book generator
 (HTM) git clone git://git.codemadness.org/chess-puzzles
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3ee1d913ba6bcafbf4647c86d45aaf958954793e
 (DIR) parent 5bf484cc8a074778fe73a54541288119dd207822
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Mon, 22 Jan 2024 19:28:32 +0100
       
       add a separate script to generate a gif or tty animation from FEN + moves
       
       Diffstat:
         R gifs.sh -> gifs_for_puzzles.sh      |       0 
         A moves.sh                            |      75 +++++++++++++++++++++++++++++++
       
       2 files changed, 75 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/gifs.sh b/gifs_for_puzzles.sh
 (DIR) diff --git a/moves.sh b/moves.sh
       @@ -0,0 +1,75 @@
       +#!/bin/sh
       +# make a list of moves from start to end for each move.
       +
       +output_tty() {
       +        while read -r moves; do
       +                clear
       +                ./fen -o tty "$fen" "$moves"
       +                echo ""
       +                ./fen -o pgn "$fen" "$moves"
       +                echo ""
       +                ./fen -o speak -l "$fen" "$moves"
       +                sleep 2
       +        done
       +}
       +
       +# create animated gifs for puzzle solutions.
       +# Dependencies: ffmpeg, ImageMagick, etc.
       +output_gif() {
       +        tmppal="$(mktemp '/tmp/palette_XXXXXXXX.png')"
       +        tmpdir="$(mktemp -d '/tmp/fen_gif_XXXXXXXX')"
       +
       +        n=1
       +        while read -r moves; do
       +                f="$tmpdir/$n.svg"
       +                ./fen -o svg "$fen" "$moves" > "$f"
       +                test -s "$f" || break
       +
       +                # initial puzzle state also
       +                dest="$tmpdir/$n.png"
       +                convert "$f" "$dest"
       +
       +                n=$((n + 1))
       +        done
       +
       +        # create video / animation.
       +
       +        # generate palette for gif.
       +        rm -f "$tmppal"
       +        ffmpeg -loglevel error -stats -i "$tmpdir/%d.png"\
       +                -vf palettegen "$tmppal"
       +
       +        # wait longer for last frame.
       +        ffmpeg -loglevel error -stats -framerate 1\
       +                -i "$tmpdir/%d.png" \
       +                -i "$tmppal" \
       +                -lavfi 'tpad=stop_mode=clone:stop_duration=4[v];[v]paletteuse[out]' \
       +                -map '[out]' \
       +                -f gif \
       +                -
       +
       +        rm -rf "$tmpdir"
       +        rm -f "$tmppal"
       +}
       +
       +if [ "$1" = "" ] || [ "$2" = "" ]; then
       +        echo "$0 <fen> <moves>" >&2
       +        exit 1
       +fi
       +
       +fen="$1"
       +m="$2"
       +while [ "$m" != "" ]; do
       +        prevmoves="$m"
       +        echo "$m"
       +
       +        m="${m% }"
       +        m="${m%[a-h][0-9][a-h][0-9]}"
       +        m="${m%[qrbnQRBN]}" # possible promotion
       +        m="${m% }"
       +
       +        test "$prevmoves" = "$m" && break # same, break also
       +done | \
       +sort | \
       +output_gif
       +#output_tty