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.
- package/dist/AliyunOSSProvider-4W47OFEK.mjs +6 -0
- package/dist/{AliyunOSSProvider-KJYRIZES.mjs.map → AliyunOSSProvider-4W47OFEK.mjs.map} +1 -1
- package/dist/AliyunOSSProvider-HCNGDJL7.js +15 -0
- package/dist/{AliyunOSSProvider-FWAKUB2T.js.map → AliyunOSSProvider-HCNGDJL7.js.map} +1 -1
- package/dist/ConfigService-3DIC6C3Q.js +21 -0
- package/dist/{ConfigService-7MEZXKJ5.js.map → ConfigService-3DIC6C3Q.js.map} +1 -1
- package/dist/ConfigService-V6ZK273Z.mjs +4 -0
- package/dist/{ConfigService-BV57YYFW.mjs.map → ConfigService-V6ZK273Z.mjs.map} +1 -1
- package/dist/LocalStorageProvider-3RVPCQB3.mjs +6 -0
- package/dist/{LocalStorageProvider-RTPMUOZ2.mjs.map → LocalStorageProvider-3RVPCQB3.mjs.map} +1 -1
- package/dist/LocalStorageProvider-PP7MA5OT.js +15 -0
- package/dist/{LocalStorageProvider-XSRCUXOU.js.map → LocalStorageProvider-PP7MA5OT.js.map} +1 -1
- package/dist/PMXParser-2VTA737I.js +13 -0
- package/dist/{PMXParser-YBS3B6HM.js.map → PMXParser-2VTA737I.js.map} +1 -1
- package/dist/PMXParser-RNVQL76A.mjs +4 -0
- package/dist/{PMXParser-L6IWHL4I.mjs.map → PMXParser-RNVQL76A.mjs.map} +1 -1
- package/dist/analytics/index.js +46 -45
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +45 -44
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/analytics/server/index.js +4 -4
- package/dist/analytics/server/index.js.map +1 -1
- package/dist/analytics/server/index.mjs +4 -4
- package/dist/analytics/server/index.mjs.map +1 -1
- package/dist/api/index.js +5 -5
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +5 -5
- package/dist/api/index.mjs.map +1 -1
- package/dist/audioDetection/index.js +17 -16
- package/dist/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs +17 -16
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/auth/client/index.js +4 -4
- package/dist/auth/client/index.mjs +1 -1
- package/dist/auth/components/index.js +3 -3
- package/dist/auth/components/index.js.map +1 -1
- package/dist/auth/components/index.mjs +3 -3
- package/dist/auth/components/index.mjs.map +1 -1
- package/dist/auth/index.js +29 -29
- package/dist/auth/index.mjs +5 -5
- package/dist/auth/middleware/index.js +3 -3
- package/dist/auth/middleware/index.mjs +2 -2
- package/dist/auth/routes/index.js +14 -14
- package/dist/auth/routes/index.mjs +2 -2
- package/dist/auth/services/index.js +7 -7
- package/dist/auth/services/index.mjs +1 -1
- package/dist/calendar/index.js +146 -182
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +139 -175
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/routes/index.js +1 -1
- package/dist/calendar/routes/index.js.map +1 -1
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/routes/index.mjs.map +1 -1
- package/dist/{chunk-5YQ5B7IZ.js → chunk-24HGREE6.js} +5 -5
- package/dist/{chunk-5YQ5B7IZ.js.map → chunk-24HGREE6.js.map} +1 -1
- package/dist/{chunk-6PRFP5EG.js → chunk-25OFOKNF.js} +6 -6
- package/dist/chunk-25OFOKNF.js.map +1 -0
- package/dist/{chunk-KQGP6BTS.mjs → chunk-3DXPQ4YV.mjs} +6 -6
- package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
- package/dist/{chunk-3BGPZN4X.mjs → chunk-3NHAT7D4.mjs} +12 -12
- package/dist/chunk-3NHAT7D4.mjs.map +1 -0
- package/dist/{chunk-MW4BCIZC.mjs → chunk-4HC6M7FK.mjs} +3 -3
- package/dist/chunk-4HC6M7FK.mjs.map +1 -0
- package/dist/{chunk-ESRCX5TQ.mjs → chunk-52TN2QSS.mjs} +3 -3
- package/dist/{chunk-ESRCX5TQ.mjs.map → chunk-52TN2QSS.mjs.map} +1 -1
- package/dist/{chunk-CNTILN5J.mjs → chunk-5YQ62BKX.mjs} +20 -19
- package/dist/chunk-5YQ62BKX.mjs.map +1 -0
- package/dist/{chunk-6W5BMXJG.js → chunk-6OWNMJKG.js} +4 -4
- package/dist/{chunk-6W5BMXJG.js.map → chunk-6OWNMJKG.js.map} +1 -1
- package/dist/{chunk-DUHZ7VZP.js → chunk-7VRT55ZD.js} +3 -3
- package/dist/chunk-7VRT55ZD.js.map +1 -0
- package/dist/{chunk-3WOAPLEG.mjs → chunk-EB4NR623.mjs} +27 -26
- package/dist/chunk-EB4NR623.mjs.map +1 -0
- package/dist/chunk-EI27JKND.mjs +1988 -0
- package/dist/chunk-EI27JKND.mjs.map +1 -0
- package/dist/{chunk-CD77U7LZ.js → chunk-GBPLX42J.js} +9 -9
- package/dist/chunk-GBPLX42J.js.map +1 -0
- package/dist/{chunk-TFQF2HDO.mjs → chunk-HDEOCX2L.mjs} +12 -12
- package/dist/chunk-HDEOCX2L.mjs.map +1 -0
- package/dist/{chunk-TV3VKRJK.mjs → chunk-HDMIOOZY.mjs} +38 -68
- package/dist/chunk-HDMIOOZY.mjs.map +1 -0
- package/dist/{chunk-OPPF3326.js → chunk-HJ6MH7J7.js} +39 -69
- package/dist/chunk-HJ6MH7J7.js.map +1 -0
- package/dist/chunk-KO73EBUT.js +80 -0
- package/dist/chunk-KO73EBUT.js.map +1 -0
- package/dist/{chunk-6YKMCPQI.mjs → chunk-KZKIH4AS.mjs} +4 -4
- package/dist/chunk-KZKIH4AS.mjs.map +1 -0
- package/dist/{chunk-LX4XX6W7.js → chunk-L47ZOYHL.js} +15 -89
- package/dist/chunk-L47ZOYHL.js.map +1 -0
- package/dist/{chunk-6MQUBPKB.mjs → chunk-LJ4CCSSY.mjs} +3 -3
- package/dist/{chunk-6MQUBPKB.mjs.map → chunk-LJ4CCSSY.mjs.map} +1 -1
- package/dist/{chunk-TOC5FSHP.js → chunk-NJ2SNXBJ.js} +12 -12
- package/dist/chunk-NJ2SNXBJ.js.map +1 -0
- package/dist/{chunk-OCR5DS4C.mjs → chunk-PE5EAHZK.mjs} +3 -3
- package/dist/chunk-PE5EAHZK.mjs.map +1 -0
- package/dist/{chunk-LZHMNOED.js → chunk-Q5EDCKQA.js} +26 -26
- package/dist/chunk-Q5EDCKQA.js.map +1 -0
- package/dist/{chunk-CLKKZSPZ.js → chunk-RBKGYWME.js} +20 -19
- package/dist/chunk-RBKGYWME.js.map +1 -0
- package/dist/{chunk-VRTRSEEH.mjs → chunk-RSJSZ7QH.mjs} +11 -11
- package/dist/chunk-RSJSZ7QH.mjs.map +1 -0
- package/dist/{chunk-E7RGBAYJ.js → chunk-TDCDEBGP.js} +30 -29
- package/dist/chunk-TDCDEBGP.js.map +1 -0
- package/dist/{chunk-JZXJQMVE.js → chunk-UIFFDRTE.js} +11 -11
- package/dist/chunk-UIFFDRTE.js.map +1 -0
- package/dist/{chunk-T5OZHYVM.mjs → chunk-UKT3PLON.mjs} +13 -85
- package/dist/chunk-UKT3PLON.mjs.map +1 -0
- package/dist/{chunk-UOFTHYIH.js → chunk-UL6XJGUZ.js} +4 -4
- package/dist/chunk-UL6XJGUZ.js.map +1 -0
- package/dist/chunk-VVWQTO4Y.mjs +77 -0
- package/dist/chunk-VVWQTO4Y.mjs.map +1 -0
- package/dist/{chunk-A3UP56MS.js → chunk-WA67GZSZ.js} +3 -3
- package/dist/chunk-WA67GZSZ.js.map +1 -0
- package/dist/{chunk-OLHGZXN3.mjs → chunk-WEEXCPSE.mjs} +5 -5
- package/dist/chunk-WEEXCPSE.mjs.map +1 -0
- package/dist/chunk-XGBE4SUV.js +2093 -0
- package/dist/chunk-XGBE4SUV.js.map +1 -0
- package/dist/{chunk-QU5OT4DF.js → chunk-XJ7ZAGC5.js} +5 -5
- package/dist/chunk-XJ7ZAGC5.js.map +1 -0
- package/dist/{chunk-ZI25QCHD.mjs → chunk-YOTQG4NP.mjs} +25 -25
- package/dist/chunk-YOTQG4NP.mjs.map +1 -0
- package/dist/{chunk-QAT2RWAO.mjs → chunk-Z36R3P62.mjs} +7 -7
- package/dist/chunk-Z36R3P62.mjs.map +1 -0
- package/dist/{chunk-7Z5LLJ3A.js → chunk-ZWQJSZEY.js} +13 -13
- package/dist/chunk-ZWQJSZEY.js.map +1 -0
- package/dist/config/index.js +6 -6
- package/dist/config/index.js.map +1 -1
- package/dist/config/index.mjs +6 -6
- package/dist/config/index.mjs.map +1 -1
- package/dist/config/server/index.js +37 -37
- package/dist/config/server/index.js.map +1 -1
- package/dist/config/server/index.mjs +37 -37
- package/dist/config/server/index.mjs.map +1 -1
- package/dist/i18n/index.d.mts +2 -2
- package/dist/i18n/index.d.ts +2 -2
- package/dist/i18n/index.js +16 -17
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +16 -17
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/imageCrop/index.js +11 -10
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs +11 -10
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/index.d.mts +185 -100
- package/dist/index.d.ts +185 -100
- package/dist/index.js +225 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +80 -104
- package/dist/index.mjs.map +1 -1
- package/dist/logger/index.js +6 -6
- package/dist/logger/index.mjs +1 -1
- package/dist/mikuFusionGame/index.d.mts +112 -0
- package/dist/mikuFusionGame/index.d.ts +112 -0
- package/dist/mikuFusionGame/index.js +680 -0
- package/dist/mikuFusionGame/index.js.map +1 -0
- package/dist/mikuFusionGame/index.mjs +667 -0
- package/dist/mikuFusionGame/index.mjs.map +1 -0
- package/dist/mmd/admin/index.js +11 -10
- package/dist/mmd/admin/index.js.map +1 -1
- package/dist/mmd/admin/index.mjs +11 -10
- package/dist/mmd/admin/index.mjs.map +1 -1
- package/dist/mmd/index.js +223 -241
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +220 -238
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.js +6 -6
- package/dist/mmd/server/index.js.map +1 -1
- package/dist/mmd/server/index.mjs +6 -6
- package/dist/mmd/server/index.mjs.map +1 -1
- package/dist/music/index.js +16 -16
- package/dist/music/index.mjs +2 -2
- package/dist/music/server/index.js +8 -8
- package/dist/music/server/index.mjs +1 -1
- package/dist/request/index.js +2 -2
- package/dist/request/index.js.map +1 -1
- package/dist/request/index.mjs +2 -2
- package/dist/request/index.mjs.map +1 -1
- package/dist/storage/index.js +15 -14
- package/dist/storage/index.mjs +3 -2
- package/dist/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +22 -22
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +14 -14
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/testYourself/server/index.js +4 -4
- package/dist/testYourself/server/index.mjs +1 -1
- package/dist/universalExport/index.d.mts +3 -3
- package/dist/universalExport/index.d.ts +3 -3
- package/dist/universalExport/index.js +48 -47
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +48 -47
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.js +29 -29
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +28 -28
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.d.mts +3 -3
- package/dist/universalFile/index.d.ts +3 -3
- package/dist/universalFile/index.js +73 -72
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +73 -72
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.js +258 -260
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +244 -246
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/dist/utils/index.js +11 -11
- package/dist/utils/index.mjs +2 -2
- package/package.json +25 -31
- package/dist/AliyunOSSProvider-FWAKUB2T.js +0 -15
- package/dist/AliyunOSSProvider-KJYRIZES.mjs +0 -6
- package/dist/ConfigService-7MEZXKJ5.js +0 -21
- package/dist/ConfigService-BV57YYFW.mjs +0 -4
- package/dist/LocalStorageProvider-RTPMUOZ2.mjs +0 -6
- package/dist/LocalStorageProvider-XSRCUXOU.js +0 -15
- package/dist/PMXParser-L6IWHL4I.mjs +0 -4
- package/dist/PMXParser-YBS3B6HM.js +0 -13
- package/dist/chunk-3BGPZN4X.mjs.map +0 -1
- package/dist/chunk-3WOAPLEG.mjs.map +0 -1
- package/dist/chunk-6PRFP5EG.js.map +0 -1
- package/dist/chunk-6YKMCPQI.mjs.map +0 -1
- package/dist/chunk-7Z5LLJ3A.js.map +0 -1
- package/dist/chunk-A3UP56MS.js.map +0 -1
- package/dist/chunk-CD77U7LZ.js.map +0 -1
- package/dist/chunk-CLKKZSPZ.js.map +0 -1
- package/dist/chunk-CNTILN5J.mjs.map +0 -1
- package/dist/chunk-DUHZ7VZP.js.map +0 -1
- package/dist/chunk-DW2ZTOCV.js +0 -1727
- package/dist/chunk-DW2ZTOCV.js.map +0 -1
- package/dist/chunk-E7RGBAYJ.js.map +0 -1
- package/dist/chunk-JZXJQMVE.js.map +0 -1
- package/dist/chunk-KQGP6BTS.mjs.map +0 -1
- package/dist/chunk-LFG6FPM5.mjs +0 -1597
- package/dist/chunk-LFG6FPM5.mjs.map +0 -1
- package/dist/chunk-LX4XX6W7.js.map +0 -1
- package/dist/chunk-LZHMNOED.js.map +0 -1
- package/dist/chunk-MW4BCIZC.mjs.map +0 -1
- package/dist/chunk-OCR5DS4C.mjs.map +0 -1
- package/dist/chunk-OLHGZXN3.mjs.map +0 -1
- package/dist/chunk-OPPF3326.js.map +0 -1
- package/dist/chunk-QAT2RWAO.mjs.map +0 -1
- package/dist/chunk-QU5OT4DF.js.map +0 -1
- package/dist/chunk-T5OZHYVM.mjs.map +0 -1
- package/dist/chunk-TFQF2HDO.mjs.map +0 -1
- package/dist/chunk-TOC5FSHP.js.map +0 -1
- package/dist/chunk-TV3VKRJK.mjs.map +0 -1
- package/dist/chunk-UOFTHYIH.js.map +0 -1
- package/dist/chunk-VRTRSEEH.mjs.map +0 -1
- package/dist/chunk-ZI25QCHD.mjs.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { DEFAULT_MUSIC_SOURCE } from './chunk-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 ?
|
|
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 ?
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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 ?
|
|
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 ?
|
|
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:
|
|
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 =
|
|
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 :
|
|
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 ?
|
|
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(
|
|
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(
|
|
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-
|
|
634
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|