Skip to main content

A simple asynchronous httpx+pydantic wrapper over the E621's API

Project description

aioe621 GitHub Tag

uv PyPI Python Version

GitHub License GitHub Actions Workflow Status

A simple asynchronous httpx+pydantic wrapper over the e621 API.

The library API is considered unstable until version 1.0.0. Minor releases may include breaking changes.

Quickstart

from aioe621 import Client
from aioe621.schemas.posts import Post
import asyncio

# a user agent is required
client = Client(user_agent="MyProject/1.0 (by username on e621)")


async def main() -> None:
    post: Post = await client.posts.get(5937863)
    print(f"i love {post.tags.artist[0]}!!!")


asyncio.run(main())

Installation

pip install aioe621

or using uv (recommended):

uv add aioe621

TagSet

TagSet is a small query-building helper around e621's tag syntax. It behaves mostly like a normal set[str] (it actually inherits from actually frozenset[Tag]), but adds convenient methods for composing searches.

Using TagSet is not required. All endpoints that accept tags also work with other "Tag"-like or "Tag list"-like types (including plain strings and iterables of strings). TagSet is provided as a convenience for building, combining, and reusing complex queries.

Build searches fluently

# find posts by the same artists, but include a specific feature
query = post.tags.artist.with_tag("tail")
print(str(query))  # cool_artist tail
posts = await client.posts.list(tags=query)

Exclude tags

Negated tags are useful for filtering out things you don't want:

# with the same species, but no humans
# each list item here is like a blacklist line in e621
query = post.tags.species.with_blacklist(["human"])
# or you could just do .with_tag("-human")

Which for a post of a dog with a cat produces the equivalent of canine feline -human

Combine tag groups

Tag groups can be merged together:

# search for the characters of the specific artists and copyrights
query = post.tags.character + post.tags.species + post.tags.copyright

Build reusable search presets

Because TagSet is composable, you can keep common searches around:

from aioe621.objects import TagSet
from aioe621.enums import PostRating

anthro_pups_with_fangs = TagSet({"fangs", "canine", "-feral"})
rating = PostRating.SAFE  # just "s" or "safe" also works!

favorites = anthro_pups_with_fangs.with_rating(rating)

All TagSet methods

Method Purpose
+ Combine tag groups
with_tag() Add a tag
with_tags() Add multiple tags
with_blacklist() Add and negate lists of TagSet, like the e621 blacklist
negated_tags() Negate tags
with_order() Add search ordering
with_rating() Add search rating
flattened() Flatten into a str

Schema helpers

Some schema objects provide small helper methods that use the attached client to fetch related resources.

Post

# get posts that have this post as their parent
children: Sequence[Post] = await post.fetch_children()

# get the parent if it has one
parent: Post | None = await post.fetch_parent()

Pool

pool = await client.pools.get(12345)

# this is only the ids
print(pool.post_ids)  # [69420, 42069, ...]

# fetch the full Post objects
posts: list[Post] = await pool.fetch_posts()

print(posts[0].rating)  # PostRating.EXPLICIT

Currently implemented API endpoints

e621 API aioe621
GET /posts.json .posts.list
GET /posts/{id}.json .posts.get
GET /posts/random.json .posts.random
GET /popular.json .posts.popular
GET /tags.json .tags.list and tags.get_by_name
GET /tags/{id}.json .tags.get
GET /pools.json .pools.list
GET /pools/{id}.json .pools.get
GET /forum_posts.json .forum.posts
GET /forum_posts/{id}.json .forum.post
GET /forum_topics.json .forum.topics
GET /forum_topics/{id}.json .forum.topic

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

aioe621-0.10.0.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

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

aioe621-0.10.0-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

File details

Details for the file aioe621-0.10.0.tar.gz.

File metadata

  • Download URL: aioe621-0.10.0.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for aioe621-0.10.0.tar.gz
Algorithm Hash digest
SHA256 90e79b129881be9f69fb3bc8c2a36a4b3a7de58062160df596715fc02b977975
MD5 aa3a86296472d0d843c7984535733879
BLAKE2b-256 977c0559260d4d72ceac9a7871ba732f1579211255a1ae4247df1f10fe52b8dc

See more details on using hashes here.

File details

Details for the file aioe621-0.10.0-py3-none-any.whl.

File metadata

  • Download URL: aioe621-0.10.0-py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for aioe621-0.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d3177fc1b5ef77bb4889d7bc8a662b20e13e195e895f54088b0510ea027f5742
MD5 767f51cba603878ff8d603293bab17a1
BLAKE2b-256 f780d148184717dffc32242f0edbb90edbd4363f091878a393fbcd1b318e61ad

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