Topic: TagMe! [v.1.0.11] Tag Project Assistant

Posted under e621 Tools and Applications

I would like to suggest some quality of life features:

- I sometimes like to add additional tags manually. Could you add the same tag recommendation during typing that is already present here on e621?

- I think it would be nice to see a guesstimate of the number of posts remaining for each tag project. That would maybe serve as motivation for projects that are nearly finished or others that still need loads of help.
This information probably need not be highly accurate and can easily be cached for a while. Additionally saving this data could be used to show a graph of the progress made over time.

I know that this is just a spare time project so these points really are just suggestions.

Hi ^^
First of all, thank you for this project. I love it.

Would it be possible to add tree select or categories for tags?
An example for missing body color:

Fur

red_fur
blue_fur
green_fur
yellow_fur
...
...
...
...

Feathers

red_feathers
blue_feathers
green_feathers
yellow_feathers
...
...
...
...

body

red_body
blue_body
green_body
yellow_body
...
...
...
...

this would also be helpful for projects like:
-"body type_penetrating_body type"
-"gender_penetrating_gender"
- piercing types

bitWolfy

Former Staff

duefff said:
- I sometimes like to add additional tags manually. Could you add the same tag recommendation during typing that is already present here on e621?

Do you mean autocomplete?
Theoretically, it's possible. Practically, it may require a lot of API requests, which is something that I am trying to minimize. But I'll see what I can do.

duefff said:
- I think it would be nice to see a guesstimate of the number of posts remaining for each tag project.

It would be nice to have that. It's also not possible.
The only way to get the number of posts for a specific search is to iterate over its pages, counting posts as you go. Even if the "remaining post count" only got updated daily, the number of API requests required to do that is rather ridiculous.

I already count the number of changes made. I suppose, I could have the project tally up the number of remaining posts once, when it is being created, and then just subtract the number of changes from it. But that count is likely to be quite inaccurate.

dubsthefox said:
Would it be possible to add tree select or categories for tags?
An example for missing body color:

I am not entirely sure if this is practical.
TagMe was made to quickly apply tags to a large number of posts. Having dropdowns that the user has to select options from seems to go against this concept.

I'll think about it.

bitwolfy said:
It would be nice to have that. It's also not possible.
The only way to get the number of posts for a specific search is to iterate over its pages, counting posts as you go. Even if the "remaining post count" only got updated daily, the number of API requests required to do that is rather ridiculous.

I already count the number of changes made. I suppose, I could have the project tally up the number of remaining posts once, when it is being created, and then just subtract the number of changes from it. But that count is likely to be quite inaccurate.

Well querying the website shows a navigation at the bottom with the total page count. So I assumed we might extract that page count aswell. And then showing numbers like '70' or '320'×'40pages' or more than '750 pages×320' posts would be helpful enough. I did not look into how many requests or what kind of requests are made for this

bitWolfy

Former Staff

duefff said:
Well querying the website shows a navigation at the bottom with the total page count. So I assumed we might extract that page count aswell. And then showing numbers like '70' or '320'×'40pages' or more than '750 pages×320' posts would be helpful enough. I did not look into how many requests or what kind of requests are made for this

Pagination is not accessible through the API, sadly.

I don't think the wildcards on removed tags are always working. For example *humanoid doesn't remove monstrous_humanoid.

tittybitty said:
I don't think the wildcards on removed tags are always working. For example *humanoid doesn't remove monstrous_humanoid.

Strange. I'll investigate.

tittybitty said:
Any news on this? No rush, just curious.

No, not really. Sorry.
Wildcards are extremely janky for some reason. I can't pinpoint a one singular cause for it.

I'm pretty sure that it's not possible to unblur blacklisted webms, clicking on them toggles the video playback but doesn't remove the blacklist blur

Is the Rank on the TagMe! website the same thing as Member Levels on e621 and are these linked? If so, why some users that have a Member Level on e6 have a Privileged Rank on TagMe!? Some also have Janitor Level on e6, but Privileged Rank on TagMe!, I'm confused. (@- @

shadyguy said:
I'm getting no images for https://tagme.dev/projects/pkball_types/ even though it worked fine in the past and manually searching e621 with the same tags works.
The console shows a 422 Unprocessable Entity response from the e621 search

