DeveshBhardwajj commited on
Commit
bf46392
·
verified ·
1 Parent(s): dd4e9f0

Update backend.py

Browse files
Files changed (1) hide show
  1. backend.py +140 -140
backend.py CHANGED
@@ -1,140 +1,140 @@
1
- import os
2
- import logging
3
- from fastapi import FastAPI, HTTPException, Request
4
- from fastapi.middleware.cors import CORSMiddleware
5
- from fastapi.responses import JSONResponse
6
- from pydantic import BaseModel
7
- from typing import List, Optional
8
- from dotenv import load_dotenv
9
- from utils.youtube_transcript import get_youtube_transcript
10
- from utils.script_generator import generate_script
11
- from deep_translator import GoogleTranslator
12
- from langdetect import detect
13
-
14
- # Set up logging
15
- logging.basicConfig(level=logging.INFO,
16
- format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
17
- logger = logging.getLogger(__name__)
18
-
19
- # Load environment variables
20
- load_dotenv()
21
-
22
- # Initialize FastAPI app
23
- app = FastAPI(title="Script Generator API")
24
-
25
- # Add CORS middleware to allow frontend to access
26
- app.add_middleware(
27
- CORSMiddleware,
28
- allow_origins=["*"], # For production, replace with specific origins
29
- allow_credentials=True,
30
- allow_methods=["*"],
31
- allow_headers=["*"],
32
- )
33
-
34
- # Add error handling middleware
35
- @app.middleware("http")
36
- async def log_exceptions(request: Request, call_next):
37
- try:
38
- return await call_next(request)
39
- except Exception as e:
40
- logger.error(f"Unhandled exception: {str(e)}")
41
- return JSONResponse(
42
- status_code=500,
43
- content={"detail": f"Internal Server Error: {str(e)}"}
44
- )
45
-
46
- # Pydantic models
47
- class ScriptRequest(BaseModel):
48
- video_url: Optional[str] = None
49
- posts: Optional[List[str]] = None
50
- topic: str
51
-
52
- class ScriptResponse(BaseModel):
53
- script: str
54
-
55
- def translate_text(text, target_lang='en'):
56
- """Translate text to the target language if needed"""
57
- try:
58
- if not text or text.strip() == "":
59
- return ""
60
-
61
- source_lang = detect(text)
62
- if source_lang == target_lang:
63
- return text
64
- translator = GoogleTranslator(source=source_lang, target=target_lang)
65
- return translator.translate(text)
66
- except Exception as e:
67
- logger.error(f"Translation error: {str(e)}")
68
- return f"Translation error: {str(e)}"
69
-
70
- @app.post("/generate-script", response_model=ScriptResponse)
71
- async def create_script(request: ScriptRequest):
72
- """Generate a script based on YouTube video or example posts"""
73
- logger.info(f"Received script generation request: {request}")
74
- examples = []
75
-
76
- # Validate topic
77
- if not request.topic or request.topic.strip() == "":
78
- raise HTTPException(status_code=400, detail="Topic cannot be empty")
79
-
80
- if request.video_url:
81
- logger.info(f"Fetching transcript for video: {request.video_url}")
82
- transcript = get_youtube_transcript(request.video_url)
83
- if isinstance(transcript, str) and transcript.startswith("Error:"):
84
- logger.error(f"Transcript error: {transcript}")
85
- raise HTTPException(status_code=400, detail=transcript)
86
-
87
- # Translate transcript to English if needed
88
- logger.info("Translating transcript if needed")
89
- transcript = translate_text(transcript)
90
- examples = [transcript]
91
- elif request.posts and len(request.posts) >= 3:
92
- logger.info(f"Processing {len(request.posts)} example posts")
93
- # Translate posts to English if needed
94
- valid_posts = [post for post in request.posts if post and post.strip()]
95
- if len(valid_posts) < 3:
96
- raise HTTPException(status_code=400, detail="Please provide at least three non-empty example posts")
97
-
98
- # Translate posts to English if needed
99
- translated_posts = [translate_text(post) for post in valid_posts[:3]]
100
- examples = translated_posts
101
- else:
102
- logger.error("No valid input provided")
103
- raise HTTPException(
104
- status_code=400,
105
- detail="Please provide either a YouTube video URL or at least three example posts"
106
- )
107
-
108
- try:
109
- # Generate script
110
- logger.info(f"Generating script with {len(examples)} examples and topic '{request.topic}'")
111
- script = generate_script(None, examples, request.topic)
112
- return ScriptResponse(script=script)
113
- except Exception as e:
114
- logger.error(f"Error generating script: {str(e)}")
115
- raise HTTPException(status_code=500, detail=f"Error generating script: {str(e)}")
116
-
117
- @app.get("/health")
118
- async def health_check():
119
- """Health check endpoint"""
120
- # Check if GROQ_API_KEY is set
121
- groq_api_key = os.getenv("GROQ_API_KEY")
122
- if not groq_api_key:
123
- logger.warning("GROQ_API_KEY environment variable is not set")
124
- return {"status": "warning", "message": "GROQ_API_KEY not set"}
125
-
126
- return {"status": "healthy"}
127
-
128
- # Run the server
129
- if __name__ == "__main__":
130
- import uvicorn
131
- # Log GROQ_API_KEY status (don't log the actual key)
132
- groq_api_key = os.getenv("GROQ_API_KEY")
133
- if groq_api_key:
134
- logger.info("GROQ_API_KEY is set")
135
- else:
136
- logger.warning("GROQ_API_KEY environment variable is not set!")
137
-
138
- # Run on port 8000
139
- logger.info("Starting FastAPI server on port 8000")
140
- uvicorn.run("backend:app", host="0.0.0.0", port=8000, reload=True)
 
1
+ import os
2
+ import logging
3
+ from fastapi import FastAPI, HTTPException, Request
4
+ from fastapi.middleware.cors import CORSMiddleware
5
+ from fastapi.responses import JSONResponse
6
+ from pydantic import BaseModel
7
+ from typing import List, Optional
8
+ from dotenv import load_dotenv
9
+ from utils.youtube_transcript import get_youtube_transcript
10
+ from utils.script_generator import generate_script
11
+ from deep_translator import GoogleTranslator
12
+ from langdetect import detect
13
+
14
+ # Set up logging
15
+ logging.basicConfig(level=logging.INFO,
16
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
17
+ logger = logging.getLogger(__name__)
18
+
19
+ # Load environment variables
20
+ load_dotenv()
21
+
22
+ # Initialize FastAPI app
23
+ app = FastAPI(title="Script Generator API")
24
+
25
+ # Add CORS middleware to allow frontend to access
26
+ app.add_middleware(
27
+ CORSMiddleware,
28
+ allow_origins=["*"], # For production, replace with specific origins
29
+ allow_credentials=True,
30
+ allow_methods=["*"],
31
+ allow_headers=["*"],
32
+ )
33
+
34
+ # Add error handling middleware
35
+ @app.middleware("http")
36
+ async def log_exceptions(request: Request, call_next):
37
+ try:
38
+ return await call_next(request)
39
+ except Exception as e:
40
+ logger.error(f"Unhandled exception: {str(e)}")
41
+ return JSONResponse(
42
+ status_code=500,
43
+ content={"detail": f"Internal Server Error: {str(e)}"}
44
+ )
45
+
46
+ # Pydantic models
47
+ class ScriptRequest(BaseModel):
48
+ video_url: Optional[str] = None
49
+ posts: Optional[List[str]] = None
50
+ topic: str
51
+
52
+ class ScriptResponse(BaseModel):
53
+ script: str
54
+
55
+ def translate_text(text, target_lang='en'):
56
+ """Translate text to the target language if needed"""
57
+ try:
58
+ if not text or text.strip() == "":
59
+ return ""
60
+
61
+ source_lang = detect(text)
62
+ if source_lang == target_lang:
63
+ return text
64
+ translator = GoogleTranslator(source=source_lang, target=target_lang)
65
+ return translator.translate(text)
66
+ except Exception as e:
67
+ logger.error(f"Translation error: {str(e)}")
68
+ return f"Translation error: {str(e)}"
69
+
70
+ @app.post("/generate-script", response_model=ScriptResponse)
71
+ async def create_script(request: ScriptRequest):
72
+ """Generate a script based on YouTube video or example posts"""
73
+ logger.info(f"Received script generation request: {request}")
74
+ examples = []
75
+
76
+ # Validate topic
77
+ if not request.topic or request.topic.strip() == "":
78
+ raise HTTPException(status_code=400, detail="Topic cannot be empty")
79
+
80
+ if request.video_url:
81
+ logger.info(f"Fetching transcript for video: {request.video_url}")
82
+ transcript = get_youtube_transcript(request.video_url)
83
+ if isinstance(transcript, str) and transcript.startswith("Error:"):
84
+ logger.error(f"Transcript error: {transcript}")
85
+ raise HTTPException(status_code=400, detail=transcript)
86
+
87
+ # Translate transcript to English if needed
88
+ logger.info("Translating transcript if needed")
89
+ transcript = translate_text(transcript)
90
+ examples = [transcript]
91
+ elif request.posts and len(request.posts) >= 3:
92
+ logger.info(f"Processing {len(request.posts)} example posts")
93
+ # Translate posts to English if needed
94
+ valid_posts = [post for post in request.posts if post and post.strip()]
95
+ if len(valid_posts) < 3:
96
+ raise HTTPException(status_code=400, detail="Please provide at least three non-empty example posts")
97
+
98
+ # Translate posts to English if needed
99
+ translated_posts = [translate_text(post) for post in valid_posts[:3]]
100
+ examples = translated_posts
101
+ else:
102
+ logger.error("No valid input provided")
103
+ raise HTTPException(
104
+ status_code=400,
105
+ detail="Please provide either a YouTube video URL or at least three example posts"
106
+ )
107
+
108
+ try:
109
+ # Generate script
110
+ logger.info(f"Generating script with {len(examples)} examples and topic '{request.topic}'")
111
+ script = generate_script(None, examples, request.topic)
112
+ return ScriptResponse(script=script)
113
+ except Exception as e:
114
+ logger.error(f"Error generating script: {str(e)}")
115
+ raise HTTPException(status_code=500, detail=f"Error generating script: {str(e)}")
116
+
117
+ @app.get("/health")
118
+ async def health_check():
119
+ """Health check endpoint"""
120
+ # Check if GROQ_API_KEY is set
121
+ groq_api_key = os.getenv("GROQ_API_KEY")
122
+ if not groq_api_key:
123
+ logger.warning("GROQ_API_KEY environment variable is not set")
124
+ return {"status": "warning", "message": "GROQ_API_KEY not set"}
125
+
126
+ return {"status": "healthy"}
127
+
128
+ # Run the server
129
+ if __name__ == "__main__":
130
+ import uvicorn
131
+ # Log GROQ_API_KEY status (don't log the actual key)
132
+ groq_api_key = os.getenv("GROQ_API_KEY")
133
+ if groq_api_key:
134
+ logger.info("GROQ_API_KEY is set")
135
+ else:
136
+ logger.warning("GROQ_API_KEY environment variable is not set!")
137
+
138
+ # Run on port 8000
139
+ logger.info("Starting FastAPI server on port 7860")
140
+ uvicorn.run("backend:app", host="0.0.0.0", port=7860, reload=True)