A simple asynchronous httpx+pydantic wrapper over the E621's API
Project description
aioe621 
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], 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 |
negate() |
Negate tags |
with_order() |
Add search ordering |
with_rating() |
Add search rating |
flatten() |
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 /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 |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aioe621-0.7.0.tar.gz.
File metadata
- Download URL: aioe621-0.7.0.tar.gz
- Upload date:
- Size: 9.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ebba601c1365fa192b92b3ad97e29de2d6c1bbb121663c974283cde71659bd8
|
|
| MD5 |
524d96e288e1c8b3a38484b75284d340
|
|
| BLAKE2b-256 |
47289348a9536e5f1f10a8eab617bd6f88eddba8b21d16e75ad0f8b16d1ed737
|
File details
Details for the file aioe621-0.7.0-py3-none-any.whl.
File metadata
- Download URL: aioe621-0.7.0-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.29 {"installer":{"name":"uv","version":"0.11.29","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a95cb11888a2626f810e792164ec22fa05e6448c6e6b6a54b91890cd4bdeff03
|
|
| MD5 |
5f456638dde6e766d4de12de4c36b69a
|
|
| BLAKE2b-256 |
9dd003f85a6535d7e25101da6260ecec40519f1bb59ad8072a323c922ff9c626
|