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
| 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 |
The system has a icecast like playbacksystem which works on a per-user basis.
audiobook support? crossfading
Use the helper script to create local test directories and start the API server:
./scripts/run-local-server.shOr via Make:
make run-localSet 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 8000Run database migrations manually (optional; startup also runs alembic upgrade head):
make migrate-dbOld 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)
}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)