Skip to main content

An asynchronous Python wrapper for the VNDB API (Kana).

Project description

VeeDB (Async)

An unofficial asynchronous Python wrapper for the VNDB.org API v2 (Kana). "Vee" for the v-sign pose and starting letter for VNDB, "DB" for database.

This library provides a convenient way to interact with the VNDB API, allowing you to query visual novel data, manage user lists, and more, all asynchronously with comprehensive type safety and filter validation.

Documentation Status Documentation

Features

  • Asynchronous API calls using aiohttp
  • Data parsing into Python dataclasses using dacite
  • Comprehensive filter validation with schema caching and auto-suggestions
  • Complete type safety with full type annotations
  • Coverage for all VNDB API v2 endpoints:
    • Simple GET requests: /schema, /stats, /user, /authinfo
    • Database querying (POST): /vn, /release, /producer, /character, /staff, /tag, /trait, /quote
    • List management: /ulist (query, labels), /rlist, including PATCH and DELETE operations
  • Intelligent query helpers for constructing complex filter queries
  • Custom exceptions for API errors with detailed error handling
  • API token authentication support
  • Optional sandbox mode for testing
  • Schema caching with TTL support for optimal performance
  • Field suggestions for misspelled or invalid field names

Installation

pip install veedb

Alternatively, install directly from the repository:

pip install git+https://github.com/Sub0X/veedb.git

Requirements

  • Python 3.8+
  • aiohttp
  • dacite

Documentation

📚 Complete documentation is available at: https://veedb.readthedocs.io/en/latest/index.html

Read the Docs API Reference Quick Start

The documentation includes:

  • Installation Guide - Setup instructions and requirements
  • Quick Start Tutorial - Get up and running in minutes
  • Authentication Guide - API token setup and security best practices
  • Complete API Reference - All classes, methods, and types
  • Examples & Use Cases - Real-world usage patterns
  • Filter Validation - Advanced querying and validation features

Quick Start

Basic Usage

import asyncio
from veedb import VNDB, QueryRequest

async def main():
    async with VNDB() as client:
        # Get database statistics
        stats = await client.get_stats()
        print(f"Total VNs: {stats.vn}")

        # Query for visual novels
        query = QueryRequest(
            filters=["title", "~", "Fate"],
            fields="id, title, rating, released",
            sort="rating",
            reverse=True,
            results=5
        )
        
        response = await client.vn.query(query)
        
        for vn in response.results:
            print(f"{vn.title} ({vn.released}): {vn.rating}")

asyncio.run(main())

With Authentication

import os
from veedb import VNDB

async def authenticated_example():
    api_token = os.environ.get("VNDB_API_TOKEN")
    
    async with VNDB(api_token=api_token) as client:
        # Get user info
        auth_info = await client.get_authinfo()
        print(f"Logged in as: {auth_info.username}")
        
        # Access user lists and other authenticated features
        # ...

asyncio.run(authenticated_example())

Filter Validation

One of VeeDB's key features is comprehensive filter validation:

async def validation_example():
    async with VNDB() as client:
        # Validate filters before using them
        result = await client.validate_filters("/vn", ["title", "=", "Test"])
        
        if result['valid']:
            print("Filter is valid!")
        else:
            print(f"Errors: {result['errors']}")
            print(f"Suggestions: {result['suggestions']}")
        
        # Get available fields for an endpoint
        fields = await client.get_available_fields("/vn")
        print(f"Available VN fields: {fields[:10]}")

asyncio.run(validation_example())
  • Python 3.8+
  • aiohttp
  • dacite

Usage

First, you'll need to obtain an API token if you plan to use authenticated endpoints (like list management or accessing private user data). You can get a token from your VNDB profile under "Applications": https://vndb.org/u/tokens

It's recommended to store your API token as an environment variable (e.g., VNDB_API_TOKEN).

import asyncio
import os
from veedb import VNDB, QueryRequest # Updated import
from veedb.exceptions import VNDBAPIError # Updated import

