aivideodubbingapi-r08gi1/alembic/versions/001_initial_migration.py
Automated Action 92e4d992b2 Implement complete AI video dubbing backend with FastAPI
Features:
- JWT authentication with user registration and login
- Video upload to Amazon S3 with file validation (200MB limit)
- Audio transcription using OpenAI Whisper API
- Text translation using GPT-4 API
- Voice cloning and audio synthesis using ElevenLabs API
- Video processing with ffmpeg for audio replacement
- Complete SQLite database with proper models and migrations
- Background task processing for long-running operations
- Health endpoint and comprehensive API documentation

Tech stack:
- FastAPI with SQLAlchemy ORM
- SQLite database with Alembic migrations
- Amazon S3 for file storage
- OpenAI APIs for transcription and translation
- ElevenLabs API for voice cloning
- ffmpeg for video processing
- JWT authentication with bcrypt password hashing
2025-06-24 17:56:12 +00:00

104 lines
4.5 KiB
Python

"""Initial migration
Revision ID: 001
Revises:
Create Date: 2024-01-01 00:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '001'
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# Create users table
op.create_table('users',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('email', sa.String(), nullable=False),
sa.Column('password_hash', sa.String(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True)
op.create_index(op.f('ix_users_id'), 'users', ['id'], unique=False)
# Create videos table
op.create_table('videos',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('original_s3_url', sa.String(), nullable=False),
sa.Column('language_from', sa.String(), nullable=False),
sa.Column('language_to', sa.String(), nullable=False),
sa.Column('status', sa.String(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_videos_id'), 'videos', ['id'], unique=False)
# Create transcriptions table
op.create_table('transcriptions',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('video_id', sa.Integer(), nullable=False),
sa.Column('text', sa.Text(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.ForeignKeyConstraint(['video_id'], ['videos.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_transcriptions_id'), 'transcriptions', ['id'], unique=False)
# Create translations table
op.create_table('translations',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('video_id', sa.Integer(), nullable=False),
sa.Column('text', sa.Text(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.ForeignKeyConstraint(['video_id'], ['videos.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_translations_id'), 'translations', ['id'], unique=False)
# Create dubbed_audios table
op.create_table('dubbed_audios',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('video_id', sa.Integer(), nullable=False),
sa.Column('s3_url', sa.String(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.ForeignKeyConstraint(['video_id'], ['videos.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_dubbed_audios_id'), 'dubbed_audios', ['id'], unique=False)
# Create dubbed_videos table
op.create_table('dubbed_videos',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('video_id', sa.Integer(), nullable=False),
sa.Column('s3_url', sa.String(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True),
sa.ForeignKeyConstraint(['video_id'], ['videos.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_dubbed_videos_id'), 'dubbed_videos', ['id'], unique=False)
def downgrade() -> None:
op.drop_index(op.f('ix_dubbed_videos_id'), table_name='dubbed_videos')
op.drop_table('dubbed_videos')
op.drop_index(op.f('ix_dubbed_audios_id'), table_name='dubbed_audios')
op.drop_table('dubbed_audios')
op.drop_index(op.f('ix_translations_id'), table_name='translations')
op.drop_table('translations')
op.drop_index(op.f('ix_transcriptions_id'), table_name='transcriptions')
op.drop_table('transcriptions')
op.drop_index(op.f('ix_videos_id'), table_name='videos')
op.drop_table('videos')
op.drop_index(op.f('ix_users_id'), table_name='users')
op.drop_index(op.f('ix_users_email'), table_name='users')
op.drop_table('users')