The import asks YouTube how long the watched videos of the candidate channels are (five or more watched, none the user follows, blocked, put out or owns), keeps the length on the Takeout row and names the channels that make the list: five videos of five minutes or more. The shorts job asks what an import could not. A channel's counted videos come in as an exploration's when its list is opened, ready to play; a channel can be put out of the list and back.
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""A watched Takeout video's length, and the channels a user put out of their list
|
|
|
|
Revision ID: 0115_takeout_channels
|
|
Revises: 0114_video_unmarks
|
|
Create Date: 2026-10-24
|
|
|
|
The "channels you watch but do not follow" list counts a user's watched videos over five minutes
|
|
by channel. The length is asked of YouTube for that list and kept on the Takeout row; a channel the
|
|
user does not want on the list is kept apart.
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0115_takeout_channels"
|
|
down_revision: str | None = "0114_video_unmarks"
|
|
branch_labels: str | None = None
|
|
depends_on: str | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column(
|
|
"takeout_items", sa.Column("looked_up_at", sa.DateTime(timezone=True), nullable=True)
|
|
)
|
|
op.add_column("takeout_items", sa.Column("duration_seconds", sa.Integer(), nullable=True))
|
|
op.create_table(
|
|
"takeout_channel_dismissals",
|
|
sa.Column("id", sa.Integer(), primary_key=True),
|
|
sa.Column(
|
|
"user_id",
|
|
sa.Integer(),
|
|
sa.ForeignKey("users.id", ondelete="CASCADE"),
|
|
nullable=False,
|
|
),
|
|
sa.Column("channel_id", sa.String(32), nullable=False),
|
|
sa.Column(
|
|
"created_at",
|
|
sa.DateTime(timezone=True),
|
|
server_default=sa.func.now(),
|
|
nullable=False,
|
|
),
|
|
sa.UniqueConstraint("user_id", "channel_id", name="uq_takeout_channel_dismissal"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table("takeout_channel_dismissals")
|
|
op.drop_column("takeout_items", "duration_seconds")
|
|
op.drop_column("takeout_items", "looked_up_at")
|