Danbooru

Danbooru changelog discussion thread

Posted under Bugs & Features

DeusExCalamus said:

Time marches on and standards change, either upgrade firefox to 78ESR or if you have a problem with the newer versions that's causing you to stick to that old one, consider looking into a fork or pale moon/vivaldi/whatever the kids are using these days.

I know and I hate it.

BrokenEagle98 said:

You can set the rate of how often an RSS reader checks the feeds. At least, that's what I've experienced on every single RSS reader that I've used.

You can usually set the global repeat, but you usually can't set the *per-domain* rate-limiting clientside. Google Reader didn't let you do that, and neither does Liferea. So for RSS readers, if you put your Danbooru RSS feeds into a folder, then regardless of whether you check feeds once an hour or once a week, the Danbooru feeds will be checked sequentially immediately, triggering the empty response errors from the Danbooru server when you hit feed #51.

Thornton said:

This breaks RSS readers.

It breaks shitty RSS readers. I have to deal with people trying to update their RSS feeds 10 times per second, 24 hours a day. This is ridiculously excessive.

I had one user in particular searching the 86 -eightysix tag over a million times per week. Note the typo; the actual tag is 86 -eightysix-. And note that it's some 180 post tag that doesn't even get one post per day. His search was completely broken but that didn't stop him from checking it multiple times per second.

I had another user another checking his feeds thousands of times per hour, rotating his IP at regular intervals to avoid getting IP banned. Instead of asking why he kept getting IP banned, he just kept finding ways to avoid it.

Right now, about 60-70% of RSS feed traffic is failing because of rate limit errors. This tells me the people running these feeds aren't even paying attention, because they don't notice when they're broken.

So blame the people abusing the system. The limit is already generous because you shouldn't need to check the same tag more than once per minute. Even that is way more than any reasonable person needs.

Thornton said:

You can usually set the global repeat, but you usually can't set the *per-domain* rate-limiting clientside. Google Reader didn't let you do that, and neither does Liferea. So for RSS readers, if you put your Danbooru RSS feeds into a folder, then regardless of whether you check feeds once an hour or once a week, the Danbooru feeds will be checked sequentially immediately, triggering the empty response errors from the Danbooru server when you hit feed #51.

There are multiple issues discussing rate limiting for Liferea. Here's one: https://github.com/lwindolf/liferea/issues/819. I would consider any feed reader that doesn't respect HTTP 429 rate limit errors and back off to be broken. This is a pretty standard thing, and Danbooru is not the only site that rate limits RSS feeds like this.

The problem I'm dealing with is that whatever rate limit I set, I'm going to have multiple users checking their RSS feeds at the maximum speed, 24 hours a day, probably from multiple IPs. They don't send a username or API key with their requests, so I have no way of contacting abusive users to tell them to knock it off. So my only options are IP bans or rate limiting, and IP bans are ineffective since people just rotate IPs and keep going.

Updated

Yes, there are open issues. Open, as in, not yet fixed, and with no fix in the foreseeable future. I did see them before I commented, to verify that I had not missed some obvious Liferea setting or workaround.

I sympathize with the problem as I have similar issues on sites I run, and I do not object to ratelimiting or trying to deal with abusive users. But there is a difference between regular RSS reader use where a few hundred/thousand feeds are checked once or twice a day, and the abusive users whose DoS you are trying to deal with. The current approach is a blunt one. Returning empty results with HTTP 429 errors is not the only possibility. You could, for example, ratelimit the abusive users who spam requests 24 hours a day, rather than everyone, or you could delay responses after a threshold (great thing about RSS readers is that it doesn't matter how slow the response is, because you're still reading everything else). Or you could have the ratelimit only on username/key-less requests, and then you would be able to contact or remove access to abusers, forcing them back onto ratelimited anon IP access if they persist.

FWIW, I ignored the errors for a while because I was hoping they would go away, and I wasn't sure that they were coming from Danbooru's end. Most computer users have learned the hard way that computers are a pit of despair and suffering, and if you ignore problems long enough, they may go away, and time spent investigating was wasted.

