@sansenjian/qq-music-api 2.2.1 → 2.2.9

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 (353) hide show
  1. package/CHANGELOG.md +124 -33
  2. package/README.md +2 -0
  3. package/dist/app.js +77 -0
  4. package/dist/config/service-config.js +37 -0
  5. package/dist/config/user-info.js +59 -0
  6. package/dist/index.js +3 -0
  7. package/dist/jest.config.js +52 -0
  8. package/dist/middlewares/fallback-middleware.js +29 -0
  9. package/dist/middlewares/koa-cors.js +63 -0
  10. package/dist/module/apis/UCommon/UCommon.js +10 -0
  11. package/dist/module/apis/album/getAlbumInfo.js +23 -0
  12. package/dist/module/apis/comments/getComments.js +24 -0
  13. package/dist/module/apis/digitalAlbum/getDigitalAlbumLists.js +22 -0
  14. package/dist/module/apis/downloadQQMusic.js +48 -0
  15. package/dist/module/apis/extend/getPlaylistTags.js +158 -0
  16. package/dist/module/apis/music/getLyric.js +32 -0
  17. package/dist/module/apis/music/getMusicPlay.js +187 -0
  18. package/dist/module/apis/mv/getMvByTag.js +23 -0
  19. package/dist/module/apis/radio/getRadioLists.js +26 -0
  20. package/dist/module/apis/rank/getTopLists.js +35 -0
  21. package/dist/module/apis/recommend/getDailyRecommend.js +124 -0
  22. package/dist/module/apis/recommend/getPersonalRecommend.js +114 -0
  23. package/dist/module/apis/search/getHotKey.js +25 -0
  24. package/dist/module/apis/search/getSearchByKey.js +32 -0
  25. package/dist/module/apis/search/getSmartbox.js +40 -0
  26. package/dist/module/apis/singers/getSimilarSinger.js +24 -0
  27. package/dist/module/apis/singers/getSingerDesc.js +24 -0
  28. package/dist/module/apis/singers/getSingerMv.js +23 -0
  29. package/dist/module/apis/singers/getSingerStarNum.js +23 -0
  30. package/dist/module/apis/songLists/songListCategories.js +23 -0
  31. package/dist/module/apis/songLists/songListDetail.js +28 -0
  32. package/dist/module/apis/songLists/songLists.js +35 -0
  33. package/dist/module/apis/u_common.js +62 -0
  34. package/dist/module/apis/user/checkQQLoginQr.js +189 -0
  35. package/dist/module/apis/user/getQQLoginQr.js +23 -0
  36. package/dist/module/apis/user/getUserAvatar.js +25 -0
  37. package/dist/module/apis/user/getUserLikedSongs.js +129 -0
  38. package/dist/module/apis/user/getUserPlaylists.js +138 -0
  39. package/dist/module/apis/y_common.js +69 -0
  40. package/dist/module/config.js +24 -0
  41. package/dist/module/index.js +72 -0
  42. package/dist/package.json +120 -0
  43. package/dist/routers/context/batchGetSongInfo.js +48 -0
  44. package/dist/routers/context/batchGetSongLists.js +35 -0
  45. package/dist/routers/context/checkQQLoginQr.js +16 -0
  46. package/dist/routers/context/cookies.js +36 -0
  47. package/dist/routers/context/getAlbumInfo.js +22 -0
  48. package/dist/routers/context/getComments.js +31 -0
  49. package/dist/routers/context/getDailyRecommend.js +33 -0
  50. package/dist/routers/context/getDigitalAlbumLists.js +16 -0
  51. package/dist/routers/context/getDownloadQQMusic.js +16 -0
  52. package/dist/routers/context/getHotkey.js +20 -0
  53. package/dist/routers/context/getImageUrl.js +25 -0
  54. package/dist/routers/context/getLyric.js +29 -0
  55. package/dist/routers/context/getMusicPlay.js +33 -0
  56. package/dist/routers/context/getMv.js +51 -0
  57. package/dist/routers/context/getMvByTag.js +16 -0
  58. package/dist/routers/context/getMvPlay.js +104 -0
  59. package/dist/routers/context/getNewDisks.js +52 -0
  60. package/dist/routers/context/getPersonalRecommend.js +42 -0
  61. package/dist/routers/context/getPlaylistTags.js +54 -0
  62. package/dist/routers/context/getQQLoginQr.js +14 -0
  63. package/dist/routers/context/getRadioLists.js +16 -0
  64. package/dist/routers/context/getRanks.js +53 -0
  65. package/dist/routers/context/getRecommend.js +88 -0
  66. package/dist/routers/context/getSearchByKey.js +32 -0
  67. package/dist/routers/context/getSimilarSinger.js +27 -0
  68. package/dist/routers/context/getSingerAlbum.js +48 -0
  69. package/dist/routers/context/getSingerDesc.js +28 -0
  70. package/dist/routers/context/getSingerHotsong.js +48 -0
  71. package/dist/routers/context/getSingerList.js +39 -0
  72. package/dist/routers/context/getSingerMv.js +36 -0
  73. package/dist/routers/context/getSingerStarNum.js +27 -0
  74. package/dist/routers/context/getSmartbox.js +27 -0
  75. package/dist/routers/context/getSongInfo.js +40 -0
  76. package/dist/routers/context/getSongListCategories.js +22 -0
  77. package/dist/routers/context/getSongListDetail.js +17 -0
  78. package/dist/routers/context/getSongLists.js +25 -0
  79. package/dist/routers/context/getTicketInfo.js +47 -0
  80. package/dist/routers/context/getTopLists.js +16 -0
  81. package/dist/routers/context/getUserAvatar.js +35 -0
  82. package/dist/routers/context/getUserLikedSongs.js +24 -0
  83. package/dist/routers/context/getUserPlaylists.js +27 -0
  84. package/dist/routers/context/index.js +98 -0
  85. package/dist/routers/router.js +69 -0
  86. package/dist/routers/types.js +2 -0
  87. package/dist/routers/util.js +219 -0
  88. package/dist/scripts/run-tests-with-flags.js +139 -0
  89. package/dist/types/api.js +55 -0
  90. package/dist/util/apiResponse.js +88 -0
  91. package/dist/util/colors.js +19 -0
  92. package/dist/util/cookie.js +34 -0
  93. package/dist/util/cookieResolver.js +66 -0
  94. package/dist/util/loginUtils.js +30 -0
  95. package/dist/util/lyricParse.js +72 -0
  96. package/dist/util/request.js +118 -0
  97. package/docs-dist/404.html +24 -0
  98. package/docs-dist/CHANGELOG-ARCHITECTURE.html +131 -0
  99. package/docs-dist/COOKIE_CONFIG_GUIDE.html +39 -0
  100. package/docs-dist/FALLBACK_MODE_GUIDE.html +101 -0
  101. package/docs-dist/README.html +447 -0
  102. package/docs-dist/TEST_USER_PLAYLISTS.html +42 -0
  103. package/docs-dist/USER_AVATAR_GUIDE.html +100 -0
  104. package/docs-dist/api/comments.html +48 -0
  105. package/docs-dist/api/index.html +27 -0
  106. package/docs-dist/api/music.html +51 -0
  107. package/docs-dist/api/other.html +33 -0
  108. package/docs-dist/api/playlist.html +77 -0
  109. package/docs-dist/api/rank.html +48 -0
  110. package/docs-dist/api/search.html +62 -0
  111. package/docs-dist/api/singer.html +47 -0
  112. package/docs-dist/api/user.html +64 -0
  113. package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.r40JGJZK.js +105 -0
  114. package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.r40JGJZK.lean.js +1 -0
  115. package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.BVXl7WHu.js +13 -0
  116. package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.BVXl7WHu.lean.js +1 -0
  117. package/docs-dist/assets/FALLBACK_MODE_GUIDE.md.BBdcIdh_.js +75 -0
  118. package/docs-dist/assets/FALLBACK_MODE_GUIDE.md.BBdcIdh_.lean.js +1 -0
  119. package/docs-dist/assets/README.md.D6Tw0nRd.js +421 -0
  120. package/docs-dist/assets/README.md.D6Tw0nRd.lean.js +1 -0
  121. package/docs-dist/assets/TEST_USER_PLAYLISTS.md.DSt20Igj.js +16 -0
  122. package/docs-dist/assets/TEST_USER_PLAYLISTS.md.DSt20Igj.lean.js +1 -0
  123. package/docs-dist/assets/USER_AVATAR_GUIDE.md.CVHPs2Dn.js +74 -0
  124. package/docs-dist/assets/USER_AVATAR_GUIDE.md.CVHPs2Dn.lean.js +1 -0
  125. package/docs-dist/assets/api_comments.md.79Q_C8Qp.js +22 -0
  126. package/docs-dist/assets/api_comments.md.79Q_C8Qp.lean.js +1 -0
  127. package/docs-dist/assets/api_index.md.CU3By8tw.js +1 -0
  128. package/docs-dist/assets/api_index.md.CU3By8tw.lean.js +1 -0
  129. package/docs-dist/assets/api_music.md.B1AzLePX.js +25 -0
  130. package/docs-dist/assets/api_music.md.B1AzLePX.lean.js +1 -0
  131. package/docs-dist/assets/api_other.md.DCg4bzA7.js +7 -0
  132. package/docs-dist/assets/api_other.md.DCg4bzA7.lean.js +1 -0
  133. package/docs-dist/assets/api_playlist.md.8ACJ3QqD.js +51 -0
  134. package/docs-dist/assets/api_playlist.md.8ACJ3QqD.lean.js +1 -0
  135. package/docs-dist/assets/api_rank.md.B8IP2ZRy.js +22 -0
  136. package/docs-dist/assets/api_rank.md.B8IP2ZRy.lean.js +1 -0
  137. package/docs-dist/assets/api_search.md.DO9J6nvp.js +36 -0
  138. package/docs-dist/assets/api_search.md.DO9J6nvp.lean.js +1 -0
  139. package/docs-dist/assets/api_singer.md.CcL32xuN.js +21 -0
  140. package/docs-dist/assets/api_singer.md.CcL32xuN.lean.js +1 -0
  141. package/docs-dist/assets/api_user.md.Cb7Ky3Sn.js +38 -0
  142. package/docs-dist/assets/api_user.md.Cb7Ky3Sn.lean.js +1 -0
  143. package/docs-dist/assets/app.CSainqD9.js +1 -0
  144. package/docs-dist/assets/chunks/@localSearchIndexroot.BKleDIv-.js +1 -0
  145. package/docs-dist/assets/chunks/VPLocalSearchBox.BUBaq7tw.js +9 -0
  146. package/docs-dist/assets/chunks/framework.aJbMEiY9.js +19 -0
  147. package/docs-dist/assets/chunks/theme.CzMhU0Ps.js +2 -0
  148. package/docs-dist/assets/guide_architecture.md.CzgqynmB.js +258 -0
  149. package/docs-dist/assets/guide_architecture.md.CzgqynmB.lean.js +1 -0
  150. package/docs-dist/assets/guide_authentication.md.a8yTA8Xe.js +4 -0
  151. package/docs-dist/assets/guide_authentication.md.a8yTA8Xe.lean.js +1 -0
  152. package/docs-dist/assets/guide_index.md.BgUUL6fI.js +1 -0
  153. package/docs-dist/assets/guide_index.md.BgUUL6fI.lean.js +1 -0
  154. package/docs-dist/assets/guide_installation.md.BCZ4jBl_.js +7 -0
  155. package/docs-dist/assets/guide_installation.md.BCZ4jBl_.lean.js +1 -0
  156. package/docs-dist/assets/guide_quickstart.md.9-4dA6wS.js +13 -0
  157. package/docs-dist/assets/guide_quickstart.md.9-4dA6wS.lean.js +1 -0
  158. package/docs-dist/assets/index.md.z0hAJioN.js +1 -0
  159. package/docs-dist/assets/index.md.z0hAJioN.lean.js +1 -0
  160. package/docs-dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  161. package/docs-dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  162. package/docs-dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  163. package/docs-dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  164. package/docs-dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  165. package/docs-dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  166. package/docs-dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  167. package/docs-dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  168. package/docs-dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  169. package/docs-dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  170. package/docs-dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  171. package/docs-dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  172. package/docs-dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  173. package/docs-dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  174. package/docs-dist/assets/reference_response-format.md.VvQTLDZr.js +12 -0
  175. package/docs-dist/assets/reference_response-format.md.VvQTLDZr.lean.js +1 -0
  176. package/docs-dist/assets/style.DM4qKDd4.css +1 -0
  177. package/docs-dist/guide/architecture.html +284 -0
  178. package/docs-dist/guide/authentication.html +30 -0
  179. package/docs-dist/guide/index.html +27 -0
  180. package/docs-dist/guide/installation.html +33 -0
  181. package/docs-dist/guide/quickstart.html +39 -0
  182. package/docs-dist/hashmap.json +1 -0
  183. package/docs-dist/index.html +27 -0
  184. package/docs-dist/logo.svg +4 -0
  185. package/docs-dist/reference/response-format.html +38 -0
  186. package/docs-dist/version.json +7 -0
  187. package/docs-dist/vp-icons.css +1 -0
  188. package/package.json +31 -17
  189. package/.babelrc +0 -7
  190. package/.dockerignore +0 -5
  191. package/.editorconfig +0 -31
  192. package/.eslintrc.json +0 -22
  193. package/.github/workflows/deploy-docs.yml +0 -54
  194. package/.github/workflows/release.yml +0 -37
  195. package/.github/workflows/test.yml +0 -70
  196. package/.husky/commit-msg +0 -1
  197. package/.husky/pre-commit +0 -1
  198. package/.prettierignore +0 -1
  199. package/.prettierrc +0 -9
  200. package/AGENTS.md +0 -153
  201. package/Dockerfile +0 -18
  202. package/QQ/351/237/263/344/271/220-v0.xmind +0 -0
  203. package/QQ/351/237/263/344/271/220-v1.xmind +0 -0
  204. package/app.ts +0 -68
  205. package/commitlint.config.js +0 -20
  206. package/config/user-info.ts +0 -71
  207. package/index.ts +0 -1
  208. package/jest.config.ts +0 -41
  209. package/middlewares/koa-cors.ts +0 -81
  210. package/module/apis/UCommon/UCommon.ts +0 -13
  211. package/module/apis/album/getAlbumInfo.ts +0 -22
  212. package/module/apis/comments/getComments.ts +0 -23
  213. package/module/apis/digitalAlbum/getDigitalAlbumLists.ts +0 -23
  214. package/module/apis/downloadQQMusic.ts +0 -51
  215. package/module/apis/music/getLyric.ts +0 -34
  216. package/module/apis/mv/getMvByTag.ts +0 -24
  217. package/module/apis/radio/getRadioLists.ts +0 -27
  218. package/module/apis/rank/getTopLists.ts +0 -37
  219. package/module/apis/search/getHotKey.ts +0 -24
  220. package/module/apis/search/getSearchByKey.ts +0 -31
  221. package/module/apis/search/getSmartbox.ts +0 -43
  222. package/module/apis/singers/getSimilarSinger.ts +0 -25
  223. package/module/apis/singers/getSingerDesc.ts +0 -25
  224. package/module/apis/singers/getSingerMv.ts +0 -24
  225. package/module/apis/singers/getSingerStarNum.ts +0 -24
  226. package/module/apis/songLists/songListCategories.ts +0 -22
  227. package/module/apis/songLists/songListDetail.ts +0 -27
  228. package/module/apis/songLists/songLists.ts +0 -35
  229. package/module/apis/u_common.ts +0 -29
  230. package/module/apis/user/checkQQLoginQr.ts +0 -230
  231. package/module/apis/user/getQQLoginQr.ts +0 -28
  232. package/module/apis/user/getUserAvatar.ts +0 -32
  233. package/module/apis/user/getUserLikedSongs.ts +0 -145
  234. package/module/apis/user/getUserPlaylists.ts +0 -163
  235. package/module/apis/y_common.ts +0 -44
  236. package/module/config.ts +0 -24
  237. package/module/index.ts +0 -95
  238. package/music.png +0 -0
  239. package/pnpm-workspace.yaml +0 -2
  240. package/public/index.html +0 -430
  241. package/routers/context/batchGetSongInfo.ts +0 -60
  242. package/routers/context/batchGetSongLists.ts +0 -46
  243. package/routers/context/checkQQLoginQr.ts +0 -19
  244. package/routers/context/cookies.ts +0 -38
  245. package/routers/context/getAlbumInfo.ts +0 -31
  246. package/routers/context/getComments.ts +0 -51
  247. package/routers/context/getDigitalAlbumLists.ts +0 -18
  248. package/routers/context/getDownloadQQMusic.ts +0 -17
  249. package/routers/context/getHotkey.ts +0 -25
  250. package/routers/context/getImageUrl.ts +0 -29
  251. package/routers/context/getLyric.ts +0 -32
  252. package/routers/context/getMusicPlay.ts +0 -102
  253. package/routers/context/getMv.ts +0 -61
  254. package/routers/context/getMvByTag.ts +0 -18
  255. package/routers/context/getMvPlay.ts +0 -114
  256. package/routers/context/getNewDisks.ts +0 -58
  257. package/routers/context/getQQLoginQr.ts +0 -16
  258. package/routers/context/getRadioLists.ts +0 -18
  259. package/routers/context/getRanks.ts +0 -67
  260. package/routers/context/getRecommend.ts +0 -92
  261. package/routers/context/getSearchByKey.ts +0 -34
  262. package/routers/context/getSimilarSinger.ts +0 -29
  263. package/routers/context/getSingerAlbum.ts +0 -58
  264. package/routers/context/getSingerDesc.ts +0 -30
  265. package/routers/context/getSingerHotsong.ts +0 -58
  266. package/routers/context/getSingerList.ts +0 -56
  267. package/routers/context/getSingerMv.ts +0 -41
  268. package/routers/context/getSingerStarNum.ts +0 -29
  269. package/routers/context/getSmartbox.ts +0 -27
  270. package/routers/context/getSongInfo.ts +0 -51
  271. package/routers/context/getSongListCategories.ts +0 -23
  272. package/routers/context/getSongListDetail.ts +0 -22
  273. package/routers/context/getSongLists.ts +0 -30
  274. package/routers/context/getTicketInfo.ts +0 -51
  275. package/routers/context/getTopLists.ts +0 -18
  276. package/routers/context/getUserAvatar.ts +0 -53
  277. package/routers/context/getUserLikedSongs.ts +0 -28
  278. package/routers/context/getUserPlaylists.ts +0 -29
  279. package/routers/context/index.ts +0 -87
  280. package/routers/router.ts +0 -88
  281. package/routers/types.ts +0 -18
  282. package/routers/util.ts +0 -231
  283. package/screenshot/album-image.png +0 -0
  284. package/screenshot/batchGetSongInfo.png +0 -0
  285. package/screenshot/batchGetSongLists.png +0 -0
  286. package/screenshot/downloadQQMusic.png +0 -0
  287. package/screenshot/get-album-image.png +0 -0
  288. package/screenshot/get-play-all-data.png +0 -0
  289. package/screenshot/get-song-album-id.png +0 -0
  290. package/screenshot/get-song-id.png +0 -0
  291. package/screenshot/get-song-image.png +0 -0
  292. package/screenshot/getAlbumInfo.png +0 -0
  293. package/screenshot/getComments-id.png +0 -0
  294. package/screenshot/getComments-param.png +0 -0
  295. package/screenshot/getComments.png +0 -0
  296. package/screenshot/getDigitalAlbumLists.png +0 -0
  297. package/screenshot/getLyric-parse.png +0 -0
  298. package/screenshot/getLyric.png +0 -0
  299. package/screenshot/getMusicPlay.png +0 -0
  300. package/screenshot/getMv.png +0 -0
  301. package/screenshot/getMvByTag.png +0 -0
  302. package/screenshot/getMvPlay.png +0 -0
  303. package/screenshot/getNewDisks.png +0 -0
  304. package/screenshot/getRadioLists.png +0 -0
  305. package/screenshot/getRanks.png +0 -0
  306. package/screenshot/getRecommend.png +0 -0
  307. package/screenshot/getSearchByKey.png +0 -0
  308. package/screenshot/getSimilarSinger.png +0 -0
  309. package/screenshot/getSingerAlbum.png +0 -0
  310. package/screenshot/getSingerDesc.png +0 -0
  311. package/screenshot/getSingerHotsong.png +0 -0
  312. package/screenshot/getSingerList.png +0 -0
  313. package/screenshot/getSingerMv-default.png +0 -0
  314. package/screenshot/getSingerMv-listen.png +0 -0
  315. package/screenshot/getSingerMv-time.png +0 -0
  316. package/screenshot/getSingerStarNum.png +0 -0
  317. package/screenshot/getSmartbox.png +0 -0
  318. package/screenshot/getSongInfo.png +0 -0
  319. package/screenshot/getSongListCategories.png +0 -0
  320. package/screenshot/getSongListDetail.png +0 -0
  321. package/screenshot/getSongLists-params.png +0 -0
  322. package/screenshot/getSongLists.png +0 -0
  323. package/screenshot/getTicketInfo.png +0 -0
  324. package/screenshot/getTopLists.png +0 -0
  325. package/screenshot/gethotkey.png +0 -0
  326. package/screenshot/just-get-play-url.png +0 -0
  327. package/screenshot/musicPlay.png +0 -0
  328. package/screenshot/new-feature-error-tips.png +0 -0
  329. package/screenshot/normalize-cookie.png +0 -0
  330. package/screenshot/qq-music-v0.png +0 -0
  331. package/screenshot/qq-music.png +0 -0
  332. package/screenshot/song-image.png +0 -0
  333. package/screenshot/song-quality-128.png +0 -0
  334. package/screenshot/song-quality-m4a.png +0 -0
  335. package/scripts/build-images.js +0 -36
  336. package/scripts/commit-push.sh +0 -103
  337. package/tests/integration/api/api.test.ts +0 -852
  338. package/tests/integration/middleware/cors.test.ts +0 -41
  339. package/tests/setup/jest.setup.ts +0 -15
  340. package/tests/setup/testUtils.ts +0 -35
  341. package/tests/unit/util/request.test.ts +0 -177
  342. package/tsconfig.json +0 -20
  343. package/tsconfig.test.json +0 -8
  344. package/types/api.ts +0 -105
  345. package/types/global.d.ts +0 -26
  346. package/types/index.d.ts +0 -97
  347. package/util/apiResponse.ts +0 -97
  348. package/util/colors.ts +0 -31
  349. package/util/cookie.ts +0 -40
  350. package/util/loginUtils.ts +0 -26
  351. package/util/lyricParse.ts +0 -86
  352. package/util/request.ts +0 -141
  353. package/vercel.json +0 -15