async def main():
    api_token = os.environ.get("VNDB_API_TOKEN")

    # Use use_sandbox=True for testing against the beta API endpoint
    async with VNDB(api_token=api_token, use_sandbox=True) as vndb: # Class name VNDB is kept
        try:
            # Get database statistics
            stats = await vndb.get_stats()
            print(f"Total VNs in database: {stats.vn}")

            # Query for a specific visual novel (e.g., Ever17)
            vn_query = QueryRequest(
                filters=["id", "=", "v17"],
                fields="id, title, released, rating, description, image.url"
            )
            response = await vndb.vn.query(vn_query)

            if response.results:
                ever17 = response.results[0]
                print(f"\nTitle: {ever17.title}")
                print(f"Released: {ever17.released}")
                print(f"Rating: {ever17.rating}")
                if ever17.image:
                    print(f"Image: {ever17.image.url}")
                # print(f"Description: {ever17.description[:200]}...") # Truncated
            else:
                print("VN v17 not found.")

            # Search for VNs
            search_query = QueryRequest(
                filters=["search", "=", "Steins;Gate"],
                fields="id, title, released",
                results=5,
                sort="rating",
                reverse=True # Highest rated first
            )
            search_response = await vndb.vn.query(search_query)
            print("\nTop Steins;Gate related VNs by rating:")
            for vn_item in search_response.results:
                print(f"- {vn_item.title} (ID: {vn_item.id}, Released: {vn_item.released})")

        except VNDBAPIError as e:
            print(f"An API error occurred: {e.status_code} - {e.message}")
        except Exception as e:
            print(f"An unexpected error occurred: {e}")

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

Querying Data

The primary way to fetch data from endpoints like /vn, /release, etc., is using the query method with a QueryRequest object.

from veedb import QueryRequest # Updated import

# Fetch VNs released in 2023, sort by vote count, get titles and developer names
query = QueryRequest(
    filters=["released", ">=", "2023-01-01", "and", "released", "<=", "2023-12-31"],
    fields="id, title, votecount, developers{id, name}",
    sort="votecount",
    reverse=True,
    results=10,
    page=1,
    count=True # To get the total count of matching entries
)
response = await vndb.vn.query(query) # Assuming 'vndb' is an initialized VNDB client

print(f"Total VNs released in 2023: {response.count}")
for vn_entry in response.results:
    dev_names = [dev.name for dev in vn_entry.developers] if vn_entry.developers else []
    print(f"- {vn_entry.title} (Votes: {vn_entry.votecount}, Developers: {', '.join(dev_names)})")

Refer to the VNDB API Documentation for details on:

  • Available filters for each entity.
  • Available fields for each entity (use dot notation for nested fields, e.g., image.url, tags{id,name,rating}).
  • Sorting options.

List Management

To manage user lists (ulist/rlist), you need an API token with listwrite permission.

from veedb.types.requests import UlistUpdatePayload # Updated import

# Add/Update a VN in your ulist
# (Assuming 'vndb' is an initialized VNDB client with a valid token)
try:
    update_payload = UlistUpdatePayload(
        vote=85, # Vote 8.5
        notes="A masterpiece!",
        labels_set=[2] # Add to "Finished" label (assuming ID 2 is 'Finished')
    )
    await vndb.ulist.update_entry(vn_id="v17", payload=update_payload)
    print("Successfully updated v17 in ulist.")

except VNDBAPIError as e:
    print(f"Error managing ulist: {e}")

Documentation

📚 For comprehensive VeeDB documentation, visit:

VeeDB Documentation

For detailed information on VNDB API filters, fields, and behavior, please refer to the official VNDB API v2 (Kana) Documentation.

Contributing

Contributions are welcome! Please feel free to submit pull requests or open issues for bugs, feature requests, or improvements.

License

This project is licensed under the MIT License - see the LICENSE file for details.

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

veedb-0.1.7.tar.gz (102.3 kB view details)

Uploaded Source

Built Distribution

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

veedb-0.1.7-py3-none-any.whl (35.3 kB view details)

Uploaded Python 3

File details

Details for the file veedb-0.1.7.tar.gz.

File metadata

  • Download URL: veedb-0.1.7.tar.gz
  • Upload date:
  • Size: 102.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for veedb-0.1.7.tar.gz
Algorithm Hash digest
SHA256 029b654c09ee4eaf818aefa7e5d9f695c7983cef07f43b17626bc575f41a2acb
MD5 76209fa9078525d0a6c8bb9702051c01
BLAKE2b-256 309a1a3a1d48b4886280f18289c152164083b1e8d73d275b9f6128f577cdc722

See more details on using hashes here.

File details

Details for the file veedb-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: veedb-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 35.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for veedb-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 73690ac0bae3a21550b5952be7cb4e233eb6263e9c31f7267103773d7a972c0b
MD5 e5cdc062fdfe88f7093b3bac1ea918f4
BLAKE2b-256 2e5002859d80b4ac120b6e222f1afb242cf0e3f023c43d74956ad3672e517ddc

See more details on using hashes here.

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