It seems like I've made a miscalculation somewhere.
TagMe should not allow you to make projects with more than 37 tags. Three more are used for utility purposes: -type:swf to filter out flash files, order:random to randomize the results, and randseed:<seed> to cut try to prevent skipped posts from showing up quite as much. However, that specific projects has 39 tags, which brings the total up to 42, and causes an error.

For the time being, just drop 2 more tags from that project.

sieghelm_lockayer said:
Is the Rank on the TagMe! website the same thing as Member Levels on e621 and are these linked? If so, why some users that have a Member Level on e6 have a Privileged Rank on TagMe!? Some also have Janitor Level on e6, but Privileged Rank on TagMe!, I'm confused. (@- @

They aren't the same thing, no.
Using the same names was probably a bad idea, but it is what is.

"Visitor" can view and comment on projects. That's the base level that everyone gets.
"Member" can contribute to projects. Promotion granted automatically as soon as you have 100 manual tag edits.
"Privileged" can create projects. Promoted automatically on 1000 tag edits, both manual and through TagMe.
"Janitor" can edit other people's projects, as well as unlock projects.
"Admin" has access to ban tools.

bitwolfy said:
They aren't the same thing, no.
Using the same names was probably a bad idea, but it is what is.

"Visitor" can view and comment on projects. That's the base level that everyone gets.
"Member" can contribute to projects. Promotion granted automatically as soon as you have 100 manual tag edits.
"Privileged" can create projects. Promoted automatically on 1000 tag edits, both manual and through TagMe.
"Janitor" can edit other people's projects, as well as unlock projects.
"Admin" has access to ban tools.

Thanks for the clarification. (👊⠀'⠀▽⠀'⠀)

Oi!~ bitWolfy!~

I'm sorry if it had been asked already, but I was wandering if there's any chance of you implementing a button that quickly toggles between on/off e6's Safe Mode at TagMe? Just like the buttons to toggle the blacklist and the one that alternate between themes.

Thank you!

