Script 'game-add': a primary support of multiple PGN files added.
This commit is contained in:
parent
42167effaa
commit
068b32de98
80
game-add
80
game-add
@ -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,28 +232,31 @@ 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 ;;
|
||||||
h) usage ;;
|
u) SORT_GAMES=false ;;
|
||||||
v) version ;;
|
h) usage ;;
|
||||||
*) usage 1 ;;
|
v) version ;;
|
||||||
|
*) usage 1 ;;
|
||||||
esac
|
esac
|
||||||
done
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user