Source code for novelai_api.NovelAI_API
from http.cookies import SimpleCookie
from logging import Logger
from os.path import abspath, dirname
from typing import Optional
from aiohttp import BasicAuth, ClientSession, ClientTimeout
from aiohttp.typedefs import StrOrURL
from multidict import CIMultiDict
from novelai_api._high_level import HighLevel
from novelai_api._low_level import GENERAL_API_ADDRESS, LowLevel
[docs]class NovelAIAPI:
# Constants
# TODO: might want to make the base endpoint configurable
#: The base address for the API
BASE_ADDRESS: str = GENERAL_API_ADDRESS
LIB_ROOT: str = dirname(abspath(__file__))
# Variables
#: The logger for the API
logger: Logger
#: The client session for the API (None if synchronous)
session: Optional[ClientSession]
#: The timeout for a request (in seconds)
timeout: ClientTimeout
#: The headers for a request
headers: CIMultiDict
#: The cookies for a request
cookies: SimpleCookie
#: The proxy for a request (None if no proxy)
proxy: Optional[StrOrURL] = None
#: The proxy authentication for a request (None if no proxy)
proxy_auth: Optional[BasicAuth] = None
# API parts
#: The low-level API (thin wrapper)
low_level: LowLevel
#: The high-level API (abstraction on top of low-level)
high_level: HighLevel
[docs] def __init__(self, session: Optional[ClientSession] = None, logger: Optional[Logger] = None):
"""
Create a new NovelAIAPI object, which can be used to interact with the API.
Use the low_level and high_level attributes for this purpose
Use attach_session and detach_session to switch between synchronous and asynchronous requests
by attaching a ClientSession
:param session: The ClientSession to use for requests (None for synchronous)
:param logger: The logger to use for the API (None for creating an empty default logger)
"""
# variable passing
if session is not None and not isinstance(session, ClientSession):
raise ValueError(f"Expected None or type 'ClientSession' for session, but got type '{type(session)}'")
# no session = synchronous
self.logger = Logger("NovelAI_API") if logger is None else logger
self.session = session
self.timeout = ClientTimeout(300)
self.headers = CIMultiDict()
self.cookies = SimpleCookie()
self.proxy = None
self.proxy_auth = None
# API parts
self.low_level = LowLevel(self)
self.high_level = HighLevel(self)
[docs] def attach_session(self, session: ClientSession):
"""
Attach a ClientSession, making the requests asynchronous
"""
if not isinstance(session, ClientSession):
raise ValueError(f"Expected type 'ClientSession' for session, but got type '{type(session)}'")
self.session = session
[docs] def detach_session(self):
"""
Detach the current ClientSession, making the requests synchronous
"""
self.session = None
@property
def timeout(self) -> float:
"""
Timeout for a request (in seconds)
"""
return self._timeout.total
@timeout.setter
def timeout(self, value: float):
"""
Timeout for a request (in seconds)
"""
self._timeout = ClientTimeout(value)