trying to fix crashes
This commit is contained in:
@ -2,12 +2,15 @@ import logging
|
||||
import os
|
||||
import stat
|
||||
import sys
|
||||
import tempfile
|
||||
from contextlib import asynccontextmanager
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import FastAPI, Query, Request, HTTPException
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.responses import StreamingResponse
|
||||
from fastapi.responses import StreamingResponse, FileResponse
|
||||
|
||||
import ffmpeg
|
||||
|
||||
from routers import transcribe, export, ai, captions, audio
|
||||
|
||||
@ -61,20 +64,69 @@ MIME_MAP = {
|
||||
|
||||
|
||||
@app.get("/file")
|
||||
async def serve_local_file(request: Request, path: str = Query(...)):
|
||||
"""Stream a local file with HTTP Range support (required for video seeking)."""
|
||||
async def serve_local_file(request: Request, path: str = Query(...), format: str = Query(None)):
|
||||
"""Stream a local file with HTTP Range support (required for video seeking).
|
||||
Optionally transcode audio files to MP3 for better browser compatibility."""
|
||||
file_path = Path(path)
|
||||
if not file_path.is_file():
|
||||
logger.warning(f"[serve_file] File not found: {path}")
|
||||
raise HTTPException(status_code=404, detail=f"File not found: {path}")
|
||||
|
||||
file_size = file_path.stat().st_size
|
||||
content_type = MIME_MAP.get(file_path.suffix.lower(), "application/octet-stream")
|
||||
original_ext = file_path.suffix.lower()
|
||||
|
||||
# Check if we should transcode this file
|
||||
should_transcode = (
|
||||
original_ext == '.wav' and
|
||||
(format == 'mp3' or file_size > 10 * 1024 * 1024) # Transcode WAV if > 10MB or explicitly requested
|
||||
)
|
||||
|
||||
if should_transcode:
|
||||
logger.info(f"[serve_file] Transcoding {file_path.name} to MP3 (size: {file_size})")
|
||||
|
||||
# Create cache directory
|
||||
cache_dir = Path(__file__).parent / "cache"
|
||||
cache_dir.mkdir(exist_ok=True)
|
||||
|
||||
# Create cache filename
|
||||
import hashlib
|
||||
file_hash = hashlib.md5(str(file_path).encode()).hexdigest()
|
||||
cache_path = cache_dir / f"{file_hash}.mp3"
|
||||
|
||||
# Check if cached version exists
|
||||
if not cache_path.exists():
|
||||
logger.info(f"[serve_file] Creating cached MP3: {cache_path}")
|
||||
|
||||
try:
|
||||
# Transcode to MP3 using ffmpeg
|
||||
(
|
||||
ffmpeg
|
||||
.input(str(file_path))
|
||||
.output(str(cache_path), acodec='libmp3lame', ab='128k')
|
||||
.run(overwrite_output=True, quiet=True)
|
||||
)
|
||||
except ffmpeg.Error as e:
|
||||
logger.error(f"[serve_file] Transcoding failed: {e}")
|
||||
# Fall back to original file
|
||||
cache_path = file_path
|
||||
else:
|
||||
logger.info(f"[serve_file] Transcoding completed: {cache_path}")
|
||||
else:
|
||||
logger.info(f"[serve_file] Using cached MP3: {cache_path}")
|
||||
|
||||
# Use the transcoded file
|
||||
file_path = cache_path
|
||||
file_size = file_path.stat().st_size
|
||||
content_type = "audio/mpeg"
|
||||
|
||||
else:
|
||||
content_type = MIME_MAP.get(original_ext, "application/octet-stream")
|
||||
|
||||
range_header = request.headers.get("range")
|
||||
|
||||
logger.info(
|
||||
f"[serve_file] {file_path.name} | size={file_size} | "
|
||||
f"type={content_type} | range={range_header or 'none'}"
|
||||
f"[serve_file] Serving {file_path.name} | size={file_size} | "
|
||||
f"type={content_type} | range={range_header or 'none'} | transcoded={should_transcode}"
|
||||
)
|
||||
|
||||
if content_type == "application/octet-stream":
|
||||
|
||||
Reference in New Issue
Block a user