Files
soroban-abacus-flashcards/apps/web/drizzle/0068_flaky_war_machine.sql
Thomas Hallock 371b449d15 feat(vision): implement per-problem video recording for teacher playback
Add server-side per-problem video recording that allows teachers to click
on completed problems in the observer progress indicator to watch recorded
videos of each problem attempt.

Key changes:
- New vision_problem_videos schema and migration for per-problem videos
- VisionRecorder refactored for per-problem frame management
- Socket server triggers ffmpeg encoding on problem transitions
- API routes for streaming videos and listing available recordings
- SessionObserverModal enables browse mode on progress indicator
- ProblemVideoPlayer component for viewing past problem recordings

Each problem gets its own MP4 video encoded incrementally as it completes,
making playback immediately available for recently completed problems.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 18:21:54 -06:00

35 lines
1.4 KiB
SQL

-- Custom SQL migration file, put your code below! --
-- Vision problem videos - per-problem video recordings for observer playback
CREATE TABLE `vision_problem_videos` (
`id` text PRIMARY KEY NOT NULL,
`session_id` text NOT NULL REFERENCES `session_plans`(`id`) ON DELETE CASCADE,
`player_id` text NOT NULL REFERENCES `players`(`id`) ON DELETE CASCADE,
`problem_number` integer NOT NULL,
`part_index` integer NOT NULL,
`filename` text NOT NULL,
`file_size` integer,
`duration_ms` integer,
`frame_count` integer,
`avg_fps` real,
`started_at` integer NOT NULL,
`ended_at` integer,
`is_correct` integer,
`status` text NOT NULL DEFAULT 'recording',
`processing_error` text,
`expires_at` integer NOT NULL,
`created_at` integer NOT NULL
);
--> statement-breakpoint
-- Indexes for efficient queries
CREATE INDEX `vision_problem_videos_session_id_idx` ON `vision_problem_videos` (`session_id`);
--> statement-breakpoint
CREATE INDEX `vision_problem_videos_session_problem_idx` ON `vision_problem_videos` (`session_id`, `problem_number`);
--> statement-breakpoint
CREATE INDEX `vision_problem_videos_player_id_idx` ON `vision_problem_videos` (`player_id`);
--> statement-breakpoint
CREATE INDEX `vision_problem_videos_expires_at_idx` ON `vision_problem_videos` (`expires_at`);
--> statement-breakpoint
CREATE INDEX `vision_problem_videos_status_idx` ON `vision_problem_videos` (`status`);