47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
|
|
"""live YouTube search: provenance flags
|
||
|
|
|
||
|
|
Revision ID: 0028_live_search_provenance
|
||
|
|
Revises: 0027_message_e2ee
|
||
|
|
Create Date: 2026-06-29
|
||
|
|
|
||
|
|
Adds provenance flags so videos (and channels) that entered the catalog only because a live
|
||
|
|
YouTube search surfaced them can be told apart from organically-synced content and hidden from
|
||
|
|
the Library by default:
|
||
|
|
- videos.via_search — this video first arrived via search
|
||
|
|
- channels.from_search — this channel exists only because search surfaced one of its videos
|
||
|
|
Both default false (every existing row is organic), indexed for the feed's exclude filter.
|
||
|
|
"""
|
||
|
|
from typing import Sequence, Union
|
||
|
|
|
||
|
|
import sqlalchemy as sa
|
||
|
|
from alembic import op
|
||
|
|
|
||
|
|
revision: str = "0028_live_search_provenance"
|
||
|
|
down_revision: Union[str, None] = "0027_message_e2ee"
|
||
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
||
|
|
depends_on: Union[str, Sequence[str], None] = None
|
||
|
|
|
||
|
|
|
||
|
|
def upgrade() -> None:
|
||
|
|
op.add_column(
|
||
|
|
"videos",
|
||
|
|
sa.Column(
|
||
|
|
"via_search", sa.Boolean(), nullable=False, server_default="false"
|
||
|
|
),
|
||
|
|
)
|
||
|
|
op.create_index("ix_videos_via_search", "videos", ["via_search"])
|
||
|
|
op.add_column(
|
||
|
|
"channels",
|
||
|
|
sa.Column(
|
||
|
|
"from_search", sa.Boolean(), nullable=False, server_default="false"
|
||
|
|
),
|
||
|
|
)
|
||
|
|
op.create_index("ix_channels_from_search", "channels", ["from_search"])
|
||
|
|
|
||
|
|
|
||
|
|
def downgrade() -> None:
|
||
|
|
op.drop_index("ix_channels_from_search", table_name="channels")
|
||
|
|
op.drop_column("channels", "from_search")
|
||
|
|
op.drop_index("ix_videos_via_search", table_name="videos")
|
||
|
|
op.drop_column("videos", "via_search")
|