qqmusic-api-python 0.7.2__tar.gz → 0.7.3__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 (204) hide show
  1. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/PKG-INFO +2 -2
  2. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/release-notes.md +24 -0
  3. qqmusic_api_python-0.7.3/examples/singer_name_special_display.py +22 -0
  4. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/__init__.py +1 -1
  5. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/singer.py +25 -0
  6. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/singer.py +19 -0
  7. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/song.py +4 -1
  8. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_singer.py +24 -0
  9. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_song.py +7 -0
  10. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/requirements.txt +32 -32
  11. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/singer.py +9 -0
  12. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.agents/skills/pydantic/SKILL.md +0 -0
  13. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.agents/skills/python-standards/SKILL.md +0 -0
  14. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.agents/skills/uv-package-manager/SKILL.md +0 -0
  15. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.dockerignore +0 -0
  16. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  17. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  18. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  19. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  20. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/renovate.json +0 -0
  21. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/workflows/checking.yaml +0 -0
  22. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/workflows/docs.yml +0 -0
  23. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/workflows/release.yml +0 -0
  24. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.github/workflows/testing.yml +0 -0
  25. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.gitignore +0 -0
  26. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/.markdownlint-cli2.yaml +0 -0
  27. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/AGENTS.md +0 -0
  28. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/CLAUDE.md +0 -0
  29. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/LICENSE +0 -0
  30. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/README.md +0 -0
  31. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/assets/qq-music.svg +0 -0
  32. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/cliff.toml +0 -0
  33. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/coding.md +0 -0
  34. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/contributing.md +0 -0
  35. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/index.md +0 -0
  36. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/core/client.md +0 -0
  37. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/core/exception.md +0 -0
  38. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/core/pagination.md +0 -0
  39. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/core/request.md +0 -0
  40. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/core/versioning.md +0 -0
  41. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/album.md +0 -0
  42. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/base.md +0 -0
  43. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/comment.md +0 -0
  44. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/helper.md +0 -0
  45. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/login.md +0 -0
  46. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/lyric.md +0 -0
  47. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/mv.md +0 -0
  48. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/private_message.md +0 -0
  49. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/recommend.md +0 -0
  50. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/request.md +0 -0
  51. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/search.md +0 -0
  52. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/singer.md +0 -0
  53. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/song.md +0 -0
  54. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/songlist.md +0 -0
  55. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/top.md +0 -0
  56. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/model/user.md +0 -0
  57. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/album.md +0 -0
  58. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/comment.md +0 -0
  59. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/helper.md +0 -0
  60. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/helper_utils.md +0 -0
  61. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/login.md +0 -0
  62. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/login_utils.md +0 -0
  63. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/lyric.md +0 -0
  64. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/mv.md +0 -0
  65. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/private_message.md +0 -0
  66. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/recommend.md +0 -0
  67. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/search.md +0 -0
  68. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/singer.md +0 -0
  69. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/song.md +0 -0
  70. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/songlist.md +0 -0
  71. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/top.md +0 -0
  72. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/reference/modules/user.md +0 -0
  73. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/client.md +0 -0
  74. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/credential.md +0 -0
  75. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/download.md +0 -0
  76. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/error-handling.md +0 -0
  77. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/login.md +0 -0
  78. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/pagination.md +0 -0
  79. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/start.md +0 -0
  80. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/docs/tutorial/web.md +0 -0
  81. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/examples/download_song.py +0 -0
  82. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/examples/get_all_sheets.py +0 -0
  83. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/examples/phone_login.py +0 -0
  84. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/examples/private_message.py +0 -0
  85. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/examples/qrcode_login.py +0 -0
  86. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/examples/upload_file.py +0 -0
  87. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/prek.toml +0 -0
  88. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/pyproject.toml +0 -0
  89. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/algorithms/__init__.py +0 -0
  90. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/algorithms/sign.py +0 -0
  91. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/algorithms/tripledes.py +0 -0
  92. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/__init__.py +0 -0
  93. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/api_context.py +0 -0
  94. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/client.py +0 -0
  95. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/exceptions.py +0 -0
  96. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/pagination.py +0 -0
  97. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/request.py +0 -0
  98. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/core/versioning.py +0 -0
  99. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/__init__.py +0 -0
  100. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/_validator.py +0 -0
  101. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/album.py +0 -0
  102. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/base.py +0 -0
  103. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/comment.py +0 -0
  104. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/helper.py +0 -0
  105. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/login.py +0 -0
  106. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/lyric.py +0 -0
  107. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/mv.py +0 -0
  108. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/private_message.py +0 -0
  109. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/recommend.py +0 -0
  110. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/request.py +0 -0
  111. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/search.py +0 -0
  112. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/song.py +0 -0
  113. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/songlist.py +0 -0
  114. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/top.py +0 -0
  115. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/models/user.py +0 -0
  116. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/__init__.py +0 -0
  117. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/_base.py +0 -0
  118. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/album.py +0 -0
  119. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/comment.py +0 -0
  120. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/helper.py +0 -0
  121. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/helper_utils.py +0 -0
  122. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/login.py +0 -0
  123. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/login_utils.py +0 -0
  124. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/lyric.py +0 -0
  125. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/mv.py +0 -0
  126. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/private_message.py +0 -0
  127. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/recommend.py +0 -0
  128. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/search.py +0 -0
  129. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/songlist.py +0 -0
  130. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/top.py +0 -0
  131. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/modules/user.py +0 -0
  132. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/utils/__init__.py +0 -0
  133. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/utils/common.py +0 -0
  134. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/utils/device.py +0 -0
  135. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/utils/mqtt.py +0 -0
  136. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/qqmusic_api/utils/qimei.py +0 -0
  137. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/scripts/ag-1.py +0 -0
  138. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/conftest.py +0 -0
  139. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_album.py +0 -0
  140. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_api_context.py +0 -0
  141. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_client.py +0 -0
  142. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_comment.py +0 -0
  143. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_login.py +0 -0
  144. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_login_utils.py +0 -0
  145. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_lyric.py +0 -0
  146. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_mv.py +0 -0
  147. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_pagination.py +0 -0
  148. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_private_message.py +0 -0
  149. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_recommend.py +0 -0
  150. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_search.py +0 -0
  151. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_songlist.py +0 -0
  152. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_top.py +0 -0
  153. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/tests/test_user.py +0 -0
  154. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/uv.lock +0 -0
  155. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/.gitignore +0 -0
  156. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/Dockerfile +0 -0
  157. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/README.md +0 -0
  158. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/accounts.example.toml +0 -0
  159. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/config.example.toml +0 -0
  160. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/docker-compose.example.yml +0 -0
  161. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/run.py +0 -0
  162. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/app.py +0 -0
  163. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/__init__.py +0 -0
  164. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/auth.py +0 -0
  165. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/cache.py +0 -0
  166. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/config.py +0 -0
  167. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/credential_store.py +0 -0
  168. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/deps.py +0 -0
  169. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/response.py +0 -0
  170. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/core/security.py +0 -0
  171. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/__init__.py +0 -0
  172. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/comment.py +0 -0
  173. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/login.py +0 -0
  174. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/mv.py +0 -0
  175. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/singer.py +0 -0
  176. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/song.py +0 -0
  177. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/modules/songlist.py +0 -0
  178. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/__init__.py +0 -0
  179. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/_helpers.py +0 -0
  180. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/album.py +0 -0
  181. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/comment.py +0 -0
  182. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/login.py +0 -0
  183. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/lyric.py +0 -0
  184. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/mv.py +0 -0
  185. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/recommend.py +0 -0
  186. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/search.py +0 -0
  187. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/song.py +0 -0
  188. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/songlist.py +0 -0
  189. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/top.py +0 -0
  190. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routes/user.py +0 -0
  191. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/__init__.py +0 -0
  192. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/adapter_registry.py +0 -0
  193. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/docstrings.py +0 -0
  194. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/executor.py +0 -0
  195. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/params.py +0 -0
  196. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/route_types.py +0 -0
  197. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/src/routing/router_factory.py +0 -0
  198. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/tests/conftest.py +0 -0
  199. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/tests/test_web_core.py +0 -0
  200. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/tests/test_web_docstrings.py +0 -0
  201. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/tests/test_web_enums.py +0 -0
  202. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/tests/test_web_route_validation.py +0 -0
  203. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/web/tests/test_web_routes.py +0 -0
  204. {qqmusic_api_python-0.7.2 → qqmusic_api_python-0.7.3}/zensical.toml +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: qqmusic-api-python
