# MLazy Engine

**MLazy Engine** is an automated YouTube video generation, editing, and publishing backend engine.

---

## πŸ“ Entity-Relationship (ER) Diagram

```mermaid
erDiagram
    USERS ||--o{ TOPIC_QUEUE : "has queued topics"
    USERS ||--o{ STORIES : "creates scripts"
    USERS ||--o{ VIDEO_JOBS : "owns rendering jobs"
    USERS ||--o{ YOUTUBE_UPLOADS : "manages uploads"
    USERS ||--o{ STYLE_PROFILES : "saves channel styles"

    STORIES ||--o{ VIDEO_JOBS : "triggers render"
    VIDEO_JOBS ||--|| YOUTUBE_UPLOADS : "publishes to"

    USERS {
        string id PK
        string google_id UK
        string email UK
        string full_name
        string avatar_url
        string plan "free | pro"
        boolean style_clone_unlocked
        datetime created_at
    }

    TOPIC_QUEUE {
        string id PK
        string user_id FK
        string topic
        string status "pending | processing | completed"
        datetime created_at
    }

    STORIES {
        string id PK
        string user_id FK
        string topic
        string title
        string description
        json tags
        json scenes
        json style_profile
        string status "draft | approved | rendering | completed"
        datetime created_at
    }

    VIDEO_JOBS {
        string id PK
        string story_id FK
        string user_id FK
        string status "queued | rendering | merging | completed | failed"
        string local_video_path
        float duration_seconds
        string error_message
        datetime created_at
        datetime updated_at
    }

    YOUTUBE_UPLOADS {
        string id PK
        string job_id FK
        string user_id FK
        string youtube_video_id
        string youtube_url
        string privacy_status "public | private | unlisted"
        string status "pending | uploading | published | failed"
        datetime uploaded_at
    }

    STYLE_PROFILES {
        string id PK
        string user_id FK
        string channel_name
        string channel_url
        json style_dna
        datetime created_at
    }

ASCII Schema Representation

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        USERS                           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ PK  id                     String(36) UUID             β”‚
β”‚ UK  google_id              String(255)                 β”‚
β”‚ UK  email                  String(255)                 β”‚
β”‚     full_name              String(255)                 β”‚
β”‚     avatar_url             Text                        β”‚
β”‚     plan                   String(50) DEFAULT 'free'   β”‚
β”‚     style_clone_unlocked   Boolean DEFAULT False       β”‚
β”‚     created_at             DateTime (UTC)              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜
            β”‚ 1                 β”‚ 1                 β”‚ 1
            β”‚                   β”‚                   β”‚
            β”‚ N                 β”‚ N                 β”‚ N
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚      TOPIC_QUEUE      β”‚ β”‚      STORIES      β”‚ β”‚    STYLE_PROFILES     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ PK id       String(36)β”‚ β”‚ PK id   String(36)β”‚ β”‚ PK id       String(36)β”‚
β”‚ FK user_id  String(36)β”‚ β”‚ FK user_id Str(36)β”‚ β”‚ FK user_id  String(36)β”‚
β”‚    topic    Text      β”‚ β”‚    topicText      β”‚ β”‚    channel_name Str   β”‚
β”‚    status   String    β”‚ β”‚    scenes JSON    β”‚ β”‚    style_dna JSON     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚ 1
                                    β”‚
                                    β”‚ N
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚    VIDEO_JOBS     β”‚
                          β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                          β”‚ PK id   String(36)β”‚
                          β”‚ FK story_id Str(36β”‚
                          β”‚ FK user_id Str(36)β”‚
                          β”‚    status String  β”‚
                          β”‚    path   Text    β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚ 1
                                    β”‚
                                    β”‚ 1
                          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                          β”‚  YOUTUBE_UPLOADS  β”‚
                          β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
                          β”‚ PK id   String(36)β”‚
                          β”‚ FK job_id Str(36) β”‚
                          β”‚ FK user_id Str(36)β”‚
                          β”‚    youtube_url Textβ”‚
                          β”‚    status String  β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ› οΈ Package Modules