@@ -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
+ };
@@ -0,0 +1,158 @@
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
+ exports.getPlaylistTags = getPlaylistTags;
7
+ exports.getPlaylistsByTag = getPlaylistsByTag;
8
+ exports.getHotComments = getHotComments;
9
+ exports.getSingerListByArea = getSingerListByArea;
10
+ const config_1 = require("../../config");
11
+ const u_common_1 = __importDefault(require("../u_common"));
12
+ const apiResponse_1 = require("../../../util/apiResponse");
13
+ /**
14
+ * 获取歌单标签列表
15
+ * @returns 歌单标签列表
16
+ */
17
+ async function getPlaylistTags() {
18
+ const data = {
19
+ comm: {
20
+ ...config_1.commonParams,
21
+ ct: 24,
22
+ cv: 0
23
+ },
24
+ playlist: {
25
+ method: 'get_tags',
26
+ module: 'playlist.web_srf',
27
+ param: {}
28
+ }
29
+ };
30
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
31
+ method: 'POST',
32
+ options: {
33
+ data: JSON.stringify(data),
34
+ headers: {
35
+ 'Content-Type': 'application/json'
36
+ }
37
+ }
38
+ }));
39
+ }
40
+ /**
41
+ * 根据标签获取歌单列表
42
+ * @param tagId - 标签 ID
43
+ * @param page - 页码
44
+ * @param num - 每页数量
45
+ * @returns 歌单列表
46
+ */
47
+ async function getPlaylistsByTag(tagId = 1, page = 0, num = 20) {
48
+ const data = {
49
+ comm: {
50
+ ...config_1.commonParams,
51
+ ct: 24,
52
+ cv: 0
53
+ },
54
+ playlist: {
55
+ method: 'get_playlist_by_tag',
56
+ module: 'playlist.web_srf',
57
+ param: {
58
+ tag_id: tagId,
59
+ rec_type: 3,
60
+ show_list: 1,
61
+ sort: 1,
62
+ user_id: 0,
63
+ page: page,
64
+ num: num
65
+ }
66
+ }
67
+ };
68
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
69
+ method: 'POST',
70
+ options: {
71
+ data: JSON.stringify(data),
72
+ headers: {
73
+ 'Content-Type': 'application/json'
74
+ }
75
+ }
76
+ }));
77
+ }
78
+ /**
79
+ * 获取热门评论
80
+ * @param id - 资源 ID(歌曲/歌单/专辑 ID)
81
+ * @param type - 资源类型 (1: 歌曲,2: 歌单,3: 专辑)
82
+ * @param page - 页码
83
+ * @param pagesize - 每页数量
84
+ * @returns 评论列表
85
+ */
86
+ async function getHotComments(id, type = 1, page = 0, pagesize = 20) {
87
+ const data = {
88
+ comm: {
89
+ ...config_1.commonParams,
90
+ ct: 24,
91
+ cv: 0
92
+ },
93
+ comment: {
94
+ module: 'comment.CommentReadServer',
95
+ method: 'GetCommentList',
96
+ param: {
97
+ biztype: type,
98
+ bizid: id,
99
+ page: page,
100
+ pagesize: pagesize,
101
+ needhot: 1
102
+ }
103
+ }
104
+ };
105
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
106
+ method: 'POST',
107
+ options: {
108
+ data: JSON.stringify(data),
109
+ headers: {
110
+ 'Content-Type': 'application/json'
111
+ }
112
+ }
113
+ }));
114
+ }
115
+ /**
116
+ * 获取歌手分类列表
117
+ * @param area - 地区 (1: 内地,2: 港台,3: 欧美,4: 韩国,5: 日本)
118
+ * @param sex - 性别 (1: 男歌手,2: 女歌手,3: 组合)
119
+ * @param genre - 流派 (1: 流行,2: 摇滚,3: 民谣等)
120
+ * @param page - 页码
121
+ * @param pagesize - 每页数量
122
+ * @returns 歌手列表
123
+ */
124
+ async function getSingerListByArea(area = -1, sex = -1, genre = -1, page = 1, pagesize = 80) {
125
+ const data = {
126
+ comm: {
127
+ ...config_1.commonParams,
128
+ ct: 24,
129
+ cv: 0
130
+ },
131
+ singer: {
132
+ method: 'get_singer_list',
133
+ module: 'music.web_srf_svr',
134
+ param: {
135
+ area: area,
136
+ sex: sex,
137
+ genre: genre,
138
+ page: page,
139
+ pagesize: pagesize
140
+ }
141
+ }
142
+ };
143
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
144
+ method: 'POST',
145
+ options: {
146
+ data: JSON.stringify(data),
147
+ headers: {
148
+ 'Content-Type': 'application/json'
149
+ }
150
+ }
151
+ }));
152
+ }
153
+ exports.default = {
154
+ getPlaylistTags,
155
+ getPlaylistsByTag,
156
+ getHotComments,
157
+ getSingerListByArea
158
+ };
@@ -0,0 +1,32 @@
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 lyricParse_1 = require("../../../util/lyricParse");
7
+ const request_1 = __importDefault(require("../../../util/request"));
8
+ const apiResponse_1 = require("../../../util/apiResponse");
9
+ exports.default = async ({ method = 'get', params = {}, option = {}, isFormat = false }) => {
10
+ const data = Object.assign(params, {
11
+ format: 'json',
12
+ outCharset: 'utf-8',
13
+ pcachetime: Date.now()
14
+ });
15
+ const options = Object.assign(option, {
16
+ params: data
17
+ });
18
+ return (0, apiResponse_1.handleApi)((0, request_1.default)({
19
+ url: '/lyric/fcgi-bin/fcg_query_lyric_new.fcg',
20
+ method: method,
21
+ options
22
+ }), {
23
+ transformData: (resData) => {
24
+ const lyricString = resData && resData.lyric && Buffer.from(resData.lyric, 'base64').toString();
25
+ const lyric = isFormat && lyricString ? (0, lyricParse_1.lyricParse)(lyricString) : lyricString;
26
+ return {
27
+ ...resData,
28
+ lyric
29
+ };
30
+ }
31
+ });
32
+ };
@@ -0,0 +1,187 @@
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 UCommon_1 = __importDefault(require("../UCommon/UCommon"));
7
+ const config_1 = require("../../config");
8
+ const cookieResolver_1 = require("../../../util/cookieResolver");
9
+ const DEFAULT_QUALITY = '128';
10
+ const FILE_TYPE_MAP = {
11
+ m4a: { prefix: 'C400', suffix: '.m4a' },
12
+ 128: { prefix: 'M500', suffix: '.mp3' },
13
+ 320: { prefix: 'M800', suffix: '.mp3' },
14
+ ape: { prefix: 'A000', suffix: '.ape' },
15
+ flac: { prefix: 'F000', suffix: '.flac' }
16
+ };
17
+ const normalizeFirstValue = (value) => {
18
+ if (Array.isArray(value)) {
19
+ return normalizeFirstValue(value[0]);
20
+ }
21
+ if (typeof value !== 'string') {
22
+ return undefined;
23
+ }
24
+ const normalized = value.trim();
25
+ return normalized || undefined;
26
+ };
27
+ const normalizeSongmidList = (songmid) => {
28
+ const values = Array.isArray(songmid) ? songmid : [songmid];
29
+ return values
30
+ .flatMap(value => {
31
+ if (typeof value !== 'string')
32
+ return [];
33
+ return value.split(',');
34
+ })
35
+ .map(item => item.trim())
36
+ .filter(Boolean);
37
+ };
38
+ const normalizeQuality = (value) => {
39
+ const quality = normalizeFirstValue(value) || String(value || '');
40
+ if (quality === 'm4a' || quality === 'ape' || quality === 'flac') {
41
+ return quality;
42
+ }
43
+ const numericQuality = Number(quality);
44
+ if (numericQuality === 320) {
45
+ return '320';
46
+ }
47
+ if (numericQuality === 128) {
48
+ return '128';
49
+ }
50
+ return DEFAULT_QUALITY;
51
+ };
52
+ const pickPlayableDomain = (sip) => {
53
+ if (!Array.isArray(sip))
54
+ return '';
55
+ const urls = sip.filter((item) => typeof item === 'string' && item.length > 0);
56
+ return (urls.find(url => !url.startsWith('http://ws')) ||
57
+ urls.find(url => url.startsWith('https://')) ||
58
+ urls[0] ||
59
+ '');
60
+ };
61
+ const joinUrl = (domain, path) => {
62
+ if (domain.endsWith('/') && path.startsWith('/')) {
63
+ return `${domain}${path.slice(1)}`;
64
+ }
65
+ if (!domain.endsWith('/') && !path.startsWith('/')) {
66
+ return `${domain}/${path}`;
67
+ }
68
+ return `${domain}${path}`;
69
+ };
70
+ const buildPlayUrl = (domain, info, guid) => {
71
+ if (!domain)
72
+ return '';
73
+ if (info.purl) {
74
+ return joinUrl(domain, info.purl);
75
+ }
76
+ // Fallback for payloads where purl is empty but vkey/filename are present.
77
+ if (info.vkey && info.filename) {
78
+ return `${joinUrl(domain, info.filename)}?vkey=${info.vkey}&guid=${guid}&fromtag=66`;
79
+ }
80
+ return '';
81
+ };
82
+ const resolveUin = (cookie) => {
83
+ const defaultUin = String(global.userInfo?.uin || global.userInfo?.loginUin || '0');
84
+ return (0, cookieResolver_1.extractUinFromCookie)(cookie) || defaultUin;
85
+ };
86
+ const getCookieFromOptions = (option) => {
87
+ if (!option || typeof option !== 'object') {
88
+ return undefined;
89
+ }
90
+ const headers = option.headers;
91
+ if (!headers || typeof headers !== 'object') {
92
+ return undefined;
93
+ }
94
+ const cookie = headers.Cookie || headers.cookie;
95
+ return typeof cookie === 'string' ? cookie : undefined;
96
+ };
97
+ exports.default = async ({ method = 'get', params = {}, option = {} }) => {
98
+ const musicParams = params;
99
+ const songmidList = normalizeSongmidList(musicParams.songmid);
100
+ if (songmidList.length === 0) {
101
+ return {
102
+ status: 400,
103
+ body: {
104
+ data: {
105
+ message: 'no songmid'
106
+ }
107
+ }
108
+ };
109
+ }
110
+ const justPlayUrl = (normalizeFirstValue(musicParams.resType) || 'play') === 'play';
111
+ const mediaId = normalizeFirstValue(musicParams.mediaId);
112
+ const quality = normalizeQuality(musicParams.quality);
113
+ const guid = String(config_1._guid || '1429839143');
114
+ const cookie = getCookieFromOptions(option);
115
+ const uin = resolveUin(cookie);
116
+ const fileType = FILE_TYPE_MAP[quality];
117
+ const filename = songmidList.map(item => `${fileType.prefix}${item}${mediaId || item}${fileType.suffix}`);
118
+ const requestPayload = {
119
+ req_0: {
120
+ module: 'vkey.GetVkeyServer',
121
+ method: 'CgiGetVkey',
122
+ param: {
123
+ filename,
124
+ guid,
125
+ songmid: songmidList,
126
+ songtype: [0],
127
+ uin,
128
+ loginflag: 1,
129
+ platform: '20'
130
+ }
131
+ },
132
+ loginUin: uin,
133
+ comm: {
134
+ uin,
135
+ format: 'json',
136
+ ct: 24,
137
+ cv: 0
138
+ }
139
+ };
140
+ const upstreamParams = {
141
+ format: 'json',
142
+ sign: 'zzannc1o6o9b4i971602f3554385022046ab796512b7012',
143
+ data: JSON.stringify(requestPayload)
144
+ };
145
+ try {
146
+ const response = await (0, UCommon_1.default)({
147
+ method: method,
148
+ params: upstreamParams,
149
+ option
150
+ });
151
+ const upstreamData = response.data;
152
+ const domain = pickPlayableDomain(upstreamData?.req_0?.data?.sip);
153
+ const midurlinfo = Array.isArray(upstreamData?.req_0?.data?.midurlinfo)
154
+ ? upstreamData.req_0.data.midurlinfo
155
+ : [];
156
+ const playUrl = {};
157
+ const midInfoMap = new Map();
158
+ midurlinfo.forEach(item => {
159
+ if (item.songmid) {
160
+ midInfoMap.set(item.songmid, item);
161
+ }
162
+ });
163
+ songmidList.forEach(songmid => {
164
+ const item = midInfoMap.get(songmid);
165
+ const url = item ? buildPlayUrl(domain, item, guid) : '';
166
+ playUrl[songmid] = {
167
+ url,
168
+ error: url ? undefined : '\u6682\u65e0\u64ad\u653e\u94fe\u63a5'
169
+ };
170
+ });
171
+ upstreamData.playUrl = playUrl;
172
+ return {
173
+ status: 200,
174
+ body: {
175
+ data: justPlayUrl ? { playUrl } : upstreamData
176
+ }
177
+ };
178
+ }
179
+ catch (error) {
180
+ return {
181
+ status: 502,
182
+ body: {
183
+ error: error instanceof Error ? error.message : error
184
+ }
185
+ };
186
+ }
187
+ };
@@ -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 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: 'GB2312',
12
+ cmd: 'shoubo',
13
+ lan: 'all'
14
+ });
15
+ const options = Object.assign(option, {
16
+ params: data
17
+ });
18
+ return (0, apiResponse_1.handleApi)((0, request_1.default)({
19
+ url: '/mv/fcgi-bin/getmv_by_tag',
20
+ method: method,
21
+ options
22
+ }));
23
+ };
@@ -0,0 +1,26 @@
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
+ channel: 'radio',
13
+ page: 'index',
14
+ tpl: 'wk',
15
+ new: 1,
16
+ p: Math.round(1)
17
+ });
18
+ const options = Object.assign(option, {
19
+ params: data
20
+ });
21
+ return (0, apiResponse_1.handleApi)((0, request_1.default)({
22
+ url: '/v8/fcg-bin/fcg_v8_radiolist.fcg',
23
+ method: method,
24
+ options
25
+ }));
26
+ };
@@ -0,0 +1,35 @@
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
+ platform: 'h5',
13
+ needNewCode: 1
14
+ });
15
+ const options = Object.assign(option, {
16
+ params: data
17
+ });
18
+ return (0, apiResponse_1.handleApi)((0, request_1.default)({
19
+ url: '/v8/fcg-bin/fcg_myqq_toplist.fcg',
20
+ method: method,
21
+ options,
22
+ isUUrl: 'c'
23
+ }), {
24
+ transformData: (response) => {
25
+ if (typeof response === 'string') {
26
+ const reg = /^\w+\(({[^()]+})\)$/;
27
+ const matches = response.match(reg);
28
+ if (matches) {
29
+ return JSON.parse(matches[1]);
30
+ }
31
+ }
32
+ return response;
33
+ }
34
+ });
35
+ };
@@ -0,0 +1,124 @@
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
+ exports.getDailyRecommend = getDailyRecommend;
7
+ exports.getPrivateFM = getPrivateFM;
8
+ exports.getNewSongs = getNewSongs;
9
+ const config_1 = require("../../config");
10
+ const u_common_1 = __importDefault(require("../u_common"));
11
+ const apiResponse_1 = require("../../../util/apiResponse");
12
+ const DEFAULT_NEW_SONG_TYPE = 5;
13
+ function normalizeNewSongType(areaId) {
14
+ return Number.isInteger(areaId) && areaId >= 1 && areaId <= 5
15
+ ? areaId
16
+ : DEFAULT_NEW_SONG_TYPE;
17
+ }
18
+ /**
19
+ * 获取每日推荐歌曲
20
+ * @param cookie - 用户 Cookie(可选,用于获取个性化推荐)
21
+ * @returns 每日推荐歌曲列表
22
+ */
23
+ async function getDailyRecommend(cookie) {
24
+ const data = {
25
+ comm: {
26
+ ...config_1.commonParams,
27
+ ct: 24,
28
+ cv: 0
29
+ },
30
+ recommend: {
31
+ method: 'get_recommend',
32
+ module: 'music.web_srf_svr',
33
+ param: {
34
+ page: 0,
35
+ num: 20,
36
+ uin: 0,
37
+ login: 0
38
+ }
39
+ }
40
+ };
41
+ const headers = { 'Content-Type': 'application/json' };
42
+ if (cookie)
43
+ headers.cookie = cookie;
44
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
45
+ method: 'POST',
46
+ options: {
47
+ data: JSON.stringify(data),
48
+ headers
49
+ }
50
+ }));
51
+ }
52
+ /**
53
+ * 获取私人 FM
54
+ * @param cookie - 用户 Cookie
55
+ * @returns 私人 FM 歌曲列表
56
+ */
57
+ async function getPrivateFM(cookie) {
58
+ const data = {
59
+ comm: {
60
+ ...config_1.commonParams,
61
+ ct: 24,
62
+ cv: 0
63
+ },
64
+ fm: {
65
+ method: 'GetPrivateFmPlaylist',
66
+ module: 'music.web_fm_svr',
67
+ param: {
68
+ enc: 'utf8',
69
+ moter: 0,
70
+ uin: 0,
71
+ login: 0
72
+ }
73
+ }
74
+ };
75
+ const headers = { 'Content-Type': 'application/json' };
76
+ if (cookie)
77
+ headers.cookie = cookie;
78
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
79
+ method: 'POST',
80
+ options: {
81
+ data: JSON.stringify(data),
82
+ headers
83
+ }
84
+ }));
85
+ }
86
+ /**
87
+ * 获取新歌速递
88
+ * @param areaId - 地区 ID(兼容旧参数,当前映射到新歌类型,暂定映射关系)
89
+ * @param limit - 返回数量(当前上游接口固定类型,limit 仅用于兼容入参)
90
+ * @returns 新歌列表
91
+ */
92
+ async function getNewSongs(areaId = DEFAULT_NEW_SONG_TYPE, limit = 20) {
93
+ const normalizedType = normalizeNewSongType(areaId);
94
+ const normalizedLimit = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 20;
95
+ const data = {
96
+ comm: {
97
+ ...config_1.commonParams,
98
+ ct: 24,
99
+ cv: 0
100
+ },
101
+ new_song: {
102
+ module: 'newsong.NewSongServer',
103
+ method: 'get_new_song_info',
104
+ param: {
105
+ type: normalizedType,
106
+ num: normalizedLimit
107
+ }
108
+ }
109
+ };
110
+ return (0, apiResponse_1.handleApi)((0, u_common_1.default)({
111
+ method: 'POST',
112
+ options: {
113
+ data: JSON.stringify(data),
114
+ headers: {
115
+ 'Content-Type': 'application/json'
116
+ }
117
+ }
118
+ }));
119
+ }
120
+ exports.default = {
121
+ getDailyRecommend,
122
+ getPrivateFM,
123
+ getNewSongs
124
+ };