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.
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/docs.yml +4 -2
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/PKG-INFO +1 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/release-notes.md +27 -0
- qqmusic_api_python-0.6.6/examples/get_all_sheets.py +47 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/__init__.py +1 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/algorithms/__init__.py +2 -0
- qqmusic_api_python-0.6.6/qqmusic_api/algorithms/sign.py +32 -0
- qqmusic_api_python-0.6.6/qqmusic_api/algorithms/tripledes.py +1038 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/client.py +32 -13
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/request.py +8 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/versioning.py +1 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/request.py +1 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/song.py +23 -2
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/_base.py +66 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/login.py +21 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/song.py +63 -2
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_lyric.py +6 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/Dockerfile +5 -2
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/README.md +12 -0
- qqmusic_api_python-0.6.6/web/requirements.txt +1403 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/app.py +8 -2
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/auth.py +11 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/security.py +10 -2
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/comment.py +1 -1
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/executor.py +12 -12
- qqmusic_api_python-0.6.6/web/tests/test_web_core.py +85 -0
- qqmusic_api_python-0.6.4/qqmusic_api/algorithms/tripledes.py +0 -598
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/pydantic/SKILL.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/python-standards/SKILL.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/tarsio/SKILL.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/tarsio/references/api-reference.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.agents/skills/uv-package-manager/SKILL.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.dockerignore +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/renovate.json +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/checking.yaml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/release.yml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.github/workflows/testing.yml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.gitignore +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/.markdownlint-cli2.yaml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/AGENTS.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/CLAUDE.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/LICENSE +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/README.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/assets/qq-music.svg +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/cliff.toml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/coding.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/contributing.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/index.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/client.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/exception.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/pagination.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/request.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/core/versioning.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/album.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/base.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/comment.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/login.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/lyric.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/mv.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/recommend.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/request.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/search.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/singer.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/song.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/songlist.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/top.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/model/user.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/album.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/comment.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/login.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/login_utils.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/lyric.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/mv.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/private_message.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/recommend.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/search.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/singer.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/song.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/songlist.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/top.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/reference/modules/user.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/client.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/credential.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/pagination.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/start.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/docs/tutorial/web.md +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/download_song.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/phone_login.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/private_message.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/examples/qrcode_login.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/prek.toml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/pyproject.toml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/exceptions.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/core/pagination.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/_validator.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/album.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/base.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/comment.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/login.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/lyric.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/mv.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/private_message.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/recommend.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/search.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/singer.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/songlist.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/top.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/models/user.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/album.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/comment.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/login_utils.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/lyric.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/mv.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/private_message.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/recommend.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/search.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/singer.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/songlist.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/top.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/modules/user.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/common.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/device.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/mqtt.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/qqmusic_api/utils/qimei.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/scripts/ag-1.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/conftest.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_album.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_comment.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_login.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_login_utils.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_mv.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_private_message.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_recommend.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_search.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_singer.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_song.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_songlist.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_top.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/tests/test_user.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/uv.lock +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/.gitignore +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/accounts.example.toml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/config.example.toml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/docker-compose.yml +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/run.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/cache.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/config.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/credential_store.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/deps.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/core/response.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/login.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/mv.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/singer.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/song.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/modules/songlist.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/_helpers.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/album.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/comment.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/login.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/lyric.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/mv.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/recommend.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/search.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/singer.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/song.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/songlist.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/top.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routes/user.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/__init__.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/docstrings.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/params.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/route_types.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/src/routing/router_factory.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_docstrings.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_enums.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_route_validation.py +0 -0
- {qqmusic_api_python-0.6.4 → qqmusic_api_python-0.6.6}/web/tests/test_web_routes.py +0 -0
- {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
|
|
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,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())
|
|
@@ -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()
|