fix(channels): a channel YouTube no longer returns is not asked for on every view

channels.list simply omits a terminated channel, so nothing was stamped and the
channel page spent a quota unit on it every time. The miss is stamped like a
fetch; the published_at sentinel that kept it stale is gone.
This commit is contained in:
2026-09-27 13:58:23 +02:00
parent 7987bd8a37
commit c9e95ecea6
4 changed files with 63 additions and 19 deletions
+13 -3
View File
@@ -1,5 +1,6 @@
"""Import the authenticated user's YouTube subscriptions and channel metadata."""
from collections.abc import Iterable
from datetime import datetime, timedelta, timezone
from sqlalchemy import or_, select
@@ -68,8 +69,16 @@ def details_stale_clause(now: datetime):
)
def apply_channel_details(db: Session, items: list[dict]) -> None:
def apply_channel_details(db: Session, items: list[dict], asked: Iterable[str]) -> None:
"""Write `channels.list`'s answer onto the rows. `asked` is every id the call asked for: one
YouTube did not return (terminated, deleted) is stamped as synced too — otherwise it stays
stale forever and every view / import asks for it again, spending quota on a known miss."""
now = datetime.now(timezone.utc)
returned = {item["id"] for item in items}
for cid in set(asked) - returned:
missing = db.get(Channel, cid)
if missing is not None:
missing.details_synced_at = now
for item in items:
channel = db.get(Channel, item["id"])
if channel is None:
@@ -179,8 +188,9 @@ def import_subscriptions(db: Session, user: User) -> dict:
)
detailed = 0
if need_details:
items = yt.get_channels([c.id for c in need_details])
apply_channel_details(db, items)
ids = [c.id for c in need_details]
items = yt.get_channels(ids)
apply_channel_details(db, items, ids)
detailed = len(items)
db.commit()