commit
d9e603ac31
@ -0,0 +1,69 @@ |
|||||||
|
import std/httpclient |
||||||
|
import std/strformat |
||||||
|
import std/json |
||||||
|
import std/options |
||||||
|
import std/sequtils |
||||||
|
import std/strutils |
||||||
|
import std/sugar |
||||||
|
|
||||||
|
type |
||||||
|
danbooru* = object |
||||||
|
c: HttpClient |
||||||
|
endpoint*: string |
||||||
|
dbPost* = object |
||||||
|
id*: int |
||||||
|
uploader_id*: int |
||||||
|
approver_id*: Option[int] |
||||||
|
tag_string*: string |
||||||
|
tag_string_general*: string |
||||||
|
tag_string_artist*: string |
||||||
|
tag_string_copyright*: string |
||||||
|
tag_string_character*: string |
||||||
|
tag_string_meta*: string |
||||||
|
rating*: Option[string] |
||||||
|
parent_id*: Option[int] |
||||||
|
source*: string |
||||||
|
md5*: string |
||||||
|
file_url*: string |
||||||
|
large_file_url*: string |
||||||
|
preview_file_url*: string |
||||||
|
file_ext*: string |
||||||
|
file_size*: int |
||||||
|
image_width*: int |
||||||
|
score*: int |
||||||
|
fav_count*: int |
||||||
|
tag_count_general*: int |
||||||
|
tag_count_artist*: int |
||||||
|
tag_count_copyright*: int |
||||||
|
tag_count_character*: int |
||||||
|
tag_count_meta*: int |
||||||
|
last_comment_bumped_at*: Option[string] |
||||||
|
last_noted_at*: Option[string] |
||||||
|
has_children*: bool |
||||||
|
# is_note_locked*: bool |
||||||
|
# is_rating_locked*: bool |
||||||
|
# is_status_locked*: bool |
||||||
|
image_height*: int |
||||||
|
created_at*: string |
||||||
|
updated_at*: string |
||||||
|
|
||||||
|
|
||||||
|
proc newDanbooru*(): danbooru = |
||||||
|
result.endpoint = "https://danbooru.donmai.us" |
||||||
|
result.c = newHttpClient() |
||||||
|
|
||||||
|
proc post*(d: danbooru, id: int): dbPost = |
||||||
|
to(d.c.getContent(d.endpoint&fmt"/posts/{id}.json").parseJson(), dbPost) |
||||||
|
|
||||||
|
proc searchPosts*(d: danbooru, tags: string, random: bool = false): seq[dbPost] = |
||||||
|
to(d.c.getContent(d.endpoint&fmt"/posts.json?tags="&tags&"&random=" & $random).parseJson(), seq[dbPost]) |
||||||
|
|
||||||
|
|
||||||
|
proc filterTags*(p: var seq[dbPost], tags: string): seq[dbPost] = |
||||||
|
let stags: seq[string] = tags.split(" ") |
||||||
|
p.filter((dbPost) => ( |
||||||
|
for tag in stags: |
||||||
|
if not ((tag in dbPost.tag_string.split(" ")) or (tag[0] == '-' and tag[1 .. ^1] notin dbPost.tag_string.split(" "))): |
||||||
|
return false |
||||||
|
return true |
||||||
|
)) |
@ -0,0 +1,8 @@ |
|||||||
|
import danbooru |
||||||
|
|
||||||
|
var db = newDanbooru() |
||||||
|
echo(db.endpoint) |
||||||
|
var mai_waifu = db.searchPosts("makise_kurisu", random = true) |
||||||
|
mai_waifu = mai_waifu.filterTags("1girl -1boy -2girl -futanari -sex_toy -cosplay -tattoo") |
||||||
|
for post in mai_waifu: |
||||||
|
echo(post.file_url) |
@ -0,0 +1,4 @@ |
|||||||
|
danbooru lib for nim |
||||||
|
implements 'post's as objects and searches as post seqs |
||||||
|
enough functions to search for posts and filter by tag (clientside, so you don't need an API key), which is all i've ever needed |
||||||
|
cheers |
Loading…
Reference in new issue