File size: 2,631 Bytes
aad9d66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
"""
Main Flask application for the Music Generation App
"""
import os
import logging
from flask import Flask, jsonify, send_from_directory
from flask_cors import CORS
from dotenv import load_dotenv

from config.settings import Config
from routes.generation import generation_bp
from routes.timeline import timeline_bp
from routes.export import export_bp
from routes.mastering import mastering_bp
from utils.logger import setup_logger

# Load environment variables
load_dotenv()

def create_app(config_class=Config):
    """Application factory pattern"""
    app = Flask(__name__)
    app.config.from_object(config_class)
    
    # Enable CORS
    CORS(app, resources={r"/api/*": {"origins": "*"}})
    
    # Setup logging
    setup_logger(app)
    
    # Create necessary directories
    os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
    os.makedirs(app.config['OUTPUT_FOLDER'], exist_ok=True)
    os.makedirs(app.config['MODELS_DIR'], exist_ok=True)
    os.makedirs('logs', exist_ok=True)
    
    # Register blueprints
    app.register_blueprint(generation_bp, url_prefix='/api/generation')
    app.register_blueprint(timeline_bp, url_prefix='/api/timeline')
    app.register_blueprint(export_bp, url_prefix='/api/export')
    app.register_blueprint(mastering_bp, url_prefix='/api/mastering')
    
    # Serve static files from outputs directory with proper MIME types
    @app.route('/outputs/<path:filename>')
    def serve_output(filename):
        response = send_from_directory(app.config['OUTPUT_FOLDER'], filename)
        # Ensure WAV files have correct MIME type
        if filename.lower().endswith('.wav'):
            response.headers['Content-Type'] = 'audio/wav'
        elif filename.lower().endswith('.mp3'):
            response.headers['Content-Type'] = 'audio/mpeg'
        return response
    
    # Health check endpoint
    @app.route('/api/health')
    def health_check():
        return jsonify({
            'status': 'healthy',
            'version': '1.0.0'
        })
    
    # Error handlers
    @app.errorhandler(404)
    def not_found(error):
        return jsonify({'error': 'Not found'}), 404
    
    @app.errorhandler(500)
    def internal_error(error):
        app.logger.error(f'Internal server error: {str(error)}')
        return jsonify({'error': 'Internal server error'}), 500
    
    return app

if __name__ == '__main__':
    app = create_app()
    port = int(os.getenv('PORT', 5000))
    host = os.getenv('HOST', '0.0.0.0')
    
    app.logger.info(f'Starting server on {host}:{port}')
    app.run(host=host, port=port, debug=os.getenv('FLASK_DEBUG', 'False') == 'True')