@sansenjian/qq-music-api 2.2.1 → 2.2.7

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 (344) hide show
  1. package/CHANGELOG.md +120 -42
  2. package/dist/app.js +58 -0
  3. package/dist/config/user-info.js +59 -0
  4. package/dist/index.js +3 -0
  5. package/dist/jest.config.js +40 -0
  6. package/dist/middlewares/koa-cors.js +63 -0
  7. package/dist/module/apis/UCommon/UCommon.js +10 -0
  8. package/dist/module/apis/album/getAlbumInfo.js +23 -0
  9. package/dist/module/apis/comments/getComments.js +24 -0
  10. package/dist/module/apis/digitalAlbum/getDigitalAlbumLists.js +22 -0
  11. package/dist/module/apis/downloadQQMusic.js +48 -0
  12. package/dist/module/apis/extend/getPlaylistTags.js +158 -0
  13. package/dist/module/apis/music/getLyric.js +32 -0
  14. package/dist/module/apis/mv/getMvByTag.js +23 -0
  15. package/dist/module/apis/radio/getRadioLists.js +26 -0
  16. package/dist/module/apis/rank/getTopLists.js +35 -0
  17. package/dist/module/apis/recommend/getDailyRecommend.js +124 -0
  18. package/dist/module/apis/recommend/getPersonalRecommend.js +114 -0
  19. package/dist/module/apis/search/getHotKey.js +25 -0
  20. package/dist/module/apis/search/getSearchByKey.js +32 -0
  21. package/dist/module/apis/search/getSmartbox.js +40 -0
  22. package/dist/module/apis/singers/getSimilarSinger.js +24 -0
  23. package/dist/module/apis/singers/getSingerDesc.js +24 -0
  24. package/dist/module/apis/singers/getSingerMv.js +23 -0
  25. package/dist/module/apis/singers/getSingerStarNum.js +23 -0
  26. package/dist/module/apis/songLists/songListCategories.js +23 -0
  27. package/dist/module/apis/songLists/songListDetail.js +28 -0
  28. package/dist/module/apis/songLists/songLists.js +35 -0
  29. package/dist/module/apis/u_common.js +56 -0
  30. package/dist/module/apis/user/checkQQLoginQr.js +189 -0
  31. package/dist/module/apis/user/getQQLoginQr.js +23 -0
  32. package/dist/module/apis/user/getUserAvatar.js +25 -0
  33. package/dist/module/apis/user/getUserLikedSongs.js +129 -0
  34. package/dist/module/apis/user/getUserPlaylists.js +138 -0
  35. package/dist/module/apis/y_common.js +69 -0
  36. package/dist/module/config.js +24 -0
  37. package/dist/module/index.js +70 -0
  38. package/dist/package.json +117 -0
  39. package/dist/routers/context/batchGetSongInfo.js +53 -0
  40. package/dist/routers/context/batchGetSongLists.js +37 -0
  41. package/dist/routers/context/checkQQLoginQr.js +16 -0
  42. package/dist/routers/context/cookies.js +36 -0
  43. package/dist/routers/context/getAlbumInfo.js +29 -0
  44. package/dist/routers/context/getComments.js +38 -0
  45. package/dist/routers/context/getDailyRecommend.js +45 -0
  46. package/dist/routers/context/getDigitalAlbumLists.js +16 -0
  47. package/dist/routers/context/getDownloadQQMusic.js +16 -0
  48. package/dist/routers/context/getHotkey.js +21 -0
  49. package/dist/routers/context/getImageUrl.js +25 -0
  50. package/dist/routers/context/getLyric.js +29 -0
  51. package/dist/routers/context/getMusicPlay.js +91 -0
  52. package/dist/routers/context/getMv.js +57 -0
  53. package/dist/routers/context/getMvByTag.js +16 -0
  54. package/dist/routers/context/getMvPlay.js +105 -0
  55. package/dist/routers/context/getNewDisks.js +52 -0
  56. package/dist/routers/context/getPersonalRecommend.js +54 -0
  57. package/dist/routers/context/getPlaylistTags.js +60 -0
  58. package/dist/routers/context/getQQLoginQr.js +14 -0
  59. package/dist/routers/context/getRadioLists.js +16 -0
  60. package/dist/routers/context/getRanks.js +60 -0
  61. package/dist/routers/context/getRecommend.js +88 -0
  62. package/dist/routers/context/getSearchByKey.js +32 -0
  63. package/dist/routers/context/getSimilarSinger.js +27 -0
  64. package/dist/routers/context/getSingerAlbum.js +54 -0
  65. package/dist/routers/context/getSingerDesc.js +28 -0
  66. package/dist/routers/context/getSingerHotsong.js +54 -0
  67. package/dist/routers/context/getSingerList.js +51 -0
  68. package/dist/routers/context/getSingerMv.js +36 -0
  69. package/dist/routers/context/getSingerStarNum.js +27 -0
  70. package/dist/routers/context/getSmartbox.js +27 -0
  71. package/dist/routers/context/getSongInfo.js +47 -0
  72. package/dist/routers/context/getSongListCategories.js +23 -0
  73. package/dist/routers/context/getSongListDetail.js +19 -0
  74. package/dist/routers/context/getSongLists.js +25 -0
  75. package/dist/routers/context/getTicketInfo.js +47 -0
  76. package/dist/routers/context/getTopLists.js +16 -0
  77. package/dist/routers/context/getUserAvatar.js +48 -0
  78. package/dist/routers/context/getUserLikedSongs.js +24 -0
  79. package/dist/routers/context/getUserPlaylists.js +24 -0
  80. package/dist/routers/context/index.js +107 -0
  81. package/dist/routers/router.js +69 -0
  82. package/dist/routers/types.js +2 -0
  83. package/dist/routers/util.js +188 -0
  84. package/dist/types/api.js +55 -0
  85. package/dist/util/apiResponse.js +88 -0
  86. package/dist/util/colors.js +19 -0
  87. package/dist/util/cookie.js +26 -0
  88. package/dist/util/loginUtils.js +30 -0
  89. package/dist/util/lyricParse.js +72 -0
  90. package/dist/util/request.js +109 -0
  91. package/docs-dist/404.html +24 -0
  92. package/docs-dist/CHANGELOG-ARCHITECTURE.html +131 -0
  93. package/docs-dist/COOKIE_CONFIG_GUIDE.html +39 -0
  94. package/docs-dist/README.html +447 -0
  95. package/docs-dist/TEST_USER_PLAYLISTS.html +42 -0
  96. package/docs-dist/USER_AVATAR_GUIDE.html +100 -0
  97. package/docs-dist/api/comments.html +48 -0
  98. package/docs-dist/api/index.html +27 -0
  99. package/docs-dist/api/music.html +51 -0
  100. package/docs-dist/api/other.html +33 -0
  101. package/docs-dist/api/playlist.html +77 -0
  102. package/docs-dist/api/rank.html +48 -0
  103. package/docs-dist/api/search.html +62 -0
  104. package/docs-dist/api/singer.html +47 -0
  105. package/docs-dist/api/user.html +64 -0
  106. package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.BOe0ZtyR.js +105 -0
  107. package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.BOe0ZtyR.lean.js +1 -0
  108. package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.D68AwXR2.js +13 -0
  109. package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.D68AwXR2.lean.js +1 -0
  110. package/docs-dist/assets/README.md.ZJQGJ1Gb.js +421 -0
  111. package/docs-dist/assets/README.md.ZJQGJ1Gb.lean.js +1 -0
  112. package/docs-dist/assets/TEST_USER_PLAYLISTS.md.C02575X2.js +16 -0
  113. package/docs-dist/assets/TEST_USER_PLAYLISTS.md.C02575X2.lean.js +1 -0
  114. package/docs-dist/assets/USER_AVATAR_GUIDE.md.BOqjn5Cm.js +74 -0
  115. package/docs-dist/assets/USER_AVATAR_GUIDE.md.BOqjn5Cm.lean.js +1 -0
  116. package/docs-dist/assets/api_comments.md.DADvndEA.js +22 -0
  117. package/docs-dist/assets/api_comments.md.DADvndEA.lean.js +1 -0
  118. package/docs-dist/assets/api_index.md.D5IASxxG.js +1 -0
  119. package/docs-dist/assets/api_index.md.D5IASxxG.lean.js +1 -0
  120. package/docs-dist/assets/api_music.md.BgB8NmZq.js +25 -0
  121. package/docs-dist/assets/api_music.md.BgB8NmZq.lean.js +1 -0
  122. package/docs-dist/assets/api_other.md.BkRWXX2z.js +7 -0
  123. package/docs-dist/assets/api_other.md.BkRWXX2z.lean.js +1 -0
  124. package/docs-dist/assets/api_playlist.md.Dc0hTrZ4.js +51 -0
  125. package/docs-dist/assets/api_playlist.md.Dc0hTrZ4.lean.js +1 -0
  126. package/docs-dist/assets/api_rank.md.DRisCFyT.js +22 -0
  127. package/docs-dist/assets/api_rank.md.DRisCFyT.lean.js +1 -0
  128. package/docs-dist/assets/api_search.md.DNnMUZK0.js +36 -0
  129. package/docs-dist/assets/api_search.md.DNnMUZK0.lean.js +1 -0
  130. package/docs-dist/assets/api_singer.md.DCmuxQkk.js +21 -0
  131. package/docs-dist/assets/api_singer.md.DCmuxQkk.lean.js +1 -0
  132. package/docs-dist/assets/api_user.md.Cjm9GG3z.js +38 -0
  133. package/docs-dist/assets/api_user.md.Cjm9GG3z.lean.js +1 -0
  134. package/docs-dist/assets/app.Dx_1wB58.js +1 -0
  135. package/docs-dist/assets/chunks/@localSearchIndexroot.CMY5EIwU.js +1 -0
  136. package/docs-dist/assets/chunks/VPLocalSearchBox.DwKWtsdX.js +9 -0
  137. package/docs-dist/assets/chunks/framework.o40iizuP.js +19 -0
  138. package/docs-dist/assets/chunks/theme.pGVgJ9Cx.js +2 -0
  139. package/docs-dist/assets/guide_architecture.md.DGtNyuMH.js +258 -0
  140. package/docs-dist/assets/guide_architecture.md.DGtNyuMH.lean.js +1 -0
  141. package/docs-dist/assets/guide_authentication.md.mtI5LfCw.js +4 -0
  142. package/docs-dist/assets/guide_authentication.md.mtI5LfCw.lean.js +1 -0
  143. package/docs-dist/assets/guide_index.md.B-0SG46T.js +1 -0
  144. package/docs-dist/assets/guide_index.md.B-0SG46T.lean.js +1 -0
  145. package/docs-dist/assets/guide_installation.md.k-KpAfxv.js +7 -0
  146. package/docs-dist/assets/guide_installation.md.k-KpAfxv.lean.js +1 -0
  147. package/docs-dist/assets/guide_quickstart.md.Bff_KFOD.js +13 -0
  148. package/docs-dist/assets/guide_quickstart.md.Bff_KFOD.lean.js +1 -0
  149. package/docs-dist/assets/index.md.xrs-uIyo.js +1 -0
  150. package/docs-dist/assets/index.md.xrs-uIyo.lean.js +1 -0
  151. package/docs-dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  152. package/docs-dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  153. package/docs-dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  154. package/docs-dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  155. package/docs-dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  156. package/docs-dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  157. package/docs-dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  158. package/docs-dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  159. package/docs-dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  160. package/docs-dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  161. package/docs-dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  162. package/docs-dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  163. package/docs-dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  164. package/docs-dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  165. package/docs-dist/assets/reference_response-format.md.DKYTK6uJ.js +12 -0
  166. package/docs-dist/assets/reference_response-format.md.DKYTK6uJ.lean.js +1 -0
  167. package/docs-dist/assets/style.DM4qKDd4.css +1 -0
  168. package/docs-dist/guide/architecture.html +284 -0
  169. package/docs-dist/guide/authentication.html +30 -0
  170. package/docs-dist/guide/index.html +27 -0
  171. package/docs-dist/guide/installation.html +33 -0
  172. package/docs-dist/guide/quickstart.html +39 -0
  173. package/docs-dist/hashmap.json +1 -0
  174. package/docs-dist/index.html +27 -0
  175. package/docs-dist/logo.svg +4 -0
  176. package/docs-dist/reference/response-format.html +38 -0
  177. package/docs-dist/version.json +7 -0
  178. package/docs-dist/vp-icons.css +1 -0
  179. package/package.json +28 -17
  180. package/.babelrc +0 -7
  181. package/.dockerignore +0 -5
  182. package/.editorconfig +0 -31
  183. package/.eslintrc.json +0 -22
  184. package/.github/workflows/deploy-docs.yml +0 -54
  185. package/.github/workflows/release.yml +0 -37
  186. package/.github/workflows/test.yml +0 -70
  187. package/.husky/commit-msg +0 -1
  188. package/.husky/pre-commit +0 -1
  189. package/.prettierignore +0 -1
  190. package/.prettierrc +0 -9
  191. package/AGENTS.md +0 -153
  192. package/Dockerfile +0 -18
  193. package/QQ/351/237/263/344/271/220-v0.xmind +0 -0
  194. package/QQ/351/237/263/344/271/220-v1.xmind +0 -0
  195. package/app.ts +0 -68
  196. package/commitlint.config.js +0 -20
  197. package/config/user-info.ts +0 -71
  198. package/index.ts +0 -1
  199. package/jest.config.ts +0 -41
  200. package/middlewares/koa-cors.ts +0 -81
  201. package/module/apis/UCommon/UCommon.ts +0 -13
  202. package/module/apis/album/getAlbumInfo.ts +0 -22
  203. package/module/apis/comments/getComments.ts +0 -23
  204. package/module/apis/digitalAlbum/getDigitalAlbumLists.ts +0 -23
  205. package/module/apis/downloadQQMusic.ts +0 -51
  206. package/module/apis/music/getLyric.ts +0 -34
  207. package/module/apis/mv/getMvByTag.ts +0 -24
  208. package/module/apis/radio/getRadioLists.ts +0 -27
  209. package/module/apis/rank/getTopLists.ts +0 -37
  210. package/module/apis/search/getHotKey.ts +0 -24
  211. package/module/apis/search/getSearchByKey.ts +0 -31
  212. package/module/apis/search/getSmartbox.ts +0 -43
  213. package/module/apis/singers/getSimilarSinger.ts +0 -25
  214. package/module/apis/singers/getSingerDesc.ts +0 -25
  215. package/module/apis/singers/getSingerMv.ts +0 -24
  216. package/module/apis/singers/getSingerStarNum.ts +0 -24
  217. package/module/apis/songLists/songListCategories.ts +0 -22
  218. package/module/apis/songLists/songListDetail.ts +0 -27
  219. package/module/apis/songLists/songLists.ts +0 -35
  220. package/module/apis/u_common.ts +0 -29
  221. package/module/apis/user/checkQQLoginQr.ts +0 -230
  222. package/module/apis/user/getQQLoginQr.ts +0 -28
  223. package/module/apis/user/getUserAvatar.ts +0 -32
  224. package/module/apis/user/getUserLikedSongs.ts +0 -145
  225. package/module/apis/user/getUserPlaylists.ts +0 -163
  226. package/module/apis/y_common.ts +0 -44
  227. package/module/config.ts +0 -24
  228. package/module/index.ts +0 -95
  229. package/music.png +0 -0
  230. package/pnpm-workspace.yaml +0 -2
  231. package/public/index.html +0 -430
  232. package/routers/context/batchGetSongInfo.ts +0 -60
  233. package/routers/context/batchGetSongLists.ts +0 -46
  234. package/routers/context/checkQQLoginQr.ts +0 -19
  235. package/routers/context/cookies.ts +0 -38
  236. package/routers/context/getAlbumInfo.ts +0 -31
  237. package/routers/context/getComments.ts +0 -51
  238. package/routers/context/getDigitalAlbumLists.ts +0 -18
  239. package/routers/context/getDownloadQQMusic.ts +0 -17
  240. package/routers/context/getHotkey.ts +0 -25
  241. package/routers/context/getImageUrl.ts +0 -29
  242. package/routers/context/getLyric.ts +0 -32
  243. package/routers/context/getMusicPlay.ts +0 -102
  244. package/routers/context/getMv.ts +0 -61
  245. package/routers/context/getMvByTag.ts +0 -18
  246. package/routers/context/getMvPlay.ts +0 -114
  247. package/routers/context/getNewDisks.ts +0 -58
  248. package/routers/context/getQQLoginQr.ts +0 -16
  249. package/routers/context/getRadioLists.ts +0 -18
  250. package/routers/context/getRanks.ts +0 -67
  251. package/routers/context/getRecommend.ts +0 -92
  252. package/routers/context/getSearchByKey.ts +0 -34
  253. package/routers/context/getSimilarSinger.ts +0 -29
  254. package/routers/context/getSingerAlbum.ts +0 -58
  255. package/routers/context/getSingerDesc.ts +0 -30
  256. package/routers/context/getSingerHotsong.ts +0 -58
  257. package/routers/context/getSingerList.ts +0 -56
  258. package/routers/context/getSingerMv.ts +0 -41
  259. package/routers/context/getSingerStarNum.ts +0 -29
  260. package/routers/context/getSmartbox.ts +0 -27
  261. package/routers/context/getSongInfo.ts +0 -51
  262. package/routers/context/getSongListCategories.ts +0 -23
  263. package/routers/context/getSongListDetail.ts +0 -22
  264. package/routers/context/getSongLists.ts +0 -30
  265. package/routers/context/getTicketInfo.ts +0 -51
  266. package/routers/context/getTopLists.ts +0 -18
  267. package/routers/context/getUserAvatar.ts +0 -53
  268. package/routers/context/getUserLikedSongs.ts +0 -28
  269. package/routers/context/getUserPlaylists.ts +0 -29
  270. package/routers/context/index.ts +0 -87
  271. package/routers/router.ts +0 -88
  272. package/routers/types.ts +0 -18
  273. package/routers/util.ts +0 -231
  274. package/screenshot/album-image.png +0 -0
  275. package/screenshot/batchGetSongInfo.png +0 -0
  276. package/screenshot/batchGetSongLists.png +0 -0
  277. package/screenshot/downloadQQMusic.png +0 -0
  278. package/screenshot/get-album-image.png +0 -0
  279. package/screenshot/get-play-all-data.png +0 -0
  280. package/screenshot/get-song-album-id.png +0 -0
  281. package/screenshot/get-song-id.png +0 -0
  282. package/screenshot/get-song-image.png +0 -0
  283. package/screenshot/getAlbumInfo.png +0 -0
  284. package/screenshot/getComments-id.png +0 -0
  285. package/screenshot/getComments-param.png +0 -0
  286. package/screenshot/getComments.png +0 -0
  287. package/screenshot/getDigitalAlbumLists.png +0 -0
  288. package/screenshot/getLyric-parse.png +0 -0
  289. package/screenshot/getLyric.png +0 -0
  290. package/screenshot/getMusicPlay.png +0 -0
  291. package/screenshot/getMv.png +0 -0
  292. package/screenshot/getMvByTag.png +0 -0
  293. package/screenshot/getMvPlay.png +0 -0
  294. package/screenshot/getNewDisks.png +0 -0
  295. package/screenshot/getRadioLists.png +0 -0
  296. package/screenshot/getRanks.png +0 -0
  297. package/screenshot/getRecommend.png +0 -0
  298. package/screenshot/getSearchByKey.png +0 -0
  299. package/screenshot/getSimilarSinger.png +0 -0
  300. package/screenshot/getSingerAlbum.png +0 -0
  301. package/screenshot/getSingerDesc.png +0 -0
  302. package/screenshot/getSingerHotsong.png +0 -0
  303. package/screenshot/getSingerList.png +0 -0
  304. package/screenshot/getSingerMv-default.png +0 -0
  305. package/screenshot/getSingerMv-listen.png +0 -0
  306. package/screenshot/getSingerMv-time.png +0 -0
  307. package/screenshot/getSingerStarNum.png +0 -0
  308. package/screenshot/getSmartbox.png +0 -0
  309. package/screenshot/getSongInfo.png +0 -0
  310. package/screenshot/getSongListCategories.png +0 -0
  311. package/screenshot/getSongListDetail.png +0 -0
  312. package/screenshot/getSongLists-params.png +0 -0
  313. package/screenshot/getSongLists.png +0 -0
  314. package/screenshot/getTicketInfo.png +0 -0
  315. package/screenshot/getTopLists.png +0 -0
  316. package/screenshot/gethotkey.png +0 -0
  317. package/screenshot/just-get-play-url.png +0 -0
  318. package/screenshot/musicPlay.png +0 -0
  319. package/screenshot/new-feature-error-tips.png +0 -0
  320. package/screenshot/normalize-cookie.png +0 -0
  321. package/screenshot/qq-music-v0.png +0 -0
  322. package/screenshot/qq-music.png +0 -0
  323. package/screenshot/song-image.png +0 -0
  324. package/screenshot/song-quality-128.png +0 -0
  325. package/screenshot/song-quality-m4a.png +0 -0
  326. package/scripts/build-images.js +0 -36
  327. package/scripts/commit-push.sh +0 -103
  328. package/tests/integration/api/api.test.ts +0 -852
  329. package/tests/integration/middleware/cors.test.ts +0 -41
  330. package/tests/setup/jest.setup.ts +0 -15
  331. package/tests/setup/testUtils.ts +0 -35
  332. package/tests/unit/util/request.test.ts +0 -177
  333. package/tsconfig.json +0 -20
  334. package/tsconfig.test.json +0 -8
  335. package/types/api.ts +0 -105
  336. package/types/global.d.ts +0 -26
  337. package/types/index.d.ts +0 -97
  338. package/util/apiResponse.ts +0 -97
  339. package/util/colors.ts +0 -31
  340. package/util/cookie.ts +0 -40
  341. package/util/loginUtils.ts +0 -26
  342. package/util/lyricParse.ts +0 -86
  343. package/util/request.ts +0 -141
  344. package/vercel.json +0 -15
