import logging
import os
import tempfile
from flask import Flask, request, jsonify
from pydub import AudioSegment
from openai import OpenAI
import io
import requests

# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

app = Flask(__name__)

# Initialize OpenAI client
client = OpenAI(api_key='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')

def download_file(url):
    logging.info(f"Downloading file from URL: {url}")
    response = requests.get(url)
    if response.status_code == 200:
        logging.info("File downloaded successfully")
        return response.content
    else:
        error_msg = f"Failed to download file. Status code: {response.status_code}"
        logging.error(error_msg)
        raise Exception(error_msg)

def transcribe_audio_chunk(file_path):
    logging.info(f"Transcribing audio chunk: {file_path}")
    try:
        with open(file_path, 'rb') as audio_file:
            response = client.audio.transcriptions.create(
                model="whisper-1",
                file=audio_file,
                response_format="text"
            )
        logging.info("Audio chunk transcribed successfully")
        return response
    except Exception as e:
        logging.error(f"Error transcribing audio chunk: {str(e)}")
        raise

def process_audio_file(mp3_data):
    logging.info("Processing audio file")
    with tempfile.TemporaryDirectory() as temp_dir:
        # Save the full MP3 file
        full_mp3_path = os.path.join(temp_dir, "full_audio.mp3")
        with open(full_mp3_path, 'wb') as f:
            f.write(mp3_data)

        audio = AudioSegment.from_mp3(full_mp3_path)
        chunk_length_ms = 60000  # 1 minute chunks
        chunks = [audio[i:i + chunk_length_ms] for i in range(0, len(audio), chunk_length_ms)]
        
        full_transcript = []
        for i, chunk in enumerate(chunks):
            logging.info(f"Processing chunk {i+1} of {len(chunks)}")
            chunk_path = os.path.join(temp_dir, f"chunk_{i}.mp3")
            chunk.export(chunk_path, format="mp3")
            
            try:
                transcript = transcribe_audio_chunk(chunk_path)
                full_transcript.append(transcript)
            except Exception as e:
                logging.error(f"Error processing chunk {i+1}: {str(e)}")
    
    logging.info("Audio file processing completed")
    return "\n".join(full_transcript)

@app.route('/transcribe', methods=['GET', 'POST'])
def transcribe():
    logging.info(f"Received transcription request via {request.method}")
    
    if request.method == 'POST':
        url = request.json.get('url')
    else:  # GET
        url = request.args.get('url')
    
    if not url:
        logging.error("No URL provided in the request")
        return jsonify({'error': 'No URL provided'}), 400

    try:
        mp3_data = download_file(url)
    except Exception as e:
        logging.error(f"Error downloading file: {str(e)}")
        return jsonify({'error': str(e)}), 400

    try:
        transcript = process_audio_file(mp3_data)
        logging.info("Transcription completed successfully")
        return jsonify({'transcript': transcript})
    except Exception as e:
        logging.error(f"Error during transcription process: {str(e)}")
        return jsonify({'error': 'An error occurred during transcription'}), 500

@app.route('/')
def home():
    return "Welcome to the MP3 Transcription Service. Use /transcribe endpoint to transcribe audio."

if __name__ == '__main__':
    logging.info("Starting the Flask application")
    app.run(host='0.0.0.0', port=5111)

