|
32 | 32 |
|
33 | 33 | # Import helper functions |
34 | 34 | from app_helper import ( |
35 | | - init_db, get_db, close_db, |
| 35 | + get_db, close_db, |
36 | 36 | redis_conn, |
37 | 37 | get_task_info_from_db, |
38 | 38 | cancel_job_and_children_recursive, |
| 39 | +) |
| 40 | +from database import init_db |
| 41 | +from config import ( |
39 | 42 | TASK_STATUS_PENDING, TASK_STATUS_STARTED, TASK_STATUS_PROGRESS, |
40 | 43 | TASK_STATUS_SUCCESS, TASK_STATUS_FAILURE, TASK_STATUS_REVOKED |
41 | 44 | ) |
|
46 | 49 | resolve_jwt_secret, |
47 | 50 | ) |
48 | 51 |
|
49 | | -from app_provider_migration import migration_bp |
50 | | - |
51 | 52 | from error import error_manager |
52 | 53 | from error.error_manager import AudioMuseError |
53 | 54 | from error.error_dictionary import UNKNOWN_ERROR_CODE |
@@ -172,7 +173,7 @@ def teardown_db(e=None): |
172 | 173 | else: |
173 | 174 | app.logger.info("RQ worker mode: skipping startup database schema bootstrap.") |
174 | 175 |
|
175 | | -import app_setup |
| 176 | +import app_setup # noqa: F401 |
176 | 177 |
|
177 | 178 | # --- API Endpoints --- |
178 | 179 |
|
@@ -705,7 +706,7 @@ def listen_for_index_reloads(): |
705 | 706 | load_voyager_index_for_querying(force_reload=True) |
706 | 707 | from tasks.artist_gmm_manager import load_artist_index_for_querying |
707 | 708 | load_artist_index_for_querying(force_reload=True) |
708 | | - from app_helper import load_map_projection, load_artist_projection |
| 709 | + from database import load_map_projection, load_artist_projection |
709 | 710 | load_map_projection('main_map', force_reload=True) |
710 | 711 | load_artist_projection('artist_map', force_reload=True) |
711 | 712 | # Rebuild the map JSON cache used by the /api/map endpoint |
@@ -757,48 +758,56 @@ def listen_for_index_reloads(): |
757 | 758 |
|
758 | 759 |
|
759 | 760 |
|
760 | | -# --- Import and Register Blueprints --- |
761 | | -# This is the original, working structure. |
762 | | -from app_chat import chat_bp |
763 | | -from app_clustering import clustering_bp |
764 | | -from app_analysis import analysis_bp |
765 | | -from app_cron import cron_bp, run_due_cron_jobs |
766 | | -from app_voyager import voyager_bp |
767 | | -from app_sonic_fingerprint import sonic_fingerprint_bp |
768 | | -from app_path import path_bp |
769 | | -from app_external import external_bp # --- NEW: Import the external blueprint --- |
770 | | -from app_alchemy import alchemy_bp |
771 | | -from app_map import map_bp |
772 | | -from app_waveform import waveform_bp |
773 | | -from app_artist_similarity import artist_similarity_bp |
774 | | -from app_clap_search import clap_search_bp |
775 | | -from app_lyrics import lyrics_search_bp |
776 | | -from app_sem_grove import sem_grove_bp |
777 | | -from app_backup import backup_bp |
778 | | -from app_dashboard import dashboard_bp |
779 | | -from app_users import users_bp |
780 | | -from app_sync import sync_bp |
781 | | - |
782 | | -app.register_blueprint(chat_bp, url_prefix='/chat') |
783 | | -app.register_blueprint(clustering_bp) |
784 | | -app.register_blueprint(analysis_bp) |
785 | | -app.register_blueprint(cron_bp) |
786 | | -app.register_blueprint(voyager_bp) |
787 | | -app.register_blueprint(sonic_fingerprint_bp) |
788 | | -app.register_blueprint(path_bp) |
789 | | -app.register_blueprint(external_bp, url_prefix='/external') # --- NEW: Register the external blueprint --- |
790 | | -app.register_blueprint(alchemy_bp) |
791 | | -app.register_blueprint(map_bp) |
792 | | -app.register_blueprint(waveform_bp) |
793 | | -app.register_blueprint(artist_similarity_bp) |
794 | | -app.register_blueprint(clap_search_bp) |
795 | | -app.register_blueprint(lyrics_search_bp) |
796 | | -app.register_blueprint(sem_grove_bp) |
797 | | -app.register_blueprint(backup_bp) |
798 | | -app.register_blueprint(migration_bp) |
799 | | -app.register_blueprint(dashboard_bp) |
800 | | -app.register_blueprint(users_bp) |
801 | | -app.register_blueprint(sync_bp) |
| 761 | +# --- Blueprint Registration --- |
| 762 | +# Standard Flask factory pattern: blueprint imports are inside |
| 763 | +# this function so the eager import graph stays flat. |
| 764 | + |
| 765 | + |
| 766 | +def _register_blueprints(flask_app): |
| 767 | + from app_chat import chat_bp |
| 768 | + from app_clustering import clustering_bp |
| 769 | + from app_analysis import analysis_bp |
| 770 | + from app_cron import cron_bp |
| 771 | + from app_voyager import voyager_bp |
| 772 | + from app_sonic_fingerprint import sonic_fingerprint_bp |
| 773 | + from app_path import path_bp |
| 774 | + from app_external import external_bp |
| 775 | + from app_alchemy import alchemy_bp |
| 776 | + from app_map import map_bp |
| 777 | + from app_waveform import waveform_bp |
| 778 | + from app_artist_similarity import artist_similarity_bp |
| 779 | + from app_clap_search import clap_search_bp |
| 780 | + from app_lyrics import lyrics_search_bp |
| 781 | + from app_sem_grove import sem_grove_bp |
| 782 | + from app_backup import backup_bp |
| 783 | + from app_provider_migration import migration_bp |
| 784 | + from app_dashboard import dashboard_bp |
| 785 | + from app_users import users_bp |
| 786 | + from app_sync import sync_bp |
| 787 | + |
| 788 | + flask_app.register_blueprint(chat_bp, url_prefix='/chat') |
| 789 | + flask_app.register_blueprint(clustering_bp) |
| 790 | + flask_app.register_blueprint(analysis_bp) |
| 791 | + flask_app.register_blueprint(cron_bp) |
| 792 | + flask_app.register_blueprint(voyager_bp) |
| 793 | + flask_app.register_blueprint(sonic_fingerprint_bp) |
| 794 | + flask_app.register_blueprint(path_bp) |
| 795 | + flask_app.register_blueprint(external_bp, url_prefix='/external') |
| 796 | + flask_app.register_blueprint(alchemy_bp) |
| 797 | + flask_app.register_blueprint(map_bp) |
| 798 | + flask_app.register_blueprint(waveform_bp) |
| 799 | + flask_app.register_blueprint(artist_similarity_bp) |
| 800 | + flask_app.register_blueprint(clap_search_bp) |
| 801 | + flask_app.register_blueprint(lyrics_search_bp) |
| 802 | + flask_app.register_blueprint(sem_grove_bp) |
| 803 | + flask_app.register_blueprint(backup_bp) |
| 804 | + flask_app.register_blueprint(migration_bp) |
| 805 | + flask_app.register_blueprint(dashboard_bp) |
| 806 | + flask_app.register_blueprint(users_bp) |
| 807 | + flask_app.register_blueprint(sync_bp) |
| 808 | + |
| 809 | + |
| 810 | +_register_blueprints(app) |
802 | 811 |
|
803 | 812 | # --- Startup: Load indexes and caches (Flask server only, NOT RQ workers) --- |
804 | 813 | # RQ workers import app.py but should NOT load indexes or start background threads. |
@@ -828,7 +837,7 @@ def listen_for_index_reloads(): |
828 | 837 | logger.debug(f"No precomputed map projection to load at startup or load failed: {e}") |
829 | 838 | # Also try to load artist component projection into memory |
830 | 839 | try: |
831 | | - from app_helper import load_artist_projection |
| 840 | + from database import load_artist_projection |
832 | 841 | load_artist_projection('artist_map') |
833 | 842 | logger.info("In-memory artist component projection loaded at startup.") |
834 | 843 | except Exception as e: |
@@ -895,6 +904,7 @@ def _start_map_init_background(): |
895 | 904 | def _cron_manager_loop(): |
896 | 905 | try: |
897 | 906 | from time import sleep |
| 907 | + from app_cron import run_due_cron_jobs |
898 | 908 | while True: |
899 | 909 | try: |
900 | 910 | with app.app_context(): |
|
0 commit comments