merge: full-history chip reflects shared deep-queue state

This commit is contained in:
npeter83 2026-06-12 02:29:10 +02:00
commit 0dad71cf6e
3 changed files with 39 additions and 14 deletions

View file

@ -36,6 +36,22 @@ def list_channels(
).all(): ).all():
stored[cid] = count stored[cid] = count
# Channels already in the *global* deep-backfill queue — i.e. at least one user (any
# user) has requested full history and it isn't done yet. Their whole back-catalogue is
# coming for everyone (video data is shared), so the UI shouldn't offer "get full
# history" to a user who simply hasn't personally opted in.
deep_queued: set[str] = set()
if channel_ids:
for (cid,) in db.execute(
select(Subscription.channel_id)
.where(
Subscription.channel_id.in_(channel_ids),
Subscription.deep_requested.is_(True),
)
.distinct()
).all():
deep_queued.add(cid)
# The user's personal tag links, grouped by channel. # The user's personal tag links, grouped by channel.
tags_by_channel: dict[str, list[int]] = {} tags_by_channel: dict[str, list[int]] = {}
for cid, tag_id in db.execute( for cid, tag_id in db.execute(
@ -57,6 +73,7 @@ def list_channels(
"priority": sub.priority, "priority": sub.priority,
"hidden": sub.hidden, "hidden": sub.hidden,
"deep_requested": sub.deep_requested, "deep_requested": sub.deep_requested,
"deep_in_queue": ch.id in deep_queued and not ch.backfill_done,
"tag_ids": tags_by_channel.get(ch.id, []), "tag_ids": tags_by_channel.get(ch.id, []),
"details_synced": ch.details_synced_at is not None, "details_synced": ch.details_synced_at is not None,
"recent_synced": ch.recent_synced_at is not None, "recent_synced": ch.recent_synced_at is not None,

View file

@ -354,24 +354,31 @@ function ChannelRow({
/> />
{c.backfill_done ? ( {c.backfill_done ? (
<SyncBadge ok label="full" hint="Full history fetched." /> <SyncBadge ok label="full" hint="Full history fetched." />
) : ( ) : c.deep_requested ? (
<Tooltip <Tooltip hint="Full history requested — this channel's whole back-catalog will backfill as the shared quota allows. Click to cancel your request.">
hint={
c.deep_requested
? "Full history requested — this channel's whole back-catalog will backfill as the shared quota allows. Click to cancel the request."
: "Only recent uploads so far. Click to request this channel's full back-catalog (older videos + complete search)."
}
>
<button <button
onClick={onDeep} onClick={onDeep}
className={`inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded-full border transition ${ className="inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded-full border border-accent bg-accent text-accent-fg transition"
c.deep_requested
? "bg-accent text-accent-fg border-accent"
: "bg-card border-border text-muted hover:border-accent"
}`}
> >
<History className="w-3 h-3" /> <History className="w-3 h-3" />
{c.deep_requested ? "full history queued" : "get full history"} full history queued
</button>
</Tooltip>
) : c.deep_in_queue ? (
<Tooltip hint="Another subscriber already requested this channel's full history, so its whole back-catalog is on its way to everyone — nothing to do here.">
<span className="inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded-full border border-accent/40 text-accent">
<History className="w-3 h-3" />
full history queued
</span>
</Tooltip>
) : (
<Tooltip hint="Only recent uploads so far. Click to request this channel's full back-catalog (older videos + complete search).">
<button
onClick={onDeep}
className="inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded-full border bg-card border-border text-muted hover:border-accent transition"
>
<History className="w-3 h-3" />
get full history
</button> </button>
</Tooltip> </Tooltip>
)} )}

View file

@ -176,6 +176,7 @@ export interface ManagedChannel {
priority: number; priority: number;
hidden: boolean; hidden: boolean;
deep_requested: boolean; deep_requested: boolean;
deep_in_queue: boolean;
tag_ids: number[]; tag_ids: number[];
details_synced: boolean; details_synced: boolean;
recent_synced: boolean; recent_synced: boolean;