sa2kit 1.6.30 → 1.6.32

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 (251) hide show
  1. package/dist/AliyunOSSProvider-4W47OFEK.mjs +6 -0
  2. package/dist/{AliyunOSSProvider-KJYRIZES.mjs.map → AliyunOSSProvider-4W47OFEK.mjs.map} +1 -1
  3. package/dist/AliyunOSSProvider-HCNGDJL7.js +15 -0
  4. package/dist/{AliyunOSSProvider-FWAKUB2T.js.map → AliyunOSSProvider-HCNGDJL7.js.map} +1 -1
  5. package/dist/ConfigService-3DIC6C3Q.js +21 -0
  6. package/dist/{ConfigService-7MEZXKJ5.js.map → ConfigService-3DIC6C3Q.js.map} +1 -1
  7. package/dist/ConfigService-V6ZK273Z.mjs +4 -0
  8. package/dist/{ConfigService-BV57YYFW.mjs.map → ConfigService-V6ZK273Z.mjs.map} +1 -1
  9. package/dist/LocalStorageProvider-3RVPCQB3.mjs +6 -0
  10. package/dist/{LocalStorageProvider-RTPMUOZ2.mjs.map → LocalStorageProvider-3RVPCQB3.mjs.map} +1 -1
  11. package/dist/LocalStorageProvider-PP7MA5OT.js +15 -0
  12. package/dist/{LocalStorageProvider-XSRCUXOU.js.map → LocalStorageProvider-PP7MA5OT.js.map} +1 -1
  13. package/dist/PMXParser-2VTA737I.js +13 -0
  14. package/dist/{PMXParser-YBS3B6HM.js.map → PMXParser-2VTA737I.js.map} +1 -1
  15. package/dist/PMXParser-RNVQL76A.mjs +4 -0
  16. package/dist/{PMXParser-L6IWHL4I.mjs.map → PMXParser-RNVQL76A.mjs.map} +1 -1
  17. package/dist/analytics/index.js +46 -45
  18. package/dist/analytics/index.js.map +1 -1
  19. package/dist/analytics/index.mjs +45 -44
  20. package/dist/analytics/index.mjs.map +1 -1
  21. package/dist/analytics/server/index.js +4 -4
  22. package/dist/analytics/server/index.js.map +1 -1
  23. package/dist/analytics/server/index.mjs +4 -4
  24. package/dist/analytics/server/index.mjs.map +1 -1
  25. package/dist/api/index.js +5 -5
  26. package/dist/api/index.js.map +1 -1
  27. package/dist/api/index.mjs +5 -5
  28. package/dist/api/index.mjs.map +1 -1
  29. package/dist/audioDetection/index.js +17 -16
  30. package/dist/audioDetection/index.js.map +1 -1
  31. package/dist/audioDetection/index.mjs +17 -16
  32. package/dist/audioDetection/index.mjs.map +1 -1
  33. package/dist/auth/client/index.js +4 -4
  34. package/dist/auth/client/index.mjs +1 -1
  35. package/dist/auth/components/index.js +3 -3
  36. package/dist/auth/components/index.js.map +1 -1
  37. package/dist/auth/components/index.mjs +3 -3
  38. package/dist/auth/components/index.mjs.map +1 -1
  39. package/dist/auth/index.js +29 -29
  40. package/dist/auth/index.mjs +5 -5
  41. package/dist/auth/middleware/index.js +3 -3
  42. package/dist/auth/middleware/index.mjs +2 -2
  43. package/dist/auth/routes/index.js +14 -14
  44. package/dist/auth/routes/index.mjs +2 -2
  45. package/dist/auth/services/index.js +7 -7
  46. package/dist/auth/services/index.mjs +1 -1
  47. package/dist/calendar/index.js +146 -182
  48. package/dist/calendar/index.js.map +1 -1
  49. package/dist/calendar/index.mjs +139 -175
  50. package/dist/calendar/index.mjs.map +1 -1
  51. package/dist/calendar/routes/index.js +1 -1
  52. package/dist/calendar/routes/index.js.map +1 -1
  53. package/dist/calendar/routes/index.mjs +1 -1
  54. package/dist/calendar/routes/index.mjs.map +1 -1
  55. package/dist/{chunk-5YQ5B7IZ.js → chunk-24HGREE6.js} +5 -5
  56. package/dist/{chunk-5YQ5B7IZ.js.map → chunk-24HGREE6.js.map} +1 -1
  57. package/dist/{chunk-6PRFP5EG.js → chunk-25OFOKNF.js} +6 -6
  58. package/dist/chunk-25OFOKNF.js.map +1 -0
  59. package/dist/{chunk-KQGP6BTS.mjs → chunk-3DXPQ4YV.mjs} +6 -6
  60. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  61. package/dist/{chunk-3BGPZN4X.mjs → chunk-3NHAT7D4.mjs} +12 -12
  62. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  63. package/dist/{chunk-MW4BCIZC.mjs → chunk-4HC6M7FK.mjs} +3 -3
  64. package/dist/chunk-4HC6M7FK.mjs.map +1 -0
  65. package/dist/{chunk-ESRCX5TQ.mjs → chunk-52TN2QSS.mjs} +3 -3
  66. package/dist/{chunk-ESRCX5TQ.mjs.map → chunk-52TN2QSS.mjs.map} +1 -1
  67. package/dist/{chunk-CNTILN5J.mjs → chunk-5YQ62BKX.mjs} +20 -19
  68. package/dist/chunk-5YQ62BKX.mjs.map +1 -0
  69. package/dist/{chunk-6W5BMXJG.js → chunk-6OWNMJKG.js} +4 -4
  70. package/dist/{chunk-6W5BMXJG.js.map → chunk-6OWNMJKG.js.map} +1 -1
  71. package/dist/{chunk-DUHZ7VZP.js → chunk-7VRT55ZD.js} +3 -3
  72. package/dist/chunk-7VRT55ZD.js.map +1 -0
  73. package/dist/{chunk-3WOAPLEG.mjs → chunk-EB4NR623.mjs} +27 -26
  74. package/dist/chunk-EB4NR623.mjs.map +1 -0
  75. package/dist/chunk-EI27JKND.mjs +1988 -0
  76. package/dist/chunk-EI27JKND.mjs.map +1 -0
  77. package/dist/{chunk-CD77U7LZ.js → chunk-GBPLX42J.js} +9 -9
  78. package/dist/chunk-GBPLX42J.js.map +1 -0
  79. package/dist/{chunk-TFQF2HDO.mjs → chunk-HDEOCX2L.mjs} +12 -12
  80. package/dist/chunk-HDEOCX2L.mjs.map +1 -0
  81. package/dist/{chunk-TV3VKRJK.mjs → chunk-HDMIOOZY.mjs} +38 -68
  82. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  83. package/dist/{chunk-OPPF3326.js → chunk-HJ6MH7J7.js} +39 -69
  84. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  85. package/dist/chunk-KO73EBUT.js +80 -0
  86. package/dist/chunk-KO73EBUT.js.map +1 -0
  87. package/dist/{chunk-6YKMCPQI.mjs → chunk-KZKIH4AS.mjs} +4 -4
  88. package/dist/chunk-KZKIH4AS.mjs.map +1 -0
  89. package/dist/{chunk-LX4XX6W7.js → chunk-L47ZOYHL.js} +15 -89
  90. package/dist/chunk-L47ZOYHL.js.map +1 -0
  91. package/dist/{chunk-6MQUBPKB.mjs → chunk-LJ4CCSSY.mjs} +3 -3
  92. package/dist/{chunk-6MQUBPKB.mjs.map → chunk-LJ4CCSSY.mjs.map} +1 -1
  93. package/dist/{chunk-TOC5FSHP.js → chunk-NJ2SNXBJ.js} +12 -12
  94. package/dist/chunk-NJ2SNXBJ.js.map +1 -0
  95. package/dist/{chunk-OCR5DS4C.mjs → chunk-PE5EAHZK.mjs} +3 -3
  96. package/dist/chunk-PE5EAHZK.mjs.map +1 -0
  97. package/dist/{chunk-LZHMNOED.js → chunk-Q5EDCKQA.js} +26 -26
  98. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  99. package/dist/{chunk-CLKKZSPZ.js → chunk-RBKGYWME.js} +20 -19
  100. package/dist/chunk-RBKGYWME.js.map +1 -0
  101. package/dist/{chunk-VRTRSEEH.mjs → chunk-RSJSZ7QH.mjs} +11 -11
  102. package/dist/chunk-RSJSZ7QH.mjs.map +1 -0
  103. package/dist/{chunk-E7RGBAYJ.js → chunk-TDCDEBGP.js} +30 -29
  104. package/dist/chunk-TDCDEBGP.js.map +1 -0
  105. package/dist/{chunk-JZXJQMVE.js → chunk-UIFFDRTE.js} +11 -11
  106. package/dist/chunk-UIFFDRTE.js.map +1 -0
  107. package/dist/{chunk-T5OZHYVM.mjs → chunk-UKT3PLON.mjs} +13 -85
  108. package/dist/chunk-UKT3PLON.mjs.map +1 -0
  109. package/dist/{chunk-UOFTHYIH.js → chunk-UL6XJGUZ.js} +4 -4
  110. package/dist/chunk-UL6XJGUZ.js.map +1 -0
  111. package/dist/chunk-VVWQTO4Y.mjs +77 -0
  112. package/dist/chunk-VVWQTO4Y.mjs.map +1 -0
  113. package/dist/{chunk-A3UP56MS.js → chunk-WA67GZSZ.js} +3 -3
  114. package/dist/chunk-WA67GZSZ.js.map +1 -0
  115. package/dist/{chunk-OLHGZXN3.mjs → chunk-WEEXCPSE.mjs} +5 -5
  116. package/dist/chunk-WEEXCPSE.mjs.map +1 -0
  117. package/dist/chunk-XGBE4SUV.js +2093 -0
  118. package/dist/chunk-XGBE4SUV.js.map +1 -0
  119. package/dist/{chunk-QU5OT4DF.js → chunk-XJ7ZAGC5.js} +5 -5
  120. package/dist/chunk-XJ7ZAGC5.js.map +1 -0
  121. package/dist/{chunk-ZI25QCHD.mjs → chunk-YOTQG4NP.mjs} +25 -25
  122. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  123. package/dist/{chunk-QAT2RWAO.mjs → chunk-Z36R3P62.mjs} +7 -7
  124. package/dist/chunk-Z36R3P62.mjs.map +1 -0
  125. package/dist/{chunk-7Z5LLJ3A.js → chunk-ZWQJSZEY.js} +13 -13
  126. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  127. package/dist/config/index.js +6 -6
  128. package/dist/config/index.js.map +1 -1
  129. package/dist/config/index.mjs +6 -6
  130. package/dist/config/index.mjs.map +1 -1
  131. package/dist/config/server/index.js +37 -37
  132. package/dist/config/server/index.js.map +1 -1
  133. package/dist/config/server/index.mjs +37 -37
  134. package/dist/config/server/index.mjs.map +1 -1
  135. package/dist/i18n/index.d.mts +2 -2
  136. package/dist/i18n/index.d.ts +2 -2
  137. package/dist/i18n/index.js +16 -17
  138. package/dist/i18n/index.js.map +1 -1
  139. package/dist/i18n/index.mjs +16 -17
  140. package/dist/i18n/index.mjs.map +1 -1
  141. package/dist/imageCrop/index.js +11 -10
  142. package/dist/imageCrop/index.js.map +1 -1
  143. package/dist/imageCrop/index.mjs +11 -10
  144. package/dist/imageCrop/index.mjs.map +1 -1
  145. package/dist/index.d.mts +185 -100
  146. package/dist/index.d.ts +185 -100
  147. package/dist/index.js +225 -249
  148. package/dist/index.js.map +1 -1
  149. package/dist/index.mjs +80 -104
  150. package/dist/index.mjs.map +1 -1
  151. package/dist/logger/index.js +6 -6
  152. package/dist/logger/index.mjs +1 -1
  153. package/dist/mikuFusionGame/index.d.mts +112 -0
  154. package/dist/mikuFusionGame/index.d.ts +112 -0
  155. package/dist/mikuFusionGame/index.js +680 -0
  156. package/dist/mikuFusionGame/index.js.map +1 -0
  157. package/dist/mikuFusionGame/index.mjs +667 -0
  158. package/dist/mikuFusionGame/index.mjs.map +1 -0
  159. package/dist/mmd/admin/index.js +11 -10
  160. package/dist/mmd/admin/index.js.map +1 -1
  161. package/dist/mmd/admin/index.mjs +11 -10
  162. package/dist/mmd/admin/index.mjs.map +1 -1
  163. package/dist/mmd/index.js +223 -241
  164. package/dist/mmd/index.js.map +1 -1
  165. package/dist/mmd/index.mjs +220 -238
  166. package/dist/mmd/index.mjs.map +1 -1
  167. package/dist/mmd/server/index.js +6 -6
  168. package/dist/mmd/server/index.js.map +1 -1
  169. package/dist/mmd/server/index.mjs +6 -6
  170. package/dist/mmd/server/index.mjs.map +1 -1
  171. package/dist/music/index.js +16 -16
  172. package/dist/music/index.mjs +2 -2
  173. package/dist/music/server/index.js +8 -8
  174. package/dist/music/server/index.mjs +1 -1
  175. package/dist/request/index.js +2 -2
  176. package/dist/request/index.js.map +1 -1
  177. package/dist/request/index.mjs +2 -2
  178. package/dist/request/index.mjs.map +1 -1
  179. package/dist/storage/index.js +15 -14
  180. package/dist/storage/index.mjs +3 -2
  181. package/dist/testYourself/admin/index.js +3 -3
  182. package/dist/testYourself/admin/index.mjs +1 -1
  183. package/dist/testYourself/index.js +22 -22
  184. package/dist/testYourself/index.js.map +1 -1
  185. package/dist/testYourself/index.mjs +14 -14
  186. package/dist/testYourself/index.mjs.map +1 -1
  187. package/dist/testYourself/server/index.js +4 -4
  188. package/dist/testYourself/server/index.mjs +1 -1
  189. package/dist/universalExport/index.d.mts +3 -3
  190. package/dist/universalExport/index.d.ts +3 -3
  191. package/dist/universalExport/index.js +48 -47
  192. package/dist/universalExport/index.js.map +1 -1
  193. package/dist/universalExport/index.mjs +48 -47
  194. package/dist/universalExport/index.mjs.map +1 -1
  195. package/dist/universalExport/server/index.js +29 -29
  196. package/dist/universalExport/server/index.js.map +1 -1
  197. package/dist/universalExport/server/index.mjs +28 -28
  198. package/dist/universalExport/server/index.mjs.map +1 -1
  199. package/dist/universalFile/index.d.mts +3 -3
  200. package/dist/universalFile/index.d.ts +3 -3
  201. package/dist/universalFile/index.js +73 -72
  202. package/dist/universalFile/index.js.map +1 -1
  203. package/dist/universalFile/index.mjs +73 -72
  204. package/dist/universalFile/index.mjs.map +1 -1
  205. package/dist/universalFile/server/index.js +258 -260
  206. package/dist/universalFile/server/index.js.map +1 -1
  207. package/dist/universalFile/server/index.mjs +244 -246
  208. package/dist/universalFile/server/index.mjs.map +1 -1
  209. package/dist/utils/index.js +11 -11
  210. package/dist/utils/index.mjs +2 -2
  211. package/package.json +25 -31
  212. package/dist/AliyunOSSProvider-FWAKUB2T.js +0 -15
  213. package/dist/AliyunOSSProvider-KJYRIZES.mjs +0 -6
  214. package/dist/ConfigService-7MEZXKJ5.js +0 -21
  215. package/dist/ConfigService-BV57YYFW.mjs +0 -4
  216. package/dist/LocalStorageProvider-RTPMUOZ2.mjs +0 -6
  217. package/dist/LocalStorageProvider-XSRCUXOU.js +0 -15
  218. package/dist/PMXParser-L6IWHL4I.mjs +0 -4
  219. package/dist/PMXParser-YBS3B6HM.js +0 -13
  220. package/dist/chunk-3BGPZN4X.mjs.map +0 -1
  221. package/dist/chunk-3WOAPLEG.mjs.map +0 -1
  222. package/dist/chunk-6PRFP5EG.js.map +0 -1
  223. package/dist/chunk-6YKMCPQI.mjs.map +0 -1
  224. package/dist/chunk-7Z5LLJ3A.js.map +0 -1
  225. package/dist/chunk-A3UP56MS.js.map +0 -1
  226. package/dist/chunk-CD77U7LZ.js.map +0 -1
  227. package/dist/chunk-CLKKZSPZ.js.map +0 -1
  228. package/dist/chunk-CNTILN5J.mjs.map +0 -1
  229. package/dist/chunk-DUHZ7VZP.js.map +0 -1
  230. package/dist/chunk-DW2ZTOCV.js +0 -1727
  231. package/dist/chunk-DW2ZTOCV.js.map +0 -1
  232. package/dist/chunk-E7RGBAYJ.js.map +0 -1
  233. package/dist/chunk-JZXJQMVE.js.map +0 -1
  234. package/dist/chunk-KQGP6BTS.mjs.map +0 -1
  235. package/dist/chunk-LFG6FPM5.mjs +0 -1597
  236. package/dist/chunk-LFG6FPM5.mjs.map +0 -1
  237. package/dist/chunk-LX4XX6W7.js.map +0 -1
  238. package/dist/chunk-LZHMNOED.js.map +0 -1
  239. package/dist/chunk-MW4BCIZC.mjs.map +0 -1
  240. package/dist/chunk-OCR5DS4C.mjs.map +0 -1
  241. package/dist/chunk-OLHGZXN3.mjs.map +0 -1
  242. package/dist/chunk-OPPF3326.js.map +0 -1
  243. package/dist/chunk-QAT2RWAO.mjs.map +0 -1
  244. package/dist/chunk-QU5OT4DF.js.map +0 -1
  245. package/dist/chunk-T5OZHYVM.mjs.map +0 -1
  246. package/dist/chunk-TFQF2HDO.mjs.map +0 -1
  247. package/dist/chunk-TOC5FSHP.js.map +0 -1
  248. package/dist/chunk-TV3VKRJK.mjs.map +0 -1
  249. package/dist/chunk-UOFTHYIH.js.map +0 -1
  250. package/dist/chunk-VRTRSEEH.mjs.map +0 -1
  251. package/dist/chunk-ZI25QCHD.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