The limit is already generous because you shouldn't need to check the same tag more than once per minute.

I don't follow how it's 'generous'. The rate limit applies to all requests in that minute, does it not? That is why my RSS feeds are failing, because I have >50 unique (different tag) RSS feeds, and each one counts towards the 50-request limit. Liferea is not trying to check any tag more than once, AFAIK.

Updated

Bit of a feature request/idea, apologies in advance if it's been brought up before: it might be useful if the post scores beneath the thumbnails are visible everywhere instead of just the posts page, e.g. in pools, user profile pages, parent/child thumbnails in post pages, etc.

Sproq981 said:

I don't know if this is the best thread for my question, but I recently found this piece (https://twitter.com/muryou_tada/status/1471817084221136898) on Mona from Genshin Impact and I was going to upload it, but when I checked if someone already did that, I find that the artist had been banned. What's up with that? Are they the kind that go ballistic over these kinds of websites? Would I get in trouble if I uploaded the piece? (I haven't FYI.)

Banned artists are artists that have personally requested their art be taken down. Posts belonging to banned artists are not visible to members below Gold status. You won't get in trouble for uploading their art, but you won't be able to interact with it in any way once you've finalized the upload.

gs://danbooru_public is inaccessible (need 'storage.objects.list' permission). This started around the same time the bigquery dumps stopped updating.

Also, some of the larger dumps rarely update (like posts). Is that intentional?

gs://danbooru_public is inaccessible (need 'storage.objects.list' permission). This started around the same time the bigquery dumps stopped updating.

I made it private because someone was using too much bandwidth and it was going to cost me $50 per day at the rate they were going. I've made it public again, but now the bucket is requester pays, meaning you need to set up a Google Cloud project to download it.

Also, some of the larger dumps rarely update (like posts). Is that intentional?

Sometimes they fail because the larger dumps take 6+ hours to complete.

I don't know if this is because of the underlying changes in the site, but has anybody experienced post images taking some time to load lately? Like slowly even if the image is <500kb and on a fast internet connection?

MaskedAvenger said:

I don't know if this is because of the underlying changes in the site, but has anybody experienced post images taking some time to load lately? Like slowly even if the image is <500kb and on a fast internet connection?

Me too. Most images on Danbooru are loading slower than usual, even the Safebooru mirror site is not spared from the image load slowdown.

evazion said:

Sometimes they fail because the larger dumps take 6+ hours to complete.

Could the larger dumps be started every 2 or 3 or 7 days, but given all the time they need to complete? It would make the update schedule predictable and reduce the load on the server (no effort wasted on failed dumps).

Most dumps update daily with occasional failures, but posts hasn't updated since January 6.

Updated

Some fields in media_metadata.json are corrupted. They are binary blobs, and it looks like zero bytes are dropped, and bytes with the high bit set are replaced with ASCII ?. There are several examples in the first record (media_metadata id 1, which is also post #1).

As a simple but ugly workaround you could decode as Latin-1 (and keep zero bytes). Or use hex/base64 obviously, but this affects fields like File:Comment that are usually text.

forum #205097

https://www.pixiv.net/en/artworks/63313611. Dot ignored. Etc. https://www.pixiv.net/en/artworks/63313611:11 and another a symbols.
Theoretically, there could be problems if the separator creates different pages of images.

https://www.deviantart.com/sciamano240/art/Tifa-Senate-905156149
It felt like the check had gone in cycles. Then the result about the duplicate was given. Unusual sensations.

Forced the type https://www.deviantart.com/sciamano240/art/90515614
1. Correct 404 message;
2. Added 9 and press Enter for https://www.deviantart.com/sciamano240/art/905156149 ;
3. The message "error: Not an image or video".

https://danbooru.donmai.us/uploads/4974680.json
{"id":4974680,"source":"https://www.deviantart.com/sciamano240/art/905156149","file_path":null,"content_type":null,"rating":"q","uploader_id":418258,"tag_string":"","status":"error:  Not an image or video","backtrace":"/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/validations.rb:80:in `raise_validation_error'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/validations.rb:53:in `save!'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/transactions.rb:302:in `block in save!'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/transactions.rb:302:in `save!'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/suppressor.rb:54:in `save!'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/instrumentation/active_record_prepend.rb:36:in `block in save!'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/transaction.rb:820:in `with_database_metric_name'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent.rb:680:in `with_database_metric_name'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/instrumentation/active_record_prepend.rb:35:in `save!'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/persistence.rb:55:in `create!'\n/danbooru/app/models/media_asset.rb:211:in `upload!'\n/danbooru/app/models/upload.rb:104:in `process_upload!'\n/danbooru/app/jobs/process_upload_job.rb:7:in `perform'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/execution.rb:59:in `block in _perform_job'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:118:in `block in run_callbacks'\n/danbooru/app/jobs/application_job.rb:17:in `block (4 levels) in \u003cclass:ApplicationJob\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/timeout-0.2.0/lib/timeout.rb:107:in `block in timeout'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/timeout-0.2.0/lib/timeout.rb:117:in `timeout'\n/danbooru/app/jobs/application_job.rb:16:in `block (3 levels) in \u003cclass:ApplicationJob\u003e'\n/danbooru/app/models/application_record.rb:133:in `without_timeout'\n/danbooru/app/jobs/application_job.rb:15:in `block (2 levels) in \u003cclass:ApplicationJob\u003e'\n/danbooru/app/logical/current_user.rb:29:in `block in scoped'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/current_attributes.rb:205:in `set'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/current_attributes.rb:147:in `set'\n/danbooru/app/logical/current_user.rb:28:in `scoped'\n/danbooru/app/jobs/application_job.rb:14:in `block in \u003cclass:ApplicationJob\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `instance_exec'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `block in run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/tracer.rb:104:in `in_transaction'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/instrumentation/active_job.rb:67:in `run_in_transaction'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/instrumentation/active_job.rb:56:in `perform'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/newrelic_rpm-8.3.0/lib/new_relic/agent/instrumentation/active_job.rb:23:in `block (4 levels) in \u003cmain\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `instance_exec'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `block in run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/i18n-1.8.11/lib/i18n.rb:314:in `with_locale'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/translation.rb:9:in `block (2 levels) in \u003cmodule:Translation\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `instance_exec'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `block in run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/core_ext/time/zones.rb:66:in `use_zone'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/timezones.rb:9:in `block (2 levels) in \u003cmodule:Timezones\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `instance_exec'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `block in run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:138:in `run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/execution.rb:58:in `_perform_job'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/instrumentation.rb:20:in `_perform_job'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/execution.rb:46:in `perform_now'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/instrumentation.rb:14:in `block in perform_now'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/instrumentation.rb:25:in `block in instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/notifications.rb:206:in `block in instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/notifications.rb:206:in `instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/instrumentation.rb:35:in `instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/instrumentation.rb:14:in `perform_now'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/logging.rb:18:in `block in perform_now'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/tagged_logging.rb:99:in `block in tagged'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/tagged_logging.rb:37:in `tagged'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/tagged_logging.rb:99:in `tagged'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/logging.rb:25:in `tag_logger'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/logging.rb:18:in `perform_now'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/execution.rb:24:in `block in execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:118:in `block in run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/railtie.rb:54:in `block (4 levels) in \u003cclass:Railtie\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/execution_wrapper.rb:89:in `wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/reloader.rb:72:in `block in wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/execution_wrapper.rb:85:in `wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/reloader.rb:71:in `wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/railtie.rb:53:in `block (3 levels) in \u003cclass:Railtie\u003e'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `instance_exec'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:127:in `block in run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/callbacks.rb:138:in `run_callbacks'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activejob-7.0.1/lib/active_job/execution.rb:22:in `execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/execution.rb:290:in `block (2 levels) in execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/notifications.rb:206:in `block in instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/notifications.rb:206:in `instrument'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/execution.rb:289:in `block in execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/current_thread.rb:84:in `within'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/execution.rb:284:in `execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/execution.rb:246:in `perform'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/execution.rb:162:in `block in perform_with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/lockable.rb:152:in `block in with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation.rb:880:in `_scoping'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation.rb:428:in `scoping'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/scoping/default.rb:43:in `unscoped'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/lockable.rb:152:in `with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation/delegation.rb:67:in `block in with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation.rb:880:in `_scoping'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation.rb:428:in `scoping'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation/delegation.rb:67:in `with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/execution.rb:157:in `perform_with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation/delegation.rb:67:in `block in perform_with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation.rb:880:in `_scoping'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation.rb:428:in `scoping'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activerecord-7.0.1/lib/active_record/relation/delegation.rb:67:in `perform_with_advisory_lock'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/job_performer.rb:27:in `next'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/scheduler.rb:270:in `block (2 levels) in create_task'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/execution_wrapper.rb:89:in `wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/reloader.rb:72:in `block in wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/execution_wrapper.rb:89:in `wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/activesupport-7.0.1/lib/active_support/reloader.rb:71:in `wrap'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/good_job-2.9.1/lib/good_job/scheduler.rb:269:in `block in create_task'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:24:in `block in execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:47:in `block in synchronize'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:47:in `synchronize'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:47:in `synchronize'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:19:in `execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/ivar.rb:169:in `safe_execute'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/scheduled_task.rb:285:in `process_task'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/timer_set.rb:98:in `block in ns_post_task'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:363:in `run_task'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:352:in `block (3 levels) in create_worker'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:335:in `loop'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:335:in `block (2 levels) in create_worker'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:334:in `catch'\n/root/.asdf/installs/ruby/3.0.3/lib/ruby/gems/3.0.0/gems/concurrent-ruby-1.1.9/lib/concurrent-ruby/concurrent/executor/ruby_thread_pool_executor.rb:334:in `block in create_worker'","post_id":null,"md5_confirmation":null,"created_at":"2022-02-03T05:08:38.338+05:00","updated_at":"2022-02-03T05:08:39.315+05:00","server":null,"parent_id":null,"md5":null,"file_ext":null,"file_size":null,"image_width":null,"image_height":null,"artist_commentary_desc":null,"artist_commentary_title":null,"include_artist_commentary":null,"context":null,"referer_url":"","translated_commentary_title":"","translated_commentary_desc":""}

These are the main variants of "mistakes" that I could guess and check.

Not sure when this change was implemented as I've only noticed it taking hold mid-day where I am, but images are now taking a very long time to upload. What was once instantaneous now takes 30 seconds per image, and for batch uploads for things like comic series, will make something that once took a couple of minutes take possibly an hour.

This is doubly a problem because Batch Upload usually will only load thumbnails up to a certain point (around 15-20 or so) before having issues, so if I'm uploading specific images from a set I have to guess whether I'm even uploading the correct image, which means some of that wait is being wasted on the wrong image.

Updated

  • If you are sniped while on the upload page, you tags will automatically be merged into the other post, and you'll be redirected to that post.

Finally! It's a bit slower to load the upload page, but the automated merging or redirection is welcome.

  • You have to select the file or source before you can start tagging the image.

Really not a fan of this change, the wait time between hitting the bookmarklet and actually being able to start tagging is really obnoxious. What was the reasoning behind this change?

Ars said:

Really not a fan of this change, the wait time between hitting the bookmarklet and actually being able to start tagging is really obnoxious. What was the reasoning behind this change?

From what I understand, it's so that those that upload from a file and those that use the bookmarklet will have the same experience.

Having said that, the wait time is annoying, so perhaps things could be modified somewhat so that a preview image is shown on the upload page while the image is loading, and then replace things with the media asset once that completes.

1 8 9 10 11 12 13 14 15 16 41