Edit: Is it also possible to implement favoriting posts through TagMe? (@- @

Updated

sieghelm_lockayer said:
Oi!~ bitWolfy!~

I'm sorry if it had been asked already, but I was wandering if there's any chance of you implementing a button that quickly toggles between on/off e6's Safe Mode at TagMe? Just like the buttons to toggle the blacklist and the one that alternate between themes.

Thank you!

Edit: Is it also possible to implement favoriting posts through TagMe? (@- @

Sorry for the late response.

Safe mode? As in, the one that filters out young -rating:s?
That should be off by default, as the script fetches posts using your API key. Although, I'll have to double check that. I'm not entirely sure why you would want to turn it back on.

Favoriting posts is ultimately not the goal of this tool. Even adding posts to sets really isn't the point, although some people do use it like that.
You can always just open the post in a new tab (using hotkeys or the link under the image) and favorite it from there.

bitwolfy said:
Sorry for the late response.

No need to apologize and it wasn't late. :0

Safe mode? As in, the one that filters out young -rating:s?

It's the one at the settings which filters every explicit and questionable posts. Account -> Settings -> Safe Mode.

That should be off by default, as the script fetches posts using your API key. Although, I'll have to double check that. I'm not entirely sure why you would want to turn it back on.

Particularly I prefer tagging safe rated posts as there's a bunch of cool looking artwork there and it's also, unfortunately, not that well maintained compared to NSFW posts (in terms of tagging) so I decided to focus more on them to help people find all these cool looking posts too. xD

With safe mode I can also get every SFW posts from every project that is already there, instead of having to clone it and add rating:s to the search of the project which helps tremendously.

If you ask why I don't use the blacklist, well if I use the blacklist the posts will still appear, but blurred. Now with safe mode it skips these posts entirely.

With a toggle I could quickly toggle safe mode here and then when I done I can turn it off as I don't mind browsing e621 itself without this filter. But sometimes I f

Favoriting posts is ultimately not the goal of this tool. Even adding posts to sets really isn't the point, although some people do use it like that.
You can always just open the post in a new tab (using hotkeys or the link under the image) and favorite it from there.

Yeah... Having a button to favorite would be just for convenience as whenever I find a cool looking post (which happens quite often), I open it and then favorite, but I understand why you wouldn't add it. xD

That Monkey Meme: Where FavMe!?

Thank you! :)

Updated

sieghelm_lockayer said:
It's the one at the settings which filters every explicit and questionable posts. Account -> Settings -> Safe Mode.

That should be off by default, as the script fetches posts using your API key. Although, I'll have to double check that. I'm not entirely sure why you would want to turn it back on.

Particularly I prefer tagging safe rated posts as there's a bunch of cool looking artwork there and it's also, unfortunately, not that well maintained compared to NSFW posts (in terms of tagging) so I decided to focus more on them to help people find all these cool looking posts too. xD

With safe mode I can also get every SFW posts from every project that is already there, instead of having to clone it and add rating:s to the search of the project.

If you ask why I don't use the blacklist, well if I use the blacklist the posts will still appear, but blurred. Now with safe mode it skips these posts entirely.

Ah, I see.

It's pretty easy to implement, but might prove troublesome, and will cause issues with some projects. As I explained to ShadyGuy above, I already use 3 tags (out of the maximum of 40) when fetching posts. Adding rating:s to the mix would mean that I would be using 4, which will break or limit the scope of some projects.

If I can come up with a solution on how to deal with swf files, that would free up one of the tags I use, which means I'll be able to implement this feature.
I'll have to think about the best way to do that. Unfortunately, I do not have much time that I can dedicate to my programming projects these days, but I'll see what I can do.

bitwolfy said:
Ah, I see.

It's pretty easy to implement, but might prove troublesome, and will cause issues with some projects. As I explained to ShadyGuy above, I already use 3 tags (out of the maximum of 40) when fetching posts. Adding rating:s to the mix would mean that I would be using 4, which will break or limit the scope of some projects.

If I can come up with a solution on how to deal with swf files, that would free up one of the tags I use, which means I'll be able to implement this feature.
I'll have to think about the best way to do that. Unfortunately, I do not have much time that I can dedicate to my programming projects these days, but I'll see what I can do.

I'm sorry for my ignorance, but I thought there was some way to simply use the API to look at my settings in e621 and just turn on/off Safe Mode, if it's that troublesome you don't need to worry that much with that. I can still just turn it on/off through e621 (having a toggle at TagMe! isn't a necessity, it would be just more convenient). Although if you still are determined to attempt implemeting it, please put it as low priority.

Take care! :)

sieghelm_lockayer said:
I'm sorry for my ignorance, but I thought there was some way to simply use the API to look at my settings in e621 and just turn on/off Safe Mode, if it's that troublesome you don't need to worry that much with that. I can still just turn it on/off through e621. Although if you still are determined to, at least, attempt implemeting it, please put it as low priority.

Take care! :)

I don't think that setting has impact on the API output. Although, I have not checked.
Actually, it just occurred to me that requesting the data from e926 might do the same thing, and would not require editing your settings. I'll see what I can do.

I can't see where this is in the github repo, but the short name description:

> Short name, used primarily in the page URL. Should (roughly) match the project title.
> Can only contain letters, numbers, and underscores.

Should probably mention the short name has to be between 3 and 16 characters long, I had to peek at source before I realised that was why I couldn't create a new project.

I'm curious where that actually is in the repo, github search didn't seem to find anything, and I would have preferred to just file a PR

Oh, also, do skipped posts come back up again?

Like, if a tagging project is to optionally add a bunch of tags to something already with the tag, can you mark a post as "dealt with" for the project, without it then just coming back again later?

A practical example: Tagging impregnation pics with ovum and/or sperm_cell as appropriate.
An image can fit impregnation without having either of those, but if skipped, would it just come up again later, or can it be marked as "dealt with" so it never comes back?

Also, is it possible to ask it to tag in date order, rather than order:random?

dr-spangle said:
I can't see where this is in the github repo, but the short name description:

> Short name, used primarily in the page URL. Should (roughly) match the project title.
> Can only contain letters, numbers, and underscores.

Should probably mention the short name has to be between 3 and 16 characters long, I had to peek at source before I realised that was why I couldn't create a new project.

I'm curious where that actually is in the repo, github search didn't seem to find anything, and I would have preferred to just file a PR

You are right, it should probably be mentioned on the page.
I'm really unhappy with the state of this project overall.

