add super cool wrapper for getting a certain number of posts, magi-filtered by tag

master
cynic 3 years ago
parent d9e603ac31
commit 6ad674f940
  1. 34
      danbooru.nim
  2. 4
      example.nim

@ -48,6 +48,16 @@ type
updated_at*: string
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
))
proc newDanbooru*(): danbooru =
result.endpoint = "https://danbooru.donmai.us"
result.c = newHttpClient()
@ -55,15 +65,19 @@ proc newDanbooru*(): danbooru =
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 searchPosts*(d: danbooru, tags: string, random: bool = false, page: string = "1"): seq[dbPost] =
to(d.c.getContent(d.endpoint&fmt"/posts.json?tags="&tags&"&random=" & $random & "&page=" & $page).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
))
proc returnTaggedPosts*(d: danbooru, tags: string, filterTags: string, num: int = 10): seq[dbPost] =
var page: int = 1
while result.len < num:
var tmp: seq[dbPost]
try:
tmp = d.searchPosts(tags, random = false, page = $page)
except:
discard
tmp = tmp.filterTags(filterTags)
result &= tmp
page += 1
result = result[0 ..< num]

@ -2,7 +2,7 @@ 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")
var mai_waifu = db.returnTaggedPosts("makise_kurisu rating:safe", "1girl -1boy -2girl -futanari -sex_toy -cosplay -tattoo", num = 600)
for post in mai_waifu:
echo(post.file_url)

Loading…
Cancel
Save