3
- Version: 0.7.2
3
+ Version: 0.7.3
4
4
  Summary: QQ音乐API封装库
5
5
  Project-URL: documentation, https://l-1124.github.io/QQMusicApi/
6
6
  Project-URL: homepage, https://l-1124.github.io/QQMusicApi/
@@ -1,4 +1,28 @@
1
1
 
2
+ ## [[0.7.2](https://github.com/L-1124/QQMusicApi/compare/v0.7.1..v0.7.2)] - 2026-08-05
3
+
4
+ ### Bug 修复
5
+
6
+ * **(routing)** 修复 add_api_route tags 参数类型不匹配 ([ee98436](https://github.com/L-1124/QQMusicApi/commit/ee984368c19bca4d164475c272b49fa136566e9e)) by [@L-1124](https://github.com/L-1124)
7
+
8
+ ### 功能更新
9
+
10
+ * **(search)** 为 quick_search/complete/get_hotkey 添加响应模型 ([b97549f](https://github.com/L-1124/QQMusicApi/commit/b97549fea31f3de9ce68904df932a6c4d73aff45)) by [@L-1124](https://github.com/L-1124)
11
+ * **(singer)** 支持 get_desc 接口详细数据控制参数 ([8a8c7f1](https://github.com/L-1124/QQMusicApi/commit/8a8c7f14262e5b08dc46073e84e43fc43508f392)) by [@L-1124](https://github.com/L-1124)
12
+
13
+ ### 功能重构
14
+
15
+ * **(core)** [**breaking**] 统一请求调度引擎 ([8b71333](https://github.com/L-1124/QQMusicApi/commit/8b71333835891f851a70354c313c614f558ff8e0)) by [@L-1124](https://github.com/L-1124) in [#301](https://github.com/L-1124/QQMusicApi/pull/301)
16
+
17
+ ### 文档更新
18
+
19
+ * 更新 lyric.py 中的错误 docstring ([8ec78ce](https://github.com/L-1124/QQMusicApi/commit/8ec78ce3f16805ebe470b8308a96fef925cf8e56)) by [@L-1124](https://github.com/L-1124)
20
+
21
+ ### 贡献者
22
+
23
+ * @L-1124
24
+ * @github-actions[bot]
25
+
2
26
  ## [[0.7.1](https://github.com/L-1124/QQMusicApi/compare/v0.7.0..v0.7.1)] - 2026-08-02
3
27
 
4
28
  ### Bug 修复
@@ -0,0 +1,22 @@
1
+ """获取歌手名称透明 PNG, 演示有图片和无特殊展示两种结果."""
2
+
3
+ import asyncio
4
+
5
+ from qqmusic_api import Client
6
+
7
+
8
+ async def main() -> None:
9
+ """请求真实歌手名称展示信息并输出 JSON."""
10
+ async with Client() as client:
11
+ for mid in ("000qrPik2w6lDr", "0025NhlN2yWrP4"):
12
+ result = await client.singer.get_name_special_display(mid)
13
+ print(f"\nMID: {mid}")
14
+ print(result.model_dump_json(indent=2))
15
+ if result.display_type == 2 and result.pic_file:
16
+ print(f"PNG: {result.pic_file}")
17
+ else:
18
+ print(f"无名称图片, 使用文字: {result.name}")
19
+
20
+
21
+ if __name__ == "__main__":
22
+ asyncio.run(main())
@@ -22,7 +22,7 @@ from .core.exceptions import (
22
22
  from .core.versioning import Platform
23
23
  from .models.request import Credential
24
24
 
25
- __version__ = "0.7.2"
25
+ __version__ = "0.7.3"
26
26
 
27
27
  __all__ = [
28
28
  "ApiDataError",
@@ -248,6 +248,31 @@ class HomepageTabDetailResponse(Response):
248
248
  )
249
249
 
250
250
 
251
+ class SingerNameSpecialDisplayResponse(Response):
252
+ """歌手名称特殊展示信息.
253
+
254
+ Attributes:
255
+ display_type: 展示类型, 2 表示名称图片, 0 表示无特殊展示.
256
+ pic_file: 透明 PNG 地址, 无名称图片时为空字符串.
257
+ signature_name_overlap_ratio: 上游返回的签名与名称重叠比例.
258
+ name: 歌手名称.
259
+ """
260
+
261
+ display_type: int = Field(
262
+ default=0,
263
+ json_schema_extra={"jsonpath": "$.Info.Singer.SingerNameSpecialDisplay.DisplayType"},
264
+ )
265
+ pic_file: str = Field(
266
+ default="",
267
+ json_schema_extra={"jsonpath": "$.Info.Singer.SingerNameSpecialDisplay.PicFile"},
268
+ )
269
+ signature_name_overlap_ratio: float = Field(
270
+ default=0.0,
271
+ json_schema_extra={"jsonpath": "$.Info.Singer.SingerNameSpecialDisplay.SignatureNameOverlapRatio"},
272
+ )
273
+ name: str = Field(default="", json_schema_extra={"jsonpath": "$.Info.Singer.Name"})
274
+
275
+
251
276
  class HomepageHeaderResponse(Response):
252
277
  """歌手主页头部响应.
253
278
 
@@ -17,6 +17,7 @@ from ..models.singer import (
17
17
  SingerDetailResponse,
18
18
  SingerIndexPageResponse,
19
19
  SingerMvListResponse,
20
+ SingerNameSpecialDisplayResponse,
20
21
  SingerSongListResponse,
21
22
  SingerTypeListResponse,
22
23
  )
@@ -208,6 +209,24 @@ class SingerApi(ApiModule):
208
209
  platform=Platform.ANDROID,
209
210
  )
210
211
 
212
+ def get_name_special_display(self, mid: str):
213
+ """获取歌手名称透明 PNG 展示信息.
214
+
215
+ 返回歌手名称、展示类型、图片地址和重叠比例.
216
+ 无名称图片时, 返回 display_type=0 和空 pic_file.
217
+
218
+ Args:
219
+ mid: 歌手 MID.
220
+ """
221
+ return self._build_cgi(
222
+ module="music.UnifiedHomepage.UnifiedHomepageSrv",
223
+ method="GetHomepageHeader",
224
+ param={"SingerMid": mid},
225
+ response_model=SingerNameSpecialDisplayResponse,
226
+ platform=Platform.ANDROID,
227
+ comm={"cv": 20_080_000, "v": 20_080_000},
228
+ )
229
+
211
230
  def get_tab_detail(
212
231
  self,
213
232
  mid: str,
@@ -283,8 +283,11 @@ class SongApi(ApiModule):
283
283
  credential: 凭据对象.
284
284
 
285
285
  Raises:
286
- ValueError: 当 `mid` 数量超过上限时抛出.
286
+ ValueError: 当 `mid` 数量超过上限时抛出. 超限时上游返回错误且无结果, 故提前拒绝.
287
287
  """
288
+ if len(file_info) > self._GET_SONG_URLS_MAX_MID:
289
+ raise ValueError(f"mid 数量不能超过 {self._GET_SONG_URLS_MAX_MID}, 当前为 {len(file_info)}")
290
+
288
291
  encrypted = isinstance(file_type, EncryptedSongFileType)
289
292
  module, method = (
290
293
  ("music.vkey.GetVkey", "UrlGetVkey") if not encrypted else ("music.vkey.GetEVkey", "CgiGetEVkey")
@@ -1,5 +1,9 @@
1
1
  """歌手模块测试."""
2
2
 
3
+ from urllib.parse import urlparse
4
+
5
+ import pytest
6
+
3
7
  from qqmusic_api import Client
4
8
  from qqmusic_api.modules.singer import AreaType, GenreType, IndexType, SexType, TabType
5
9
 
@@ -51,6 +55,26 @@ async def test_get_info(client: Client) -> None:
51
55
  assert result.base_info.name
52
56
 
53
57
 
58
+ @pytest.mark.parametrize(
59
+ ("mid", "name", "display_type"),
60
+ [("000qrPik2w6lDr", "Taylor Swift", 2), ("0025NhlN2yWrP4", "周杰伦", 0)],
61
+ )
62
+ async def test_get_name_special_display(client: Client, mid: str, name: str, display_type: int) -> None:
63
+ """测试真实歌手名称图片与无特殊展示的返回结果."""
64
+ result = await client.singer.get_name_special_display(mid)
65
+
66
+ assert result.name == name
67
+ assert result.display_type == display_type
68
+ assert isinstance(result.signature_name_overlap_ratio, float)
69
+ if display_type == 2:
70
+ url = urlparse(result.pic_file)
71
+ assert url.scheme == "https"
72
+ assert url.netloc
73
+ assert url.path.endswith(".png")
74
+ else:
75
+ assert result.pic_file == ""
76
+
77
+
54
78
  async def test_get_tab_detail_wiki(client: Client) -> None:
55
79
  """测试获取歌手 Wiki Tab 详情模型."""
56
80
  result = await client.singer.get_tab_detail(
@@ -52,6 +52,13 @@ async def test_get_song_urls(client: Client, file_type: SongFileType | Encrypted
52
52
  assert len(result.data) == 1
53
53
 
54
54
 
55
+ def test_get_song_urls_exceed_limit(client: Client) -> None:
56
+ """测试获取歌曲链接超出 mid 数量上限时抛出异常."""
57
+ oversized = [SongFileInfo(mid="003w2xz20QlUZt")] * (client.song._GET_SONG_URLS_MAX_MID + 1)
58
+ with pytest.raises(ValueError, match="mid 数量不能超过"):
59
+ client.song.get_song_urls(oversized)
60
+
61
+
55
62
  @pytest.mark.parametrize("value", [100, "003w2xz20QlUZt"])
56
63
  async def test_get_detail(client: Client, value: int | str) -> None:
57
64
  """测试获取歌曲详情."""
@@ -906,19 +906,19 @@ pymdown-extensions==11.0.1 \
906
906
  # via
907
907
  # mkdocstrings
908
908
  # zensical
909
- pyrefly==1.1.1 \
910
- --hash=sha256:2150b450ee6a6bcbe69b2d45d9a4ebc934a609e1abcf65e490433f38eb873d84 \
911
- --hash=sha256:4e0430f3ef69c8ac73505fd6584db70ed504665a9f0816fef7f723de510f26cb \
912
- --hash=sha256:5ffd8a8ed62fe4e6bf0afe1837d1bad149bb3b9f80e928ef248c96b836db3742 \
913
- --hash=sha256:6deda959f8603a7dbdf112c48983e2275b2903cf33c8c739ed65d7e71a4fd520 \
914
- --hash=sha256:83baf0db71e172665db1fca0ced50b8f7773f5192ca57e8ac6773a772b6d2fc5 \
915
- --hash=sha256:a6342d87c52b04f72156da04f554c4d57f3616f2b32d1763969efb22d05a1407 \
916
- --hash=sha256:b50d4510e4f8aaea79e2c4b343a4d7a060c9451c0b2aa9bfe10d7ca1ef33d68d \
917
- --hash=sha256:c08b814ad03175e9cf47111390537161828b472044c39ab3320252b3ac6b2edd \
918
- --hash=sha256:d50cad97f19fc893b04deff7239626cffff5dd27ffb29b7d303a1b770247b208 \
919
- --hash=sha256:d6b238e1362622d47a6eb5af704fd8b613c94e8c303386efd6350e3da59fecc8 \
920
- --hash=sha256:f330cf039ef3da3b910c84f3a7e431f0cf8d0c1d2dad26491d6cadf3c7cd4759 \
921
- --hash=sha256:f4b8595f91885bc8b5e3c282ab68d1df21201668a84e6508b1e15f2feec0bb8d
909
+ pyrefly==1.2.0 \
910
+ --hash=sha256:25822ea9505f589ea8a725e4268b475132fb89e038fbf092e446510443ac142a \
911
+ --hash=sha256:368aaf7eee4f511ddc0f8e564cf14e01ab2f10b0db9105c6d5b153bf498d07bf \
912
+ --hash=sha256:3a90bb8df39dfbac74b1f3b2e9d7c526b8f80568884c3944d955023a73ebf61e \
913
+ --hash=sha256:5485f960fc2481617068c918335c39ab1507ef90b6b5bd35bf57726e60e73185 \
914
+ --hash=sha256:5de7b2ad2bba5c8055181681a84b74143eac2234a48ba5d1b7ed7e7a722b02bd \
915
+ --hash=sha256:756f669b5555090f5c1a4fef30db1785fabe657764f7e4e6dc88994dfb8ca82d \
916
+ --hash=sha256:7f46d983ac49ddd2b043694960a01dc6a19a5cfd8eec609d6bd9c42866f91b4e \
917
+ --hash=sha256:8a8964c224ccc4882730130955815de21ff443c1ac3f0b90685b19bf63848170 \
918
+ --hash=sha256:8c90751de8506d938e8f802659c74cf35bd7a0036510ee6c634a38eebb280bfa \
919
+ --hash=sha256:90efe75e17491ef5d636e10469e9278d7d0256b3b4c5e1f4750069bf3ae0f5d1 \
920
+ --hash=sha256:d52d5da7bc65fb7675fbaa80eda879d4f8787c494f04cac21603330d3abbdbbe \
921
+ --hash=sha256:e3465812ce5ef4781fb592edbf2724547296f0a3124be115d73c7e8b2401862d
922
922
  pytest==9.1.1 \
923
923
  --hash=sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313 \
924
924
  --hash=sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c
@@ -1095,25 +1095,25 @@ requests==2.34.2 \
1095
1095
  --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \
1096
1096
  --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed
1097
1097
  # via cos-python-sdk-v5
1098
- ruff==0.16.0 \
1099
- --hash=sha256:0ff4a79ce3ec0172f3241943835de1c4cb4e2dcd07f0f8c2d02603dbbbee4b17 \
1100
- --hash=sha256:14296fedcd2705c77ab8235439278bbb38f285cf7da5528b00b3e330c3d4872d \
1101
- --hash=sha256:28ea2b7df8ebf7f9da6b7d47b230ab48f387c0a29be3b474c4d0740e197bb9af \
1102
- --hash=sha256:33a3dfac8c35f81498dea9181bccc2f4c4bc8f1521a1dd9406e77643e0f0fb09 \
1103
- --hash=sha256:3c954b1d580bfa035b41654f7858cc7e71d5fc3ac5b723dd62bd9133830ed522 \
1104
- --hash=sha256:429c117f022bf481fabd9d551e7a3952b24c65e6ef44337ea09d90bebef14472 \
1105
- --hash=sha256:48044c678e9cb8698246c99b14aaccfa6601dea7379eb48a6f8f73f7a6d86cd0 \
1106
- --hash=sha256:4f11a8d11010301d0a398a2fdef67691feca7294da6aef55e2150e8fa2cd520b \
1107
- --hash=sha256:6e364e5ed22ed8dc05082fd78e35308618260907ac2d3c1d637b2e682415b6c9 \
1108
- --hash=sha256:7aa0959bad8eb8bef50340154fc9b58678dae31fa4293afa38b44b6e552c0213 \
1109
- --hash=sha256:7fab76fa065c873f41ff744347c6e77bcc3dfec4bcc754dc26b63d23c0f7f5fb \
1110
- --hash=sha256:a5237a0bda500d30d81b8e07a6973a5cbc772864cbf746ae2f4e8a2e01c9f4ed \
1111
- --hash=sha256:a9b50c55e263103586b3dcf5f73d479eb8cb5fdb6098fec59a62891dab653717 \
1112
- --hash=sha256:d327b8fc113a1d4421a04f3839d3752057c8dd1ee320223a6f3f52d04ada462a \
1113
- --hash=sha256:e01c21d10eb1b29f47b7454e1f4056db9a3f0260c646aa88457c610291db9f81 \
1114
- --hash=sha256:e460aafd5495ec89efaa6ced2e4a9a581116451e1c88b9d37ef497e0f8e93982 \
1115
- --hash=sha256:e5115729eb08c585e5121978ba5d5b60caeae394ce21b9fb5e6cd33a1c6c9b1e \
1116
- --hash=sha256:e95c448fca1fb2a18372a9440926c5a6ee789639bb975c72e7ae6d0b04218ab4
1098
+ ruff==0.16.1 \
1099
+ --hash=sha256:07bf434b1c95f4e093be4532068ef4fcf00924eb2ade8796075980902d6fd54a \
1100
+ --hash=sha256:09b05e8b90c2cb06ad63464350e7a45e8e44a2dfe52072ebfba6666ca8d3f596 \
1101
+ --hash=sha256:24e9c631573cbca9d20f1283f8f479b2afa4a8503504822bd71a293889f16743 \
1102
+ --hash=sha256:26e9ca5c9bc3971f20d3cf18a957f52ffd6a5f6564ff15c4912a144dcac22494 \
1103
+ --hash=sha256:30affbcedf59ad5703d9c91f82266e02b47739f797e1a7b6e158e5526a6dae38 \
1104
+ --hash=sha256:39897739f112253ee4fdd2e8aa9a4f9ded99fb2be367d5f31dfa4ded6025584c \
1105
+ --hash=sha256:4d5f2ed10f8242d83fc08d521301089364e3375375705356f20c0e31606ef3ef \
1106
+ --hash=sha256:58edb313b88f0c5460a26adf5f39a37a3be789494a15e3e411e35fa78b89f9a0 \
1107
+ --hash=sha256:67e1e1e3fa4f0c82f0e36d4cd61e661f6e7a6196cb1aa92fe0828fa7b8f257cd \
1108
+ --hash=sha256:82ae3c0c0d74daf17b968a10b7b3bb3ef297ab7de0c1f749646b25e690ccb150 \
1109
+ --hash=sha256:a4665b309891f83f3e3c25447935f1213e9abbd4b5640af7a1f2def9f8d413c1 \
1110
+ --hash=sha256:b0d1e1393b7648079e13669de1c1f4fde06d4583e84d8fd5c1551e0a77a2aa75 \
1111
+ --hash=sha256:b41bdd48fb420987a9b5212e4957c26ad4abce401fa9ea9d4d85843727945f4f \
1112
+ --hash=sha256:d31765e131295b8445caf301e3e8a85b34d1b9b211b4109b7ba457888b051806 \
1113
+ --hash=sha256:dbaadaac38c70239f056d306b7476f246b0bf000fa6b3876402acbf5b227eaf8 \
1114
+ --hash=sha256:e0d4c20532fca4f7fa609369161d968dd28f65d83dabbd61d8e9c7edbf7001f6 \
1115
+ --hash=sha256:fde5a99e2f97479af66edd6622c6d5a2a7592c77cf4153d9e4428f5eeb55b60c \
1116
+ --hash=sha256:fedad7c801dabd3fb9741d76aca39246e6ddd9ca446a015875207bf19f1e6bc7
1117
1117
  six==1.17.0 \
1118
1118
  --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \
1119
1119
  --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81
@@ -8,6 +8,7 @@ from qqmusic_api.models.singer import (
8
8
  SingerDetailResponse,
9
9
  SingerIndexPageResponse,
10
10
  SingerMvListResponse,
11
+ SingerNameSpecialDisplayResponse,
11
12
  SingerSongListResponse,
12
13
  SingerTypeListResponse,
13
14
  )
@@ -53,6 +54,14 @@ ROUTES: tuple[WebRoute, ...] = (
53
54
  cache=PUBLIC_300,
54
55
  ),
55
56
  R("singer", "get_info", "/singer/{mid}/info", HomepageHeaderResponse, params=MID, cache=PUBLIC_300),
57
+ R(
58
+ "singer",
59
+ "get_name_special_display",
60
+ "/singer/{mid}/name-special-display",
61
+ SingerNameSpecialDisplayResponse,
62
+ params=MID,
63
+ cache=PUBLIC_600,
64
+ ),
56
65
  R(
57
66
  "singer",
58
67
  "get_mv_list",