qqmusic-api-python 0.6.4__tar.gz → 0.6.6__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 (189) hide show
  1. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/docs.yml +4 -2
  2. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/PKG-INFO +1 -1
  3. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/release-notes.md +27 -0
  4. qqmusic_api_python-0.6.6/examples/get_all_sheets.py +47 -0
  5. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/__init__.py +1 -1
  6. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/algorithms/__init__.py +2 -0
  7. qqmusic_api_python-0.6.6/qqmusic_api/algorithms/sign.py +32 -0
  8. qqmusic_api_python-0.6.6/qqmusic_api/algorithms/tripledes.py +1038 -0
  9. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/client.py +32 -13
  10. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/request.py +8 -1
  11. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/versioning.py +1 -1
  12. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/request.py +1 -1
  13. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/song.py +23 -2
  14. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/_base.py +66 -1
  15. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/login.py +21 -0
  16. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/song.py +63 -2
  17. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_lyric.py +6 -0
  18. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/Dockerfile +5 -2
  19. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/README.md +12 -0
  20. qqmusic_api_python-0.6.6/web/requirements.txt +1403 -0
  21. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/app.py +8 -2
  22. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/auth.py +11 -0
  23. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/security.py +10 -2
  24. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/comment.py +1 -1
  25. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/executor.py +12 -12
  26. qqmusic_api_python-0.6.6/web/tests/test_web_core.py +85 -0
  27. qqmusic_api_python-0.6.4/qqmusic_api/algorithms/tripledes.py +0 -598
  28. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/pydantic/SKILL.md +0 -0
  29. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/python-standards/SKILL.md +0 -0
  30. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/tarsio/SKILL.md +0 -0
  31. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/tarsio/references/api-reference.md +0 -0
  32. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/uv-package-manager/SKILL.md +0 -0
  33. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.dockerignore +0 -0
  34. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  35. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  36. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  37. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  38. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/renovate.json +0 -0
  39. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/checking.yaml +0 -0
  40. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/release.yml +0 -0
  41. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/testing.yml +0 -0
  42. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.gitignore +0 -0
  43. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.markdownlint-cli2.yaml +0 -0
  44. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/AGENTS.md +0 -0
  45. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/CLAUDE.md +0 -0
  46. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/LICENSE +0 -0
  47. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/README.md +0 -0
  48. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/assets/qq-music.svg +0 -0
  49. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/cliff.toml +0 -0
  50. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/coding.md +0 -0
  51. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/contributing.md +0 -0
  52. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/index.md +0 -0
  53. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/client.md +0 -0
  54. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/exception.md +0 -0
  55. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/pagination.md +0 -0
  56. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/request.md +0 -0
  57. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/versioning.md +0 -0
  58. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/album.md +0 -0
  59. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/base.md +0 -0
  60. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/comment.md +0 -0
  61. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/login.md +0 -0
  62. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/lyric.md +0 -0
  63. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/mv.md +0 -0
  64. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/recommend.md +0 -0
  65. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/request.md +0 -0
  66. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/search.md +0 -0
  67. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/singer.md +0 -0
  68. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/song.md +0 -0
  69. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/songlist.md +0 -0
  70. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/top.md +0 -0
  71. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/user.md +0 -0
  72. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/album.md +0 -0
  73. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/comment.md +0 -0
  74. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/login.md +0 -0
  75. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/login_utils.md +0 -0
  76. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/lyric.md +0 -0
  77. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/mv.md +0 -0
  78. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/private_message.md +0 -0
  79. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/recommend.md +0 -0
  80. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/search.md +0 -0
  81. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/singer.md +0 -0
  82. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/song.md +0 -0
  83. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/songlist.md +0 -0
  84. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/top.md +0 -0
  85. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/user.md +0 -0
  86. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/client.md +0 -0
  87. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/credential.md +0 -0
  88. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/pagination.md +0 -0
  89. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/start.md +0 -0
  90. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/web.md +0 -0
  91. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/download_song.py +0 -0
  92. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/phone_login.py +0 -0
  93. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/private_message.py +0 -0
  94. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/qrcode_login.py +0 -0
  95. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/prek.toml +0 -0
  96. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/pyproject.toml +0 -0
  97. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/__init__.py +0 -0
  98. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/exceptions.py +0 -0
  99. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/pagination.py +0 -0
  100. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/__init__.py +0 -0
  101. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/_validator.py +0 -0
  102. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/album.py +0 -0
  103. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/base.py +0 -0
  104. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/comment.py +0 -0
  105. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/login.py +0 -0
  106. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/lyric.py +0 -0
  107. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/mv.py +0 -0
  108. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/private_message.py +0 -0
  109. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/recommend.py +0 -0
  110. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/search.py +0 -0
  111. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/singer.py +0 -0
  112. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/songlist.py +0 -0
  113. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/top.py +0 -0
  114. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/user.py +0 -0
  115. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/__init__.py +0 -0
  116. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/album.py +0 -0
  117. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/comment.py +0 -0
  118. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/login_utils.py +0 -0
  119. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/lyric.py +0 -0
  120. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/mv.py +0 -0
  121. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/private_message.py +0 -0
  122. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/recommend.py +0 -0
  123. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/search.py +0 -0
  124. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/singer.py +0 -0
  125. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/songlist.py +0 -0
  126. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/top.py +0 -0
  127. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/user.py +0 -0
  128. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/__init__.py +0 -0
  129. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/common.py +0 -0
  130. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/device.py +0 -0
  131. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/mqtt.py +0 -0
  132. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/qimei.py +0 -0
  133. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/scripts/ag-1.py +0 -0
  134. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/conftest.py +0 -0
  135. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_album.py +0 -0
  136. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_comment.py +0 -0
  137. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_login.py +0 -0
  138. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_login_utils.py +0 -0
  139. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_mv.py +0 -0
  140. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_private_message.py +0 -0
  141. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_recommend.py +0 -0
  142. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_search.py +0 -0
  143. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_singer.py +0 -0
  144. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_song.py +0 -0
  145. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_songlist.py +0 -0
  146. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_top.py +0 -0
  147. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_user.py +0 -0
  148. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/uv.lock +0 -0
  149. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/.gitignore +0 -0
  150. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/accounts.example.toml +0 -0
  151. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/config.example.toml +0 -0
  152. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/docker-compose.yml +0 -0
  153. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/run.py +0 -0
  154. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/__init__.py +0 -0
  155. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/cache.py +0 -0
  156. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/config.py +0 -0
  157. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/credential_store.py +0 -0
  158. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/deps.py +0 -0
  159. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/response.py +0 -0
  160. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/__init__.py +0 -0
  161. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/login.py +0 -0
  162. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/mv.py +0 -0
  163. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/singer.py +0 -0
  164. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/song.py +0 -0
  165. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/songlist.py +0 -0
  166. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/__init__.py +0 -0
  167. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/_helpers.py +0 -0
  168. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/album.py +0 -0
  169. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/comment.py +0 -0
  170. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/login.py +0 -0
  171. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/lyric.py +0 -0
  172. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/mv.py +0 -0
  173. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/recommend.py +0 -0
  174. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/search.py +0 -0
  175. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/singer.py +0 -0
  176. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/song.py +0 -0
  177. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/songlist.py +0 -0
  178. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/top.py +0 -0
  179. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/user.py +0 -0
  180. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/__init__.py +0 -0
  181. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/docstrings.py +0 -0
  182. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/params.py +0 -0
  183. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/route_types.py +0 -0
  184. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/router_factory.py +0 -0
  185. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_docstrings.py +0 -0
  186. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_enums.py +0 -0
  187. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_route_validation.py +0 -0
  188. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_routes.py +0 -0
  189. {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/zensical.toml +0 -0
@@ -41,14 +41,16 @@ jobs:
41
41
  env:
42
42
  OUTPUT: docs/release-notes.md
43
43
  GITHUB_REPO: ${{ github.repository }}
44
+ - name: Export web requirements.txt
45
+ run: uv export --format requirements.txt --group web --output-file web/requirements.txt
44
46
  - name: Commit
45
47
  run: |
46
48
  git checkout main
47
49
  git config user.name "github-actions[bot]"
48
50
  git config user.email "github-actions[bot]@users.noreply.github.com"
49
51
  set +e
50
- git add docs/release-notes.md
51
- git commit -m "🧹 chore(release-notes): 更新 release notes"
52
+ git add docs/release-notes.md web/requirements.txt
53
+ git commit -m "🧹 chore(release): 更新 release notes 及 web 依赖"
52
54
  git push origin main
53
55
  - name: Build with zensical
54
56
  run: uv run zensical build
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qqmusic-api-python
3
- Version: 0.6.4
3
+ Version: 0.6.6
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,31 @@
1
1
 
2
+ ## [[0.6.5](https://github.com/L-1124/QQMusicApi/compare/v0.6.4..v0.6.5)] - 2026-06-12
3
+
4
+ ### Bug 修复
5
+
6
+ * **(core)** 开启 allow_incoming_cookies=False 防止上下请求的 cookies 污染 ([1cd1b69](https://github.com/L-1124/QQMusicApi/commit/1cd1b69338ffa2f26409480490b18b9c9080a29e)) by [@L-1124](https://github.com/L-1124)
7
+ * **(login)** `Platform.WEB` 的 `check_expired` 总是返回 True ([f0b4533](https://github.com/L-1124/QQMusicApi/commit/f0b4533e7c172b6cb5b0556fbd7ff13e8b20f4c7)) by [@L-1124](https://github.com/L-1124)
8
+
9
+ ### 贡献者
10
+
11
+ * @L-1124
12
+ * @github-actions[bot]
13
+
14
+ ## [[0.6.4](https://github.com/L-1124/QQMusicApi/compare/v0.6.3..v0.6.4)] - 2026-06-12
15
+
16
+ ### Bug 修复
17
+
18
+ * **(models)** 修复没有 musickey 时误判为 QQ 登录的问题 ([9b122a7](https://github.com/L-1124/QQMusicApi/commit/9b122a77f418d85f1926da889846c61a55bf70a2)) by [@L-1124](https://github.com/L-1124)
19
+
20
+ ### 功能更新
21
+
22
+ * **(models)** 修改 BaseModel 的 model_config 设置,允许额外字段 ([12a2334](https://github.com/L-1124/QQMusicApi/commit/12a2334dbde580930b167c728998b6310508597e)) by [@L-1124](https://github.com/L-1124)
23
+
24
+ ### 贡献者
25
+
26
+ * @L-1124
27
+ * @github-actions[bot]
28
+
2
29
  ## [[0.6.3](https://github.com/L-1124/QQMusicApi/compare/v0.6.2..v0.6.3)] - 2026-06-12
3
30
 
4
31
  ### Bug 修复
@@ -0,0 +1,47 @@
1
+ """获取歌曲所有来源曲谱示例."""
2
+
3
+ import asyncio
4
+
5
+ from qqmusic_api import Client
6
+
7
+ CREDENTIAL_PATH = __import__("pathlib").Path(__file__).parent.parent / "credential.json"
8
+
9
+ MID = "0039MnYb0qxYhV"
10
+
11
+
12
+ async def main() -> None:
13
+ """并行获取所有来源曲谱并合并."""
14
+ async with Client() as client:
15
+ # 1. 先检查有哪些类型的曲谱
16
+ has = await client.song.has_sheet(MID)
17
+ print(f"歌曲 {MID}:")
18
+ print(f" 吉他谱: {has.has_guitar}")
19
+ print(f" 虫虫钢琴: {has.has_chong_chong}")
20
+ print(f" 更多曲谱: {has.has_more}")
21
+
22
+ # 2. 并行拉取三个来源
23
+ results = await client.gather(
24
+ [
25
+ client.song.get_sheet(MID, ttype=0),
26
+ client.song.get_sheet(MID, ttype=1),
27
+ client.song.get_sheet(MID, ttype=2),
28
+ ]
29
+ )
30
+
31
+ # 3. 合并结果, 按 scoreMID 去重
32
+ seen: set[str] = set()
33
+ merged: list = []
34
+ for resp in results:
35
+ if isinstance(resp, Exception):
36
+ continue
37
+ for sheet in resp.result:
38
+ if sheet.score_mid not in seen:
39
+ seen.add(sheet.score_mid)
40
+ merged.append(sheet)
41
+
42
+ print(f"\n共获取 {len(merged)} 首曲谱:")
43
+ for sheet in merged:
44
+ print(f" {sheet.score_name} [{sheet.ins_type_text}] ({sheet.score_type_text})")
45
+
46
+
47
+ asyncio.run(main())
@@ -18,7 +18,7 @@ from .core.exceptions import (
18
18
  from .core.versioning import Platform
19
19
  from .models.request import Credential
20
20
 
21
- __version__ = "0.6.4"
21
+ __version__ = "0.6.6"
22
22
 
23
23
  __all__ = [
24
24
  "ApiDataError",
@@ -2,6 +2,7 @@
2
2
 
3
3
  import zlib
4
4
 
5
+ from .sign import zzc_sign
5
6
  from .tripledes import DECRYPT, tripledes_crypt, tripledes_key_setup
6
7
 
7
8
  _QRC_3DES_KEY = b"!@#)(*$%123ZXC!@!@#)(NHL"
@@ -43,4 +44,5 @@ def qrc_decrypt(encrypted_qrc: str | bytearray | bytes) -> str:
43
44
 
44
45
  __all__ = [
45
46
  "qrc_decrypt",
47
+ "zzc_sign",
46
48
  ]
@@ -0,0 +1,32 @@
1
+ """签名算法实现."""
2
+
3
+ import re
4
+ from base64 import b64encode
5
+ from hashlib import sha1
6
+
7
+ PART_1_INDEXES = [23, 14, 6, 36, 16, 7, 19]
8
+ PART_2_INDEXES = [16, 1, 32, 12, 19, 27, 8, 5]
9
+ SCRAMBLE_VALUES = [89, 39, 179, 150, 218, 82, 58, 252, 177, 52, 186, 123, 120, 64, 242, 133, 143, 161, 121, 179]
10
+
11
+
12
+ def zzc_sign(payload: str | bytes | bytearray) -> str:
13
+ """计算 QQ 音乐客户端请求的 zzc 签名.
14
+
15
+ Args:
16
+ payload: 待签名的明文 (字符串或二进制数据).
17
+
18
+ Returns:
19
+ str: 计算出的签名值.
20
+ """
21
+ payload_bytes = payload.encode("utf-8") if isinstance(payload, str) else bytes(payload)
22
+ hash_hex = sha1(payload_bytes).hexdigest().upper()
23
+
24
+ part1 = "".join(hash_hex[i] for i in PART_1_INDEXES)
25
+ part2 = "".join(hash_hex[i] for i in PART_2_INDEXES)
26
+
27
+ part3 = bytearray(20)
28
+ for i, v in enumerate(SCRAMBLE_VALUES):
29
+ value = v ^ int(hash_hex[i * 2 : i * 2 + 2], 16)
30
+ part3[i] = value
31
+ b64_part = re.sub(rb"[\\/+=]", b"", b64encode(part3)).decode("utf-8")
32
+ return f"zzc{part1}{b64_part}{part2}".lower()