58b98ab5ed
Adds nullable storage fields + availability column on tracks, remote source/source_id identity on albums/artists, TrackRepository.materialize() and get_or_create_remote() repos — groundwork for on-demand YTM library (placeholders saved without audio, materialized in-place on first play). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
"""remote placeholders: track availability, album/artist remote ids
|
|
|
|
Revision ID: dc126696f5a6
|
|
Revises: 20260614_dl_track_id
|
|
Create Date: 2026-06-14 11:25:30.643588
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = 'dc126696f5a6'
|
|
down_revision: str | None = '20260614_dl_track_id'
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
op.add_column('albums', sa.Column('source', sa.String(length=32), nullable=True))
|
|
op.add_column('albums', sa.Column('source_id', sa.String(length=512), nullable=True))
|
|
op.create_unique_constraint('uq_albums_source_source_id', 'albums', ['source', 'source_id'])
|
|
op.add_column('artists', sa.Column('source', sa.String(length=32), nullable=True))
|
|
op.add_column('artists', sa.Column('source_id', sa.String(length=512), nullable=True))
|
|
op.create_unique_constraint('uq_artists_source_source_id', 'artists', ['source', 'source_id'])
|
|
op.add_column(
|
|
'tracks',
|
|
sa.Column('availability', sa.String(length=16), nullable=False, server_default='local'),
|
|
)
|
|
op.alter_column('tracks', 'availability', server_default=None)
|
|
op.alter_column('tracks', 'storage_uri',
|
|
existing_type=sa.VARCHAR(length=2048),
|
|
nullable=True)
|
|
op.alter_column('tracks', 'file_format',
|
|
existing_type=sa.VARCHAR(length=32),
|
|
nullable=True)
|
|
op.alter_column('tracks', 'file_size',
|
|
existing_type=sa.INTEGER(),
|
|
nullable=True)
|
|
# ### end Alembic commands ###
|
|
|
|
|
|
def downgrade() -> None:
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
op.alter_column('tracks', 'file_size',
|
|
existing_type=sa.INTEGER(),
|
|
nullable=False)
|
|
op.alter_column('tracks', 'file_format',
|
|
existing_type=sa.VARCHAR(length=32),
|
|
nullable=False)
|
|
op.alter_column('tracks', 'storage_uri',
|
|
existing_type=sa.VARCHAR(length=2048),
|
|
nullable=False)
|
|
op.drop_column('tracks', 'availability')
|
|
op.drop_constraint('uq_artists_source_source_id', 'artists', type_='unique')
|
|
op.drop_column('artists', 'source_id')
|
|
op.drop_column('artists', 'source')
|
|
op.drop_constraint('uq_albums_source_source_id', 'albums', type_='unique')
|
|
op.drop_column('albums', 'source_id')
|
|
op.drop_column('albums', 'source')
|
|
# ### end Alembic commands ###
|