from __future__ import annotations
from typing import cast, List, Iterator
from ..formats import PGN
from ..types.common import Color, Variant
from ..types import ChapterIdName
from .base import BaseClient
[docs]class Studies(BaseClient):
"""Study chess the Lichess way."""
[docs] def export_chapter(self, study_id: str, chapter_id: str) -> str:
"""Export one chapter of a study.
:return: chapter PGN
"""
path = f"/api/study/{study_id}/{chapter_id}.pgn"
return self._r.get(path, fmt=PGN)
[docs] def export(self, study_id: str) -> Iterator[str]:
"""Export all chapters of a study.
:return: iterator over all chapters as PGN
"""
path = f"/api/study/{study_id}.pgn"
yield from self._r.get(path, fmt=PGN, stream=True)
[docs] def export_by_username(self, username: str) -> Iterator[str]:
"""Export all chapters of all studies of a user in PGN format.
If authenticated, then all public, unlisted, and private studies are included.
If not, only public (non-unlisted) studies are included.
return:iterator over all chapters as PGN"""
path = f"/study/by/{username}/export.pgn"
yield from self._r.get(path, fmt=PGN, stream=True)
[docs] def import_pgn(
self,
study_id: str,
chapter_name: str,
pgn: str,
orientation: Color = "white",
variant: Variant = "standard",
) -> List[ChapterIdName]:
"""Imports arbitrary PGN into an existing study.
Creates a new chapter in the study.
If the PGN contains multiple games (separated by 2 or more newlines) then multiple chapters will be created within the study.
Note that a study can contain at most 64 chapters.
return: List of the chapters {id, name}"""
# https://lichess.org/api/study/{studyId}/import-pgn
path = f"/api/study/{study_id}/import-pgn"
payload = {
"name": chapter_name,
"pgn": pgn,
"orientation": orientation,
"variant": variant,
}
# The return is of the form:
return cast(
List[ChapterIdName], self._r.post(path, data=payload).get("chapters", [])
)