Skip to main content

An asynchronous Python API client for LANraragi, written with aiohttp and pydantic for type validation.

Project description

aio-lanraragi

Client tag

An asynchronous Python API client for LANraragi, written with aiohttp and pydantic for type validation. The project is a work in progress (and subject to potential breaking changes on minor version).

Installation

A Python interpreter is required. I recommend uv — install it from the installation guides, then install a Python interpreter with uv python install.

Installation with uv:

uv add aio-lanraragi

Or with pip:

pip install aio-lanraragi

To install a nightly version:

uv add "aio-lanraragi @ git+https://github.com/psilabs-dev/aio-lanraragi.git@$branch_name"

For development documentation, see development. For integration testing documentation, see integration tests README.

Usage

To enable the usage of an API in LRR, you must first insert an API key to the database:

  1. Login as Admin
  2. Go to Settings > Security > API Key
  3. Fill in API key (e.g. "lanraragi", which we'll use for demonstration)

Here is an example on getting all archives from LANraragi using LRRClient's context management:

import asyncio
from lanraragi import LRRClient

async def main():
    async with LRRClient("http://localhost:3000", lrr_api_key="lanraragi") as lrr:
        response, err = await lrr.archive_api.get_all_archives()
        if err:
            raise Exception(f"Encountered error while getting all archives: {err.error}")
        for archive in response.data:
            print(archive.arcid)

if __name__ == "__main__":
    asyncio.run(main())

"aio-lanraragi" uses a (response, error) approach to error handling.

Here is a code snippet on making concurrent API calls under a bounded semaphore.

...
async with LRRClient("http://localhost:3000", lrr_api_key="lanraragi") as lrr:
    semaphore = asyncio.BoundedSemaphore(value=4)
    tasks = []
    for req in requests:
        tasks.append(asyncio.create_task(async_task(lrr, req, semaphore)))
    await asyncio.gather(*tasks)

Since aiohttp is used under the hood, you may install optional libraries (namely, aiodns and brotli) for more optimization:

# automatically installs aiohttp[speedups]
pip install "aio-lanraragi[speedups]"

Only officially documented APIs will be supported. Undocumented API calls may be invoked at the ApiContextManager layer by library users. Under-development APIs shall be decorated with an @experimental tag in library and during testing. Deprecated APIs shall be decorated with a @deprecated tag.

Session/Connector Context Cleanup

On initializing LRRClient or ApiContextManager, you may pass a selection of aiohttp-specific key parameters. The supported parameters currently include "ssl", "connector", and "client_session".

When "connector" or "client_session" are not provided, the context automatically creates them. These created resources are automatically cleaned up when leaving context/scope.

At the same time, if "connector" or "client_session" are provided, the context does not close them automatically.

Parameter hierarchy is determined by containment: the configuration which contains the other configuration takes precedence, rendering the latter ineffective. Concretely:

  • if both "client_session" and "connector" are provided, then "client_session" overrides the effects of "connector", because "client_session" includes "connector".
  • if both "connector" and "ssl" are provided, then "connector" takes precedence, because "connector" includes "ssl".

Library Description

All request/response classes are under the "src/lanraragi/models" directory, and inherit the LanraragiRequest and LanraragiResponse base class, respectively.

The ApiContextManager is an asynchronous HTTP context manager and handle the HTTP interaction with LANraragi.

If you don't want to use request/response DTOs, go with the API context manager.

An ApiClient represents a logical client for a collection of related APIs. They handle the DTO and request/response marshalling layer. These are only to be used by the LRRClient.

The LRRClient is a higher abstraction than ApiContextManager which also provides API clients for easy access in a context.

Version Policy

"aio-lanraragi" will use major/minor/patch versions but stay on "0.x.x" for now.

Version update is necessary only if there is change to the src/ code (comments, styling and documentation don't count). Changes to integration tests will not require version updates.

Scope

"aio-lanraragi" is designed to abstract away the boilerplate of interfacing with a LANraragi server in Python, to allow the user to focus on application business logic, rather than the HTTP/API protocols. This includes:

  • automatically choosing the REST method and parameters for the API
  • conversion between request, response and Pydantic DTOs for each API call
  • comfortable type hinting and rigorous request/response validation with Pydantic
  • aiohttp exception retry with exponential backoff
  • session management logic and implementation abstraction

The scope of this library is to implement LANraragi-related API functionality which comes naturally from supporting dependencies like aiohttp/pydantic, such as session-related functionality, or type validation. On the other hand, derivative features (features which can be implemented simply by invoking multiple APIs, sometimes with the help of additional dependencies) are not supported by aio-lanraragi. Derivative features include:

  • get version of server
  • delete all archives by a tag or pattern
  • upload archives from a folder
  • checking if an image is incomplete by reading file bytes

In other words, scripting does not fall under the library's responsibility.

Until a feasable client-server version-handling strategy is implemented, support for only the most current API specification falls under the scope of the project. Request/response changes across version updates, bug fixes, corrections, tests, and slight code practice alignments also fall within the scope of this project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aio_lanraragi-0.1.19.tar.gz (20.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aio_lanraragi-0.1.19-py3-none-any.whl (32.8 kB view details)

Uploaded Python 3

File details

Details for the file aio_lanraragi-0.1.19.tar.gz.

File metadata

  • Download URL: aio_lanraragi-0.1.19.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aio_lanraragi-0.1.19.tar.gz
Algorithm Hash digest
SHA256 e081993c69050b482aec136ddc23e4752ad0dcb78c5c1e23379fb79a956292e2
MD5 c78ae3df4f1f03e3123667b84eb0a99a
BLAKE2b-256 3425cdc0281e8816e92814767a2857b55ab95b7baa6c6fe4f15aed81e79563fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for aio_lanraragi-0.1.19.tar.gz:

Publisher: publish.yml on psilabs-dev/aio-lanraragi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aio_lanraragi-0.1.19-py3-none-any.whl.

File metadata

  • Download URL: aio_lanraragi-0.1.19-py3-none-any.whl
  • Upload date:
  • Size: 32.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aio_lanraragi-0.1.19-py3-none-any.whl
Algorithm Hash digest
SHA256 c0b1857d4280e0a8c24773a9eef95d30ad1bdf92ed5828b7ec1f017b549c10c8
MD5 679040386078417cc40d08e3ce3f3582
BLAKE2b-256 84a794db47715f2e484fb36f5a1ca626cd9fb0e10b52f01c102ec6993da24c3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for aio_lanraragi-0.1.19-py3-none-any.whl:

Publisher: publish.yml on psilabs-dev/aio-lanraragi

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page