Commit
·
93bf10c
1
Parent(s):
5d1f54f
Fix 502 timeout: Upload returns immediately, processing starts on first status check
Browse files- highlights_api.py +45 -15
highlights_api.py
CHANGED
|
@@ -155,23 +155,27 @@ async def upload_video(
|
|
| 155 |
}
|
| 156 |
}
|
| 157 |
|
| 158 |
-
#
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
|
|
|
|
|
|
|
|
|
| 170 |
|
|
|
|
| 171 |
return AnalysisResponse(
|
| 172 |
job_id=job_id,
|
| 173 |
-
status="
|
| 174 |
-
message="Video uploaded successfully.
|
| 175 |
)
|
| 176 |
|
| 177 |
except Exception as e:
|
|
@@ -186,6 +190,29 @@ async def get_job_status(job_id: str):
|
|
| 186 |
# Check active jobs
|
| 187 |
if job_id in active_jobs:
|
| 188 |
job = active_jobs[job_id]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
return JobStatus(
|
| 190 |
job_id=job_id,
|
| 191 |
status=job["status"],
|
|
@@ -222,7 +249,7 @@ async def download_file(filename: str):
|
|
| 222 |
filename=filename
|
| 223 |
)
|
| 224 |
|
| 225 |
-
async def
|
| 226 |
job_id: str,
|
| 227 |
video_path: str,
|
| 228 |
interval: float,
|
|
@@ -273,6 +300,9 @@ async def process_video_highlights(
|
|
| 273 |
# Analyze segment
|
| 274 |
analysis = analyzer.analyze_segment(video_path, segment, temp_frame_path)
|
| 275 |
analyzed_segments.append(analysis)
|
|
|
|
|
|
|
|
|
|
| 276 |
|
| 277 |
# Cleanup temp frame
|
| 278 |
try:
|
|
|
|
| 155 |
}
|
| 156 |
}
|
| 157 |
|
| 158 |
+
# Store job parameters for immediate return
|
| 159 |
+
active_jobs[job_id] = {
|
| 160 |
+
"status": "queued",
|
| 161 |
+
"progress": 0,
|
| 162 |
+
"message": "Video uploaded. Processing will start shortly.",
|
| 163 |
+
"params": {
|
| 164 |
+
"video_path": temp_video_path,
|
| 165 |
+
"interval": interval,
|
| 166 |
+
"min_score": min_score,
|
| 167 |
+
"max_highlights": max_highlights,
|
| 168 |
+
"whisper_model": whisper_model,
|
| 169 |
+
"timeout": timeout,
|
| 170 |
+
"enable_visual": enable_visual
|
| 171 |
+
}
|
| 172 |
+
}
|
| 173 |
|
| 174 |
+
# Return immediately - processing will be triggered by first status check
|
| 175 |
return AnalysisResponse(
|
| 176 |
job_id=job_id,
|
| 177 |
+
status="queued",
|
| 178 |
+
message="Video uploaded successfully. Check status to begin processing."
|
| 179 |
)
|
| 180 |
|
| 181 |
except Exception as e:
|
|
|
|
| 190 |
# Check active jobs
|
| 191 |
if job_id in active_jobs:
|
| 192 |
job = active_jobs[job_id]
|
| 193 |
+
|
| 194 |
+
# If job is queued, start processing
|
| 195 |
+
if job["status"] == "queued":
|
| 196 |
+
# Start processing in background
|
| 197 |
+
params = job["params"]
|
| 198 |
+
asyncio.create_task(
|
| 199 |
+
process_video_highlights_async(
|
| 200 |
+
job_id,
|
| 201 |
+
params["video_path"],
|
| 202 |
+
params["interval"],
|
| 203 |
+
params["min_score"],
|
| 204 |
+
params["max_highlights"],
|
| 205 |
+
params["whisper_model"],
|
| 206 |
+
params["timeout"],
|
| 207 |
+
params["enable_visual"]
|
| 208 |
+
)
|
| 209 |
+
)
|
| 210 |
+
|
| 211 |
+
# Update status to processing
|
| 212 |
+
active_jobs[job_id]["status"] = "processing"
|
| 213 |
+
active_jobs[job_id]["progress"] = 5
|
| 214 |
+
active_jobs[job_id]["message"] = "Processing started..."
|
| 215 |
+
|
| 216 |
return JobStatus(
|
| 217 |
job_id=job_id,
|
| 218 |
status=job["status"],
|
|
|
|
| 249 |
filename=filename
|
| 250 |
)
|
| 251 |
|
| 252 |
+
async def process_video_highlights_async(
|
| 253 |
job_id: str,
|
| 254 |
video_path: str,
|
| 255 |
interval: float,
|
|
|
|
| 300 |
# Analyze segment
|
| 301 |
analysis = analyzer.analyze_segment(video_path, segment, temp_frame_path)
|
| 302 |
analyzed_segments.append(analysis)
|
| 303 |
+
|
| 304 |
+
# Yield control to allow other requests
|
| 305 |
+
await asyncio.sleep(0)
|
| 306 |
|
| 307 |
# Cleanup temp frame
|
| 308 |
try:
|