uxoxo/eb2ab
0
1"""2FastAPI server entry point for TTS REST API.3 4This server runs alongside the Gradio UI (app.py) to provide5REST API access to the TTS functionality.6 7Usage:8 python api_server.py [--host HOST] [--port PORT] [--help]9 10Environment Variables:11 API_PORT: Server port (default: 8000)12 API_HOST: Server host (default: 0.0.0.0)13 API_ENABLED: Enable/disable API (default: true)14 API_KEYS: Comma-separated list of API keys15 API_KEY_1, API_KEY_2, ...: Individual API keys16 CORS_ORIGINS: Comma-separated list of allowed CORS origins17 MAX_REQUESTS_PER_HOUR: Rate limit per API key (default: 100)18 AUDIO_RETENTION_HOURS: File retention period (default: 24)19 API_OUTPUT_DIR: Output directory for audio files (default: /app/audiobooks/api)20 CLEANUP_INTERVAL_SECONDS: Cleanup interval (default: 3600)21"""22 23import argparse24import os25import sys26import uvicorn27 28 29def main():30 """Main entry point for API server."""31 # Check if API is enabled32 api_enabled = os.environ.get("API_ENABLED", "true").lower() in ["true", "1", "yes"]33 if not api_enabled:34 print("API is disabled (API_ENABLED=false)")35 sys.exit(0)36 37 # Parse arguments38 parser = argparse.ArgumentParser(39 description="ebook2audiobook TTS REST API Server",40 formatter_class=argparse.RawTextHelpFormatter41 )42 parser.add_argument(43 "--host",44 type=str,45 default=os.environ.get("API_HOST", "0.0.0.0"),46 help="Server host (default: 0.0.0.0)"47 )48 parser.add_argument(49 "--port",50 type=int,51 default=int(os.environ.get("API_PORT", "8000")),52 help="Server port (default: 8000)"53 )54 parser.add_argument(55 "--reload",56 action="store_true",57 help="Enable auto-reload for development"58 )59 parser.add_argument(60 "--workers",61 type=int,62 default=1,63 help="Number of worker processes (default: 1)"64 )65 66 args = parser.parse_args()67 68 # Print startup information69 print(f"""70================================================================71 ebook2audiobook TTS REST API Server72================================================================73 74Server Configuration:75 Host: {args.host}76 Port: {args.port}77 Workers: {args.workers}78 Reload: {args.reload}79 80Environment Configuration:81 API Keys: {"Configured" if os.environ.get("API_KEYS") or os.environ.get("API_KEY_1") else "NOT CONFIGURED (WARNING)"}82 CORS Origins: {os.environ.get("CORS_ORIGINS", "* (all origins)")}83 Rate Limit: {os.environ.get("MAX_REQUESTS_PER_HOUR", "100")} requests/hour84 File Retention: {os.environ.get("AUDIO_RETENTION_HOURS", "24")} hours85 Output Directory: {os.environ.get("API_OUTPUT_DIR", "/app/audiobooks/api")}86 87Documentation:88 OpenAPI: http://{args.host if args.host != '0.0.0.0' else 'localhost'}:{args.port}/api/v1/docs89 ReDoc: http://{args.host if args.host != '0.0.0.0' else 'localhost'}:{args.port}/api/v1/redoc90 91Starting server...92""")93 94 # Check for API keys warning95 if not (os.environ.get("API_KEYS") or os.environ.get("API_KEY_1")):96 print("WARNING: No API keys configured!")97 print("WARNING: The API will be publicly accessible without authentication.")98 print("WARNING: Set API_KEY_1, API_KEY_2, or API_KEYS environment variable.")99 print()100 101 # Run server102 try:103 uvicorn.run(104 "api.main:app",105 host=args.host,106 port=args.port,107 reload=args.reload,108 workers=args.workers if not args.reload else 1,109 log_level="info"110 )111 except KeyboardInterrupt:112 print("\nShutting down API server...")113 except Exception as e:114 print(f"Error starting server: {e}")115 sys.exit(1)116 117 118if __name__ == "__main__":119 main()120 