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.
Files changed (206) hide show
  1. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/CHANGELOG.md +53 -0
  2. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/PKG-INFO +35 -5
  3. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/README.md +34 -4
  4. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/CONTRIBUTING.md +5 -5
  5. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/api-reference.md +1 -1
  6. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/cli.md +45 -4
  7. riotskillissue-1.2.0/docs/replays.md +341 -0
  8. riotskillissue-1.2.0/docs/rso.md +47 -0
  9. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/tools/index.md +5 -3
  10. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/mkdocs.yml +1 -0
  11. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/pyproject.toml +1 -1
  12. riotskillissue-1.2.0/reports/diff_20261026_075426_291794.md +12 -0
  13. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/spec/openapi.json +14 -18
  14. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/__init__.py +7 -0
  15. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/match.py +10 -17
  16. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/registry.py +15 -32
  17. riotskillissue-1.2.0/src/riotskillissue/cli.py +358 -0
  18. riotskillissue-1.2.0/src/riotskillissue/league_client.py +415 -0
  19. riotskillissue-1.2.0/src/riotskillissue/replays.py +250 -0
  20. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/async_services.py +24 -0
  21. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/sync_services.py +20 -0
  22. riotskillissue-1.2.0/tests/test_league_client.py +382 -0
  23. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_gateway.py +2 -2
  24. riotskillissue-1.2.0/tests/test_player_replay_cli.py +224 -0
  25. riotskillissue-1.2.0/tests/test_replay_cli.py +223 -0
  26. riotskillissue-1.2.0/tests/test_replays.py +239 -0
  27. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/typecheck/client_usage.py +23 -0
  28. riotskillissue-1.1.4/docs/rso.md +0 -24
  29. riotskillissue-1.1.4/src/riotskillissue/cli.py +0 -99
  30. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.gitattributes +0 -0
  31. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.github/workflows/publish.yml +0 -0
  32. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.github/workflows/test.yml +0 -0
  33. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.github/workflows/update_sdk.yml +0 -0
  34. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/.gitignore +0 -0
  35. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/LICENSE +0 -0
  36. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/assets/logo.png +0 -0
  37. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/assets/tui.gif +0 -0
  38. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/configuration.md +0 -0
  39. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/index.md +0 -0
  40. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/league-of-legends.md +0 -0
  41. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/teamfight-tactics.md +0 -0
  42. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/examples/valorant.md +0 -0
  43. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/getting-started.md +0 -0
  44. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/index.md +0 -0
  45. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/live-game-tui.md +0 -0
  46. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/live_game_tui.gif +0 -0
  47. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/live_game_tui_not_found.gif +0 -0
  48. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/mcp.md +0 -0
  49. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/migration.md +0 -0
  50. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/reference/index.md +0 -0
  51. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/routing.md +0 -0
  52. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/sdk/index.md +0 -0
  53. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/docs/stylesheets/extra.css +0 -0
  54. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/examples/basic_usage.py +0 -0
  55. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/examples/champion_mastery.py +0 -0
  56. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/examples/match_history.py +0 -0
  57. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/404.html +0 -0
  58. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/home.html +0 -0
  59. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/partials/path.html +0 -0
  60. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/overrides/partials/progress.html +0 -0
  61. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/diff_20260810_080005.md +0 -0
  62. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/diff_20260924_033319_941627.md +0 -0
  63. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/diff_20261006_092817_855689.md +0 -0
  64. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/reports/production_readiness_20260906.md +0 -0
  65. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/__init__.py +0 -0
  66. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/client_mixin.py +0 -0
  67. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/operations.py +0 -0
  68. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/__init__.py +0 -0
  69. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/_client.py +0 -0
  70. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/common/__init__.py +0 -0
  71. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/common/account.py +0 -0
  72. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/__init__.py +0 -0
  73. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/challenges.py +0 -0
  74. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/champion.py +0 -0
  75. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/champion_mastery.py +0 -0
  76. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/clash.py +0 -0
  77. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/league.py +0 -0
  78. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/league_exp.py +0 -0
  79. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/rso_match.py +0 -0
  80. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/spectator.py +0 -0
  81. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/status.py +0 -0
  82. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/summoner.py +0 -0
  83. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/tournament.py +0 -0
  84. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lol/tournament_stub.py +0 -0
  85. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/__init__.py +0 -0
  86. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/deck.py +0 -0
  87. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/inventory.py +0 -0
  88. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/match.py +0 -0
  89. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/ranked.py +0 -0
  90. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/lor/status.py +0 -0
  91. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/riftbound/__init__.py +0 -0
  92. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/riftbound/content.py +0 -0
  93. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/__init__.py +0 -0
  94. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/league.py +0 -0
  95. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/match.py +0 -0
  96. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/spectator.py +0 -0
  97. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/status.py +0 -0
  98. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/tft/summoner.py +0 -0
  99. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/__init__.py +0 -0
  100. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/console_match.py +0 -0
  101. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/console_ranked.py +0 -0
  102. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/content.py +0 -0
  103. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/match.py +0 -0
  104. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/ranked.py +0 -0
  105. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/api/raw/valorant/status.py +0 -0
  106. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/auth.py +0 -0
  107. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/cache.py +0 -0
  108. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/client.py +0 -0
  109. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/config.py +0 -0
  110. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/http.py +0 -0
  111. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/pagination.py +0 -0
  112. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/ratelimit.py +0 -0
  113. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/sync_client.py +0 -0
  114. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/types.py +0 -0
  115. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/core/utils.py +0 -0
  116. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/__init__.py +0 -0
  117. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/cli.py +0 -0
  118. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/errors.py +0 -0
  119. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/lol.py +0 -0
  120. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/models.py +0 -0
  121. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/operations.py +0 -0
  122. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/result_store.py +0 -0
  123. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/server.py +0 -0
  124. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/settings.py +0 -0
  125. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/mcp/workflows.py +0 -0
  126. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/__init__.py +0 -0
  127. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/common/__init__.py +0 -0
  128. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/common/account_v1.py +0 -0
  129. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/common/errors.py +0 -0
  130. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/__init__.py +0 -0
  131. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/challenges_v1.py +0 -0
  132. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/champion_mastery_v4.py +0 -0
  133. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/champion_v3.py +0 -0
  134. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/clash_v1.py +0 -0
  135. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/league_exp_v4.py +0 -0
  136. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/league_v4.py +0 -0
  137. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/match_v5.py +0 -0
  138. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/rso_match_v1.py +0 -0
  139. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/spectator_v5.py +0 -0
  140. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/status_v4.py +0 -0
  141. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/summoner_v4.py +0 -0
  142. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/tournament_stub_v5.py +0 -0
  143. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lol/tournament_v5.py +0 -0
  144. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/__init__.py +0 -0
  145. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/deck_v1.py +0 -0
  146. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/inventory_v1.py +0 -0
  147. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/match_v1.py +0 -0
  148. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/ranked_v1.py +0 -0
  149. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/lor/status_v1.py +0 -0
  150. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/results.py +0 -0
  151. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/riftbound/__init__.py +0 -0
  152. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/riftbound/content_v1.py +0 -0
  153. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/__init__.py +0 -0
  154. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/league_v1.py +0 -0
  155. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/match_v1.py +0 -0
  156. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/spectator_v5.py +0 -0
  157. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/status_v1.py +0 -0
  158. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/tft/summoner_v1.py +0 -0
  159. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/__init__.py +0 -0
  160. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/console_match_v1.py +0 -0
  161. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/console_ranked_v1.py +0 -0
  162. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/content_v1.py +0 -0
  163. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/match_v1.py +0 -0
  164. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/ranked_v1.py +0 -0
  165. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/models/valorant/status_v1.py +0 -0
  166. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/py.typed +0 -0
  167. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/__init__.py +0 -0
  168. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/base.py +0 -0
  169. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/services/models.py +0 -0
  170. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/static.py +0 -0
  171. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/testing.py +0 -0
  172. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/src/riotskillissue/tui.py +0 -0
  173. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/conftest.py +0 -0
  174. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/manual_test.py +0 -0
  175. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_advanced.py +0 -0
  176. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_bindings.py +0 -0
  177. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_cache.py +0 -0
  178. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_core.py +0 -0
  179. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_core_v1.py +0 -0
  180. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_diff_engine.py +0 -0
  181. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_documentation.py +0 -0
  182. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_generator.py +0 -0
  183. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_lol_analysis.py +0 -0
  184. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_result_store.py +0 -0
  185. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_server.py +0 -0
  186. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_mcp_settings.py +0 -0
  187. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_python_support.py +0 -0
  188. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_release.py +0 -0
  189. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_resiliency.py +0 -0
  190. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_runtime_safety.py +0 -0
  191. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_spec_manager.py +0 -0
  192. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_sync_client.py +0 -0
  193. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_tui.py +0 -0
  194. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tests/test_workflows_v1.py +0 -0
  195. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/bump_version.py +0 -0
  196. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/diff_engine.py +0 -0
  197. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/generator/core.py +0 -0
  198. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/generator/parser.py +0 -0
  199. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/manager.py +0 -0
  200. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/release.py +0 -0
  201. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/api_reference.md.j2 +0 -0
  202. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/client_mixin.py.j2 +0 -0
  203. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/endpoints.py.j2 +0 -0
  204. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/models.py.j2 +0 -0
  205. {riotskillissue-1.1.4 → riotskillissue-1.2.0}/tools/templates/raw_client.py.j2 +0 -0
  206. {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.1.4
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`, covering Python 3.14,
74
- 3.15, and 3.16. As of July 2026, CI gates releases on Python 3.14 and the
75
- current Python 3.15 prerelease. Python 3.16 is still in development, so it is
76
- covered by a non-blocking nightly compatibility probe until its stable release.
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`, covering Python 3.14,
22
- 3.15, and 3.16. As of July 2026, CI gates releases on Python 3.14 and the
23
- current Python 3.15 prerelease. Python 3.16 is still in development, so it is
24
- covered by a non-blocking nightly compatibility probe until its stable release.
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.1.2:
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.1.2
130
- hatch build dist/1.1.2
131
- python tools/release.py --tag v1.1.2 --notes-output dist/1.1.2/RELEASE_NOTES.md
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.1.2`). Pushing the tag starts `.github/workflows/publish.yml`.
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.getReplay` | `riot.raw.lol.match.get_replay` | GET | regional | api_key | `Replay` |
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. The CLI prints a focused summary; use the [Python client](getting-started.md) or [MCP server](mcp.md) for richer results.
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
- Set `RIOT_API_KEY` in the terminal where you will run the command:
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
- Every command also accepts `--api-key`. The environment variable keeps the key out of the command itself.
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` uses a **regional route**, such as `europe`. See [routing](routing.md) for how the families relate.
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.