From 6ad674f9404c4d194bfaa51450ec00a593a346c1 Mon Sep 17 00:00:00 2001 From: cynic Date: Wed, 11 May 2022 20:25:27 -0400 Subject: [PATCH] add super cool wrapper for getting a certain number of posts, magi-filtered by tag --- danbooru.nim | 34 ++++++++++++++++++++++++---------- example.nim | 6 +++--- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/danbooru.nim b/danbooru.nim index d6ec31f..6496bd0 100644 --- a/danbooru.nim +++ b/danbooru.nim @@ -46,6 +46,16 @@ type image_height*: int created_at*: string 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 = @@ -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] diff --git a/example.nim b/example.nim index 51a3982..3081cee 100644 --- a/example.nim +++ b/example.nim @@ -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) + echo(post.file_url) +