riotskillissue 1.1.4__tar.gz → 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/CHANGELOG.md +53 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/PKG-INFO +35 -5
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/README.md +34 -4
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/CONTRIBUTING.md +5 -5
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/api-reference.md +1 -1
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/cli.md +45 -4
- riotskillissue-1.2.0/docs/replays.md +341 -0
- riotskillissue-1.2.0/docs/rso.md +47 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/tools/index.md +5 -3
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/mkdocs.yml +1 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/pyproject.toml +1 -1
- riotskillissue-1.2.0/reports/diff_20261026_075426_291794.md +12 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/spec/openapi.json +14 -18
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/__init__.py +7 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/match.py +10 -17
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/registry.py +15 -32
- riotskillissue-1.2.0/src/riotskillissue/cli.py +358 -0
- riotskillissue-1.2.0/src/riotskillissue/league_client.py +415 -0
- riotskillissue-1.2.0/src/riotskillissue/replays.py +250 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/async_services.py +24 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/sync_services.py +20 -0
- riotskillissue-1.2.0/tests/test_league_client.py +382 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_gateway.py +2 -2
- riotskillissue-1.2.0/tests/test_player_replay_cli.py +224 -0
- riotskillissue-1.2.0/tests/test_replay_cli.py +223 -0
- riotskillissue-1.2.0/tests/test_replays.py +239 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/typecheck/client_usage.py +23 -0
- riotskillissue-1.1.4/docs/rso.md +0 -24
- riotskillissue-1.1.4/src/riotskillissue/cli.py +0 -99
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.gitattributes +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.github/workflows/publish.yml +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.github/workflows/test.yml +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.github/workflows/update_sdk.yml +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.gitignore +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/LICENSE +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/assets/logo.png +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/assets/tui.gif +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/configuration.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/index.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/league-of-legends.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/teamfight-tactics.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/valorant.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/getting-started.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/index.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/live-game-tui.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/live_game_tui.gif +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/live_game_tui_not_found.gif +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/mcp.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/migration.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/reference/index.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/routing.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/sdk/index.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/stylesheets/extra.css +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/examples/basic_usage.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/examples/champion_mastery.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/examples/match_history.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/404.html +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/home.html +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/partials/path.html +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/partials/progress.html +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/diff_20260810_080005.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/diff_20260924_033319_941627.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/diff_20261006_092817_855689.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/production_readiness_20260906.md +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/client_mixin.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/operations.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/_client.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/common/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/common/account.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/challenges.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/champion.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/champion_mastery.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/clash.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/league.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/league_exp.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/rso_match.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/spectator.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/status.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/summoner.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/tournament.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/tournament_stub.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/deck.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/inventory.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/match.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/ranked.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/status.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/riftbound/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/riftbound/content.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/league.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/match.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/spectator.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/status.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/summoner.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/console_match.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/console_ranked.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/content.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/match.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/ranked.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/status.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/auth.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/cache.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/client.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/config.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/http.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/pagination.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/ratelimit.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/sync_client.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/types.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/utils.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/cli.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/errors.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/lol.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/models.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/operations.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/result_store.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/server.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/settings.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/workflows.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/common/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/common/account_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/common/errors.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/challenges_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/champion_mastery_v4.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/champion_v3.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/clash_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/league_exp_v4.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/league_v4.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/match_v5.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/rso_match_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/spectator_v5.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/status_v4.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/summoner_v4.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/tournament_stub_v5.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/tournament_v5.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/deck_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/inventory_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/match_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/ranked_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/status_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/results.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/riftbound/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/riftbound/content_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/league_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/match_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/spectator_v5.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/status_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/summoner_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/console_match_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/console_ranked_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/content_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/match_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/ranked_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/status_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/py.typed +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/__init__.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/base.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/models.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/static.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/testing.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/tui.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/conftest.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/manual_test.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_advanced.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_bindings.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_cache.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_core.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_core_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_diff_engine.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_documentation.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_generator.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_lol_analysis.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_result_store.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_server.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_settings.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_python_support.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_release.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_resiliency.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_runtime_safety.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_spec_manager.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_sync_client.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_tui.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_workflows_v1.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/bump_version.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/diff_engine.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/generator/core.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/generator/parser.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/manager.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/release.py +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/api_reference.md.j2 +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/client_mixin.py.j2 +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/endpoints.py.j2 +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/models.py.j2 +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/raw_client.py.j2 +0 -0
- {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/registry.py.j2 +0 -0
|
@@ -5,6 +5,58 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.2.0] - 2026-10-26
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Replay listing and downloads through `riotskillissue-cli replays`. Use
|
|
13
|
+
`--player "GameName#TagLine"` with a running League Client to select another
|
|
14
|
+
player's replay, or an RSO token for the authenticated player's public API
|
|
15
|
+
replay list. Supports interactive selection, explicit output paths, and
|
|
16
|
+
opt-in replacement of existing files.
|
|
17
|
+
- `LeagueReplayClient` for local player lookup, recent matches, and replay
|
|
18
|
+
downloads. Uses the client's replay folder and follows its download limits
|
|
19
|
+
without retrying rejected download requests.
|
|
20
|
+
- Async and sync `lol.replays()` and `lol.download_replay()` helpers with streamed
|
|
21
|
+
downloads, temporary-file cleanup, and credential-free file requests.
|
|
22
|
+
- Replay documentation covering League Client and RSO setup, CLI and Python
|
|
23
|
+
usage, and download limits.
|
|
24
|
+
|
|
25
|
+
### Upgrade
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
python -m pip install --upgrade riotskillissue
|
|
29
|
+
riotskillissue-cli replays download --player "GameName#TagLine"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Compatibility
|
|
33
|
+
|
|
34
|
+
- Player mode requires a signed-in League Client on the same Windows or macOS
|
|
35
|
+
machine, with the target match accessible on the client's current region.
|
|
36
|
+
Riot enforces the current [10-downloads-per-hour limit](https://www.leagueoflegends.com/en-ph/news/game-updates/league-of-legends-patch-26-21-notes/).
|
|
37
|
+
The [League Client API](https://developer.riotgames.com/docs/lol#league-client-api)
|
|
38
|
+
is unsupported by Riot and may change between patches.
|
|
39
|
+
- Public API replay requests require an RSO token from an approved integration
|
|
40
|
+
and return replays for the player identified by that token. They do not
|
|
41
|
+
provide arbitrary player-name or match-ID lookup.
|
|
42
|
+
- Automated tests cover the client workflow with mocked API responses. A replay
|
|
43
|
+
download from a live League 26.21 client has not been verified.
|
|
44
|
+
|
|
45
|
+
## [1.1.5] - 2026-10-26
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
## Added Endpoints
|
|
50
|
+
- /lol/match/v5/matches/replays
|
|
51
|
+
|
|
52
|
+
## Removed Endpoints
|
|
53
|
+
- /lol/match/v5/matches/by-puuid/{puuid}/replays
|
|
54
|
+
|
|
55
|
+
## Other Changes
|
|
56
|
+
- info.version: "bca08c6737245decb570e82447491f77fee83d38" -> "f11a6ec7a4e117eac0a1997e9bda89bd6a5d52bf"
|
|
57
|
+
- info.x-hash: "bca08c6737245decb570e82447491f77fee83d38a2591954004b70b6d1909828f157d9a4acf6cff8" -> "f11a6ec7a4e117eac0a1997e9bda89bd6a5d52bfa2591954004b70b6d1909828f157d9a4acf6cff8"
|
|
58
|
+
|
|
59
|
+
|
|
8
60
|
## [1.1.4] - 2026-10-06
|
|
9
61
|
|
|
10
62
|
### Changed
|
|
@@ -343,6 +395,7 @@ natural-language game analysis instead of returning disconnected API payloads.
|
|
|
343
395
|
- **Pagination**: Async iterator `paginate()` for paginated endpoints.
|
|
344
396
|
- **Static**: `DataDragonClient` for fetching versions and assets.
|
|
345
397
|
|
|
398
|
+
[1.2.0]: https://github.com/Demoen/riotskillissue/compare/v1.1.5...v1.2.0
|
|
346
399
|
[1.1.2]: https://github.com/Demoen/riotskillissue/compare/v1.1.1...v1.1.2
|
|
347
400
|
[1.1.1]: https://github.com/Demoen/riotskillissue/compare/v1.1.0...v1.1.1
|
|
348
401
|
[1.1.0]: https://github.com/Demoen/riotskillissue/compare/v1.0.0...v1.1.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: riotskillissue
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Typed Python client and local MCP server for Riot Games APIs.
|
|
5
5
|
Project-URL: Homepage, https://github.com/Demoen/riotskillissue
|
|
6
6
|
Project-URL: Repository, https://github.com/Demoen/riotskillissue
|
|
@@ -70,10 +70,11 @@ Description-Content-Type: text/markdown
|
|
|
70
70
|
|
|
71
71
|
## Install
|
|
72
72
|
|
|
73
|
-
RiotSkillIssue 1.x requires Python `>=3.14,<3.17
|
|
74
|
-
3.15
|
|
75
|
-
|
|
76
|
-
|
|
73
|
+
RiotSkillIssue 1.x requires Python `>=3.14,<3.17`. CI tests Python 3.14 and
|
|
74
|
+
3.15 on Linux and Windows, and release verification checks both versions.
|
|
75
|
+
A separate Python 3.16-dev compatibility probe runs when its dependencies can
|
|
76
|
+
be installed; unavailable upstream dependencies are reported without failing
|
|
77
|
+
that probe.
|
|
77
78
|
|
|
78
79
|
```bash
|
|
79
80
|
pip install riotskillissue
|
|
@@ -111,6 +112,35 @@ with SyncRiotClient(default_route=PlatformRoute.EUW1) as riot:
|
|
|
111
112
|
print(riot.lol.player_profile("Player#EUW"))
|
|
112
113
|
```
|
|
113
114
|
|
|
115
|
+
## Replay downloads
|
|
116
|
+
|
|
117
|
+
Open the League Client and sign in, then choose a replay from another player's
|
|
118
|
+
recent matches using their full Riot ID:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
riotskillissue-cli replays list --player "GameName#TagLine"
|
|
122
|
+
riotskillissue-cli replays download --player "GameName#TagLine"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
For a direct selection and an explicit destination:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
riotskillissue-cli replays download 1 --player "GameName#TagLine" --output ./replays/my-game.rofl
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
This requires League running on the same Windows or macOS machine, with the
|
|
132
|
+
target match accessible on the client's region. No API key or RSO token is
|
|
133
|
+
needed. Riot's limit of 10 downloads per hour applies through the client. The
|
|
134
|
+
League Client API is not officially supported by Riot and may change between
|
|
135
|
+
patches.
|
|
136
|
+
|
|
137
|
+
The public API workflow remains available by omitting `--player` and setting
|
|
138
|
+
`RIOT_RSO_ACCESS_TOKEN`. It returns replays for that token's player. Python
|
|
139
|
+
applications can use `LeagueReplayClient` for player lookups or the async/sync
|
|
140
|
+
`lol.replays()` and `lol.download_replay()` RSO helpers. See the
|
|
141
|
+
[replay guide](https://demoen.github.io/riotskillissue/replays/) for client setup,
|
|
142
|
+
RSO authentication, limits, and examples.
|
|
143
|
+
|
|
114
144
|
## Local MCP server
|
|
115
145
|
|
|
116
146
|
Install the optional server and run it over stdio:
|
|
@@ -18,10 +18,11 @@
|
|
|
18
18
|
|
|
19
19
|
## Install
|
|
20
20
|
|
|
21
|
-
RiotSkillIssue 1.x requires Python `>=3.14,<3.17
|
|
22
|
-
3.15
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
RiotSkillIssue 1.x requires Python `>=3.14,<3.17`. CI tests Python 3.14 and
|
|
22
|
+
3.15 on Linux and Windows, and release verification checks both versions.
|
|
23
|
+
A separate Python 3.16-dev compatibility probe runs when its dependencies can
|
|
24
|
+
be installed; unavailable upstream dependencies are reported without failing
|
|
25
|
+
that probe.
|
|
25
26
|
|
|
26
27
|
```bash
|
|
27
28
|
pip install riotskillissue
|
|
@@ -59,6 +60,35 @@ with SyncRiotClient(default_route=PlatformRoute.EUW1) as riot:
|
|
|
59
60
|
print(riot.lol.player_profile("Player#EUW"))
|
|
60
61
|
```
|
|
61
62
|
|
|
63
|
+
## Replay downloads
|
|
64
|
+
|
|
65
|
+
Open the League Client and sign in, then choose a replay from another player's
|
|
66
|
+
recent matches using their full Riot ID:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
riotskillissue-cli replays list --player "GameName#TagLine"
|
|
70
|
+
riotskillissue-cli replays download --player "GameName#TagLine"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For a direct selection and an explicit destination:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
riotskillissue-cli replays download 1 --player "GameName#TagLine" --output ./replays/my-game.rofl
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
This requires League running on the same Windows or macOS machine, with the
|
|
80
|
+
target match accessible on the client's region. No API key or RSO token is
|
|
81
|
+
needed. Riot's limit of 10 downloads per hour applies through the client. The
|
|
82
|
+
League Client API is not officially supported by Riot and may change between
|
|
83
|
+
patches.
|
|
84
|
+
|
|
85
|
+
The public API workflow remains available by omitting `--player` and setting
|
|
86
|
+
`RIOT_RSO_ACCESS_TOKEN`. It returns replays for that token's player. Python
|
|
87
|
+
applications can use `LeagueReplayClient` for player lookups or the async/sync
|
|
88
|
+
`lol.replays()` and `lol.download_replay()` RSO helpers. See the
|
|
89
|
+
[replay guide](https://demoen.github.io/riotskillissue/replays/) for client setup,
|
|
90
|
+
RSO authentication, limits, and examples.
|
|
91
|
+
|
|
62
92
|
## Local MCP server
|
|
63
93
|
|
|
64
94
|
Install the optional server and run it over stdio:
|
|
@@ -123,16 +123,16 @@ Generated files:
|
|
|
123
123
|
1. Bump the version in `pyproject.toml` and move the completed changes from
|
|
124
124
|
`Unreleased` into a dated `CHANGELOG.md` release section. Remove an empty
|
|
125
125
|
`Unreleased` section and update the comparison links at the end of the file.
|
|
126
|
-
2. Run the quality checks from CI and validate the release metadata. For 1.
|
|
126
|
+
2. Run the quality checks from CI and validate the release metadata. For 1.2.0:
|
|
127
127
|
|
|
128
128
|
```bash
|
|
129
|
-
python tools/release.py --tag v1.
|
|
130
|
-
hatch build dist/1.
|
|
131
|
-
python tools/release.py --tag v1.
|
|
129
|
+
python tools/release.py --tag v1.2.0
|
|
130
|
+
hatch build dist/1.2.0
|
|
131
|
+
python tools/release.py --tag v1.2.0 --notes-output dist/1.2.0/RELEASE_NOTES.md
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
3. Review and commit the prepared changes, then tag that commit with the exact
|
|
135
|
-
version (`v1.
|
|
135
|
+
version (`v1.2.0`). Pushing the tag starts `.github/workflows/publish.yml`.
|
|
136
136
|
4. The workflow checks the tag/version match, requires release notes, and verifies
|
|
137
137
|
Python 3.14 and 3.15 before publishing to PyPI using Trusted Publishing. The
|
|
138
138
|
GitHub release uses the reviewed changelog entry and contains the built
|
|
@@ -115,7 +115,7 @@ as the raw clients and registry.
|
|
|
115
115
|
| Operation ID | Python accessor | Method | Route | Auth | Result |
|
|
116
116
|
| --- | --- | --- | --- | --- | --- |
|
|
117
117
|
| `match-v5.getMatchIdsByPUUID` | `riot.raw.lol.match.get_match_ids_by_puuid` | GET | regional | api_key | `List[str]` |
|
|
118
|
-
| `match-v5.
|
|
118
|
+
| `match-v5.getReplayByAccessToken` | `riot.raw.lol.match.get_replay_by_access_token` | GET | regional | rso | `Replay` |
|
|
119
119
|
| `match-v5.getMatch` | `riot.raw.lol.match.get_match` | GET | regional | api_key | `Match` |
|
|
120
120
|
| `match-v5.getTimeline` | `riot.raw.lol.match.get_timeline` | GET | regional | api_key | `Timeline` |
|
|
121
121
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Command Line Interface
|
|
2
2
|
|
|
3
|
-
Look up a League player, inspect a match, or open the live-game dashboard from your terminal.
|
|
3
|
+
Look up a League player, inspect a match, download an available replay, or open the live-game dashboard from your terminal. Use the [Python client](getting-started.md) or [MCP server](mcp.md) to process richer results.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -20,7 +20,7 @@ See [getting started](getting-started.md) for supported Python versions.
|
|
|
20
20
|
|
|
21
21
|
## Configuration
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
For `summoner`, `match`, and `live`, set `RIOT_API_KEY` in the terminal where you will run the command:
|
|
24
24
|
|
|
25
25
|
=== "macOS / Linux"
|
|
26
26
|
|
|
@@ -40,10 +40,12 @@ Set `RIOT_API_KEY` in the terminal where you will run the command:
|
|
|
40
40
|
set RIOT_API_KEY=RGAPI-your-key-here
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
These commands also accept `--api-key`. The environment variable keeps the key out of the command itself.
|
|
44
|
+
|
|
45
|
+
With `--player "GameName#TagLine"`, the `replays` commands connect to your running, logged-in League Client on Windows or macOS. No API key or RSO token is needed. Without `--player`, they use `RIOT_RSO_ACCESS_TOKEN` or `--access-token` from an approved Riot Sign On integration. See the [replay guide](replays.md) for both workflows.
|
|
44
46
|
|
|
45
47
|
!!! tip "Choose the right route"
|
|
46
|
-
`summoner` and `live` use a **platform route**, such as `euw1`. `match`
|
|
48
|
+
`summoner` and `live` use a **platform route**, such as `euw1`. `match` and RSO replay requests use a **regional route**, such as `europe`. Replay requests with `--player` use the League Client's current region. See [routing](routing.md) for how the families relate.
|
|
47
49
|
|
|
48
50
|
## Commands
|
|
49
51
|
|
|
@@ -52,6 +54,8 @@ Every command also accepts `--api-key`. The environment variable keeps the key o
|
|
|
52
54
|
| [`summoner`](#summoner) | Player level and PUUID | `euw1` |
|
|
53
55
|
| [`match`](#match) | Game mode and duration | `europe` |
|
|
54
56
|
| [`live`](#live) | Interactive live-game dashboard | `euw1` |
|
|
57
|
+
| [`replays list`](#replays) | A player's recent matches or the RSO replay list | Client region with `--player`; otherwise `europe` |
|
|
58
|
+
| [`replays download`](#replays) | A selected replay saved to a local `.rofl` file | Client region with `--player`; otherwise `europe` |
|
|
55
59
|
|
|
56
60
|
Run `riotskillissue-cli --help` to list commands, or append `--help` to a command to inspect its options.
|
|
57
61
|
|
|
@@ -106,6 +110,42 @@ The dashboard shows teams, champions, summoner spells, ranked records, and bans.
|
|
|
106
110
|
|
|
107
111
|
Press `r` to refresh, or `q` / `Esc` to quit. The [`tui` extra](#installation) is required. See the [TUI guide](live-game-tui.md) for previews, controls, and refresh behavior.
|
|
108
112
|
|
|
113
|
+
### replays
|
|
114
|
+
|
|
115
|
+
Open League, sign in, and look up another player's recent matches by full Riot
|
|
116
|
+
ID:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
riotskillissue-cli replays list --player "GameName#TagLine"
|
|
120
|
+
riotskillissue-cli replays download --player "GameName#TagLine"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`download` prompts for a one-based selection from the list it just fetched. To
|
|
124
|
+
select an entry directly and set the destination:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
riotskillissue-cli replays download 1 --player "GameName#TagLine" --output ./replays/my-game.rofl
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Player mode needs the League Client running on the same Windows or macOS
|
|
131
|
+
machine. It uses the client's replay folder by default; `--output` copies the
|
|
132
|
+
completed file elsewhere. Riot's download limit applies, including downloads
|
|
133
|
+
started through the client UI. Use `--lockfile` for a custom installation and
|
|
134
|
+
`--count` to show between 1 and 20 recent matches.
|
|
135
|
+
|
|
136
|
+
For the public API workflow, set `RIOT_RSO_ACCESS_TOKEN` and omit `--player`:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
riotskillissue-cli replays list --route europe
|
|
140
|
+
riotskillissue-cli replays download --route europe
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
That endpoint returns replays for the token's player and has no player-name or
|
|
144
|
+
match-ID lookup. Neither workflow needs a Riot API key. Existing `--output`
|
|
145
|
+
files are preserved unless you pass `--overwrite`. See the [replay guide](replays.md)
|
|
146
|
+
for client requirements, RSO authentication, selection behavior, options, and
|
|
147
|
+
Python examples.
|
|
148
|
+
|
|
109
149
|
## Error Handling
|
|
110
150
|
|
|
111
151
|
| Symptom | What to check |
|
|
@@ -116,5 +156,6 @@ Press `r` to refresh, or `q` / `Esc` to quit. The [`tui` extra](#installation) i
|
|
|
116
156
|
| Player or match not found | Check the identifier and the command's route family. |
|
|
117
157
|
| Live command cannot import Textual | Install `"riotskillissue[tui]"` in the same environment as the CLI. |
|
|
118
158
|
| Live dashboard shows previous or partial data | Read the status bar and the [TUI troubleshooting guide](live-game-tui.md#troubleshooting). |
|
|
159
|
+
| Replay token, selection, or download error | Follow the [replay troubleshooting guide](replays.md#troubleshooting). |
|
|
119
160
|
|
|
120
161
|
To process results in your own application, start with the [Python client](getting-started.md) and [game examples](examples/index.md).
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# Replay downloads
|
|
2
|
+
|
|
3
|
+
Download a League of Legends replay by player name through your running League
|
|
4
|
+
Client, or use Riot Sign On to download replays returned by the public API.
|
|
5
|
+
Both workflows are included in the base package.
|
|
6
|
+
|
|
7
|
+
To choose one of another player's recent matches, open League, sign in, and run:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
riotskillissue-cli replays download --player "GameName#TagLine"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Use the full Riot ID, including the tag. The command shows recent matches and
|
|
14
|
+
asks which replay to download. This mode needs neither a Riot API key nor an
|
|
15
|
+
RSO token.
|
|
16
|
+
|
|
17
|
+
| Mode | Requirements | Replay source |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| `--player "GameName#TagLine"` | Logged-in League Client on the same Windows or macOS machine | The named player's matches accessible to that client |
|
|
20
|
+
| Without `--player` | An access token from an approved RSO integration | Replays returned for the player identified by the token |
|
|
21
|
+
|
|
22
|
+
## Download by player name
|
|
23
|
+
|
|
24
|
+
Keep the League Client running while using these commands. The target player
|
|
25
|
+
and match must be accessible on the client's current region. `--route` is an
|
|
26
|
+
RSO-only option and cannot be combined with `--player`.
|
|
27
|
+
|
|
28
|
+
To inspect up to 20 recent matches:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
riotskillissue-cli replays list --player "GameName#TagLine"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The table shows the selection number, match ID, queue, and patch. Recent matches
|
|
35
|
+
can include unavailable replays; the client checks the selected replay when you
|
|
36
|
+
request a download.
|
|
37
|
+
|
|
38
|
+
For interactive selection from a smaller list:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
riotskillissue-cli replays download --player "GameName#TagLine" --count 5
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Or select a one-based entry directly:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
riotskillissue-cli replays download 1 --player "GameName#TagLine"
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The League Client downloads the selected replay into its configured replay
|
|
51
|
+
folder. The CLI waits for completion and prints the resulting path. To keep a
|
|
52
|
+
copy somewhere else:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
riotskillissue-cli replays download 1 --player "GameName#TagLine" --output ./replays/game.rofl
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`--output` copies the completed replay to that file without changing the League
|
|
59
|
+
Client's settings. Missing parent directories are created. An existing output
|
|
60
|
+
file is preserved unless you pass `--overwrite`, and a failed copy leaves no
|
|
61
|
+
partially written destination.
|
|
62
|
+
|
|
63
|
+
| Argument or option | Default | Meaning |
|
|
64
|
+
| --- | --- | --- |
|
|
65
|
+
| `--player` | Not set | Full `GameName#TagLine` Riot ID; enables the League Client workflow |
|
|
66
|
+
| `INDEX` | Interactive selection | One-based row to download; `download` only |
|
|
67
|
+
| `--count` | `20` | Recent matches to list, from `1` to `20`; player mode only |
|
|
68
|
+
| `--lockfile` | `RIOT_LCU_LOCKFILE`, then automatic discovery | Path to the running League Client's lockfile |
|
|
69
|
+
| `--timeout` | `120` | Seconds to wait for local download completion, from `1` to `600`; `download` only |
|
|
70
|
+
| `--output` | League Client's replay folder | Copy the completed replay to this file; `download` only |
|
|
71
|
+
| `--overwrite` | Off | Replace an existing `--output` file after a successful copy |
|
|
72
|
+
|
|
73
|
+
`--lockfile`, `--count`, and `--timeout` apply only when `--player` is set.
|
|
74
|
+
|
|
75
|
+
The list is fetched anew for each invocation. Its order may change between
|
|
76
|
+
`list` and `download 1`. Omit the index to choose from the exact list that the
|
|
77
|
+
download command will use. The number is a row selection, not a match ID.
|
|
78
|
+
|
|
79
|
+
!!! note "League Client API compatibility"
|
|
80
|
+
This workflow uses the local
|
|
81
|
+
[League Client API](https://developer.riotgames.com/docs/lol#league-client-api).
|
|
82
|
+
Riot does not officially support it for third-party applications or
|
|
83
|
+
guarantee compatibility between patches. Replay access remains subject to
|
|
84
|
+
the current client's availability checks and server responses.
|
|
85
|
+
|
|
86
|
+
## Find your League client
|
|
87
|
+
|
|
88
|
+
The CLI checks these standard lockfile locations:
|
|
89
|
+
|
|
90
|
+
| Platform | Location |
|
|
91
|
+
| --- | --- |
|
|
92
|
+
| Windows | `C:/Riot Games/League of Legends/lockfile` |
|
|
93
|
+
| macOS | `/Applications/League of Legends.app/Contents/LoL/lockfile` |
|
|
94
|
+
| macOS, per-user installation | `~/Applications/League of Legends.app/Contents/LoL/lockfile` |
|
|
95
|
+
|
|
96
|
+
On Windows, the drive comes from `SYSTEMDRIVE`, normally `C:`.
|
|
97
|
+
|
|
98
|
+
For a custom installation, pass the exact path or set `RIOT_LCU_LOCKFILE`:
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
riotskillissue-cli replays list --player "GameName#TagLine" --lockfile "D:/Riot Games/League of Legends/lockfile"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The lockfile is created by the running League Client and contains local
|
|
105
|
+
connection credentials. Use the file on your own machine; do not copy it from
|
|
106
|
+
another player or commit it to a repository. Run the command in the same Windows
|
|
107
|
+
or macOS environment as League, rather than a remote server, container, or WSL.
|
|
108
|
+
|
|
109
|
+
## Download limits
|
|
110
|
+
|
|
111
|
+
Riot's
|
|
112
|
+
[Patch 26.21 notes](https://www.leagueoflegends.com/en-ph/news/game-updates/league-of-legends-patch-26-21-notes/),
|
|
113
|
+
published on October 20, 2026, retain downloads of your own, friends', and other
|
|
114
|
+
players' replays with a limit of **10 downloads per hour**.
|
|
115
|
+
|
|
116
|
+
Player mode asks your League Client to download the replay and follows its
|
|
117
|
+
server-enforced limit, including downloads started through the client UI. The
|
|
118
|
+
CLI downloads one selected replay per invocation. It does not retry rejected
|
|
119
|
+
download requests or invent a local count of remaining downloads. If Riot
|
|
120
|
+
rejects a download, wait for the reported interval where available before trying
|
|
121
|
+
again.
|
|
122
|
+
|
|
123
|
+
That client announcement does not specify the public API's replay quota. The
|
|
124
|
+
RSO workflow below also respects rate-limit responses.
|
|
125
|
+
|
|
126
|
+
## What the endpoint supports
|
|
127
|
+
|
|
128
|
+
Without `--player`, RiotSkillIssue uses the public endpoint
|
|
129
|
+
[`match-v5.getReplayByAccessToken`](https://developer.riotgames.com/apis#match-v5/GET_getReplayByAccessToken):
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
GET https://{route}.api.riotgames.com/lol/match/v5/matches/replays
|
|
133
|
+
Authorization: Bearer <RSO access token>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The response contains `total` and `matchFileURLs`. It lists replays for the
|
|
137
|
+
player identified by the access token. The endpoint has no Riot ID, PUUID,
|
|
138
|
+
match-ID, or pagination parameter. The CLI can download files from that list;
|
|
139
|
+
this RSO mode cannot look up another player's replay by name or match ID.
|
|
140
|
+
Use [player mode](#download-by-player-name) for a lookup through your local
|
|
141
|
+
League Client.
|
|
142
|
+
|
|
143
|
+
## Authentication
|
|
144
|
+
|
|
145
|
+
These requirements apply to the public API workflow, without `--player`.
|
|
146
|
+
Player mode uses the running League Client instead.
|
|
147
|
+
|
|
148
|
+
[Riot's RSO integration guide](https://developer.riotgames.com/docs/lol#rso-integration)
|
|
149
|
+
requires an approved production-key application and RSO onboarding. The player
|
|
150
|
+
then signs in through Riot's authorization flow. The replay operation requires
|
|
151
|
+
the `openid` scope.
|
|
152
|
+
|
|
153
|
+
RiotSkillIssue provides [RSO helpers](rso.md) for applications that already have
|
|
154
|
+
that integration. The CLI accepts an existing access token; it does not register
|
|
155
|
+
an application, run a browser login, or extract tokens from the League client.
|
|
156
|
+
|
|
157
|
+
Set the token in the terminal where you will run the replay commands:
|
|
158
|
+
|
|
159
|
+
=== "macOS / Linux"
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
export RIOT_RSO_ACCESS_TOKEN="your-rso-access-token"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
=== "Windows PowerShell"
|
|
166
|
+
|
|
167
|
+
```powershell
|
|
168
|
+
$env:RIOT_RSO_ACCESS_TOKEN = "your-rso-access-token"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Both commands also accept `--access-token`. Using the environment variable keeps
|
|
172
|
+
the token out of the replay command's arguments. Treat access tokens and signed
|
|
173
|
+
download URLs as credentials. No `RIOT_API_KEY` is needed for these commands.
|
|
174
|
+
|
|
175
|
+
## List available replays
|
|
176
|
+
|
|
177
|
+
With an RSO token configured, list the authenticated player's public API replays:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
riotskillissue-cli replays list --route europe
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
The table shows a one-based selection number and a suggested filename. The CLI
|
|
184
|
+
does not print the signed download URLs. Choose the regional route that holds
|
|
185
|
+
the player's replays: `americas`, `asia`, `europe`, or `sea`. The default is
|
|
186
|
+
`europe`; platform routes such as `euw1` are not accepted here.
|
|
187
|
+
|
|
188
|
+
Riot returns URLs without separate match metadata. A filename is inferred when
|
|
189
|
+
the URL contains a usable name; otherwise the command supplies a fallback.
|
|
190
|
+
Do not assume every row includes a match ID, date, champion, or game mode.
|
|
191
|
+
|
|
192
|
+
## Download a replay
|
|
193
|
+
|
|
194
|
+
For an interactive selection from the RSO replay list, run:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
riotskillissue-cli replays download --route europe
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
The command fetches the list and asks which entry to download. It downloads
|
|
201
|
+
from that same list, so the selected number refers to the row you just saw.
|
|
202
|
+
|
|
203
|
+
To select a number directly and choose a destination:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
riotskillissue-cli replays download 1 --route europe --output ./replays/my-game.rofl
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Each command fetches the current list. Its order and contents may change between
|
|
210
|
+
a separate `list` call and `download 1`; use interactive selection when you want
|
|
211
|
+
to inspect the exact list being used. Numbers start at **1** and are not match
|
|
212
|
+
IDs.
|
|
213
|
+
|
|
214
|
+
| Argument or option | Default | Meaning |
|
|
215
|
+
| --- | --- | --- |
|
|
216
|
+
| `INDEX` | Interactive selection | One-based entry in the current list; `download` only |
|
|
217
|
+
| `--route` | `europe` | `americas`, `asia`, `europe`, or `sea` |
|
|
218
|
+
| `--access-token` | `RIOT_RSO_ACCESS_TOKEN` | RSO access token |
|
|
219
|
+
| `--output` | Suggested filename in the current directory | Destination file; `download` only |
|
|
220
|
+
| `--overwrite` | Off | Replace an existing destination after a successful download |
|
|
221
|
+
|
|
222
|
+
Files are streamed to disk, and missing parent directories are created. The
|
|
223
|
+
destination is published only after the transfer completes; a failed transfer
|
|
224
|
+
cleans up its temporary file and preserves any existing destination. To replace
|
|
225
|
+
a file deliberately:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
riotskillissue-cli replays download 1 --output ./replays/my-game.rofl --overwrite
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
The command downloads one file per invocation and does not retry file downloads
|
|
232
|
+
automatically. If the server limits requests, wait before trying again. Run
|
|
233
|
+
`riotskillissue-cli replays download --help` for the installed version's options.
|
|
234
|
+
|
|
235
|
+
## Use from Python
|
|
236
|
+
|
|
237
|
+
### League Client
|
|
238
|
+
|
|
239
|
+
Use `LeagueReplayClient` as an async context manager while League is running:
|
|
240
|
+
|
|
241
|
+
```python
|
|
242
|
+
import asyncio
|
|
243
|
+
|
|
244
|
+
from riotskillissue import LeagueReplayClient
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
async def main() -> None:
|
|
248
|
+
async with LeagueReplayClient() as league:
|
|
249
|
+
replays = await league.player_replays("GameName#TagLine", count=5)
|
|
250
|
+
if replays:
|
|
251
|
+
path = await league.download_replay(replays[0], timeout=120)
|
|
252
|
+
print(path)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
asyncio.run(main())
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
`player_replays()` returns `list[ClientReplay]` for the named player's recent
|
|
259
|
+
matches. Pass a `destination` to `download_replay()` to copy the completed replay
|
|
260
|
+
to another file; omit it to use the League Client's replay folder. The method
|
|
261
|
+
returns a `pathlib.Path` and accepts `overwrite=True` for replacing an explicit
|
|
262
|
+
destination. This client does not use `RiotClient`, an API key, or an RSO token.
|
|
263
|
+
|
|
264
|
+
### Public API with RSO
|
|
265
|
+
|
|
266
|
+
The async and sync Riot clients expose the same RSO workflow. Both examples read
|
|
267
|
+
`RIOT_RSO_ACCESS_TOKEN` from the environment.
|
|
268
|
+
|
|
269
|
+
=== "Async"
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
import asyncio
|
|
273
|
+
|
|
274
|
+
from riotskillissue import RegionalRoute, RiotClient
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
async def main() -> None:
|
|
278
|
+
async with RiotClient() as riot:
|
|
279
|
+
replays = await riot.lol.replays(route=RegionalRoute.EUROPE)
|
|
280
|
+
for replay in replays:
|
|
281
|
+
print(replay.index, replay.filename)
|
|
282
|
+
if replays:
|
|
283
|
+
path = await riot.lol.download_replay(
|
|
284
|
+
replays[0], "replays/my-game.rofl"
|
|
285
|
+
)
|
|
286
|
+
print(path)
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
asyncio.run(main())
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
=== "Sync"
|
|
293
|
+
|
|
294
|
+
```python
|
|
295
|
+
from riotskillissue import RegionalRoute, SyncRiotClient
|
|
296
|
+
|
|
297
|
+
with SyncRiotClient() as riot:
|
|
298
|
+
replays = riot.lol.replays(route=RegionalRoute.EUROPE)
|
|
299
|
+
if replays:
|
|
300
|
+
path = riot.lol.download_replay(replays[0], "replays/my-game.rofl")
|
|
301
|
+
print(path)
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
`replays()` returns `list[ReplayFile]`. Each entry has `index`, `filename`, and
|
|
305
|
+
`url`; the URL is omitted from the object's representation. `download_replay()`
|
|
306
|
+
returns a `pathlib.Path` and accepts `overwrite=True` for explicit replacement.
|
|
307
|
+
Keep returned entries only as long as needed to download them, since signed
|
|
308
|
+
URLs may expire.
|
|
309
|
+
|
|
310
|
+
When embedding the client in an application, keep HTTP request logging disabled
|
|
311
|
+
for replay downloads: `httpx` INFO logs and `httpcore` debug logs can include
|
|
312
|
+
signed URLs. The CLI does not enable that logging.
|
|
313
|
+
|
|
314
|
+
For applications that need the unmodified response, the generated method remains
|
|
315
|
+
available:
|
|
316
|
+
|
|
317
|
+
```python
|
|
318
|
+
replay_data = await riot.raw.lol.match.get_replay_by_access_token(
|
|
319
|
+
route=RegionalRoute.EUROPE,
|
|
320
|
+
)
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Troubleshooting
|
|
324
|
+
|
|
325
|
+
| Symptom | What to check |
|
|
326
|
+
| --- | --- |
|
|
327
|
+
| League Client not found | Open League and sign in. For a custom installation, pass `--lockfile` or set `RIOT_LCU_LOCKFILE`. |
|
|
328
|
+
| Player not found | Supply the full Riot ID, including `#TagLine`, and check that the player is accessible from the League Client's current region. |
|
|
329
|
+
| Match listed but replay unavailable | A match-history entry does not guarantee that Riot still offers its replay. The client may reject older or otherwise unavailable replays. |
|
|
330
|
+
| Local download timed out | Keep League open and check its download status. Increase `--timeout` if the transfer is slow; the timeout does not cancel the client's download. |
|
|
331
|
+
| Missing RSO access token | For commands without `--player`, set `RIOT_RSO_ACCESS_TOKEN`; an `RGAPI-...` API key cannot replace it. |
|
|
332
|
+
| RSO unauthorized or forbidden | Obtain a current token through your approved RSO integration and verify the player's authorization. |
|
|
333
|
+
| No RSO replays returned | Check the regional route and the replays available to the authenticated player. |
|
|
334
|
+
| Invalid selection | Select a number from the current list, starting at `1`, or omit it to choose interactively. |
|
|
335
|
+
| Destination already exists | Choose another `--output` path or use `--overwrite`. |
|
|
336
|
+
| Download expired or unavailable | Fetch a fresh list and retry the selection. A replay may no longer be available. |
|
|
337
|
+
| Rate limited | Wait for the reported retry interval where available; do not repeatedly request the same download. |
|
|
338
|
+
| RSO transfer interrupted | Retry once the connection is stable. Incomplete downloads are not kept as completed replay files. |
|
|
339
|
+
|
|
340
|
+
Downloaded `.rofl` files are game replays, not video exports. Downloading a file
|
|
341
|
+
does not launch League or convert it to another format.
|