File size: 5,764 Bytes
5c9380d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
from fastapi import APIRouter, HTTPException, BackgroundTasks
from pydantic import BaseModel
import logging
import traceback
import sys
import os

# Add parent directory to path so execution module can be found
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

from execution.transcribe_video import get_transcription
from execution.extract_topics import extract_topics
from execution.research_topics import research_topics
from execution.generate_script import generate_video_script

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

router = APIRouter()

class VideoRequest(BaseModel):
    url: str

class TranscriptRequest(BaseModel):
    transcript_text: str

class TopicsRequest(BaseModel):
    topics: list[str]

class GenerateRequest(BaseModel):
    transcript_text: str
    research: str

# In-memory store per semplicità (in prod usare DB/Redis)
job_store = {}


# ============ STEP-BY-STEP ENDPOINTS ============

@router.post("/step/transcribe")
async def step_transcribe(request: VideoRequest):
    """Step 1: Trascrizione video YouTube"""
    try:
        logger.info(f"[Step] Starting transcription for: {request.url}")
        transcript_data = get_transcription(request.url)
        logger.info(f"[Step] Transcription complete. Length: {len(transcript_data['text'])} chars")
        return {
            "success": True,
            "data": transcript_data,
            "next_step": "extract_topics"
        }
    except Exception as e:
        logger.error(f"[Step] Transcription error: {str(e)}")
        logger.error(traceback.format_exc())
        return {"success": False, "error": str(e)}


@router.post("/step/extract-topics")
async def step_extract_topics(request: TranscriptRequest):
    """Step 2: Estrazione topics dalla trascrizione"""
    try:
        logger.info(f"[Step] Extracting topics from transcript ({len(request.transcript_text)} chars)")
        topics = extract_topics(request.transcript_text)
        logger.info(f"[Step] Topics extracted: {topics}")
        return {
            "success": True,
            "data": topics,
            "next_step": "research"
        }
    except Exception as e:
        logger.error(f"[Step] Topic extraction error: {str(e)}")
        logger.error(traceback.format_exc())
        return {"success": False, "error": str(e)}


@router.post("/step/research")
async def step_research(request: TopicsRequest):
    """Step 3: Ricerca approfondita sui topics"""
    try:
        logger.info(f"[Step] Researching topics: {request.topics}")
        research_report = research_topics(request.topics)
        logger.info(f"[Step] Research complete. Length: {len(research_report)} chars")
        return {
            "success": True,
            "data": research_report,
            "next_step": "generate_script"
        }
    except Exception as e:
        logger.error(f"[Step] Research error: {str(e)}")
        logger.error(traceback.format_exc())
        return {"success": False, "error": str(e)}


@router.post("/step/generate-script")
async def step_generate_script(request: GenerateRequest):
    """Step 4: Generazione script finale"""
    try:
        logger.info(f"[Step] Generating script from transcript and research")
        final_script = generate_video_script(request.transcript_text, request.research)
        logger.info(f"[Step] Script generation complete. Length: {len(final_script)} chars")
        return {
            "success": True,
            "data": final_script,
            "next_step": "completed"
        }
    except Exception as e:
        logger.error(f"[Step] Script generation error: {str(e)}")
        logger.error(traceback.format_exc())
        return {"success": False, "error": str(e)}


# ============ LEGACY ENDPOINTS (per compatibilità) ============

@router.post("/process-video")
async def process_video(request: VideoRequest, background_tasks: BackgroundTasks):
    job_id = str(len(job_store) + 1)
    job_store[job_id] = {"step": "queued", "logs": []}
    
    background_tasks.add_task(run_full_pipeline, job_id, request.url)
    
    return {"job_id": job_id, "status": "queued"}

@router.get("/status/{job_id}")
async def get_status(job_id: str):
    if job_id not in job_store:
        raise HTTPException(status_code=404, detail="Job not found")
    return job_store[job_id]

def run_full_pipeline(job_id: str, url: str):
    try:
        logger.info(f"[Job {job_id}] Starting transcription...")
        job_store[job_id]["step"] = "transcribing"
        transcript_data = get_transcription(url)
        job_store[job_id]["transcript"] = transcript_data
        
        logger.info(f"[Job {job_id}] Starting topic extraction...")
        job_store[job_id]["step"] = "extracting_topics"
        topics = extract_topics(transcript_data["text"])
        job_store[job_id]["topics"] = topics
        
        logger.info(f"[Job {job_id}] Starting research...")
        job_store[job_id]["step"] = "researching"
        research_report = research_topics(topics)
        job_store[job_id]["research"] = research_report
        
        logger.info(f"[Job {job_id}] Starting script generation...")
        job_store[job_id]["step"] = "generating_script"
        final_script = generate_video_script(transcript_data["text"], research_report)
        job_store[job_id]["final_script"] = final_script
        
        job_store[job_id]["step"] = "completed"
        logger.info(f"[Job {job_id}] Pipeline completed successfully!")
        
    except Exception as e:
        logger.error(f"Error in pipeline: {str(e)}")
        logger.error(traceback.format_exc())
        job_store[job_id]["step"] = "error"
        job_store[job_id]["error"] = str(e)