Quick and Claude Fable 5
ed4cebf3ba
feat(ai): per-user transcription quota for subtitle ASR jobs
...
Cap how many Whisper transcription jobs each user account can start per
rolling window (day/week/month), configurable from admin settings. The
player modal shows remaining usage and the server returns 429 with
details when the limit is hit.
Enforcement is atomic with the job insert (per-user advisory lock, same
pattern as media-request quotas), so concurrent requests cannot race
past the limit. Failed/cancelled jobs that never produced transcription
work are refunded. Exemption applies to the admin account's primary
profile only; other profiles on an admin account stay subject to the
quota. A partial index covers the quota count, a malformed quota
setting row degrades to "no quota" instead of blocking startup, and the
period vocabulary and admin-role predicate are each defined once
(ai.ValidQuotaPeriod, apimw.IsAdmin).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-06-10 16:02:42 -04:00
..
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 15:57:05 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-06 23:51:30 -04:00
2026-06-09 13:00:48 -04:00
2026-06-08 18:17:08 -04:00
2026-06-07 15:57:05 -04:00
2026-06-07 17:18:55 -04:00
2026-06-07 17:18:55 -04:00
2026-06-09 13:00:48 -04:00
2026-06-07 21:32:40 -04:00
2026-06-10 08:18:35 -04:00
2026-06-10 08:18:35 -04:00
2026-06-10 08:18:35 -04:00
2026-06-09 13:00:48 -04:00
2026-06-08 21:55:35 -04:00
2026-06-08 21:55:35 -04:00
2026-06-08 21:55:35 -04:00
2026-06-09 19:28:53 -04:00
2026-06-09 19:44:40 -04:00
2026-06-10 08:18:35 -04:00
2026-06-10 08:18:35 -04:00
2026-06-10 08:18:35 -04:00
2026-06-10 14:58:54 -04:00
2026-06-10 14:58:54 -04:00
2026-06-10 11:56:59 -04:00
2026-06-10 16:02:42 -04:00