# -*- coding: utf-8 -*- """服务层:从原 Flask 巨石中剥离的框架无关实现(不含任何 Flask 依赖)。 模块划分(原先集中在 runtime.py 的 1900 行,现按职责拆分;`services.runtime` 保留为兼容门面,原样再导出下列全部符号,既有调用点零改动): - ``api_service``:MusicAPIService 与进程级实例(config / api_service) - ``_shared``:限流桶、请求统计、命名与共享常量 - ``_taskcore``:任务生命周期原语(启动 / 终态 / 文件收尾 / 结算) - ``downloads``:单曲下载、账号探测与任务交付 - ``batch``:歌单/专辑批量打包 worker - ``podcast``:播客单集下载与整台打包 worker - ``streaming``:同步流式响应垫片(音频分段透传) - ``tasks``:任务监控循环、设备心跳与缓存清扫 """ # ============ 依赖自检 ============ # 应用依赖缺失时给出可读提示并非零退出。本层常以 NSSM 服务方式运行、控制台重定向为 # GBK,裸 traceback 反而更难定位,故提示串保持纯 ASCII。放在包初始化里是因为它必然 # 先于任何子模块执行——子模块各自 import 失败会先抛 traceback,那段提示就没机会出现。 import importlib import sys for _dep in ('auth_system', 'podcast_api', 'music_api', 'music_downloader', 'qr_login'): try: importlib.import_module(_dep) except ImportError as _exc: print("ImportError: " + str(_exc)) print("Please make sure all dependency modules exist and are importable.") sys.exit(1)