|
import groq_backend |
|
from flask import Flask, request, jsonify, g |
|
from typing import Dict, Union |
|
import logging |
|
import re |
|
|
|
|
|
app = Flask(__name__) |
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
app.config['DEFAULT_CHUNK_SIZE'] = 25*60*1000 |
|
app.config['TEMP_DIR'] = "temp" |
|
|
|
YOUTUBE_URL_PATTERN = r'^(https?://)?(www\.)?(youtube\.com|youtu\.be)/.+$' |
|
|
|
def validate_youtube_url(url: str) -> bool: |
|
return re.match(YOUTUBE_URL_PATTERN, url) is not None |
|
|
|
|
|
@app.route('/transcribe', methods=['POST']) |
|
def transcribe() -> Union[Dict, str]: |
|
data = request.json |
|
yt_url = data.get('yt_url') |
|
chunk_size = data.get('chunk_size', app.config['DEFAULT_CHUNK_SIZE']) |
|
temp_dir = data.get('temp_dir', app.config['TEMP_DIR']) |
|
|
|
if not yt_url: |
|
error = "YouTube URL is required." |
|
logger.error(error) |
|
return jsonify({'error': error}), 400 |
|
|
|
if not validate_youtube_url(yt_url): |
|
error = f"Invalid YouTube URL: {yt_url}" |
|
logger.error(error) |
|
return jsonify({'error': error}), 400 |
|
|
|
try: |
|
print(f"Transcribing {yt_url} with chunk size {chunk_size} and temp dir {temp_dir}") |
|
transcript = groq_backend.generate_youtube_transcript_with_groq( |
|
yt_url, chunk_size, temp_dir |
|
) |
|
return jsonify({'transcript': transcript}), 200 |
|
except ValueError as e: |
|
error = f"Failed to transcribe video: {str(e)}" |
|
logger.exception(error) |
|
return jsonify({'error': error}), 400 |
|
except Exception as e: |
|
error = "Unexpected error occurred during transcription" |
|
logger.exception(error) |
|
return jsonify({'error': error}), 500 |
|
|
|
|
|
if __name__ == '__main__': |
|
app.run() |