The validation is done in two places: via JS[1] using the "pattern" attribute[2] on the input, and in PHP[3] when submitting the form.
The help text is here.

dr-spangle said:
Oh, also, do skipped posts come back up again?

Like, if a tagging project is to optionally add a bunch of tags to something already with the tag, can you mark a post as "dealt with" for the project, without it then just coming back again later?

A practical example: Tagging impregnation pics with ovum and/or sperm_cell as appropriate.
An image can fit impregnation without having either of those, but if skipped, would it just come up again later, or can it be marked as "dealt with" so it never comes back?

Also, is it possible to ask it to tag in date order, rather than order:random?

Yes, skipped posts come up again eventually.
The system works like this: when you open a project you have not worked on before, you are assigned a random seed. That seed is used to generate random sequence of posts based on the project's tags.
When you either skip a post or submit your changes, you move on to the next post in the sequence. The progress is saved by keeping track of the index of the current image in that sequence – that's why you can close and re-open a project, and you will return to the image that you left off on.
Once that sequence runs out of posts, or you hit the hard 750 page limit that the e621 API imposes, the seed gets regenerated, and you start anew. When that happens, you will start encountering posts you've skipped again.

It's done this way because it's actually pretty difficult to filter out posts from a search.
I would be fetching a page of results (320 max), then checking them against my database to see if you've seen them. And if you've seen all of them, I would have to fetch another page of requests. And potentially another, and another, and another.
All in all, it exponentially increases the complexity of this whole thing.

It's not possible at the moment to use any order except for the random one.

bitwolfy said:
You are right, it should probably be mentioned on the page.
I'm really unhappy with the state of this project overall.

The validation is done in two places: via JS[1] using the "pattern" attribute[2] on the input, and in PHP[3] when submitting the form.
The help text is here.

Doing the validation client side and server side makes sense. The pattern attribute on the input element is how I realised where I was going wrong.
Filed a little PR to improve that text, at least!
I'll have to browse around the github source some more too :D

bitwolfy said:
Yes, skipped posts come up again eventually.
The system works like this: when you open a project you have not worked on before, you are assigned a random seed. That seed is used to generate random sequence of posts based on the project's tags.
When you either skip a post or submit your changes, you move on to the next post in the sequence. The progress is saved by keeping track of the index of the current image in that sequence – that's why you can close and re-open a project, and you will return to the image that you left off on.
Once that sequence runs out of posts, or you hit the hard 750 page limit that the e621 API imposes, the seed gets regenerated, and you start anew. When that happens, you will start encountering posts you've skipped again.

It's done this way because it's actually pretty difficult to filter out posts from a search.
I would be fetching a page of results (320 max), then checking them against my database to see if you've seen them. And if you've seen all of them, I would have to fetch another page of requests. And potentially another, and another, and another.
All in all, it exponentially increases the complexity of this whole thing.

It's not possible at the moment to use any order except for the random one.

Ahhh, okay, that is interesting. Basically, my problem at the moment is that I built a tagging system for myself, and it's just a mess. It's based in telegram, which limits to 10-20 button presses per minute, which makes it so tedious to use. So was hoping to switch to using yours, as it seems a fair bit more pleasant than that!
But mine has 2 modes: Projects can either be tagging old stuff, or tag new stuff as it comes in matching the search.
And the old-stuff projects just go backward by date starting from an ID, and log which IDs are done, and then yeah, pages through if need be to find new stuff, which can take a lil while if it's not cached. Hmm. (My projects haven't been more than 100 pages long)
It does feel like, with some caching, that would be roughly doable with your system though, store a start ID and the IDs done/skipped, get a new page of IDs, cache them and store the page number, serve up posts from that cache until it's empty, then get the next page? I'm not sure.
I've been mulling over whether there's another solution, like adding a temporary tag to everything matching the search to start with, then removing it as I go through, but that's too messy for e621 I should think.

I dunno, I'm not sure whether this is stuff that could be extended into this, or stuff I could add to a private instance forked from your tool (If that's okay!), or something?

dr-spangle said:
Doing the validation client side and server side makes sense. The pattern attribute on the input element is how I realised where I was going wrong.
Filed a little PR to improve that text, at least!
I'll have to browse around the github source some more too :D

