osu! Map Finder
Модульный скрипт для авто-поиска, глубокого анализа (PP/SR/страйны с учётом модов, рассчитанные локально) и скачивания карт osu! по гибким фильтрам.
Архитектура
osu_map_finder/
├── main.py # точка входа, оркестрация пайплайна, вывод в консоль (rich)
├── config.example.yaml # шаблон конфига — скопируйте в config.yaml
├── requirements.txt
└── osu_finder/
├── config.py # ConfigManager: загрузка и валидация config.yaml
├── local_cache.py # LocalCache: индекс уже скачанных карт (папка Songs)
├── api_client.py # OsuApiClient: официальный osu! API v2 (OAuth2)
├── pp_analyzer.py # PpAnalyzer: расчёт PP/SR/страйнов через rosu-pp-py
├── downloader.py # Downloader: скачивание .osz + открытие в ОС
└── models.py # dataclasses: DiffAnalysis, BeatmapCandidate
Пайплайн (main.py → run()):
- LocalCache сканирует папку
Songsи строитset()из BeatmapSet ID. - OsuApiClient получает OAuth2-токен (Client Credentials Grant) и
постранично обходит
/beatmapsets/searchс базовыми фильтрами (режим, статус, ключевые слова, сортировка). - Каждый новый (не в локальном кэше) сет проверяется по всем сложностям: для каждой сложности с зеркала скачивается только лёгкий .osu файл.
- PpAnalyzer парсит .osu через
rosu_pp_py.Beatmapи для каждой заданной в конфиге мод-комбинации считает звёзды, Aim/Speed strain и PP (rosu_pp_py.Difficulty/Performance). BPM и длительность пересчитываются под моды черезclock_rateизrosu_pp_py.BeatmapAttributesBuilder— то же значение, что использует сама игра (1.5× для DT/NC, 0.75× для HT/DC и т.д.), без ручных таблиц. - Результат проверяется по
advanced_filters(длина, BPM, PP, звёзды, стиль geймплея jump/stream/hybrid — по соотношениюspeed/aim strain). - Если хотя бы одна сложность/мод-комбо прошла фильтр — Downloader
скачивает полный
.oszс зеркала и (еслиauto_open: true) открывает его в ОС (os.startfileна Windows — двойной клик по.oszв установленном клиенте osu! запускает импорт карты).
Установка
pip install -r requirements.txt
cp config.example.yaml config.yaml
# отредактируйте config.yaml под себя
python main.py --config config.yaml
Флаги: --verbose / -v — подробный (DEBUG) вывод.
Получение client_id / client_secret
- Зайдите на https://osu.ppy.sh/home/account/edit#oauth
- "New OAuth Application" → любое имя, Callback URL можно оставить пустым (используется только Client Credentials Grant — без входа пользователя).
- Скопируйте
Client IDиClient Secretвconfig.yaml.
Важные оговорки
/beatmapsets/searchофициально не задокументирован — сама osu! в своей документации помечает этот эндпоинт как "TODO: documentation". Параметры (q,s,m,sort,g,l) вapi_client.py(_build_search_params) определены по фактическому поведению веб-клиента и сторонних библиотек (aiosu, osu-api-v2-js). Если osu! когда-нибудь поменяет их — правьте только этот один метод.- Зеркало для скачивания. Официальный API v2 не отдаёт файлы карт без
авторизации реального пользователя (
lazer-скоуп), поэтому используется сторонний мирроринг-сервис (по умолчаниюcatboy.best). Такие зеркала периодически меняют домен/эндпоинты (на смену chimu.moe в своё время пришёл catboy.best) — если скачивание перестало работать, обновитеmirror.base_url/mirror.osu_file_path/mirror.osz_download_pathв конфиге под актуальный сервис. - Rate limit. osu! просит не более ~60 запросов/мин к официальному API
(см.
execution.request_delay, по умолчанию 1 запрос/сек). Скрипт также сам обрабатывает HTTP 429 с экспоненциальной паузой. - Скрипт предназначен для личного использования (поиск карт под свой уровень/стиль игры) — пожалуйста, не используйте его для агрессивного массового скрапинга, это противоречит Terms of Use osu! API.
Пример config.yaml
См. config.example.yaml — там расписан каждый параметр.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
osu_finder-1.0.0.tar.gz
(26.0 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file osu_finder-1.0.0.tar.gz.
File metadata
- Download URL: osu_finder-1.0.0.tar.gz
- Upload date:
- Size: 26.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd78a5322732ddc8e0471c2404a7e07c26f323efbf867c8dac753d636abd6690
|
|
| MD5 |
30b89e3f492c7a964072c4da073cadd1
|
|
| BLAKE2b-256 |
08908a3e95aae8cb4a60a28b3427d52dac4274bc970bb739fdc9ac860e3db19b
|
File details
Details for the file osu_finder-1.0.0-py3-none-any.whl.
File metadata
- Download URL: osu_finder-1.0.0-py3-none-any.whl
- Upload date:
- Size: 29.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f444474102860b02dcb807e233c6d7fe85cd372c54d720d4cb299995c093b151
|
|
| MD5 |
b68267866dccc771bae89cb1e488de9b
|
|
| BLAKE2b-256 |
03961882dcf290344f06d0d7791280d06517daabf7b1821e76eec882b04b481f
|