stream_lichess.sh - 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
---
stream_lichess.sh (2186B)
---
1 #!/bin/sh
2 # Stream a lichess game, by game id.
3 # Requires permissions to the board / game.
4 # NOTE that it updates after a move.
5 # Dependencies: curl, json2tsv (could be replaced by jq).
6
7 if [ "$1" = "" ]; then
8 echo "Usage: $0 <gameid>" >&2
9 exit 1
10 fi
11
12 gameid="$1"
13 token="${LICHESS_TOKEN}" # API token here.
14
15 url="https://lichess.org/api/board/game/stream/$gameid"
16
17 # start position of classical chess.
18 fen="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"
19
20 firstline=1
21 header=""
22
23 # -N disables cURL buffering, each line is streamed as JSON.
24 curl \
25 -f \
26 -s \
27 -N \
28 -H "Authorization: Bearer $token" \
29 -H 'Accept: application/x-ndjson' "$url" | \
30 while read -r json; do
31 moveplayed="0"
32 if [ "$firstline" = "1" ]; then
33 firstline="0"
34
35 str=$(printf '%s' "$json" | jaq '$1 == ".initialFen" { print $3; }')
36 test "$str" != "" && fen="$str" # override
37
38 header=$(printf '%s' "$json" | jaq '
39 BEGIN {
40 white_name = "Anonymous";
41 black_name = "Anonymous";
42 }
43 $2 == "?" || $3 == "" { next; }
44 $1 == ".white.name" { white_name = $3; }
45 $1 == ".white.rating" { white_rating = $3; }
46 $1 == ".white.provisional" && $3 == "true" { white_provisional = "?"; }
47 $1 == ".black.name" { black_name = $3; }
48 $1 == ".black.rating" { black_rating = $3; }
49 $1 == ".black.provisional" && $3 == "true" { black_provisional = "?"; }
50 $1 == ".white.aiLevel" { white_name = "AI level " $3; }
51 $1 == ".black.aiLevel" { black_name = "AI level " $3; }
52 END {
53 white = white_name;
54 if (white_rating != "")
55 white = white " (" white_rating white_provisional ")";
56 black = black_name;
57 if (black_rating != "")
58 black = black " (" black_rating black_provisional ")";
59 print white " vs " black;
60 }')
61 fi
62
63 str=$(printf '%s' "$json" | jaq '$1 == ".moves" { print $3; }')
64 if [ "$str" != "" ]; then
65 moves="$str" # override
66 moveplayed="1"
67 fi
68
69 clear
70 printf '%s\n\n' "$header"
71 ./fen -o tty "$fen" "$moves"
72
73 if [ "$moveplayed" = "1" ]; then
74 speaktext="$(./fen -l -o speak "$fen" "$moves")"
75 fi
76 printf '\n%s\n' "$speaktext"
77
78 printf '\nMoves:\n'
79 printf '%s\n' "$moves"
80
81 printf '\nPGN:\n'
82 ./fen -o pgn "$fen" "$moves"
83
84 # audio
85 if [ "$moveplayed" = "1" ]; then
86 (printf '%s\n' "$speaktext" | espeak) &
87 fi
88 done