"""playback_events.error_detail: raw native-player error message Revision ID: 0027_playback_event_error_detail Revises: 0026_scene_backfill_flag Create Date: 2026-07-05 `error_kind` grupuje błędy odtwarzania zgrubnie ('player_error'/'gone'/...), ale do diagnozy realnych padów niereprodukowalnych na emulatorze potrzebna jest surowa treść błędu z native playera (ExoPlayer message). `error_detail` (ucięte do 512) zbiera ją z urządzeń przy status='error'. Idempotentne (IF NOT EXISTS): prod dostał kolumnę ręcznym ALTER-em zanim ta migracja powstała, a deploy nie odpala alembic; guard chroni przed DuplicateColumn gdyby `alembic upgrade` puszczono na prodzie albo na dumpie z prod. """ from collections.abc import Sequence from alembic import op revision: str = "0027_playback_event_error_detail" down_revision: str | None = "0026_scene_backfill_flag" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.execute( "ALTER TABLE playback_events ADD COLUMN IF NOT EXISTS error_detail varchar(512)" ) def downgrade() -> None: op.execute("ALTER TABLE playback_events DROP COLUMN IF EXISTS error_detail")