- import { DEFAULT_MUSIC_SOURCE } from './chunk-MW4BCIZC.mjs';
1
+ import { DEFAULT_MUSIC_SOURCE } from './chunk-4HC6M7FK.mjs';
2
2
  import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';
3
+ import { clsx } from 'clsx';
3
4
  import useSWR from 'swr';
4
5
 
5
6
  function MusicPlayer({
@@ -36,7 +37,7 @@ function MusicPlayer({
36
37
  if (!seconds || isNaN(seconds)) return "0:00";
37
38
  const mins = Math.floor(seconds / 60);
38
39
  const secs = Math.floor(seconds % 60);
39
- return `${mins}:${secs.toString().padStart(2, "0")}`;
40
+ return mins + ":" + secs.toString().padStart(2, "0");
40
41
  };
41
42
  const handlePlay = useCallback(() => {
42
43
  onPlay?.();
@@ -107,7 +108,7 @@ function MusicPlayer({
107
108
  return /* @__PURE__ */ React.createElement(
108
109
  "div",
109
110
  {
110
- className: `flex items-center gap-2 bg-white/90 backdrop-blur-sm rounded-xl p-2 shadow-lg border border-purple-200 ${className}`,
111
+ className: clsx("flex items-center gap-2 bg-white/90 backdrop-blur-sm rounded-xl p-2 shadow-lg border border-purple-200", className),
111
112
  style: { width: hideVolumeControl ? "120px" : "192px" },
112
113
  onClick: stopPropagation,
113
114
  onMouseDown: stopPropagation,
@@ -117,7 +118,7 @@ function MusicPlayer({
117
118
  onPointerDown: stopPropagation,
118
119
  onPointerUp: stopPropagation
119
120
  },
120
- /* @__PURE__ */ React.createElement("div", { className: `flex items-center gap-1 ${hideVolumeControl ? "w-full justify-center" : ""}` }, /* @__PURE__ */ React.createElement(
121
+ /* @__PURE__ */ React.createElement("div", { className: clsx("flex items-center gap-1", hideVolumeControl ? "w-full justify-center" : "") }, /* @__PURE__ */ React.createElement(
121
122
  "button",
122
123
  {
123
124
  onClick: (e) => {
@@ -147,7 +148,7 @@ function MusicPlayer({
147
148
  onTouchEnd: stopPropagation,
148
149
  onPointerDown: stopPropagation,
149
150
  onPointerUp: stopPropagation,
150
- className: `w-8 h-8 rounded-lg border flex items-center justify-center transition-colors ${isPlaying ? "bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400" : "bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer"}`,
151
+ className: clsx("w-8 h-8 rounded-lg border flex items-center justify-center transition-colors", isPlaying ? "bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400" : "bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer"),
151
152
  title: isPlaying ? "\u6682\u505C" : "\u64AD\u653E"
152
153
  },
153
154
  isPlaying ? /* @__PURE__ */ React.createElement("div", { className: "flex gap-0.5" }, /* @__PURE__ */ React.createElement("div", { className: "w-1 h-3 bg-white rounded-sm" }), /* @__PURE__ */ React.createElement("div", { className: "w-1 h-3 bg-white rounded-sm" })) : /* @__PURE__ */ React.createElement("div", { className: "w-0 h-0 border-l-[6px] border-l-white border-t-[4px] border-t-transparent border-b-[4px] border-b-transparent ml-0.5" })
@@ -168,14 +169,14 @@ function MusicPlayer({
168
169
  "div",
169
170
  {
170
171
  className: "h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full",
171
- style: { width: `${volume * 100}%` }
172
+ style: { width: volume * 100 + "%" }
172
173
  }
173
174
  ),
174
175
  /* @__PURE__ */ React.createElement(
175
176
  "div",
176
177
  {
177
178
  className: "absolute top-1/2 w-3 h-3 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab",
178
- style: { left: `${volume * 100}%`, transform: "translateX(-50%) translateY(-50%)" }
179
+ style: { left: volume * 100 + "%", transform: "translateX(-50%) translateY(-50%)" }
179
180
  }
180
181
  )
181
182
  ))
@@ -184,7 +185,7 @@ function MusicPlayer({
184
185
  return /* @__PURE__ */ React.createElement(
185
186
  "div",
186
187
  {
187
- className: `bg-white/90 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-purple-200 ${className}`,
188
+ className: clsx("bg-white/90 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-purple-200", className),
188
189
  style: { width: compact ? "280px" : "320px" },
189
190
  onClick: stopPropagation,
190
191
  onMouseDown: stopPropagation,
@@ -211,7 +212,7 @@ function MusicPlayer({
211
212
  "div",
212
213
  {
213
214
  className: "h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full transition-all duration-100",
214
- style: { width: duration > 0 ? `${currentTime / duration * 100}%` : "0%" }
215
+ style: { width: duration > 0 ? currentTime / duration * 100 + "%" : "0%" }
215
216
  }
216
217
  ),
217
218
  /* @__PURE__ */ React.createElement(
@@ -219,7 +220,7 @@ function MusicPlayer({
219
220
  {
220
221
  className: "absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab",
221
222
  style: {
222
- left: duration > 0 ? `${currentTime / duration * 100}%` : "0%",
223
+ left: duration > 0 ? currentTime / duration * 100 + "%" : "0%",
223
224
  transform: "translateX(-50%) translateY(-50%)"
224
225
  }
225
226
  }
@@ -255,7 +256,7 @@ function MusicPlayer({
255
256
  onTouchEnd: stopPropagation,
256
257
  onPointerDown: stopPropagation,
257
258
  onPointerUp: stopPropagation,
258
- className: `w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ${isPlaying ? "bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400" : "bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer"}`,
259
+ className: clsx("w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors", isPlaying ? "bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400" : "bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer"),
259
260
  title: isPlaying ? "\u6682\u505C" : "\u64AD\u653E"
260
261
  },
261
262
  isLoading ? /* @__PURE__ */ React.createElement("div", { className: "w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin" }) : isPlaying ? /* @__PURE__ */ React.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ React.createElement("div", { className: "w-1.5 h-4 bg-white rounded-sm" }), /* @__PURE__ */ React.createElement("div", { className: "w-1.5 h-4 bg-white rounded-sm" })) : /* @__PURE__ */ React.createElement("div", { className: "w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1" })
@@ -276,14 +277,14 @@ function MusicPlayer({
276
277
  "div",
277
278
  {
278
279
  className: "h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full",
279
- style: { width: `${volume * 100}%` }
280
+ style: { width: volume * 100 + "%" }
280
281
  }
281
282
  ),
282
283
  /* @__PURE__ */ React.createElement(
283
284
  "div",
284
285
  {
285
286
  className: "absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab",
286
- style: { left: `${volume * 100}%`, transform: "translateX(-50%) translateY(-50%)" }
287
+ style: { left: volume * 100 + "%", transform: "translateX(-50%) translateY(-50%)" }
287
288
  }
288
289
  )
289
290
  ), /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-500 w-8 text-right" }, Math.round(volume * 100), "%")),
@@ -306,7 +307,7 @@ function MikutapMusicPlayer({
306
307
  if (!seconds || isNaN(seconds)) return "0:00";
307
308
  const mins = Math.floor(seconds / 60);
308
309
  const secs = Math.floor(seconds % 60);
309
- return `${mins}:${secs.toString().padStart(2, "0")}`;
310
+ return mins + ":" + secs.toString().padStart(2, "0");
310
311
  };
311
312
  const handlePlay = useCallback(() => {
312
313
  onPlay?.();
@@ -355,7 +356,7 @@ function MikutapMusicPlayer({
355
356
  return /* @__PURE__ */ React.createElement(
356
357
  "div",
357
358
  {
358
- className: `bg-gradient-to-r from-purple-900/95 to-pink-900/95 backdrop-blur-sm rounded-2xl p-4 shadow-2xl border border-purple-300/30 ${className}`,
359
+ className: clsx("bg-gradient-to-r from-purple-900/95 to-pink-900/95 backdrop-blur-sm rounded-2xl p-4 shadow-2xl border border-purple-300/30", className),
359
360
  style: { width: "200px" },
360
361
  onClick: stopPropagation,
361
362
  onMouseDown: stopPropagation,
@@ -379,7 +380,7 @@ function MikutapMusicPlayer({
379
380
  onTouchEnd: stopPropagation,
380
381
  onPointerDown: stopPropagation,
381
382
  onPointerUp: stopPropagation,
382
- className: `w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105 ${isPlaying ? "bg-gradient-to-r from-orange-400 to-red-500 hover:from-orange-500 hover:to-red-600 text-white border-orange-300 shadow-orange-500/50" : "bg-gradient-to-r from-green-400 to-emerald-500 hover:from-green-500 hover:to-emerald-600 text-white border-green-300 shadow-green-500/50"}`,
383
+ className: clsx("w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105", isPlaying ? "bg-gradient-to-r from-orange-400 to-red-500 hover:from-orange-500 hover:to-red-600 text-white border-orange-300 shadow-orange-500/50" : "bg-gradient-to-r from-green-400 to-emerald-500 hover:from-green-500 hover:to-emerald-600 text-white border-green-300 shadow-green-500/50"),
383
384
  title: isPlaying ? "\u6682\u505C" : "\u64AD\u653E"
384
385
  },
385
386
  isPlaying ? /* @__PURE__ */ React.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ React.createElement("div", { className: "w-1.5 h-4 bg-white rounded-sm" }), /* @__PURE__ */ React.createElement("div", { className: "w-1.5 h-4 bg-white rounded-sm" })) : /* @__PURE__ */ React.createElement("div", { className: "w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1" })
@@ -400,7 +401,7 @@ function MikutapMusicPlayer({
400
401
  "div",
401
402
  {
402
403
  className: "h-full bg-gradient-to-r from-cyan-400 to-blue-500 rounded-full transition-all duration-100 shadow-sm",
403
- style: { width: duration > 0 ? `${currentTime / duration * 100}%` : "0%" }
404
+ style: { width: duration > 0 ? currentTime / duration * 100 + "%" : "0%" }
404
405
  }
405
406
  ),
406
407
  /* @__PURE__ */ React.createElement(
@@ -408,13 +409,13 @@ function MikutapMusicPlayer({
408
409
  {
409
410
  className: "absolute top-1/2 w-3 h-3 bg-white border-2 border-cyan-400 rounded-full transform -translate-y-1/2 cursor-grab shadow-lg",
410
411
  style: {
411
- left: duration > 0 ? `${currentTime / duration * 100}%` : "0%",
412
+ left: duration > 0 ? currentTime / duration * 100 + "%" : "0%",
412
413
  transform: "translateX(-50%) translateY(-50%)"
413
414
  }
414
415
  }
415
416
  )
416
417
  ), /* @__PURE__ */ React.createElement("div", { className: "flex justify-between text-xs text-purple-200 mt-1" }, /* @__PURE__ */ React.createElement("span", null, formatTime(currentTime)), /* @__PURE__ */ React.createElement("span", null, formatTime(duration)))),
417
- /* @__PURE__ */ React.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React.createElement("div", { className: `flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300 ${isPlaying ? "bg-orange-500/20 text-orange-200 border border-orange-400/30" : "bg-gray-500/20 text-gray-300 border border-gray-400/30"}` }, /* @__PURE__ */ React.createElement("div", { className: `w-2 h-2 rounded-full transition-all duration-300 ${isPlaying ? "bg-orange-400 animate-pulse" : "bg-gray-400"}` }), /* @__PURE__ */ React.createElement("span", null, isPlaying ? "\u64AD\u653E\u4E2D" : "\u5DF2\u6682\u505C")))
418
+ /* @__PURE__ */ React.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React.createElement("div", { className: clsx("flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300", isPlaying ? "bg-orange-500/20 text-orange-200 border border-orange-400/30" : "bg-gray-500/20 text-gray-300 border border-gray-400/30") }, /* @__PURE__ */ React.createElement("div", { className: clsx("w-2 h-2 rounded-full transition-all duration-300", isPlaying ? "bg-orange-400 animate-pulse" : "bg-gray-400") }), /* @__PURE__ */ React.createElement("span", null, isPlaying ? "\u64AD\u653E\u4E2D" : "\u5DF2\u6682\u505C")))
418
419
  );
419
420
  }
420
421
 
@@ -499,7 +500,7 @@ var tencentAdapter = {
499
500
  const artist = Array.isArray(item.singer) ? item.singer.map((s) => s.name).join(", ") : item.singer?.[0]?.name || item.artist || "Unknown";
500
501
  let pic = item.pic;
501
502
  if (!pic && item.album?.mid) {
502
- pic = `https://y.gtimg.cn/music/photo_new/T002R300x300M000${item.album.mid}.jpg`;
503
+ pic = "https://y.gtimg.cn/music/photo_new/T002R300x300M000" + item.album.mid + ".jpg";
503
504
  }
504
505
  return {
505
506
  id: item.mid || item.id || item.songid,
@@ -522,7 +523,7 @@ var tencentAdapter = {
522
523
  const urlData = root.url.url;
523
524
  let finalUrl = Object.values(urlData)[0];
524
525
  console.log("finalUrl2", finalUrl);
525
- return finalUrl.startsWith("http") ? finalUrl : `http://${finalUrl}`;
526
+ return finalUrl.startsWith("http") ? finalUrl : "http://" + finalUrl;
526
527
  },
527
528
  parseGetLyric(data) {
528
529
  const root = typeof data === "string" ? JSON.parse(data) : data;
@@ -575,7 +576,7 @@ var ADAPTERS = {
575
576
  function useMusic() {
576
577
  const [searchOptions, setSearchOptions] = useState(null);
577
578
  const { data: rawData, error: searchError, isLoading: isSearching } = useSWR(
578
- searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source || DEFAULT_MUSIC_SOURCE}&limit=${searchOptions.limit || 20}&offset=${searchOptions.offset || 0}${searchOptions.miku ? "&miku=true" : ""}` : null,
579
+ searchOptions ? "/api/music/search?keyword=" + encodeURIComponent(searchOptions.keyword) + "&source=" + (searchOptions.source || DEFAULT_MUSIC_SOURCE) + "&limit=" + (searchOptions.limit || 20) + "&offset=" + (searchOptions.offset || 0) + (searchOptions.miku ? "&miku=true" : "") : null,
579
580
  fetcher
580
581
  );
581
582
  const searchResult = useMemo(() => {
@@ -591,7 +592,7 @@ function useMusic() {
591
592
  }, []);
592
593
  const getSongUrl = useCallback(async (id, source = DEFAULT_MUSIC_SOURCE) => {
593
594
  try {
594
- const res = await fetch(`/api/music/url?id=${id}&source=${source}`);
595
+ const res = await fetch("/api/music/url?id=" + id + "&source=" + source);
595
596
  const json = await res.json();
596
597
  const adapter = ADAPTERS[source];
597
598
  console.log("json2", json.data, source, adapter);
@@ -607,7 +608,7 @@ function useMusic() {
607
608
  }, []);
608
609
  const getLyric = useCallback(async (id, source = DEFAULT_MUSIC_SOURCE) => {
609
610
  try {
610
- const res = await fetch(`/api/music/lyric?id=${id}&source=${source}`);
611
+ const res = await fetch("/api/music/lyric?id=" + id + "&source=" + source);
611
612
  const json = await res.json();
612
613
  const adapter = ADAPTERS[source];
613
614
  if (adapter && json.data) {
@@ -630,5 +631,5 @@ function useMusic() {
630
631
  }
631
632
 
632
633
  export { MikutapMusicPlayer, MusicPlayer, kugouAdapter, neteaseAdapter, tencentAdapter, useMusic, xiamiAdapter };
633
- //# sourceMappingURL=chunk-3WOAPLEG.mjs.map
634
- //# sourceMappingURL=chunk-3WOAPLEG.mjs.map
634
+ //# sourceMappingURL=chunk-EB4NR623.mjs.map
635
+ //# sourceMappingURL=chunk-EB4NR623.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/music/components/MusicPlayer.tsx","../src/music/components/MikutapMusicPlayer.tsx","../src/music/adapters/kugou.ts","../src/music/adapters/netease.ts","../src/music/adapters/tencent.ts","../src/music/adapters/xiami.ts","../src/music/hooks/useMusic.ts"],"names":["useRef","useState","useCallback","useEffect","React","clsx"],"mappings":"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","file":"chunk-EB4NR623.mjs","sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { clsx } from 'clsx';\n\nexport interface MusicPlayerState {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isLoading: boolean;\n error?: string;\n}\n\nexport interface PlayerMusicTrack {\n id: string;\n name: string;\n file: string;\n duration?: number;\n volume?: number;\n}\n\nexport interface MusicPlayerProps {\n track?: PlayerMusicTrack;\n onPlay?: () => void; // 新增播放回调\n onPause?: () => void;\n onStop?: () => void;\n onVolumeChange?: (volume: number) => void;\n onSeek?: (time: number) => void;\n initialVolume?: number;\n className?: string;\n compact?: boolean;\n ultraCompact?: boolean; // 超级紧缩模式,只显示播放控制和音量\n hideVolumeControl?: boolean; // 隐藏音量控制模块\n showTrackInfo?: boolean;\n // 外部状态控制 - 必需的props\n isPlaying: boolean; // 外部播放状态\n currentTime: number; // 外部当前时间\n duration: number; // 外部总时长\n externalVolume?: number; // 外部音量状态\n}\n\nexport default function MusicPlayer({\n track,\n onPlay,\n onPause,\n onStop,\n onVolumeChange,\n onSeek,\n initialVolume = 0.7,\n className = '',\n compact = false,\n ultraCompact = false,\n hideVolumeControl = false,\n showTrackInfo = true,\n isPlaying,\n currentTime,\n duration,\n externalVolume\n}: MusicPlayerProps) {\n const [volume, setVolume] = useState(externalVolume ?? initialVolume);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n const progressRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n const [isDraggingProgress, setIsDraggingProgress] = useState(false);\n const [isDraggingVolume, setIsDraggingVolume] = useState(false);\n\n // 同步外部音量状态\n useEffect(() => {\n if (externalVolume !== undefined) {\n setVolume(externalVolume);\n }\n }, [externalVolume]);\n\n // 格式化时间显示\n const formatTime = (seconds: number): string => {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return (mins) + ':' + (secs.toString().padStart(2, '0'));\n };\n\n // 播放控制\n const handlePlay = useCallback(() => {\n onPlay?.();\n }, [onPlay]);\n\n // 暂停控制\n const handlePause = useCallback(() => {\n onPause?.();\n }, [onPause]);\n\n // 停止控制\n const handleStop = useCallback(() => {\n onStop?.();\n }, [onStop]);\n\n // 音量控制\n const handleVolumeChange = useCallback((newVolume: number) => {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n setVolume(clampedVolume);\n onVolumeChange?.(clampedVolume);\n }, [onVolumeChange]);\n\n // 进度控制\n const handleSeek = useCallback((time: number) => {\n if (!duration || isNaN(duration)) return;\n \n const seekTime = Math.max(0, Math.min(duration, time));\n onSeek?.(seekTime);\n }, [duration, onSeek]);\n\n // 鼠标拖拽进度条\n const handleProgressMouseDown = useCallback((e: React.MouseEvent) => {\n if (!progressRef.current || !duration) return;\n \n setIsDraggingProgress(true);\n const rect = progressRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * duration;\n handleSeek(time);\n }, [duration, handleSeek]);\n\n // 鼠标拖拽音量条\n const handleVolumeMouseDown = useCallback((e: React.MouseEvent) => {\n if (!volumeRef.current) return;\n \n setIsDraggingVolume(true);\n const rect = volumeRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n handleVolumeChange(percent);\n }, [handleVolumeChange]);\n\n // 处理拖拽事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingProgress && progressRef.current && duration) {\n const rect = progressRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const time = percent * duration;\n handleSeek(time);\n }\n \n if (isDraggingVolume && volumeRef.current) {\n const rect = volumeRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n handleVolumeChange(percent);\n }\n };\n\n const handleMouseUp = () => {\n setIsDraggingProgress(false);\n setIsDraggingVolume(false);\n };\n\n if (isDraggingProgress || isDraggingVolume) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingProgress, isDraggingVolume, duration, handleSeek, handleVolumeChange]);\n\n // 阻止事件传播的通用处理器\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n // 如果是超级紧缩模式\n if (ultraCompact) {\n return (\n <div \n className={clsx('flex items-center gap-2 bg-white/90 backdrop-blur-sm rounded-xl p-2 shadow-lg border border-purple-200', className)}\n style={{ width: hideVolumeControl ? '120px' : '192px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 控制按钮 */}\n <div className={clsx('flex items-center gap-1', hideVolumeControl ? 'w-full justify-center' : '')}>\n {/* 停止按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); handleStop(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className=\"w-7 h-7 rounded-lg bg-gray-100 hover:bg-gray-200 border border-gray-300 flex items-center justify-center transition-colors\"\n title=\"停止\"\n >\n <div className=\"w-2.5 h-2.5 bg-gray-600 rounded-sm\"></div>\n </button>\n\n {/* 播放/暂停按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={clsx('w-8 h-8 rounded-lg border flex items-center justify-center transition-colors', isPlaying \n ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400' \n : 'bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer')}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isPlaying ? (\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-3 bg-white rounded-sm\"></div>\n <div className=\"w-1 h-3 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[6px] border-l-white border-t-[4px] border-t-transparent border-b-[4px] border-b-transparent ml-0.5\"></div>\n )}\n </button>\n </div>\n\n {/* 音量控制 */}\n {!hideVolumeControl && (\n <div className=\"flex items-center gap-1 flex-1\">\n <div className=\"text-gray-500 text-xs\">🔊</div>\n <div \n ref={volumeRef}\n className=\"flex-1 h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleVolumeMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full\"\n style={{ width: (volume * 100) + '%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-3 h-3 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ left: (volume * 100) + '%', transform: 'translateX(-50%) translateY(-50%)' }}\n ></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div \n className={clsx('bg-white/90 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-purple-200', className)}\n style={{ width: compact ? '280px' : '320px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 音乐信息 */}\n {!compact && showTrackInfo && track && (\n <div className=\"mb-3\">\n <h3 className=\"text-sm font-medium text-gray-800 truncate\">{track.name}</h3>\n <p className=\"text-xs text-gray-500\">背景音乐</p>\n </div>\n )}\n\n {/* 进度条 */}\n {!compact && (\n <div className=\"mb-3\">\n <div \n ref={progressRef}\n className=\"w-full h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleProgressMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full transition-all duration-100\"\n style={{ width: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ \n left: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%',\n transform: 'translateX(-50%) translateY(-50%)'\n }}\n ></div>\n </div>\n \n <div className=\"flex justify-between text-xs text-gray-500 mt-1\">\n <span>{formatTime(currentTime)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n )}\n\n {/* 控制按钮 */}\n <div className=\"flex items-center justify-center gap-3 mb-3\">\n {/* 停止按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); handleStop(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className=\"w-10 h-10 rounded-full bg-gray-100 hover:bg-gray-200 border border-gray-300 flex items-center justify-center transition-colors\"\n title=\"停止\"\n >\n <div className=\"w-4 h-4 bg-gray-600 rounded-sm\"></div>\n </button>\n\n {/* 播放/暂停按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={clsx('w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors', isPlaying \n ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400' \n : 'bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer')}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isLoading ? (\n <div className=\"w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n ) : isPlaying ? (\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1\"></div>\n )}\n </button>\n </div>\n\n {/* 音量控制 */}\n {!hideVolumeControl && (\n <div className=\"flex items-center gap-3\">\n <div className=\"text-gray-500 text-sm\">🔊</div>\n <div \n ref={volumeRef}\n className=\"flex-1 h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleVolumeMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full\"\n style={{ width: (volume * 100) + '%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ left: (volume * 100) + '%', transform: 'translateX(-50%) translateY(-50%)' }}\n ></div>\n </div>\n <div className=\"text-xs text-gray-500 w-8 text-right\">\n {Math.round(volume * 100)}%\n </div>\n </div>\n )}\n\n {/* 错误信息 */}\n {error && (\n <div className=\"mt-2 text-xs text-red-500\">\n {error}\n </div>\n )}\n </div>\n );\n}","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { clsx } from 'clsx';\n\nexport interface MikutapMusicTrack {\n id: string;\n name: string;\n audioUrl: string;\n audioData?: string;\n duration?: number;\n}\n\nexport interface MikutapMusicPlayerProps {\n track?: MikutapMusicTrack;\n onPlay?: () => void;\n onPause?: () => void;\n onSeek?: (time: number) => void;\n className?: string;\n // 外部状态控制\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n}\n\nexport default function MikutapMusicPlayer({\n track,\n onPlay,\n onPause,\n onSeek,\n className = '',\n isPlaying,\n currentTime,\n duration,\n}: MikutapMusicPlayerProps) {\n const progressRef = useRef<HTMLDivElement>(null);\n const [isDraggingProgress, setIsDraggingProgress] = useState(false);\n\n // 格式化时间显示\n const formatTime = (seconds: number): string => {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return (mins) + ':' + (secs.toString().padStart(2, '0'));\n };\n\n // 播放控制\n const handlePlay = useCallback(() => {\n onPlay?.();\n }, [onPlay]);\n\n // 暂停控制\n const handlePause = useCallback(() => {\n onPause?.();\n }, [onPause]);\n\n // 进度控制\n const handleSeek = useCallback((time: number) => {\n if (!duration || isNaN(duration)) return;\n \n const seekTime = Math.max(0, Math.min(duration, time));\n onSeek?.(seekTime);\n }, [duration, onSeek]);\n\n // 鼠标拖拽进度条\n const handleProgressMouseDown = useCallback((e: React.MouseEvent) => {\n if (!progressRef.current || !duration) return;\n \n setIsDraggingProgress(true);\n const rect = progressRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * duration;\n handleSeek(time);\n }, [duration, handleSeek]);\n\n // 处理拖拽事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingProgress && progressRef.current && duration) {\n const rect = progressRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const time = percent * duration;\n handleSeek(time);\n }\n };\n\n const handleMouseUp = () => {\n setIsDraggingProgress(false);\n };\n\n if (isDraggingProgress) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingProgress, duration, handleSeek]);\n\n // 阻止事件传播的通用处理器\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <div \n className={clsx('bg-gradient-to-r from-purple-900/95 to-pink-900/95 backdrop-blur-sm rounded-2xl p-4 shadow-2xl border border-purple-300/30', className)}\n style={{ width: '200px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 音乐信息 */}\n {track && (\n <div className=\"mb-3 text-center\">\n <div className=\"text-white text-sm font-medium truncate mb-1\">\n {track.name}\n </div>\n <div className=\"text-purple-200 text-xs\">\n 背景音乐\n </div>\n </div>\n )}\n\n {/* 播放/暂停按钮 */}\n <div className=\"flex justify-center mb-3\">\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={clsx('w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105', isPlaying \n ? 'bg-gradient-to-r from-orange-400 to-red-500 hover:from-orange-500 hover:to-red-600 text-white border-orange-300 shadow-orange-500/50' \n : 'bg-gradient-to-r from-green-400 to-emerald-500 hover:from-green-500 hover:to-emerald-600 text-white border-green-300 shadow-green-500/50')}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isPlaying ? (\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1\"></div>\n )}\n </button>\n </div>\n\n {/* 进度条 */}\n <div className=\"mb-2\">\n <div \n ref={progressRef}\n className=\"w-full h-2 bg-white/20 rounded-full cursor-pointer relative overflow-hidden\"\n onMouseDown={handleProgressMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-cyan-400 to-blue-500 rounded-full transition-all duration-100 shadow-sm\"\n style={{ width: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-3 h-3 bg-white border-2 border-cyan-400 rounded-full transform -translate-y-1/2 cursor-grab shadow-lg\"\n style={{ \n left: duration > 0 ? ((currentTime / duration) * 100) + '%' : '0%',\n transform: 'translateX(-50%) translateY(-50%)'\n }}\n ></div>\n </div>\n \n <div className=\"flex justify-between text-xs text-purple-200 mt-1\">\n <span>{formatTime(currentTime)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* 状态指示器 */}\n <div className=\"flex justify-center\">\n <div className={clsx('flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300', isPlaying \n ? 'bg-orange-500/20 text-orange-200 border border-orange-400/30' \n : 'bg-gray-500/20 text-gray-300 border border-gray-400/30')}>\n <div className={clsx('w-2 h-2 rounded-full transition-all duration-300', isPlaying ? 'bg-orange-400 animate-pulse' : 'bg-gray-400')}></div>\n <span>{isPlaying ? '播放中' : '已暂停'}</span>\n </div>\n </div>\n </div>\n );\n} ","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const kugouAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const info = root.data?.data?.info || root.data?.info || root.info || [];\n const total = root.data?.data?.total || root.data?.total || info.length;\n return {\n tracks: info.map((item: any) => {\n // 优先从 trans_param.union_cover 提取封面,并替换 {size} 为 400\n let pic = item.pic || '';\n if (item.trans_param?.union_cover) {\n pic = item.trans_param.union_cover.replace('{size}', '400');\n }\n\n return {\n id: item.hash || item.id,\n name: item.songname || item.filename || 'Unknown',\n artist: item.singername || 'Unknown Artist',\n album: item.album_name || item.album || '',\n pic: pic,\n url: item.url,\n lrc: item.lrc,\n source: 'kugou',\n isVip: item.privilege >= 8,\n playable: item.status !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n return data.url?.url || data.url?.backup_url?.[0] || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const neteaseAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id,\n name: item.name,\n artist: Array.isArray(item.artist) ? item.artist.join(', ') : item.artist,\n album: item.album?.name || item.album,\n pic: item.pic || item.album?.picUrl,\n url: item.url,\n lrc: item.lrc,\n source: 'netease',\n isVip: item.fee === 1 || item.fee === 4,\n playable: item.noCopyrightRcmd === null,\n })),\n total: root.result?.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const item = root.data?.[0] || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const tencentAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n \n // 兼容多种 QQ 音乐返回结构\n const songData = root.data?.data?.song || root.data?.song || root.data || root;\n const list = songData.list || root.songs || [];\n const total = songData.totalnum || root.total || list.length;\n \n return {\n tracks: list.map((item: any) => {\n // 解析歌手名\n const artist = Array.isArray(item.singer) \n ? item.singer.map((s: any) => s.name).join(', ') \n : (item.singer?.[0]?.name || item.artist || 'Unknown');\n\n // 处理封面图 (QQ 音乐封面通常基于 album mid)\n let pic = item.pic;\n if (!pic && item.album?.mid) {\n pic = 'https://y.gtimg.cn/music/photo_new/T002R300x300M000' + (item.album.mid) + '.jpg';\n }\n\n return {\n id: item.mid || item.id || item.songid,\n name: item.name || item.title || item.songname,\n artist: artist,\n album: item.album?.name || item.albumname || item.album,\n pic: pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'tencent',\n isVip: item.pay?.pay_play === 1,\n playable: item.action?.switch !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n\n const root = data\n\n const urlData = root.url.url;\n let finalUrl = Object.values(urlData)[0] as string;\n console.log('finalUrl2', finalUrl);\n return finalUrl.startsWith('http') ? finalUrl : 'http://' + (finalUrl);\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const xiamiAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 虾米返回的结构(根据提供的数据,类似于网易云的结构)\n const result = root.data?.result || root.result || root;\n const songs = result.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id?.toString() || '',\n name: item.name || 'Unknown',\n artist: Array.isArray(item.ar) \n ? item.ar.map((a: any) => a.name).join(', ') \n : (item.artist || 'Unknown Artist'),\n album: item.al?.name || item.album || '',\n pic: item.al?.picUrl || item.pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'xiami',\n // 这里的逻辑参考提供的数据结构\n isVip: item.fee === 1 || item.fee === 8,\n playable: item.copyright !== 0,\n })),\n total: result.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 兼容多种可能的包装结构\n const item = root.data?.[0] || root.data || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n\n","import useSWR from 'swr';\nimport { useState, useCallback, useMemo } from 'react';\nimport { MusicTrack, SearchOptions, SearchResult, MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\nimport { \n kugouAdapter, \n neteaseAdapter, \n tencentAdapter, \n xiamiAdapter,\n MusicSourceAdapter \n} from '../adapters';\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\n\nconst ADAPTERS: Record<string, MusicSourceAdapter> = {\n kugou: kugouAdapter,\n netease: neteaseAdapter,\n tencent: tencentAdapter,\n xiami: xiamiAdapter,\n};\n\nexport function useMusic() {\n const [searchOptions, setSearchOptions] = useState<SearchOptions | null>(null);\n\n // 搜索歌曲\n const { data: rawData, error: searchError, isLoading: isSearching } = useSWR<MusicApiResponse<any>>(\n searchOptions ? '/api/music/search?keyword=' + (encodeURIComponent(searchOptions.keyword)) + '&source=' + (searchOptions.source || DEFAULT_MUSIC_SOURCE) + '&limit=' + (searchOptions.limit || 20) + '&offset=' + (searchOptions.offset || 0) + (searchOptions.miku ? '&miku=true' : '') : null,\n fetcher\n );\n\n const searchResult = useMemo(() => {\n if (!rawData?.data || !searchOptions) return undefined;\n const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];\n if (adapter) {\n return adapter.parseSearchResult(rawData.data);\n }\n return undefined;\n }, [rawData, searchOptions]);\n\n const search = useCallback((options: SearchOptions) => {\n setSearchOptions(options);\n }, []);\n\n // 获取播放链接\n const getSongUrl = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch('/api/music/url?id=' + (id) + '&source=' + (source));\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n console.log('json2', json.data,source,adapter);\n if (adapter && json.data) {\n console.log('getSongUrl2', json.data);\n return adapter.parseGetSongUrl(json.data) || undefined;\n }\n return json.data?.url;\n } catch (err) {\n console.error('[Music] Failed to get song URL:', err);\n return undefined;\n }\n }, []);\n\n // 获取歌词\n const getLyric = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch('/api/music/lyric?id=' + (id) + '&source=' + (source));\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n if (adapter && json.data) {\n return adapter.parseGetLyric(json.data);\n }\n return json.data?.lyric;\n } catch (err) {\n console.error('[Music] Failed to get lyric:', err);\n return undefined;\n }\n }, []);\n\n return {\n search,\n searchResult,\n isSearching,\n searchError,\n getSongUrl,\n getLyric,\n };\n}\n\n"]}