Spaces:
Sleeping
Sleeping
import io | |
import logging | |
import chess.pgn | |
import tempfile | |
import os | |
import time | |
import glob | |
import gradio as gr | |
def extract_game(png_input): | |
if isinstance(png_input, io.IOBase): | |
file = png_input | |
elif isinstance(png_input, str): | |
file = io.StringIO(png_input) | |
elif isinstance(png_input, gr.utils.NamedString): | |
file = png_input.name | |
else: | |
raise ValueError("Input must be a string or a file-like object.") | |
game = read_pgn(file) | |
return game | |
def pgn_string_to_game(pgn_text: str) -> chess.pgn.Game: | |
pgn_io = io.StringIO(pgn_text) | |
game = chess.pgn.read_game(pgn_io) | |
return game | |
# Load game | |
def read_pgn(pgn_filepath) -> str: | |
with open(pgn_filepath) as f: | |
game = chess.pgn.read_game(f) | |
return game | |
def export_pgn(game, tmp_dir="tmp_pgn"): | |
os.makedirs(tmp_dir, exist_ok=True) | |
with tempfile.NamedTemporaryFile( | |
delete=False, suffix=".pgn", dir=tmp_dir, mode="w", encoding="utf-8" | |
) as tmp: | |
exporter = chess.pgn.FileExporter(tmp) | |
game.accept(exporter) | |
return tmp.name | |
def cleanup_tmp_pgn(tmp_dir="tmp_pgn", expire_seconds=300): | |
if not os.path.exists(tmp_dir): | |
return | |
now = time.time() | |
pgn_files = glob.glob(os.path.join(tmp_dir, "*.pgn")) | |
for file_path in pgn_files: | |
try: | |
if now - os.path.getmtime(file_path) > expire_seconds: | |
os.remove(file_path) | |
logging.info(f"Deleted: {file_path}") | |
except Exception as e: | |
logging.warning(f"Error deleting {file_path}: {e}") | |
def format_pv(pv_moves, board): | |
temp_board = board.copy() | |
san_moves = [] | |
for move in pv_moves: | |
san_moves.append(temp_board.san(move)) | |
temp_board.push(move) | |
return " ".join(san_moves) | |
def add_variation(node, variation): | |
board = node.board() | |
current = node | |
for move in variation: | |
# Ensure move is legal in current position | |
if move in board.legal_moves: | |
current = current.add_variation(move) | |
board.push(move) | |
else: | |
break # Stop if PV deviates from legal moves | |