Audiophiles' Music Manager - AMM_core
AMM is a music management system for very large collections.
It has the following processing capabilities:
- Importing / Parsing
- Fingerprinting
- Silence Trimming
- Converting
- Tag Retrieval
- Art Retrieval
- Lyrics Retrieval
- Tagging
- Renaming / Sorting
- exporting
Modules
| Module | Description | Progress |
|---|---|---|
| Core | Server | 90% |
| API client | API client | 100% |
| Web | Web Interface | 10% |
| TUI | CLI/Terminal Client | planned |
| GUI | Graphical Client | planned |
| Mobile | Mobile Client | planned |
user login via google oauth, admin approved registration
Per-user playback
The system has a icecast like playbacksystem which works on a per-user basis.
Planned capabilities
audiobook support? crossfading
Local test run
Use the helper script to create local test directories and start the API server:
./scripts/run-local-server.sh
Or via Make:
MariaDB run
Set DATABASE_URL to an async MySQL/MariaDB URL (driver: asyncmy) and start uvicorn:
export DATABASE_URL="mysql+asyncmy://amm_user:amm_pass@127.0.0.1:3306/amm_db?charset=utf8mb4" # Bind to localhost-only by default. PYTHONPATH="$(pwd)/src" .venv/bin/python -m uvicorn main:app --app-dir src --host 127.0.0.1 --port 8000
Run database migrations manually (optional; startup also runs alembic upgrade head):
Task retention
Old task rows are cleaned up automatically once per day at startup interval.
TASK_RETENTION_ENABLED(default:true)TASK_RETENTION_DAYS(default:30)
Manual admin trigger via GraphQL mutation:
mutation { runTaskRetentionCleanup(olderThanDays: 7) }
Security-related env vars
JWT_SECRET_KEY(required unlessALLOW_INSECURE_DEFAULT_JWT_SECRET=true)ALLOW_INSECURE_DEFAULT_JWT_SECRET(default:false, dev-only fallback)GRAPHIQL_ENABLED(default:false)CORS_ALLOW_ALL(default:false)CORS_ORIGINS(comma-separated allowlist)LOGIN_RATE_LIMIT_ENABLED(default:true)LOGIN_RATE_LIMIT_MAX_ATTEMPTS(default:5)LOGIN_RATE_LIMIT_WINDOW_SECONDS(default:60)REFRESH_RATE_LIMIT_ENABLED(default:true)REFRESH_RATE_LIMIT_MAX_ATTEMPTS(default:20)REFRESH_RATE_LIMIT_WINDOW_SECONDS(default:60)