118 lines
4.6 KiB
SQL
118 lines
4.6 KiB
SQL
-- Video Projects
|
|
CREATE TABLE IF NOT EXISTS video_projects (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
organization_id UUID,
|
|
created_by UUID,
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
resolution_width INT NOT NULL DEFAULT 1920,
|
|
resolution_height INT NOT NULL DEFAULT 1080,
|
|
fps INT NOT NULL DEFAULT 30,
|
|
total_duration_ms BIGINT NOT NULL DEFAULT 0,
|
|
timeline_json JSONB NOT NULL DEFAULT '{"clips": []}',
|
|
layers_json JSONB NOT NULL DEFAULT '[]',
|
|
audio_tracks_json JSONB NOT NULL DEFAULT '[]',
|
|
playhead_ms BIGINT NOT NULL DEFAULT 0,
|
|
selection_json JSONB NOT NULL DEFAULT '{"type": "None"}',
|
|
zoom_level REAL NOT NULL DEFAULT 1.0,
|
|
thumbnail_url TEXT,
|
|
status TEXT NOT NULL DEFAULT 'draft',
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_projects_organization ON video_projects(organization_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_projects_status ON video_projects(status);
|
|
CREATE INDEX IF NOT EXISTS idx_video_projects_created_by ON video_projects(created_by);
|
|
|
|
-- Video Clips
|
|
CREATE TABLE IF NOT EXISTS video_clips (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL REFERENCES video_projects(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
source_url TEXT NOT NULL,
|
|
start_ms BIGINT NOT NULL DEFAULT 0,
|
|
duration_ms BIGINT NOT NULL DEFAULT 0,
|
|
trim_in_ms BIGINT NOT NULL DEFAULT 0,
|
|
trim_out_ms BIGINT NOT NULL DEFAULT 0,
|
|
volume REAL NOT NULL DEFAULT 1.0,
|
|
clip_order INT NOT NULL DEFAULT 0,
|
|
transition_in TEXT,
|
|
transition_out TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_clips_project ON video_clips(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_clips_order ON video_clips(project_id, clip_order);
|
|
|
|
-- Video Layers (Text, Shapes, Images)
|
|
CREATE TABLE IF NOT EXISTS video_layers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL REFERENCES video_projects(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
layer_type TEXT NOT NULL,
|
|
track_index INT NOT NULL DEFAULT 0,
|
|
start_ms BIGINT NOT NULL DEFAULT 0,
|
|
end_ms BIGINT NOT NULL DEFAULT 5000,
|
|
x REAL NOT NULL DEFAULT 0.5,
|
|
y REAL NOT NULL DEFAULT 0.5,
|
|
width REAL NOT NULL DEFAULT 0.5,
|
|
height REAL NOT NULL DEFAULT 0.2,
|
|
rotation REAL NOT NULL DEFAULT 0.0,
|
|
opacity REAL NOT NULL DEFAULT 1.0,
|
|
properties_json JSONB NOT NULL DEFAULT '{}',
|
|
animation_in TEXT,
|
|
animation_out TEXT,
|
|
locked BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_layers_project ON video_layers(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_layers_track ON video_layers(project_id, track_index);
|
|
|
|
-- Video Audio Tracks
|
|
CREATE TABLE IF NOT EXISTS video_audio_tracks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL REFERENCES video_projects(id) ON DELETE CASCADE,
|
|
name TEXT NOT NULL,
|
|
source_url TEXT NOT NULL,
|
|
track_type TEXT NOT NULL,
|
|
start_ms BIGINT NOT NULL DEFAULT 0,
|
|
duration_ms BIGINT NOT NULL DEFAULT 0,
|
|
volume REAL NOT NULL DEFAULT 1.0,
|
|
fade_in_ms BIGINT NOT NULL DEFAULT 0,
|
|
fade_out_ms BIGINT NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_audio_tracks_project ON video_audio_tracks(project_id);
|
|
|
|
-- Video Exports
|
|
CREATE TABLE IF NOT EXISTS video_exports (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL REFERENCES video_projects(id) ON DELETE CASCADE,
|
|
format TEXT NOT NULL DEFAULT 'mp4',
|
|
quality TEXT NOT NULL DEFAULT 'high',
|
|
status TEXT NOT NULL DEFAULT 'pending',
|
|
progress INT NOT NULL DEFAULT 0,
|
|
output_url TEXT,
|
|
error_message TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
completed_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_exports_project ON video_exports(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_exports_status ON video_exports(status);
|
|
|
|
-- Video Command History (for undo/redo)
|
|
CREATE TABLE IF NOT EXISTS video_command_history (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL REFERENCES video_projects(id) ON DELETE CASCADE,
|
|
user_id UUID,
|
|
command_type TEXT NOT NULL,
|
|
command_json JSONB NOT NULL,
|
|
executed_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_video_command_history_project ON video_command_history(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_video_command_history_executed ON video_command_history(project_id, executed_at DESC);
|