Thanks! I'll take a look when I get home.

dr-spangle said:
Ahhh, okay, that is interesting. Basically, my problem at the moment is that I built a tagging system for myself, and it's just a mess. It's based in telegram, which limits to 10-20 button presses per minute, which makes it so tedious to use. So was hoping to switch to using yours, as it seems a fair bit more pleasant than that!
But mine has 2 modes: Projects can either be tagging old stuff, or tag new stuff as it comes in matching the search.
And the old-stuff projects just go backward by date starting from an ID, and log which IDs are done, and then yeah, pages through if need be to find new stuff, which can take a lil while if it's not cached. Hmm. (My projects haven't been more than 100 pages long)
It does feel like, with some caching, that would be roughly doable with your system though, store a start ID and the IDs done/skipped, get a new page of IDs, cache them and store the page number, serve up posts from that cache until it's empty, then get the next page? I'm not sure.
I've been mulling over whether there's another solution, like adding a temporary tag to everything matching the search to start with, then removing it as I go through, but that's too messy for e621 I should think.

I dunno, I'm not sure whether this is stuff that could be extended into this, or stuff I could add to a private instance forked from your tool (If that's okay!), or something?

To be honest with you, I really dislike the back-end of this tool. The front-end is relatively okay, the server side of things is horrifying.
I am in the process of rewriting this thing in NodeJS, and I think that it's coming along quite nicely. That's why I'm hesitant to invest time and effort into upgrading the PHP version.

One way to reliably exclude visited posts would be using sets.
That is, create a set (unique to the user and the project, named tagme-bitwolfy-project12345, for example), add skipped posts to it, and have it excluded from the search when fetching posts: tag1 tag2 tag3 -set:tagme-bitwolfy-project12345.
It's a lot more straightforward, but requires a more setup. Kind of like your "temporary tag" idea, but without the mess.

TagMe is distributed under the GPLv3 license. You are more than welcome to fork, modify, run, and distribute it – as long as your version is also open-source and retains the same license.

