import os import uuid import threading from dotenv import load_dotenv from flask import Flask, request, jsonify, render_template, send_from_directory from werkzeug.utils import secure_filename from engine import ( init_db, create_task, get_task, run_ai_engine_worker, generate_script_with_ai, UPLOAD_FOLDER, OUTPUT_FOLDER ) load_dotenv() app = Flask(__name__) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['OUTPUT_FOLDER'] = OUTPUT_FOLDER init_db() # ============================================================================== # PWA, Static File, and Favicon Routes # ============================================================================== # Favicon ka naya aur sahi route @app.route('/favicon.ico') def favicon(): # Hum static folder se favicon.png file bhej rahe hain # Iske liye static folder me 'favicon.png' naam ki file honi chahiye return send_from_directory('static', 'favicon.png') @app.route('/manifest.json') def serve_manifest(): return send_from_directory('static', 'manifest.json') @app.route('/sw.js') def serve_sw(): return send_from_directory('static', 'sw.js') @app.route('/icon-512x512.png') def serve_icon_512(): return send_from_directory('static', 'icon-512x512.png') @app.route('/icon-192x192.png') def serve_icon_192(): return send_from_directory('static', 'icon-192x192.png') # ============================================================================== # Main Application Routes # ============================================================================== @app.route('/') def home(): return render_template('home.html') @app.route('/process', methods=['POST']) def process_video(): task_id = str(uuid.uuid4()) create_task(task_id) script_text = request.form.get('script_text') script_file = request.files.get('script_file') orientation = request.form.get('orientation', 'horizontal') max_clip_length = int(request.form.get('max_clip_length', 15)) mute_final_video = request.form.get('mute_final_video') == 'true' script_file_path = None if script_file and script_file.filename: filename = secure_filename(script_file.filename) task_upload_dir = os.path.join(app.config['UPLOAD_FOLDER'], task_id) os.makedirs(task_upload_dir, exist_ok=True) script_file_path = os.path.join(task_upload_dir, filename) script_file.save(script_file_path) if not script_text and not script_file_path: return "Please provide a script text or an audio file.", 400 thread = threading.Thread( target=run_ai_engine_worker, args=(task_id, script_text, script_file_path, orientation, max_clip_length, mute_final_video) ) thread.start() return render_template('processing.html', task_id=task_id) @app.route('/generate-script', methods=['POST']) def generate_script(): data = request.get_json() topic = data.get('topic') video_length = data.get('video_length') if not topic or not video_length: return jsonify({'error': 'Topic and video length are required.'}), 400 try: generated_script = generate_script_with_ai(topic, video_length) return jsonify({'script': generated_script}) except Exception as e: print(f"Error during script generation: {e}") return jsonify({'error': f"AI से संपर्क करने में विफल: {str(e)}"}), 500 @app.route('/progress/') def progress(task_id): task = get_task(task_id) if not task: return jsonify({'status': 'error', 'log': 'Task not found.'}) return jsonify(dict(task)) @app.route('/result/') def result(filename): return render_template('result.html', filename=filename) @app.route('/outputs/') def serve_output_file(filename): return send_from_directory(app.config['OUTPUT_FOLDER'], filename) @app.route('/history') def history(): output_dir = app.config['OUTPUT_FOLDER'] history_items = [] try: all_files = sorted(os.listdir(output_dir), reverse=True) for filename in all_files: if filename.endswith('_final_video.mp4'): task_id = filename.replace('_final_video.mp4', '') report_filename = f"{task_id}_report.json" item = { 'video': filename, 'task_id': task_id, 'report': report_filename if report_filename in all_files else None } history_items.append(item) except FileNotFoundError: print(f"'{output_dir}' directory not found.") return render_template('history.html', items=history_items) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)