from flask import Flask, request, send_file from pydub import AudioSegment from io import BytesIO import requests import zipfile app = Flask(__name__) def process_audio(segments): track_1 = AudioSegment.empty() track_2 = AudioSegment.empty() full_mix = AudioSegment.empty() crossfade = 100 cursor = 0 print(f"Traitement de {len(segments)} segments...") for i, seg in enumerate(segments): try: r = requests.get(seg['url']) audio_data = BytesIO(r.content) chunk = AudioSegment.from_file(audio_data, format="mp3") except Exception as e: print(f"Erreur téléchargement segment {i}: {e}") continue duration = len(chunk) if i > 0: cursor -= crossfade # Track 1 gap_1 = cursor - len(track_1) if gap_1 > 0: track_1 += AudioSegment.silent(duration=gap_1) if str(seg['person']) == "1": track_1 += chunk # Track 2 gap_2 = cursor - len(track_2) if gap_2 > 0: track_2 += AudioSegment.silent(duration=gap_2) if str(seg['person']) == "2": track_2 += chunk # Mix if i == 0: full_mix += chunk else: full_mix = full_mix.append(chunk, crossfade=crossfade) cursor += duration final_len = len(full_mix) if len(track_1) < final_len: track_1 += AudioSegment.silent(duration=final_len - len(track_1)) if len(track_2) < final_len: track_2 += AudioSegment.silent(duration=final_len - len(track_2)) memory_file = BytesIO() with zipfile.ZipFile(memory_file, 'w') as zf: for name, audio in [("speaker_1.mp3", track_1), ("speaker_2.mp3", track_2), ("mix.mp3", full_mix)]: buf = BytesIO() audio.export(buf, format="mp3") zf.writestr(name, buf.getvalue()) memory_file.seek(0) return memory_file @app.route('/') def home(): return "PodGen API is running! Send POST requests to /generate" @app.route('/generate', methods=['POST']) def generate(): data = request.json segments = data.get('segments', []) if not segments: return {"error": "No segments provided"}, 400 try: zip_buffer = process_audio(segments) return send_file(zip_buffer, mimetype='application/zip', as_attachment=True, download_name='podcast_pack.zip') except Exception as e: return {"error": str(e)}, 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=7860)