hi. I was about to make a "fisting penetration" project on TagMe. I would add an option to nuke everything related to penetration. This would include all gender-/body type- combos and orifices (I'd guess 40+ tags) but before I do so... would this fuck up something?

dubsthefox said:
hi. I was about to make a "fisting penetration" project on TagMe. I would add an option to nuke everything related to penetration. This would include all gender-/body type- combos and orifices (I'd guess 40+ tags) but before I do so... would this fuck up something?

I don't think so.
But be careful with that. Check that all of the removed tags are valid in your tag history for a few dozen posts, just in case.

bitwolfy said:
I don't think so.
But be careful with that. Check that all of the removed tags are valid in your tag history for a few dozen posts, just in case.

Don't worry. It's explicitly written, in the penetration wiki, that fisting/fingering is not considered penetration, in terms of e621. I'll also point out that the users have to be careful, and have to make sure that there are no sex toys/disembodied penises/etc in any orifice.

bitwolfy said:
Thanks! I'll take a look when I get home.

To be honest with you, I really dislike the back-end of this tool. The front-end is relatively okay, the server side of things is horrifying.
I am in the process of rewriting this thing in NodeJS, and I think that it's coming along quite nicely. That's why I'm hesitant to invest time and effort into upgrading the PHP version.

One way to reliably exclude visited posts would be using sets.
That is, create a set (unique to the user and the project, named tagme-bitwolfy-project12345, for example), add skipped posts to it, and have it excluded from the search when fetching posts: tag1 tag2 tag3 -set:tagme-bitwolfy-project12345.
It's a lot more straightforward, but requires a more setup. Kind of like your "temporary tag" idea, but without the mess.

TagMe is distributed under the GPLv3 license. You are more than welcome to fork, modify, run, and distribute it – as long as your version is also open-source and retains the same license.

Ahh, that's fair! It's nice having the front end and back end in the same language, so I get your motivation there!
Sounds like it would be wise for me not to dig too much into it in the meanwhile then, just in case it all changes!

Using a set is very smart, I didn't think about that!
I guess I could do it by adding everything to the set, and then removing them as I go? Or adding them all as I go, I guess. I suppose either works, but the former would mean a separate script adding all new posts to a set.. Okay, I guess the latter is best!

As for post ordering, I think I would personally prefer posts to be in date order for my tagging projects.. But maybe that would present conflicts when multiple people are working on the same project, so it might not be appropriate for the public instance.
What do you think? Should this be an option when creating a project (which I could look at making a PR for), or is it best if that's only done on a private instance in a fork?

(though I guess there's no deployment instructions in the repo yet, but yeah)

could the option-name-character-limit be reduced to two? a few of my projects have y/n questions and i’ve had to mark one of them as “no.” instead of “no”. no big deal but seems like an oversight

This thing is great. You've saved me the trouble of writing my own tool and probably ending up with one that's nowhere near as good as yours.

Could you add some indication of whether the post you're looking at has a parent or children, or is in a pool? I seem to have some intuition for that (clearly I spend too long on here) but I'm finding myself clicking through to the post fairly often.

I was also stuck for some time trying to create a new project because I didn't realise the "Project Name" field couldn't contain '/'. If just for me, could you update the <input pattern/>? I think it's this one.

It isn't working, I am logged in but no posts are coming up when I click on a project. I also don't have the ability to create a project.

domjo said:
It isn't working, I am logged in but no posts are coming up when I click on a project. I also don't have the ability to create a project.

You only have 47 tag edits.

You won't be able to use this tool until you have at least 100 manual tag edits, just to make sure you know what you are doing.
And you won't be able to create your own projects until you reach 1000 tag edits.

I tried to create a new project but it just says "Error: Wrong input format". Would be nice if it would at least explain which of the many fields on the page is in the wrong format, and preferably how, so I could give a more detailed report.

watchdog22 said:
Is it possible to completely skip the blacklisted post? like, do not show them at all?

Maybe clone whatever tag project you're doing, and add your blacklist lines to the search, if it fits?

Perhaps I'm stupid, but I don't seem to see anything when I click on a project other than the overview of the project itself, but no posts load. Is there a guide or button that I missed?

Ah

To prevent spam and ensure higher quality tagging, only users with 100 manual post edits can resolve projects.

That would be why lol.

Updated

If the rewrite is still going, I'd like to raise the idea of a third action option alongside 'Skip' and 'Submit' : 'N/A'.

Skipping posts is fine in the case that it's difficult to tell what the correct resolution would be. But in some cases it seems to me ideally, the post id should be 'blacklisted from the project'. That is in the case where it is clear that no changes are needed. For example take the criteria defined by talking_feral project:

1. The feral talks (Action: +talking_feral)
2. There are no ferals (Action: -feral and a bunch of tags that implicate it)
3. There is no dialogue (Action: -dialogue)

'N/A' (or 'no action needed') would be useful in this example when all of the following are simultaneously and clearly true : There is a feral depicted in the post, the feral does not talk, but there is dialogue.

So to summarize, N/A would in theory be triggered by the user when they see that the post both can not and should not be addressed by the project, it would add the post id to a list associated with the project, and
these 'irrelevant' posts could then be ignored for anybody working on the project.

savageorange said:
'N/A' (or 'no action needed') would be useful in this example when all of the following are simultaneously and clearly true : There is a feral depicted in the post, the feral does not talk, but there is dialogue.

+1
It would be great to be able to add a 'post id blacklist' to a project, being able to make it so that certain posts don't show up in a project.

For example, in my Minecraft Wolf Breeds project, there are 3 posts that can't be tagged as they're 'custom'
Like this post #4644468 , where it's a retexture of a mob in-game to show a transformation, and doesn't match any of the 'vanilla' variants, so it would be great to be able to remove it from the resolve 'queue'

dirtyderg said:
+1
It would be great to be able to add a 'post id blacklist' to a project, being able to make it so that certain posts don't show up in a project.

For example, in my Minecraft Wolf Breeds project, there are 3 posts that can't be tagged as they're 'custom'
Like this post #4644468 , where it's a retexture of a mob in-game to show a transformation, and doesn't match any of the 'vanilla' variants, so it would be great to be able to remove it from the resolve 'queue'

The best way to accomplish this (in personal projects), I've learned from Donovan, is to have them be added to a set when no action is needed then add -set:id to the query. It's not a perfect solution, but it works. You can add posts to a set with set:id when adding tags.

  • 1
  • 2