fix(search): every related and live-search request takes a slot, and a failed one gives it back
A related list's cursor cost nothing, and a cursor is a free string: a replayed one read and enriched without end. Every request now takes a slot of the user's daily cap — taken under a lock before the work (`quota.claim_action`), so requests sent together cannot all pass the last free one, and given back when the request fails outright (`quota.refund_action`). The live search's scrape source takes its slots the same way. A limit of 0 turns the feature off: a distinct 409 `related_disabled` / `search_disabled`, and `/api/me` says `related_enabled` / `search_enabled` so the UI can leave it out. A videos.list that fails no longer reads as an empty page: `ingest_candidates` raises, and the search and the related list answer the refusal (the shared budget spent says "quota") instead of "no results". The two routes' page loops are one (`_gather`). `clear` deletes only what the caller found: a related list's rows carry no find, and any user could name them.
This commit is contained in:
@@ -188,7 +188,9 @@
|
||||
"quota_spent": "Today's shared YouTube budget is spent. Try again tomorrow.",
|
||||
"recipient_required": "A recipient email is required",
|
||||
"registration_closed": "Registration is currently closed",
|
||||
"related_disabled": "Related videos are turned off on this instance.",
|
||||
"related_daily_limit": "You've opened today's limit of related lists ({{limit}}). Try again tomorrow.",
|
||||
"search_disabled": "Live YouTube search is turned off on this instance.",
|
||||
"search_daily_limit": "You've reached today's YouTube search limit ({{limit}}). Try again tomorrow.",
|
||||
"search_term_required": "Enter something to search for",
|
||||
"session_gone": "The playback session ended",
|
||||
|
||||
Reference in New Issue
Block a user