Script 'game-add': a primary support of multiple PGN files added.

This commit is contained in:
vonavi 2014-09-29 13:18:47 +04:00
parent 42167effaa
commit 068b32de98

View File

@ -17,10 +17,10 @@ argv0=${0##*/}
function usage { function usage {
cat <<EOF cat <<EOF
Store a chess game played on lichess.org Store chess games played on lichess.org
Usage: Usage:
$argv0 -t <num> <url> $argv0 -t <num> [-u] [<url>]
$argv0 -h $argv0 -h
$argv0 -v $argv0 -v
@ -28,10 +28,17 @@ Usage:
inner variable REPO_DIR to it. If the tournament is not the last one inner variable REPO_DIR to it. If the tournament is not the last one
(default), store its sub-directory in inner variable TOURNAMENT. (default), store its sub-directory in inner variable TOURNAMENT.
The first form fills the result of a chess game and stores its PGN The first form fills the results of chess games and stores its PGN
file, assuming that the game is available at <url> (lichess.org) and files, assuming that all the games were played by the same pair of
corresponds to tournament tour <num>. The second form shows this players on tour <num> of the tournament. The PGN files are sorted by
help output. The third form shows version information. their timestamps, unless '-u' is set. Each game should be available
at the corresponding <url> (lichess.org).
The second form shows this help output. The third form shows version
information.
Options:
-u Don't sort games by their timestamps
EOF EOF
exit "${1:-0}" exit "${1:-0}"
@ -59,6 +66,36 @@ function game_setup {
ply_ini=${REPO_DIR}/${TOURNAMENT}/players.ini ply_ini=${REPO_DIR}/${TOURNAMENT}/players.ini
} }
function game_mktemp {
# Don't sort just one game
[[ $# == 1 ]] && SORT_GAMES=false
for url in $@; do
local pgn_template="pgn"
[[ $url =~ ^(http://[^/]*)/([^/]*) ]]
# Link to annotated game PGN
local game_url=${BASH_REMATCH[1]}/game/export/${BASH_REMATCH[2]::8}.pgn
# Append the timestamp of game for sorting
if $SORT_GAMES; then
local game_api=${BASH_REMATCH[1]}/api/game/${BASH_REMATCH[2]::8}
local api_response=$(curl -q --fail --location --silent "$game_api")
[[ -z $api_response ]] && die "Unreachable game API ${game_api}"
local game_time=$(sed -En "s/.*\"timestamp\":([0-9]+).*/\1/p" <<< "$api_response")
pgn_template+="-${game_time}"
fi
# Store PGN file in a temporal location
local tmp_pgn=$(mktemp -t ${pgn_template}.XXXXXX)
TMP_PGN_FILES+=" $tmp_pgn"
trap "rm $TMP_INI_FILES $TMP_PGN_FILES" EXIT
wget -q -U "$FIREFOX_UA" -O $tmp_pgn "$game_url" \
|| die "Unreachable game PGN ${game_url}"
done
$SORT_GAMES && TMP_PGN_FILES=$(echo "$TMP_PGN_FILES" | xargs -n1 | sort | xargs)
}
function game_get_players { function game_get_players {
# Extract players on Lichess # Extract players on Lichess
local wt_lichess=$(sed -En "s/\[White \"([^\"]*)\"\]/\1/p" $tmp_pgn) local wt_lichess=$(sed -En "s/\[White \"([^\"]*)\"\]/\1/p" $tmp_pgn)
@ -195,19 +232,22 @@ function game_git_commit {
} }
function die { function die {
echo "$@" 1>&2 echo "$@" >&2
exit 1 exit 1
} }
function checkargs { function checkargs {
if [[ $opt == t && $OPTARG =~ ^[0-9]+$ ]]; then if [[ $opt == t ]]; then
[[ ! $OPTARG =~ ^[0-9]+$ ]] && die "Incorrect tour number."
TOUR=$(printf "%02g" $OPTARG) TOUR=$(printf "%02g" $OPTARG)
fi fi
} }
while getopts t:hv opt; do SORT_GAMES=true
while getopts t:uhv opt; do
case $opt in case $opt in
t) checkargs ;; t) checkargs ;;
u) SORT_GAMES=false ;;
h) usage ;; h) usage ;;
v) version ;; v) version ;;
*) usage 1 ;; *) usage 1 ;;
@ -216,7 +256,7 @@ done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
# For now, tour number should be given explicitly # For now, tour number should be given explicitly
[[ -z $TOUR || -z $1 ]] && usage 1 [[ -z $TOUR || $# == 0 ]] && usage 1
game_setup game_setup
tour_info=${REPO_DIR}/${TOURNAMENT}/tours/${TOUR}/tour_info tour_info=${REPO_DIR}/${TOURNAMENT}/tours/${TOUR}/tour_info
@ -227,15 +267,9 @@ git pull
# Temporary files # Temporary files
tmp_ini=$(mktemp -t `basename $ply_ini`.XXXXXX) tmp_ini=$(mktemp -t `basename $ply_ini`.XXXXXX)
tmp_pgn=$(mktemp -t pgn.XXXXXX) TMP_INI_FILES="${tmp_ini} ${tmp_ini}.prev"
trap "rm ${tmp_ini} ${tmp_ini}.prev ${tmp_pgn}" EXIT TMP_PGN_FILES=
game_mktemp $@
# Download PGN file
[[ $1 =~ ^(http://[^/]*)/([^/]*) ]]
# Link to annotated PGN
pgn_url=${BASH_REMATCH[1]}/game/export/${BASH_REMATCH[2]::8}.pgn
wget -q -U "$FIREFOX_UA" -O $tmp_pgn "$pgn_url" \
|| die "PGN file at $pgn_url not found."
game_get_players game_get_players
game_add_to_repo game_add_to_repo