package/CHANGELOG.md CHANGED
@@ -1,70 +1,148 @@
1
- ## [1.0.4](https://github.com/Rain120/qq-music-api/compare/v1.0.3...v1.0.4) (2021-01-25)
1
+ ## 2.2.7 (2026-03-08)
2
2
 
3
3
 
4
- ### Bug Fixes
5
-
6
- * doc screenshot png path ([fe811e2](https://github.com/Rain120/qq-music-api/commit/fe811e26c0c0a2ed468728b0323866bd27b5a404))
7
- * music play url quality; docs about cookie, music play; ([#35](https://github.com/Rain120/qq-music-api/issues/35)) ([f0b7923](https://github.com/Rain120/qq-music-api/commit/f0b7923b9feb7e32c44bc9417c2d426148ab3865))
8
-
9
-
10
-
11
- ## [1.0.3](https://github.com/Rain120/qq-music-api/compare/v1.0.1...v1.0.3) (2021-01-24)
12
-
13
-
14
- ### Bug Fixes
15
-
16
- * doc screenshot png path ([cb8b253](https://github.com/Rain120/qq-music-api/commit/cb8b25358219ca1cc3e973e6f46a3f75bb3b8b29))
17
-
18
-
19
- ### Features
20
4
 
21
- * user cookie ([#32](https://github.com/Rain120/qq-music-api/issues/32)) ([5a32dae](https://github.com/Rain120/qq-music-api/commit/5a32daeca351c7b18352f9267db0c173fef9bff6))
5
+ ## 2.2.7 (2026-03-08)
22
6
 
23
7
 
24
8
 
25
- ## [1.0.1](https://github.com/Rain120/qq-music-api/compare/v1.0.0...v1.0.1) (2020-12-25)
9
+ ## [2.2.6](https://github.com/sansenjian/qq-music-api/compare/2.0.0...2.2.6) (2026-03-08)
26
10
 
27
11
 
28
12
  ### Bug Fixes
29
13
 
30
- * build docker image sh ([fe395a4](https://github.com/Rain120/qq-music-api/commit/fe395a435efc0678d3d387abbcd6b33786bb72fa))
14
+ * 添加向后兼容的路由别名并改进文档 ([5e04b5d](https://github.com/sansenjian/qq-music-api/commit/5e04b5df489857e7c9088d0bc36464d15bfbf5d3))
15
+ * 修复代码审查发现的问题 ([dfee3ee](https://github.com/sansenjian/qq-music-api/commit/dfee3ee8196ba69f744d2c09814fb4583795dcbf))
16
+ * 修复代码审查发现的问题 ([90dfc16](https://github.com/sansenjian/qq-music-api/commit/90dfc1613a5e5195d46a084e2b762f852941d373))
17
+ * 修复代码审查意见 ([a5e08b3](https://github.com/sansenjian/qq-music-api/commit/a5e08b3ef7a6fe9a5b798c5d62f33fb09e453ece))
18
+ * 修复代码审查意见 ([ab7ff6e](https://github.com/sansenjian/qq-music-api/commit/ab7ff6e056eac5c0b2c9cf8127ea8c7a12e86cfe))
19
+ * 优化代码并修复向后兼容性问题 ([331b8cb](https://github.com/sansenjian/qq-music-api/commit/331b8cbd41fc3b59e435da7ccaf2bde6bf6aec2a))
20
+ * add error handling to version bump step ([f393c6e](https://github.com/sansenjian/qq-music-api/commit/f393c6e7f515b47ba9d357638679569ffc713449))
21
+ * add GET/POST methods to axios mock for CI compatibility ([14825c6](https://github.com/sansenjian/qq-music-api/commit/14825c617b515996654ee494fd1bcfe355ea290d))
22
+ * address code review feedback ([e39d90b](https://github.com/sansenjian/qq-music-api/commit/e39d90b298be6bf5cb40acdc3b45bcc2c7840b8c))
23
+ * address code review feedback ([1675b53](https://github.com/sansenjian/qq-music-api/commit/1675b538183721d3197d0c63539e1755b06d905c))
24
+ * address second round review feedback for QR login and docs ([5a00bd5](https://github.com/sansenjian/qq-music-api/commit/5a00bd519b766b7ecad08a3bccda9e3ca3ba63ff))
25
+ * disable npm cache in test workflow ([4293012](https://github.com/sansenjian/qq-music-api/commit/4293012959c0c755ba5a6e799bf807dff20e032a))
26
+ * handle array-type cookie parameter in recommend controllers ([efb0283](https://github.com/sansenjian/qq-music-api/commit/efb0283474e655dd5b970aea23c0157769371586))
27
+ * improve bump-version.js script ([6c47d18](https://github.com/sansenjian/qq-music-api/commit/6c47d180b32addc68bb2a7ffd796e64ec51cdc09))
28
+ * improve version.yml workflow ([c4964f0](https://github.com/sansenjian/qq-music-api/commit/c4964f0ceed2373b213cd91922fba67e9eca0607))
29
+ * remove .babelrc and add .npmrc to disable package-lock ([8f49ed0](https://github.com/sansenjian/qq-music-api/commit/8f49ed01542d1f0f5ac87d88114a568b5b4165a9))
30
+ * remove npm cache from all GitHub Actions workflows ([b2a5eec](https://github.com/sansenjian/qq-music-api/commit/b2a5eecb220b7cca036a3e4780a9044dd7c1509e))
31
+ * remove npm cache from GitHub Actions (no package-lock.json) ([f057955](https://github.com/sansenjian/qq-music-api/commit/f057955d7decbe58422115f9dd61b5cbeaa8a8c1))
32
+ * resolve review feedback and test compatibility ([36796a5](https://github.com/sansenjian/qq-music-api/commit/36796a5d03bf039218a880c920fbe9955c20069c))
33
+ * resolve VitePress build errors in README.md ([00c5d47](https://github.com/sansenjian/qq-music-api/commit/00c5d47e43d440e73f3aae9fe0471bf83cf4cd53))
34
+ * simplify API tests and update Node.js versions to 20, 22, 24 ([b52a783](https://github.com/sansenjian/qq-music-api/commit/b52a78359201918010862cc7ad1eb5c1d17fc648))
35
+ * simplify axios mock with default resolved value ([a23139a](https://github.com/sansenjian/qq-music-api/commit/a23139a568c6ca666206af6849adaeb1dec1989c))
36
+ * simplify publish workflow to only publish to NPM ([8cd1874](https://github.com/sansenjian/qq-music-api/commit/8cd1874e869d4573845196f9ed5b4204203a06d1))
37
+ * suppress error logs in test environment ([838c841](https://github.com/sansenjian/qq-music-api/commit/838c8411df20630df7029d000f4bad5b6396cb42))
38
+ * update GitHub Actions to use v4 versions ([55ce670](https://github.com/sansenjian/qq-music-api/commit/55ce670417b3cfa2e825d97d21fcc6331738f02e))
39
+ * use computed version in GitHub Release ([75accbf](https://github.com/sansenjian/qq-music-api/commit/75accbf60f9d95350857f5723e7c85acf84e99db))
40
+ * use UserInfo type from global.d.ts in cookie.ts ([fbf8f1c](https://github.com/sansenjian/qq-music-api/commit/fbf8f1ccb964cdeb44bbd9bc6e2b80ccae81e62e))
31
41
 
32
42
 
33
43
  ### Features
34
44
 
35
- * docker build images to hub for docker env run ([dcbbf95](https://github.com/Rain120/qq-music-api/commit/dcbbf95e70b305cd2ad4d00a7cc0bd4db5d0f8ab))
36
- * docker repository version ([d74a425](https://github.com/Rain120/qq-music-api/commit/d74a4251da8c0c2dac2f5e4251e91f288f732d43))
45
+ * 配置同时发布到 NPM GitHub Packages ([a1d6633](https://github.com/sansenjian/qq-music-api/commit/a1d66337cf7341c783ce4700037e57f5083c68c5))
46
+ * 迁移到 VitePress 文档系统并添加 GitHub Pages 部署 ([afc0062](https://github.com/sansenjian/qq-music-api/commit/afc00621f465835c6a551bd96cd10f32d3fbb271))
47
+ * 添加获取用户喜欢的歌曲接口 (getUserLikedSongs) ([e9c8217](https://github.com/sansenjian/qq-music-api/commit/e9c82172ce6e669d0bf663704be70664cb47c2b6))
48
+ * add bump-version script to avoid triggering version lifecycle ([e44fa12](https://github.com/sansenjian/qq-music-api/commit/e44fa128c8321afb14d2233b001db1f12172eeed))
49
+ * add CHANGELOG and version.json generation to bump-version script ([6dc35ec](https://github.com/sansenjian/qq-music-api/commit/6dc35ec0fc17552d38d3c9736861150bf8042e4e))
50
+ * add GitHub Packages publishing back ([7d30b2c](https://github.com/sansenjian/qq-music-api/commit/7d30b2c607b71895a40e209fa86f882fb0ee7949))
51
+ * add test infrastructure and fix router compatibility ([863daba](https://github.com/sansenjian/qq-music-api/commit/863daba59a7382bc57528b0da04d0511bbb91bc5))
52
+ * auto-detect version from package.json in release workflow ([f90c097](https://github.com/sansenjian/qq-music-api/commit/f90c0974bf72fce413d7b82b7d693c2e7fa6c139))
53
+ * complete release workflow refactoring and ESLint configuration ([de415ef](https://github.com/sansenjian/qq-music-api/commit/de415efe92bd1911bc71c22f4ebd72f818f965d9))
54
+ * rename release.yml to package.yml ([500c235](https://github.com/sansenjian/qq-music-api/commit/500c235eec4a71dca5d21881a4cc508413ae1b73))
55
+ * update release automation workflow ([ad6871b](https://github.com/sansenjian/qq-music-api/commit/ad6871b11f732f1985d7e4199522c0257bdbaf57))
37
56
 
38
57
 
39
58
 
40
- # [1.0.0](https://github.com/Rain120/qq-music-api/compare/4d79041a5e5712c0c6bc6e6d55045f732636c80f...v1.0.0) (2020-09-15)
59
+ ## [2.2.6](https://github.com/sansenjian/qq-music-api/compare/2.0.0...2.2.6) (2026-03-08)
41
60
 
42
61
 
43
62
  ### Bug Fixes
44
63
 
45
- * bug about search by key https://github.com/Rain120/qq-music-api/issues/28 ([12b7d66](https://github.com/Rain120/qq-music-api/commit/12b7d667c05f92ad61545c5f75a82d878ad3220c))
46
- * getComment ([#26](https://github.com/Rain120/qq-music-api/issues/26)) ([9e62be5](https://github.com/Rain120/qq-music-api/commit/9e62be539b3b78cdf0eea3e1696d9505ab242756))
47
- * getSingerHotsong pagination ([#19](https://github.com/Rain120/qq-music-api/issues/19)) ([9bb705a](https://github.com/Rain120/qq-music-api/commit/9bb705a1b6eb4e2577ba20f0a279ccb63112390d))
48
- * getSingerHotsong pagination ([#22](https://github.com/Rain120/qq-music-api/issues/22)) ([6d6dbf3](https://github.com/Rain120/qq-music-api/commit/6d6dbf36c545269ad7a6138e711e436a90d61e28))
49
- * issue 14 about getRank topId was invalid ([024096f](https://github.com/Rain120/qq-music-api/commit/024096fa63144391680f1d6ec376929fee697c37))
50
- * issue 14 about getRank which bug about period change by qq music api ([f13d2b5](https://github.com/Rain120/qq-music-api/commit/f13d2b540d860994600cc2728e4d848df574b2f4))
51
- * issue: 12 -> (getHotkey -> getHotKey); axios option error; ([ee0371b](https://github.com/Rain120/qq-music-api/commit/ee0371b32352546feb8b60b7725dc3ff66a412ef))
52
- * issue: 12, require getHotkey Camel-Case bug ([0eb9297](https://github.com/Rain120/qq-music-api/commit/0eb9297ff19773ef2d61377f341937f20a70d6a4))
53
- * mv params bug: https://github.com/Rain120/qq-music-api/issues/16\#issuecomment-638230301 ([8f29b87](https://github.com/Rain120/qq-music-api/commit/8f29b874705ab0638310bcc13781a5599ab9de4d)), closes [#issuecomment-638230301](https://github.com/Rain120/qq-music-api/issues/issuecomment-638230301)
54
- * song list params bug: https://github.com/Rain120/qq-music-api/issues/16 ([d9fb973](https://github.com/Rain120/qq-music-api/commit/d9fb9732f546cb76f208053a8dabd164aad893c5))
64
+ * 改进 cookie 处理逻辑 ([b0ab900](https://github.com/sansenjian/qq-music-api/commit/b0ab900150ae405e3ff1143b19ed48e6a75682a1))
65
+ * 添加向后兼容的路由别名并改进文档 ([5e04b5d](https://github.com/sansenjian/qq-music-api/commit/5e04b5df489857e7c9088d0bc36464d15bfbf5d3))
66
+ * 修复代码审查发现的多个问题 ([21f9c2f](https://github.com/sansenjian/qq-music-api/commit/21f9c2fa4d810c17c101b7ba4684c448e52ce298))
67
+ * 修复代码审查发现的更多问题 ([e2a971e](https://github.com/sansenjian/qq-music-api/commit/e2a971e066a763060dcf586889fc7aaa0e0e387c))
68
+ * 修复代码审查发现的问题 ([dfee3ee](https://github.com/sansenjian/qq-music-api/commit/dfee3ee8196ba69f744d2c09814fb4583795dcbf))
69
+ * 修复代码审查发现的问题 ([90dfc16](https://github.com/sansenjian/qq-music-api/commit/90dfc1613a5e5195d46a084e2b762f852941d373))
70
+ * 修复代码审查发现的问题 ([7f68957](https://github.com/sansenjian/qq-music-api/commit/7f68957079d26b91b5910961b0eacca51a6e497e))
71
+ * 修复代码审查意见 ([a5e08b3](https://github.com/sansenjian/qq-music-api/commit/a5e08b3ef7a6fe9a5b798c5d62f33fb09e453ece))
72
+ * 修复代码审查意见 ([ab7ff6e](https://github.com/sansenjian/qq-music-api/commit/ab7ff6e056eac5c0b2c9cf8127ea8c7a12e86cfe))
73
+ * 修复设置 cookie 也不能获取 vip 歌曲下载链接 [#91](https://github.com/sansenjian/qq-music-api/issues/91) [#49](https://github.com/sansenjian/qq-music-api/issues/49) ([#94](https://github.com/sansenjian/qq-music-api/issues/94)) ([fb7a1b1](https://github.com/sansenjian/qq-music-api/commit/fb7a1b132485f3505cd263b1ed3e3fd43ad15ba7))
74
+ * 优化代码并修复向后兼容性问题 ([331b8cb](https://github.com/sansenjian/qq-music-api/commit/331b8cbd41fc3b59e435da7ccaf2bde6bf6aec2a))
75
+ * add error handling to version bump step ([f393c6e](https://github.com/sansenjian/qq-music-api/commit/f393c6e7f515b47ba9d357638679569ffc713449))
76
+ * add GET/POST methods to axios mock for CI compatibility ([14825c6](https://github.com/sansenjian/qq-music-api/commit/14825c617b515996654ee494fd1bcfe355ea290d))
77
+ * address code review feedback ([e39d90b](https://github.com/sansenjian/qq-music-api/commit/e39d90b298be6bf5cb40acdc3b45bcc2c7840b8c))
78
+ * address code review feedback ([1675b53](https://github.com/sansenjian/qq-music-api/commit/1675b538183721d3197d0c63539e1755b06d905c))
79
+ * address second round review feedback for QR login and docs ([5a00bd5](https://github.com/sansenjian/qq-music-api/commit/5a00bd519b766b7ecad08a3bccda9e3ca3ba63ff))
80
+ * bug about search by key https://github.com/Rain120/qq-music-api/issues/28 ([12b7d66](https://github.com/sansenjian/qq-music-api/commit/12b7d667c05f92ad61545c5f75a82d878ad3220c))
81
+ * build docker image sh ([fe395a4](https://github.com/sansenjian/qq-music-api/commit/fe395a435efc0678d3d387abbcd6b33786bb72fa))
82
+ * cookies not set ([#36](https://github.com/sansenjian/qq-music-api/issues/36)) ([50c7def](https://github.com/sansenjian/qq-music-api/commit/50c7def9caf676161e8eee7e8dfc25df9afc386b))
83
+ * correct syntax errors ([#66](https://github.com/sansenjian/qq-music-api/issues/66)) ([9aaf39d](https://github.com/sansenjian/qq-music-api/commit/9aaf39d7699e7affd907cb902afa548b1e0be50c))
84
+ * disable npm cache in test workflow ([4293012](https://github.com/sansenjian/qq-music-api/commit/4293012959c0c755ba5a6e799bf807dff20e032a))
85
+ * doc screenshot png path ([fe811e2](https://github.com/sansenjian/qq-music-api/commit/fe811e26c0c0a2ed468728b0323866bd27b5a404))
86
+ * doc screenshot png path ([cb8b253](https://github.com/sansenjian/qq-music-api/commit/cb8b25358219ca1cc3e973e6f46a3f75bb3b8b29))
87
+ * get ranks song list not mid ([e2c0330](https://github.com/sansenjian/qq-music-api/commit/e2c0330950c1c17062220ef99ac2dbf6c437ff30))
88
+ * getComment ([#26](https://github.com/sansenjian/qq-music-api/issues/26)) ([9e62be5](https://github.com/sansenjian/qq-music-api/commit/9e62be539b3b78cdf0eea3e1696d9505ab242756))
89
+ * getSearchByKey is null with https://github.com/Rain120/qq-music-api/issues/68 ([339efc3](https://github.com/sansenjian/qq-music-api/commit/339efc3b3736d9ce9b5fb29aa33c3928c255b8a4))
90
+ * getSingerHotsong pagination ([#19](https://github.com/sansenjian/qq-music-api/issues/19)) ([9bb705a](https://github.com/sansenjian/qq-music-api/commit/9bb705a1b6eb4e2577ba20f0a279ccb63112390d))
91
+ * getSingerHotsong pagination ([#22](https://github.com/sansenjian/qq-music-api/issues/22)) ([6d6dbf3](https://github.com/sansenjian/qq-music-api/commit/6d6dbf36c545269ad7a6138e711e436a90d61e28))
92
+ * google analysis not data ([53e0a8c](https://github.com/sansenjian/qq-music-api/commit/53e0a8c17e84aeba568608be89fd3fc8ddc75e88))
93
+ * handle array-type cookie parameter in recommend controllers ([efb0283](https://github.com/sansenjian/qq-music-api/commit/efb0283474e655dd5b970aea23c0157769371586))
94
+ * improve bump-version.js script ([6c47d18](https://github.com/sansenjian/qq-music-api/commit/6c47d180b32addc68bb2a7ffd796e64ec51cdc09))
95
+ * improve version.yml workflow ([c4964f0](https://github.com/sansenjian/qq-music-api/commit/c4964f0ceed2373b213cd91922fba67e9eca0607))
96
+ * issue 14 about getRank topId was invalid ([024096f](https://github.com/sansenjian/qq-music-api/commit/024096fa63144391680f1d6ec376929fee697c37))
97
+ * issue 14 about getRank which bug about period change by qq music api ([f13d2b5](https://github.com/sansenjian/qq-music-api/commit/f13d2b540d860994600cc2728e4d848df574b2f4))
98
+ * issue: 12 -> (getHotkey -> getHotKey); axios option error; ([ee0371b](https://github.com/sansenjian/qq-music-api/commit/ee0371b32352546feb8b60b7725dc3ff66a412ef))
99
+ * issue: 12, require getHotkey Camel-Case bug ([0eb9297](https://github.com/sansenjian/qq-music-api/commit/0eb9297ff19773ef2d61377f341937f20a70d6a4))
100
+ * music play url quality; docs about cookie, music play; ([#35](https://github.com/sansenjian/qq-music-api/issues/35)) ([f0b7923](https://github.com/sansenjian/qq-music-api/commit/f0b7923b9feb7e32c44bc9417c2d426148ab3865))
101
+ * mv params bug: https://github.com/Rain120/qq-music-api/issues/16\#issuecomment-638230301 ([8f29b87](https://github.com/sansenjian/qq-music-api/commit/8f29b874705ab0638310bcc13781a5599ab9de4d)), closes [#issuecomment-638230301](https://github.com/sansenjian/qq-music-api/issues/issuecomment-638230301)
102
+ * remove .babelrc and add .npmrc to disable package-lock ([8f49ed0](https://github.com/sansenjian/qq-music-api/commit/8f49ed01542d1f0f5ac87d88114a568b5b4165a9))
103
+ * remove npm cache from all GitHub Actions workflows ([b2a5eec](https://github.com/sansenjian/qq-music-api/commit/b2a5eecb220b7cca036a3e4780a9044dd7c1509e))
104
+ * remove npm cache from GitHub Actions (no package-lock.json) ([f057955](https://github.com/sansenjian/qq-music-api/commit/f057955d7decbe58422115f9dd61b5cbeaa8a8c1))
105
+ * resolve review feedback and test compatibility ([36796a5](https://github.com/sansenjian/qq-music-api/commit/36796a5d03bf039218a880c920fbe9955c20069c))
106
+ * resolve VitePress build errors in README.md ([00c5d47](https://github.com/sansenjian/qq-music-api/commit/00c5d47e43d440e73f3aae9fe0471bf83cf4cd53))
107
+ * set cookies maxAge ([fac30d6](https://github.com/sansenjian/qq-music-api/commit/fac30d6702c49a2871c7f9d8ac1efcd55de9fbac))
108
+ * simplify API tests and update Node.js versions to 20, 22, 24 ([b52a783](https://github.com/sansenjian/qq-music-api/commit/b52a78359201918010862cc7ad1eb5c1d17fc648))
109
+ * simplify axios mock with default resolved value ([a23139a](https://github.com/sansenjian/qq-music-api/commit/a23139a568c6ca666206af6849adaeb1dec1989c))
110
+ * simplify publish workflow to only publish to NPM ([8cd1874](https://github.com/sansenjian/qq-music-api/commit/8cd1874e869d4573845196f9ed5b4204203a06d1))
111
+ * song list params bug: https://github.com/Rain120/qq-music-api/issues/16 ([d9fb973](https://github.com/sansenjian/qq-music-api/commit/d9fb9732f546cb76f208053a8dabd164aad893c5))
112
+ * suppress error logs in test environment ([838c841](https://github.com/sansenjian/qq-music-api/commit/838c8411df20630df7029d000f4bad5b6396cb42))
113
+ * update GitHub Actions to use v4 versions ([55ce670](https://github.com/sansenjian/qq-music-api/commit/55ce670417b3cfa2e825d97d21fcc6331738f02e))
114
+ * use computed version in GitHub Release ([75accbf](https://github.com/sansenjian/qq-music-api/commit/75accbf60f9d95350857f5723e7c85acf84e99db))
115
+ * use UserInfo type from global.d.ts in cookie.ts ([fbf8f1c](https://github.com/sansenjian/qq-music-api/commit/fbf8f1ccb964cdeb44bbd9bc6e2b80ccae81e62e))
55
116
 
56
117
 
57
118
  ### Features
58
119
 
59
- * add song list ([c0e8de8](https://github.com/Rain120/qq-music-api/commit/c0e8de86dd93a907aa75e838c18d967b1434493d))
60
- * batch get song info ([0ac4cfc](https://github.com/Rain120/qq-music-api/commit/0ac4cfca38e15e727d79f76c39e729a0ff3abc16))
61
- * batch get songlist ([facc3cb](https://github.com/Rain120/qq-music-api/commit/facc3cbf7a44fbeb1db48bfa0c18e7918938b21c))
62
- * eslint + prettier + commitlint + changelog + editorconfig ([e547ca3](https://github.com/Rain120/qq-music-api/commit/e547ca3c43db052769a06f5e0090a29749b721d5))
63
- * get song info; rebuild the axios request, cut down route params ([4d79041](https://github.com/Rain120/qq-music-api/commit/4d79041a5e5712c0c6bc6e6d55045f732636c80f))
64
- * getImageUrl; commit push shell; ([69f257a](https://github.com/Rain120/qq-music-api/commit/69f257a41d5d4746dce306c84ff902358a0d391c))
65
- * rebuild router and axios ([0b737df](https://github.com/Rain120/qq-music-api/commit/0b737df8971a560119af2bcae199a1ea5549859c))
66
- * rebuild router for lost ([2165b6a](https://github.com/Rain120/qq-music-api/commit/2165b6a8b5527bb2b68592b17e28846fce1e856f))
67
- * rebuild routers ([1278008](https://github.com/Rain120/qq-music-api/commit/1278008d57bd8fb4bced800c3de6c6f16f0aee8f))
120
+ * 配置同时发布到 NPM GitHub Packages ([a1d6633](https://github.com/sansenjian/qq-music-api/commit/a1d66337cf7341c783ce4700037e57f5083c68c5))
121
+ * 迁移到 VitePress 文档系统并添加 GitHub Pages 部署 ([afc0062](https://github.com/sansenjian/qq-music-api/commit/afc00621f465835c6a551bd96cd10f32d3fbb271))
122
+ * 添加获取用户喜欢的歌曲接口 (getUserLikedSongs) ([e9c8217](https://github.com/sansenjian/qq-music-api/commit/e9c82172ce6e669d0bf663704be70664cb47c2b6))
123
+ * 依赖现代化升级 v1.1.7 ([45dc7b3](https://github.com/sansenjian/qq-music-api/commit/45dc7b31169585396125e226c634a17cb0e829cc))
124
+ * add bump-version script to avoid triggering version lifecycle ([e44fa12](https://github.com/sansenjian/qq-music-api/commit/e44fa128c8321afb14d2233b001db1f12172eeed))
125
+ * add CHANGELOG and version.json generation to bump-version script ([6dc35ec](https://github.com/sansenjian/qq-music-api/commit/6dc35ec0fc17552d38d3c9736861150bf8042e4e))
126
+ * add GitHub Packages publishing back ([7d30b2c](https://github.com/sansenjian/qq-music-api/commit/7d30b2c607b71895a40e209fa86f882fb0ee7949))
127
+ * add song list ([c0e8de8](https://github.com/sansenjian/qq-music-api/commit/c0e8de86dd93a907aa75e838c18d967b1434493d))
128
+ * add test infrastructure and fix router compatibility ([863daba](https://github.com/sansenjian/qq-music-api/commit/863daba59a7382bc57528b0da04d0511bbb91bc5))
129
+ * auto-detect version from package.json in release workflow ([f90c097](https://github.com/sansenjian/qq-music-api/commit/f90c0974bf72fce413d7b82b7d693c2e7fa6c139))
130
+ * batch get song info ([0ac4cfc](https://github.com/sansenjian/qq-music-api/commit/0ac4cfca38e15e727d79f76c39e729a0ff3abc16))
131
+ * batch get songlist ([facc3cb](https://github.com/sansenjian/qq-music-api/commit/facc3cbf7a44fbeb1db48bfa0c18e7918938b21c))
132
+ * complete release workflow refactoring and ESLint configuration ([de415ef](https://github.com/sansenjian/qq-music-api/commit/de415efe92bd1911bc71c22f4ebd72f818f965d9))
133
+ * docker build images to hub for docker env run ([dcbbf95](https://github.com/sansenjian/qq-music-api/commit/dcbbf95e70b305cd2ad4d00a7cc0bd4db5d0f8ab))
134
+ * docker repository version ([d74a425](https://github.com/sansenjian/qq-music-api/commit/d74a4251da8c0c2dac2f5e4251e91f288f732d43))
135
+ * eslint + prettier + commitlint + changelog + editorconfig ([e547ca3](https://github.com/sansenjian/qq-music-api/commit/e547ca3c43db052769a06f5e0090a29749b721d5))
136
+ * get song info; rebuild the axios request, cut down route params ([4d79041](https://github.com/sansenjian/qq-music-api/commit/4d79041a5e5712c0c6bc6e6d55045f732636c80f))
137
+ * getImageUrl; commit push shell; ([69f257a](https://github.com/sansenjian/qq-music-api/commit/69f257a41d5d4746dce306c84ff902358a0d391c))
138
+ * rebuild router and axios ([0b737df](https://github.com/sansenjian/qq-music-api/commit/0b737df8971a560119af2bcae199a1ea5549859c))
139
+ * rebuild router for lost ([2165b6a](https://github.com/sansenjian/qq-music-api/commit/2165b6a8b5527bb2b68592b17e28846fce1e856f))
140
+ * rebuild routers ([1278008](https://github.com/sansenjian/qq-music-api/commit/1278008d57bd8fb4bced800c3de6c6f16f0aee8f))
141
+ * rename release.yml to package.yml ([500c235](https://github.com/sansenjian/qq-music-api/commit/500c235eec4a71dca5d21881a4cc508413ae1b73))
142
+ * update change log ([2c1d09d](https://github.com/sansenjian/qq-music-api/commit/2c1d09d9de5e0b3daec818311cf4156de386f7d2))
143
+ * update google analysis id ([4b1ca9d](https://github.com/sansenjian/qq-music-api/commit/4b1ca9de2cd884f18724197f8cf20854334c0445))
144
+ * update release automation workflow ([ad6871b](https://github.com/sansenjian/qq-music-api/commit/ad6871b11f732f1985d7e4199522c0257bdbaf57))
145
+ * user cookie ([#32](https://github.com/sansenjian/qq-music-api/issues/32)) ([5a32dae](https://github.com/sansenjian/qq-music-api/commit/5a32daeca351c7b18352f9267db0c173fef9bff6))
68
146
 
69
147
 
70
148
 
package/dist/app.js ADDED
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ require("reflect-metadata");
7
+ const koa_1 = __importDefault(require("koa"));
8
+ const koa_bodyparser_1 = __importDefault(require("koa-bodyparser"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const koa_static_1 = __importDefault(require("koa-static"));
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const koa_cors_1 = __importDefault(require("./middlewares/koa-cors"));
13
+ const router_1 = __importDefault(require("./routers/router"));
14
+ const cookie_1 = __importDefault(require("./util/cookie"));
15
+ const colors_1 = __importDefault(require("./util/colors"));
16
+ const user_info_1 = __importDefault(require("./config/user-info"));
17
+ const package_json_1 = __importDefault(require("./package.json"));
18
+ const app = new koa_1.default();
19
+ global.userInfo = user_info_1.default;
20
+ console.log(chalk_1.default.green('\n🥳🎉 We had supported config the user cookies. \n'));
21
+ console.log(colors_1.default.info(`Current Version: ${package_json_1.default.version}`));
22
+ if (!(global.userInfo.loginUin || global.userInfo.uin)) {
23
+ console.log(chalk_1.default.yellow(`😔 The configuration ${chalk_1.default.red('loginUin')} or your ${chalk_1.default.red('cookie')} in file ${chalk_1.default.green('config/user-info')} has not configured. \n`));
24
+ }
25
+ if (!global.userInfo.cookie) {
26
+ console.log(chalk_1.default.yellow(`😔 The configuration ${chalk_1.default.red('cookie')} in file ${chalk_1.default.green('config/user-info')} has not configured. \n`));
27
+ }
28
+ app.use((0, koa_bodyparser_1.default)());
29
+ app.use((0, cookie_1.default)());
30
+ app.use((0, koa_static_1.default)(path_1.default.join(__dirname, 'public')));
31
+ // logger
32
+ app.use(async (ctx, next) => {
33
+ await next();
34
+ const rt = ctx.response.get('X-Response-Time');
35
+ console.log(colors_1.default.prompt(`${ctx.method} ${ctx.url} - ${rt}`));
36
+ });
37
+ // cors
38
+ app.use((0, koa_cors_1.default)({
39
+ origin: ctx => ctx.request.header?.origin || '*',
40
+ exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
41
+ maxAge: 5,
42
+ credentials: true,
43
+ allowMethods: ['GET', 'POST', 'DELETE'],
44
+ allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
45
+ }));
46
+ // x-response-time
47
+ app.use(async (ctx, next) => {
48
+ const start = Date.now();
49
+ await next();
50
+ const ms = Date.now() - start;
51
+ ctx.set('X-Response-Time', `${ms}ms`);
52
+ });
53
+ app.use(router_1.default.routes())
54
+ .use(router_1.default.allowedMethods());
55
+ const PORT = typeof process.env.PORT === 'string' ? parseInt(process.env.PORT, 10) : (process.env.PORT || 3200);
56
+ app.listen(PORT, () => {
57
+ console.log(colors_1.default.prompt(`server running @ http://localhost:${PORT}`));
58
+ });
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ let userInfo = { loginUin: '', cookie: '', cookieList: [], cookieObject: {}, refreshData: () => ({}) };
9
+ let cookieList = [];
10
+ let cookieObject = {};
11
+ const infoPath = path_1.default.join(__dirname, './user-info.json');
12
+ if (!fs_1.default.existsSync(infoPath)) {
13
+ fs_1.default.writeFileSync(infoPath, '{}', 'utf-8');
14
+ }
15
+ const initData = () => {
16
+ try {
17
+ const parsed = JSON.parse(fs_1.default.readFileSync(infoPath, 'utf-8'));
18
+ userInfo = {
19
+ loginUin: parsed.loginUin || '',
20
+ cookie: parsed.cookie || '',
21
+ cookieList: [],
22
+ cookieObject: {},
23
+ refreshData: () => ({})
24
+ };
25
+ }
26
+ catch (e) {
27
+ userInfo = { loginUin: '', cookie: '', cookieList: [], cookieObject: {}, refreshData: () => ({}) };
28
+ }
29
+ cookieList = (userInfo.cookie || '').split('; ').map(_ => _.trim());
30
+ cookieObject = {};
31
+ cookieList.filter(Boolean).forEach(_ => {
32
+ if (_) {
33
+ const [key, value = ''] = _.split('=');
34
+ cookieObject[key] = value;
35
+ }
36
+ });
37
+ };
38
+ const refreshData = (cookie) => {
39
+ const uinMatch = cookie.match(/ uin=([^;]+)/);
40
+ const uin = uinMatch ? uinMatch[1] : '';
41
+ fs_1.default.writeFileSync(infoPath, JSON.stringify({ loginUin: uin, cookie }), 'utf-8');
42
+ initData();
43
+ return {
44
+ ...userInfo,
45
+ uin: userInfo.loginUin || cookieObject.uin,
46
+ cookieList,
47
+ cookieObject
48
+ };
49
+ };
50
+ initData();
51
+ const exportObj = {
52
+ loginUin: userInfo?.loginUin || '',
53
+ uin: userInfo?.loginUin || cookieObject?.uin || '',
54
+ cookie: userInfo?.cookie || '',
55
+ cookieList: cookieList || [],
56
+ cookieObject: cookieObject || {},
57
+ refreshData
58
+ };
59
+ exports.default = exportObj;
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("./app");
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config = {
4
+ preset: 'ts-jest',
5
+ testEnvironment: 'node',
6
+ testMatch: ['**/tests/**/*.test.ts'],
7
+ collectCoverageFrom: [
8
+ 'module/**/*.ts',
9
+ 'routers/**/*.ts',
10
+ 'util/**/*.ts',
11
+ '!**/node_modules/**',
12
+ '!**/tests/**',
13
+ '!**/dist/**'
14
+ ],
15
+ coverageDirectory: 'coverage',
16
+ coverageReporters: ['text', 'lcov', 'html'],
17
+ coverageThreshold: {
18
+ global: {
19
+ branches: 35,
20
+ functions: 40,
21
+ lines: 50,
22
+ statements: 50
23
+ }
24
+ },
25
+ setupFilesAfterEnv: ['<rootDir>/tests/setup/jest.setup.ts'],
26
+ modulePathIgnorePatterns: ['<rootDir>/dist/'],
27
+ testTimeout: 10000,
28
+ verbose: true,
29
+ moduleNameMapper: {
30
+ '^@module/(.*)$': '<rootDir>/module/$1',
31
+ '^@routers/(.*)$': '<rootDir>/routers/$1',
32
+ '^@util/(.*)$': '<rootDir>/util/$1'
33
+ },
34
+ transform: {
35
+ '^.+[.]ts$': ['ts-jest', {
36
+ tsconfig: 'tsconfig.test.json'
37
+ }]
38
+ }
39
+ };
40
+ exports.default = config;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function crossOrigin(options = {}) {
4
+ const defaultOptions = {
5
+ allowMethods: ['GET', 'PUT', 'POST', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
6
+ };
7
+ options = Object.assign({}, defaultOptions, options);
8
+ return async function cors(ctx, next) {
9
+ ctx.vary('Origin');
10
+ let origin;
11
+ if (typeof options.origin === 'function') {
12
+ origin = options.origin(ctx);
13
+ }
14
+ else {
15
+ origin = options.origin || ctx.get('Origin') || '*';
16
+ }
17
+ if (!origin) {
18
+ return await next();
19
+ }
20
+ ctx.set('Access-Control-Allow-Origin', origin);
21
+ if (ctx.method === 'OPTIONS') {
22
+ if (!ctx.get('Access-Control-Request-Method')) {
23
+ return await next();
24
+ }
25
+ if (options.maxAge) {
26
+ ctx.set('Access-Control-Max-Age', String(options.maxAge));
27
+ }
28
+ if (options.credentials === true) {
29
+ ctx.set('Access-Control-Allow-Credentials', 'true');
30
+ }
31
+ if (options.allowMethods) {
32
+ ctx.set('Access-Control-Allow-Methods', options.allowMethods.join(','));
33
+ }
34
+ if (options.allowHeaders) {
35
+ ctx.set('Access-Control-Allow-Headers', options.allowHeaders.join(','));
36
+ }
37
+ else {
38
+ ctx.set('Access-Control-Allow-Headers', ctx.get('Access-Control-Request-Headers'));
39
+ }
40
+ ctx.status = 204;
41
+ }
42
+ else {
43
+ if (options.credentials === true) {
44
+ if (origin === '*') {
45
+ ctx.remove('Access-Control-Allow-Credentials');
46
+ }
47
+ else {
48
+ ctx.set('Access-Control-Allow-Credentials', 'true');
49
+ }
50
+ }
51
+ if (options.exposeHeaders) {
52
+ ctx.set('Access-Control-Expose-Headers', options.exposeHeaders.join(','));
53
+ }
54
+ try {
55
+ await next();
56
+ }
57
+ catch (err) {
58
+ throw err;
59
+ }
60
+ }
61
+ };
62
+ }
63
+ exports.default = crossOrigin;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const u_common_1 = __importDefault(require("../u_common"));
7
+ exports.default = ({ method = 'get', params = {}, option = {} }) => {
8
+ const options = { ...option, params };
9
+ return (0, u_common_1.default)({ method, options });
10
+ };
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const apiResponse_1 = require("../../../util/apiResponse");
7
+ const y_common_1 = __importDefault(require("../y_common"));
8
+ exports.default = async ({ method = 'get', params = {}, option = {} }) => {
9
+ const data = {
10
+ ...params,
11
+ format: 'json',
12
+ outCharset: 'utf-8'
13
+ };
14
+ const options = {
15
+ ...option,
16
+ params: data
17
+ };
18
+ return (0, apiResponse_1.handleApi)((0, y_common_1.default)({
19
+ url: '/v8/fcg-bin/fcg_v8_album_info_cp.fcg',
20
+ method: method,
21
+ options
22
+ }));
23
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const apiResponse_1 = require("../../../util/apiResponse");
7
+ const y_common_1 = __importDefault(require("../y_common"));
8
+ exports.default = async ({ method = 'get', params = {}, option = {} }) => {
9
+ const data = {
10
+ ...params,
11
+ format: 'json',
12
+ outCharset: 'GB2312',
13
+ domain: 'qq.com',
14
+ ct: 24,
15
+ cv: 10101010,
16
+ needmusiccrit: 0
17
+ };
18
+ const options = { ...option, params: data };
19
+ return (0, apiResponse_1.handleApi)((0, y_common_1.default)({
20
+ url: '/base/fcgi-bin/fcg_global_comment_h5.fcg',
21
+ method: method,
22
+ options
23
+ }));
24
+ };
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const request_1 = __importDefault(require("../../../util/request"));
7
+ const apiResponse_1 = require("../../../util/apiResponse");
8
+ exports.default = async ({ method = 'get', params = {}, option = {} }) => {
9
+ const data = Object.assign(params, {
10
+ format: 'json',
11
+ outCharset: 'utf-8',
12
+ cmd: 'pc_index_new'
13
+ });
14
+ const options = Object.assign(option, {
15
+ params: data
16
+ });
17
+ return (0, apiResponse_1.handleApi)((0, request_1.default)({
18
+ url: '/v8/fcg-bin/musicmall.fcg',
19
+ method: method,
20
+ options
21
+ }));
22
+ };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const request_1 = __importDefault(require("../../util/request"));
7
+ exports.default = ({ method = 'get', params = {}, option = {} }) => {
8
+ const data = {
9
+ ...params,
10
+ format: 'jsonp',
11
+ jsonpCallback: 'MusicJsonCallback',
12
+ platform: 'yqq'
13
+ };
14
+ const options = {
15
+ ...option,
16
+ headers: {
17
+ host: 'y.qq.com',
18
+ referer: 'https://y.qq.com/',
19
+ ...(option.headers || {})
20
+ },
21
+ params: data
22
+ };
23
+ return (0, request_1.default)('/download/download.js', method, options, 'y')
24
+ .then(res => {
25
+ let response = res.data;
26
+ if (typeof response === 'string') {
27
+ const reg = /^\w+\(({[^()]+})\)$/;
28
+ const matches = response.match(reg);
29
+ if (matches) {
30
+ response = JSON.parse(matches[1]);
31
+ }
32
+ }
33
+ return {
34
+ status: 200,
35
+ body: {
36
+ response
37
+ }
38
+ };
39
+ })
40
+ .catch(error => {
41
+ console.log('error', error);
42
+ return {
43
+ body: {
44
+ error
45
+ }
46
+ };
47
+ });
48
+ };