sa2kit 1.6.13 → 1.6.14
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/PMXParser-L6IWHL4I.mjs +4 -0
- package/dist/PMXParser-L6IWHL4I.mjs.map +1 -0
- package/dist/PMXParser-YBS3B6HM.js +13 -0
- package/dist/PMXParser-YBS3B6HM.js.map +1 -0
- package/dist/audioDetection/index.js.map +1 -1
- package/dist/audioDetection/index.mjs.map +1 -1
- package/dist/auth/index.js +3 -3
- package/dist/auth/index.mjs +1 -1
- package/dist/{chunk-FAHLZIYQ.js → chunk-5D7ZFZIM.js} +2 -2
- package/dist/{chunk-FAHLZIYQ.js.map → chunk-5D7ZFZIM.js.map} +1 -1
- package/dist/{chunk-G4AMEDO5.js → chunk-66EHKQVS.js} +2 -2
- package/dist/{chunk-G4AMEDO5.js.map → chunk-66EHKQVS.js.map} +1 -1
- package/dist/{chunk-CDK3DHKM.mjs → chunk-GGGTJETD.mjs} +3 -3
- package/dist/{chunk-CDK3DHKM.mjs.map → chunk-GGGTJETD.mjs.map} +1 -1
- package/dist/chunk-JZXJQMVE.js +363 -0
- package/dist/chunk-JZXJQMVE.js.map +1 -0
- package/dist/{chunk-2ODO4HEI.js → chunk-LFM5QSFW.js} +2 -2
- package/dist/{chunk-2ODO4HEI.js.map → chunk-LFM5QSFW.js.map} +1 -1
- package/dist/{chunk-ZYXF3L6T.mjs → chunk-MRGFYQTC.mjs} +2 -2
- package/dist/{chunk-ZYXF3L6T.mjs.map → chunk-MRGFYQTC.mjs.map} +1 -1
- package/dist/{chunk-ZCLAF3XN.mjs → chunk-TGL6BATG.mjs} +2 -2
- package/dist/{chunk-ZCLAF3XN.mjs.map → chunk-TGL6BATG.mjs.map} +1 -1
- package/dist/{chunk-L5PW2YTI.js → chunk-UUM5BIOU.js} +7 -7
- package/dist/{chunk-L5PW2YTI.js.map → chunk-UUM5BIOU.js.map} +1 -1
- package/dist/chunk-VRTRSEEH.mjs +361 -0
- package/dist/chunk-VRTRSEEH.mjs.map +1 -0
- package/dist/{chunk-6BZ3QFA5.mjs → chunk-VZFHU553.mjs} +2 -2
- package/dist/{chunk-6BZ3QFA5.mjs.map → chunk-VZFHU553.mjs.map} +1 -1
- package/dist/imageCrop/index.js.map +1 -1
- package/dist/imageCrop/index.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/mmd/admin/index.d.mts +1 -1
- package/dist/mmd/admin/index.d.ts +1 -1
- package/dist/mmd/index.d.mts +753 -3
- package/dist/mmd/index.d.ts +753 -3
- package/dist/mmd/index.js +7542 -5841
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +7453 -5776
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/mmd/server/index.d.mts +1 -1
- package/dist/mmd/server/index.d.ts +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/testYourself/admin/index.js +3 -3
- package/dist/testYourself/admin/index.mjs +1 -1
- package/dist/testYourself/index.js +7 -7
- package/dist/testYourself/index.js.map +1 -1
- package/dist/testYourself/index.mjs +2 -2
- package/dist/testYourself/index.mjs.map +1 -1
- package/dist/{types-BB-7_WtE.d.ts → types-HorDyIRv.d.mts} +50 -0
- package/dist/{types-BB-7_WtE.d.mts → types-HorDyIRv.d.ts} +50 -0
- package/package.json +19 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/music/constants.ts","../src/music/server/meting.ts","../src/music/server/miku.ts","../src/music/server/handlers.ts"],"names":[],"mappings":"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","file":"chunk-ZCLAF3XN.mjs","sourcesContent":["/**\n * 音乐模块常量定义\n */\n\nexport const DEFAULT_MUSIC_SOURCE = 'kugou';\n\nexport const MUSIC_SOURCES = [\n // 'netease', \n // 'tencent',\n 'kugou',\n // 'xiami',\n] as const;\n\nexport type MusicSource = (typeof MUSIC_SOURCES)[number];\n\nexport const MUSIC_SOURCE_NAMES: Record<MusicSource, string> = {\n // netease: '网易云',\n // tencent: '腾讯音乐',\n kugou: '酷狗音乐',\n // xiami: '虾米音乐',\n};\n\n","import Meting from '@meting/core';\nimport { SearchOptions } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * Meting 服务集成\n */\nexport class MetingService {\n private instances: Map<string, any> = new Map();\n\n private getInstance(source: string) {\n if (!this.instances.has(source)) {\n this.instances.set(source, new Meting(source));\n }\n return this.instances.get(source);\n }\n\n /**\n * 搜索歌曲\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n const meting = this.getInstance(source);\n \n // Meting 通常使用 page (1-based) 和 limit 参数\n // 如果 offset 是前端传来的 0-based 页码\n const response = await meting.search(keyword, {\n limit,\n page: offset + 1,\n });\n\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌曲详情(包含播放链接)\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.song(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌词\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.lyric(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n}\n\nexport const musicService = new MetingService();\n","import { MetingService, musicService } from './meting';\nimport { SearchOptions, SearchResult } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 专门用于搜索 Miku/初音未来 相关歌曲的服务\n */\nexport class MikuMusicService {\n private baseService: MetingService;\n private mikuKeywords = ['初音未来', 'Miku', 'Vocaloid', 'MIKU'];\n\n constructor(baseService: MetingService = musicService) {\n this.baseService = baseService;\n }\n\n /**\n * 搜索歌曲,自动增加 Miku 相关关键词\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n \n const trimmedKeyword = keyword.trim();\n \n // 如果关键词中已经包含了 miku 相关词,就不再额外添加\n const hasMikuKeyword = this.mikuKeywords.some(k => \n trimmedKeyword.toLowerCase().includes(k.toLowerCase())\n );\n\n // 组合关键词:用户关键词 + 初音未来\n // 如果用户没搜初音,我们就帮他搜初音\n const mikuKeyword = hasMikuKeyword ? trimmedKeyword : `${trimmedKeyword} 初音未来`.trim();\n\n return this.baseService.search({\n ...options,\n keyword: mikuKeyword || '初音未来', // 如果输入为空,默认搜初音未来\n });\n }\n\n /**\n * 获取歌曲详情(包含播放链接)- 直接透传\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n return this.baseService.getSongUrl(id, source);\n }\n\n /**\n * 获取歌词 - 直接透传\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n return this.baseService.getLyric(id, source);\n }\n}\n\nexport const mikuMusicService = new MikuMusicService();\n\n\n","import { musicService } from './meting';\nimport { mikuMusicService } from './miku';\nimport { MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 创建搜索接口处理器\n */\nexport const createSearchHandler = () => {\n// ...\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const keyword = searchParams.get('keyword');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n const limit = parseInt(searchParams.get('limit') || '20');\n const offset = parseInt(searchParams.get('offset') || '0');\n const miku = searchParams.get('miku') === 'true';\n\n if (!keyword && !miku) {\n return Response.json({ code: 400, message: 'Keyword is required' }, { status: 400 });\n }\n\n const service = miku ? mikuMusicService : musicService;\n const result = await service.search({\n keyword: keyword || '',\n source: source as any,\n limit,\n offset,\n miku,\n });\n\n return Response.json({\n code: 200,\n data: result,\n });\n } catch (error: any) {\n console.error('[Music] Search error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌曲链接接口处理器\n */\nexport const createSongUrlHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const url = await musicService.getSongUrl(id, source);\n\n return Response.json({\n code: 200,\n data: { url },\n });\n } catch (error: any) {\n console.error('[Music] Get URL error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌词接口处理器\n */\nexport const createLyricHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const lyric = await musicService.getLyric(id, source);\n\n return Response.json({\n code: 200,\n data: { lyric },\n });\n } catch (error: any) {\n console.error('[Music] Get lyric error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/music/constants.ts","../src/music/server/meting.ts","../src/music/server/miku.ts","../src/music/server/handlers.ts"],"names":[],"mappings":";;;;;AAIO,IAAM,oBAAA,GAAuB;;;ACG7B,IAAM,gBAAN,MAAoB;AAAA,EAApB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAA,uBAAkC,GAAA,EAAI;AAAA,EAAA;AAAA,EAEtC,YAAY,MAAA,EAAgB;AAClC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,UAAU,GAAA,CAAI,MAAA,EAAQ,IAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAA,EAAsC;AACjD,IAAA,MAAM,EAAE,SAAS,MAAA,GAAS,oBAAA,EAAsB,QAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,OAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAItC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS;AAAA,MAC5C,KAAA;AAAA,MACA,MAAM,MAAA,GAAS;AAAA,KAChB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA;AAAA,IAC/D,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACrC,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA;AAAA,IAC/D,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC1F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GAAI,QAAA;AAAA,IAC/D,SAAS,CAAA,EAAG;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,YAAA,GAAe,IAAI,aAAA;;;AC1DzB,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CAAY,cAA6B,YAAA,EAAc;AAFvD,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAC,0BAAA,EAAQ,MAAA,EAAQ,YAAY,MAAM,CAAA;AAGxD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAA,EAAsC;AACjD,IAAA,MAAM,EAAE,SAAS,MAAA,GAAS,oBAAA,EAAsB,QAAQ,EAAA,EAAI,MAAA,GAAS,GAAE,GAAI,OAAA;AAE3E,IAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,EAAK;AAGpC,IAAA,MAAM,cAAA,GAAiB,KAAK,YAAA,CAAa,IAAA;AAAA,MAAK,OAC5C,cAAA,CAAe,WAAA,GAAc,QAAA,CAAS,CAAA,CAAE,aAAa;AAAA,KACvD;AAIA,IAAA,MAAM,cAAc,cAAA,GAAiB,cAAA,GAAiB,CAAA,EAAG,cAAc,4BAAQ,IAAA,EAAK;AAEpF,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,MAC7B,GAAG,OAAA;AAAA,MACH,SAAS,WAAA,IAAe;AAAA;AAAA,KACzB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC5F,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,EAAA,EAAI,MAAM,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,EAAA,EAAY,MAAA,GAAiB,oBAAA,EAAgD;AAC1F,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,EAAA,EAAI,MAAM,CAAA;AAAA,EAC7C;AACF;AAEO,IAAM,gBAAA,GAAmB,IAAI,gBAAA;;;AC7C7B,IAAM,sBAAsB,MAAM;AAEvC,EAAA,OAAO,OAAO,GAAA,KAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,oBAAA;AAC7C,MAAA,MAAM,QAAQ,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,OAAO,KAAK,IAAI,CAAA;AACxD,MAAA,MAAM,SAAS,QAAA,CAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,KAAK,GAAG,CAAA;AACzD,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,KAAM,MAAA;AAE1C,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,IAAA,EAAM;AACrB,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,qBAAA,EAAsB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MACrF;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,gBAAA,GAAmB,YAAA;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO;AAAA,QAClC,SAAS,OAAA,IAAW,EAAA;AAAA,QACpB,MAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACF;AAKO,IAAM,uBAAuB,MAAM;AACxC,EAAA,OAAO,OAAO,GAAA,KAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,oBAAA;AAE7C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,gBAAA,EAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,UAAA,CAAW,IAAI,MAAM,CAAA;AAEpD,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM,EAAE,GAAA;AAAI,OACb,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACF;AAKO,IAAM,qBAAqB,MAAM;AACtC,EAAA,OAAO,OAAO,GAAA,KAAoC;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,YAAA,EAAa,GAAI,IAAI,GAAA,CAAI,IAAI,GAAG,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA,IAAK,oBAAA;AAE7C,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,gBAAA,EAAiB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa,QAAA,CAAS,IAAI,MAAM,CAAA;AAEpD,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,IAAA,EAAM,EAAE,KAAA;AAAM,OACf,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAC/C,MAAA,OAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC5B,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACF","file":"chunk-TGL6BATG.mjs","sourcesContent":["/**\n * 音乐模块常量定义\n */\n\nexport const DEFAULT_MUSIC_SOURCE = 'kugou';\n\nexport const MUSIC_SOURCES = [\n // 'netease', \n // 'tencent',\n 'kugou',\n // 'xiami',\n] as const;\n\nexport type MusicSource = (typeof MUSIC_SOURCES)[number];\n\nexport const MUSIC_SOURCE_NAMES: Record<MusicSource, string> = {\n // netease: '网易云',\n // tencent: '腾讯音乐',\n kugou: '酷狗音乐',\n // xiami: '虾米音乐',\n};\n\n","import Meting from '@meting/core';\nimport { SearchOptions } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * Meting 服务集成\n */\nexport class MetingService {\n private instances: Map<string, any> = new Map();\n\n private getInstance(source: string) {\n if (!this.instances.has(source)) {\n this.instances.set(source, new Meting(source));\n }\n return this.instances.get(source);\n }\n\n /**\n * 搜索歌曲\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n const meting = this.getInstance(source);\n \n // Meting 通常使用 page (1-based) 和 limit 参数\n // 如果 offset 是前端传来的 0-based 页码\n const response = await meting.search(keyword, {\n limit,\n page: offset + 1,\n });\n\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌曲详情(包含播放链接)\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.song(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n\n /**\n * 获取歌词\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n const meting = this.getInstance(source);\n const response = await meting.lyric(id);\n try {\n return typeof response === 'string' ? JSON.parse(response) : response;\n } catch (e) {\n return response;\n }\n }\n}\n\nexport const musicService = new MetingService();\n","import { MetingService, musicService } from './meting';\nimport { SearchOptions, SearchResult } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 专门用于搜索 Miku/初音未来 相关歌曲的服务\n */\nexport class MikuMusicService {\n private baseService: MetingService;\n private mikuKeywords = ['初音未来', 'Miku', 'Vocaloid', 'MIKU'];\n\n constructor(baseService: MetingService = musicService) {\n this.baseService = baseService;\n }\n\n /**\n * 搜索歌曲,自动增加 Miku 相关关键词\n */\n async search(options: SearchOptions): Promise<any> {\n const { keyword, source = DEFAULT_MUSIC_SOURCE, limit = 20, offset = 0 } = options;\n \n const trimmedKeyword = keyword.trim();\n \n // 如果关键词中已经包含了 miku 相关词,就不再额外添加\n const hasMikuKeyword = this.mikuKeywords.some(k => \n trimmedKeyword.toLowerCase().includes(k.toLowerCase())\n );\n\n // 组合关键词:用户关键词 + 初音未来\n // 如果用户没搜初音,我们就帮他搜初音\n const mikuKeyword = hasMikuKeyword ? trimmedKeyword : `${trimmedKeyword} 初音未来`.trim();\n\n return this.baseService.search({\n ...options,\n keyword: mikuKeyword || '初音未来', // 如果输入为空,默认搜初音未来\n });\n }\n\n /**\n * 获取歌曲详情(包含播放链接)- 直接透传\n */\n async getSongUrl(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n return this.baseService.getSongUrl(id, source);\n }\n\n /**\n * 获取歌词 - 直接透传\n */\n async getLyric(id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<any | undefined> {\n return this.baseService.getLyric(id, source);\n }\n}\n\nexport const mikuMusicService = new MikuMusicService();\n\n\n\n\n\n","import { musicService } from './meting';\nimport { mikuMusicService } from './miku';\nimport { MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\n\n/**\n * 创建搜索接口处理器\n */\nexport const createSearchHandler = () => {\n// ...\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const keyword = searchParams.get('keyword');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n const limit = parseInt(searchParams.get('limit') || '20');\n const offset = parseInt(searchParams.get('offset') || '0');\n const miku = searchParams.get('miku') === 'true';\n\n if (!keyword && !miku) {\n return Response.json({ code: 400, message: 'Keyword is required' }, { status: 400 });\n }\n\n const service = miku ? mikuMusicService : musicService;\n const result = await service.search({\n keyword: keyword || '',\n source: source as any,\n limit,\n offset,\n miku,\n });\n\n return Response.json({\n code: 200,\n data: result,\n });\n } catch (error: any) {\n console.error('[Music] Search error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌曲链接接口处理器\n */\nexport const createSongUrlHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const url = await musicService.getSongUrl(id, source);\n\n return Response.json({\n code: 200,\n data: { url },\n });\n } catch (error: any) {\n console.error('[Music] Get URL error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n/**\n * 创建歌词接口处理器\n */\nexport const createLyricHandler = () => {\n return async (req: Request): Promise<Response> => {\n try {\n const { searchParams } = new URL(req.url);\n const id = searchParams.get('id');\n const source = searchParams.get('source') || DEFAULT_MUSIC_SOURCE;\n\n if (!id) {\n return Response.json({ code: 400, message: 'ID is required' }, { status: 400 });\n }\n\n const lyric = await musicService.getLyric(id, source);\n\n return Response.json({\n code: 200,\n data: { lyric },\n });\n } catch (error: any) {\n console.error('[Music] Get lyric error:', error);\n return Response.json({\n code: 500,\n message: error.message || 'Internal Server Error',\n }, { status: 500 });\n }\n };\n};\n\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkLFM5QSFW_js = require('./chunk-LFM5QSFW.js');
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var useSWR = require('swr');
|
|
6
6
|
|
|
@@ -582,12 +582,12 @@ var ADAPTERS = {
|
|
|
582
582
|
function useMusic() {
|
|
583
583
|
const [searchOptions, setSearchOptions] = React.useState(null);
|
|
584
584
|
const { data: rawData, error: searchError, isLoading: isSearching } = useSWR__default.default(
|
|
585
|
-
searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source ||
|
|
585
|
+
searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source || chunkLFM5QSFW_js.DEFAULT_MUSIC_SOURCE}&limit=${searchOptions.limit || 20}&offset=${searchOptions.offset || 0}${searchOptions.miku ? "&miku=true" : ""}` : null,
|
|
586
586
|
fetcher
|
|
587
587
|
);
|
|
588
588
|
const searchResult = React.useMemo(() => {
|
|
589
589
|
if (!rawData?.data || !searchOptions) return void 0;
|
|
590
|
-
const adapter = ADAPTERS[searchOptions.source ||
|
|
590
|
+
const adapter = ADAPTERS[searchOptions.source || chunkLFM5QSFW_js.DEFAULT_MUSIC_SOURCE];
|
|
591
591
|
if (adapter) {
|
|
592
592
|
return adapter.parseSearchResult(rawData.data);
|
|
593
593
|
}
|
|
@@ -596,7 +596,7 @@ function useMusic() {
|
|
|
596
596
|
const search = React.useCallback((options) => {
|
|
597
597
|
setSearchOptions(options);
|
|
598
598
|
}, []);
|
|
599
|
-
const getSongUrl = React.useCallback(async (id, source =
|
|
599
|
+
const getSongUrl = React.useCallback(async (id, source = chunkLFM5QSFW_js.DEFAULT_MUSIC_SOURCE) => {
|
|
600
600
|
try {
|
|
601
601
|
const res = await fetch(`/api/music/url?id=${id}&source=${source}`);
|
|
602
602
|
const json = await res.json();
|
|
@@ -612,7 +612,7 @@ function useMusic() {
|
|
|
612
612
|
return void 0;
|
|
613
613
|
}
|
|
614
614
|
}, []);
|
|
615
|
-
const getLyric = React.useCallback(async (id, source =
|
|
615
|
+
const getLyric = React.useCallback(async (id, source = chunkLFM5QSFW_js.DEFAULT_MUSIC_SOURCE) => {
|
|
616
616
|
try {
|
|
617
617
|
const res = await fetch(`/api/music/lyric?id=${id}&source=${source}`);
|
|
618
618
|
const json = await res.json();
|
|
@@ -643,5 +643,5 @@ exports.neteaseAdapter = neteaseAdapter;
|
|
|
643
643
|
exports.tencentAdapter = tencentAdapter;
|
|
644
644
|
exports.useMusic = useMusic;
|
|
645
645
|
exports.xiamiAdapter = xiamiAdapter;
|
|
646
|
-
//# sourceMappingURL=chunk-
|
|
647
|
-
//# sourceMappingURL=chunk-
|
|
646
|
+
//# sourceMappingURL=chunk-UUM5BIOU.js.map
|
|
647
|
+
//# sourceMappingURL=chunk-UUM5BIOU.js.map
|
|
@@ -1 +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":["useState","useRef","useEffect","useCallback","React","useSWR","DEFAULT_MUSIC_SOURCE","useMemo"],"mappings":"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","file":"chunk-L5PW2YTI.js","sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\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={`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={`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={`w-8 h-8 rounded-lg border flex items-center justify-center transition-colors ${\n 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 }`}\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={`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={`w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ${\n 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 }`}\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';\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={`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={`w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105 ${\n 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 }`}\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={`flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300 ${\n 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 }`}>\n <div className={`w-2 h-2 rounded-full transition-all duration-300 ${\n isPlaying ? 'bg-orange-400 animate-pulse' : 'bg-gray-400'\n }`}></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"]}
|
|
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":["useState","useRef","useEffect","useCallback","React","useSWR","DEFAULT_MUSIC_SOURCE","useMemo"],"mappings":";;;;;;;;;;;AAyCe,SAAR,WAAA,CAA6B;AAAA,EAClC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB,SAAA,GAAY,EAAA;AAAA,EACZ,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EACf,iBAAA,GAAoB,KAAA;AAAA,EACpB,aAAA,GAAgB,IAAA;AAAA,EAChB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAS,kBAAkB,aAAa,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,cAAA,EAA6B;AAEvD,EAAA,MAAM,WAAA,GAAcC,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAYA,aAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAID,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG9D,EAAAE,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA,SAAA,CAAU,cAAc,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA4B;AAC9C,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,OAAO,GAAG,OAAO,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EACpD,CAAA;AAGA,EAAA,MAAM,UAAA,GAAaC,kBAAY,MAAM;AACnC,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM;AACnC,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,kBAAA,GAAqBA,iBAAA,CAAY,CAAC,SAAA,KAAsB;AAC5D,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AACxD,IAAA,SAAA,CAAU,aAAa,CAAA;AACvB,IAAA,cAAA,GAAiB,aAAa,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,EAAA,MAAM,UAAA,GAAaA,iBAAA,CAAY,CAAC,IAAA,KAAiB;AAC/C,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,QAAQ,CAAA,EAAG;AAElC,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA;AACrD,IAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAA,MAAM,uBAAA,GAA0BA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,QAAA,EAAU;AAEvC,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,IAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC/C,IAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAGzB,EAAA,MAAM,qBAAA,GAAwBA,iBAAA,CAAY,CAAC,CAAA,KAAwB;AACjE,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AAExB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,IAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC/C,IAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,IAAI,kBAAA,IAAsB,WAAA,CAAY,OAAA,IAAW,QAAA,EAAU;AACzD,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7E,QAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAEA,MAAA,IAAI,gBAAA,IAAoB,UAAU,OAAA,EAAS;AACzC,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,qBAAA,EAAsB;AACrD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7E,QAAA,kBAAA,CAAmB,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,IAAI,sBAAsB,gBAAA,EAAkB;AAC1C,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,eAAe,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,GAAG,CAAC,kBAAA,EAAoB,kBAAkB,QAAA,EAAU,UAAA,EAAY,kBAAkB,CAAC,CAAA;AAGnF,EAAA,MAAM,eAAA,GAAkBC,iBAAA,CAAY,CAAC,CAAA,KAA4B;AAC/D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,uBACEC,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,0GAA0G,SAAS,CAAA,CAAA;AAAA,QAC9H,KAAA,EAAO,EAAE,KAAA,EAAO,iBAAA,GAAoB,UAAU,OAAA,EAAQ;AAAA,QACtD,OAAA,EAAS,eAAA;AAAA,QACT,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,2DAGZ,KAAA,EAAA,EAAI,SAAA,EAAW,2BAA2B,iBAAA,GAAoB,uBAAA,GAA0B,EAAE,CAAA,CAAA,EAAA,kBAEzFA,sBAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,YAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,YAAA,UAAA,EAAW;AAAA,UAAG,CAAA;AAAA,UACpD,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,eAAA;AAAA,UACX,YAAA,EAAc,eAAA;AAAA,UACd,UAAA,EAAY,eAAA;AAAA,UACZ,aAAA,EAAe,eAAA;AAAA,UACf,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAU,4HAAA;AAAA,UACV,KAAA,EAAM;AAAA,SAAA;AAAA,wBAENA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC;AAAA,OACtD,kBAGAA,sBAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,YAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,YAAA,SAAA,GAAY,WAAA,KAAgB,UAAA,EAAW;AAAA,UAAG,CAAA;AAAA,UAChF,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,eAAA;AAAA,UACX,YAAA,EAAc,eAAA;AAAA,UACd,UAAA,EAAY,eAAA;AAAA,UACZ,aAAA,EAAe,eAAA;AAAA,UACf,WAAA,EAAa,eAAA;AAAA,UACb,SAAA,EAAW,CAAA,6EAAA,EACT,SAAA,GACI,mHAAA,GACA,+HACN,CAAA,CAAA;AAAA,UACA,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,SAAA;AAAA,QAEzB,4BACCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EAA8B,mBAC7CA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EAA8B,CAC/C,oBAEAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sHAAA,EAAuH;AAAA,OAG5I,CAAA;AAAA,MAGC,CAAC,iBAAA,oBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,EAAwB,WAAE,CAAA,kBACzCA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,SAAA,EAAU,6DAAA;AAAA,UACV,WAAA,EAAa,qBAAA;AAAA,UACb,OAAA,EAAS,eAAA;AAAA,UACT,YAAA,EAAc,eAAA;AAAA,UACd,UAAA,EAAY,eAAA;AAAA,UACZ,aAAA,EAAe,eAAA;AAAA,UACf,WAAA,EAAa;AAAA,SAAA;AAAA,wBAEbA,sBAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kEAAA;AAAA,YACV,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,GAAS,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA,SACpC;AAAA,wBACDA,sBAAA,CAAA,aAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kHAAA;AAAA,YACV,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,GAAG,CAAA,CAAA,CAAA,EAAK,WAAW,mCAAA;AAAoC;AAAA;AACnF,OAEL;AAAA,KAEJ;AAAA,EAEJ;AAEA,EAAA,uBACEA,sBAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,kFAAkF,SAAS,CAAA,CAAA;AAAA,MACtG,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,GAAU,UAAU,OAAA,EAAQ;AAAA,MAC5C,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,eAAA;AAAA,MACX,YAAA,EAAc,eAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,eAAA;AAAA,MACf,WAAA,EAAa;AAAA,KAAA;AAAA,IAGZ,CAAC,WAAW,aAAA,IAAiB,KAAA,yDAC3B,KAAA,EAAA,EAAI,SAAA,EAAU,0BACbA,sBAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAG,WAAU,4CAAA,EAAA,EAA8C,KAAA,CAAM,IAAK,CAAA,kBACvEA,sBAAA,CAAA,aAAA,CAAC,OAAE,SAAA,EAAU,uBAAA,EAAA,EAAwB,0BAAI,CAC3C,CAAA;AAAA,IAID,CAAC,OAAA,oBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,SAAA,EAAU,6DAAA;AAAA,QACV,WAAA,EAAa,uBAAA;AAAA,QACb,OAAA,EAAS,eAAA;AAAA,QACT,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAEbA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,8FAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,GAAW,CAAA,GAAI,GAAI,WAAA,GAAc,QAAA,GAAY,GAAG,CAAA,CAAA,CAAA,GAAM,IAAA;AAAK;AAAA,OAC5E;AAAA,sBACDA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kHAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,MAAM,QAAA,GAAW,CAAA,GAAI,GAAI,WAAA,GAAc,QAAA,GAAY,GAAG,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,YAC5D,SAAA,EAAW;AAAA;AACb;AAAA;AACD,uBAGHA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAA,uDACZ,MAAA,EAAA,IAAA,EAAM,UAAA,CAAW,WAAW,CAAE,mBAC/BA,sBAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,WAAW,QAAQ,CAAE,CAC9B,CACF,CAAA;AAAA,oBAIFA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EAAA,kBAEbA,sBAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,UAAA,UAAA,EAAW;AAAA,QAAG,CAAA;AAAA,QACpD,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAU,gIAAA;AAAA,QACV,KAAA,EAAM;AAAA,OAAA;AAAA,sBAENA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EAAiC;AAAA,KAClD,kBAGAA,sBAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,UAAA,SAAA,GAAY,WAAA,KAAgB,UAAA,EAAW;AAAA,QAAG,CAAA;AAAA,QAChF,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,CAAA,mFAAA,EACT,SAAA,GACI,mHAAA,GACA,+HACN,CAAA,CAAA;AAAA,QACA,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,OAAA;AAAA,MAEzB,SAAA,mBACCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8EAAA,EAA+E,IAC5F,SAAA,mBACFA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBAC/CA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CACjD,CAAA,mBAEAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EAAsH;AAAA,KAG3I,CAAA;AAAA,IAGC,CAAC,iBAAA,oBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,kBACbA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAA,EAAwB,WAAE,CAAA,kBACzCA,sBAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAU,6DAAA;AAAA,QACV,WAAA,EAAa,qBAAA;AAAA,QACb,OAAA,EAAS,eAAA;AAAA,QACT,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAEbA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kEAAA;AAAA,UACV,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,GAAS,GAAG,CAAA,CAAA,CAAA;AAAI;AAAA,OACpC;AAAA,sBACDA,sBAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,kHAAA;AAAA,UACV,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,GAAG,CAAA,CAAA,CAAA,EAAK,WAAW,mCAAA;AAAoC;AAAA;AACnF,KACH,kBACAA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAA,EACZ,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,GAAG,CAAA,EAAE,GAC5B,CACF,CAAA;AAAA,IAID,KAAA,oBACCA,sBAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACZ,KACH;AAAA,GAEJ;AAEJ;ACpXe,SAAR,kBAAA,CAAoC;AAAA,EACzC,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,SAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,WAAA,GAAcH,aAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAID,eAAS,KAAK,CAAA;AAGlE,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA4B;AAC9C,IAAA,IAAI,CAAC,OAAA,IAAW,KAAA,CAAM,OAAO,GAAG,OAAO,MAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EACpD,CAAA;AAGA,EAAA,MAAM,UAAA,GAAaG,kBAAY,MAAM;AACnC,IAAA,MAAA,IAAS;AAAA,EACX,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,OAAA,IAAU;AAAA,EACZ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AAC/C,IAAA,IAAI,CAAC,QAAA,IAAY,KAAA,CAAM,QAAQ,CAAA,EAAG;AAElC,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA;AACrD,IAAA,MAAA,GAAS,QAAQ,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAGrB,EAAA,MAAM,uBAAA,GAA0BA,iBAAAA,CAAY,CAAC,CAAA,KAAwB;AACnE,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,CAAC,QAAA,EAAU;AAEvC,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,IAAA,MAAM,OAAA,GAAA,CAAW,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC/C,IAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAGzB,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACzC,MAAA,IAAI,kBAAA,IAAsB,WAAA,CAAY,OAAA,IAAW,QAAA,EAAU;AACzD,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,OAAA,CAAQ,qBAAA,EAAsB;AACvD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAC7E,QAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,gBAAgB,MAAM;AAC1B,MAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,eAAe,CAAA;AACtD,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,eAAe,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACvD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,QAAA,EAAU,UAAU,CAAC,CAAA;AAG7C,EAAA,MAAM,eAAA,GAAkBC,iBAAAA,CAAY,CAAC,CAAA,KAA4B;AAC/D,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEC,sBAAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,8HAA8H,SAAS,CAAA,CAAA;AAAA,MAClJ,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,MACxB,OAAA,EAAS,eAAA;AAAA,MACT,WAAA,EAAa,eAAA;AAAA,MACb,SAAA,EAAW,eAAA;AAAA,MACX,YAAA,EAAc,eAAA;AAAA,MACd,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe,eAAA;AAAA,MACf,WAAA,EAAa;AAAA,KAAA;AAAA,IAGZ,KAAA,oBACCA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EAAA,EACZ,KAAA,CAAM,IACT,CAAA,kBACAA,sBAAAA,CAAA,cAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAAA,EAA0B,0BAEzC,CACF,CAAA;AAAA,oBAIFA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,0BAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAG,UAAA,SAAA,GAAY,WAAA,KAAgB,UAAA,EAAW;AAAA,QAAG,CAAA;AAAA,QAChF,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,eAAA;AAAA,QACX,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,CAAA,uHAAA,EACT,SAAA,GACI,sIAAA,GACA,0IACN,CAAA,CAAA;AAAA,QACA,KAAA,EAAO,YAAY,cAAA,GAAO;AAAA,OAAA;AAAA,MAEzB,SAAA,mBACCA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CAAA,kBAC/CA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EAAgC,CACjD,CAAA,mBAEAA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qHAAA,EAAsH;AAAA,KAG3I,CAAA;AAAA,oBAGAA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,WAAA;AAAA,QACL,SAAA,EAAU,6EAAA;AAAA,QACV,WAAA,EAAa,uBAAA;AAAA,QACb,OAAA,EAAS,eAAA;AAAA,QACT,YAAA,EAAc,eAAA;AAAA,QACd,UAAA,EAAY,eAAA;AAAA,QACZ,aAAA,EAAe,eAAA;AAAA,QACf,WAAA,EAAa;AAAA,OAAA;AAAA,sBAEbA,sBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,sGAAA;AAAA,UACV,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,GAAW,CAAA,GAAI,GAAI,WAAA,GAAc,QAAA,GAAY,GAAG,CAAA,CAAA,CAAA,GAAM,IAAA;AAAK;AAAA,OAC5E;AAAA,sBACDA,sBAAAA,CAAA,aAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,0HAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,MAAM,QAAA,GAAW,CAAA,GAAI,GAAI,WAAA,GAAc,QAAA,GAAY,GAAG,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,YAC5D,SAAA,EAAW;AAAA;AACb;AAAA;AACD,KACH,kBAEAA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAU,mDAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,MAAA,EAAA,IAAA,EAAM,WAAW,WAAW,CAAE,CAAA,kBAC/BA,sBAAAA,CAAA,aAAA,CAAC,cAAM,UAAA,CAAW,QAAQ,CAAE,CAC9B,CACF,CAAA;AAAA,oBAGAA,sBAAAA,CAAA,aAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAA,kBACbA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,CAAA,mFAAA,EACd,SAAA,GACI,8DAAA,GACA,wDACN,CAAA,CAAA,EAAA,kBACEA,sBAAAA,CAAA,aAAA,CAAC,SAAI,SAAA,EAAW,CAAA,iDAAA,EACd,SAAA,GAAY,6BAAA,GAAgC,aAC9C,CAAA,CAAA,EAAI,CAAA,kBACJA,sBAAAA,CAAA,cAAC,MAAA,EAAA,IAAA,EAAM,SAAA,GAAY,oBAAA,GAAQ,oBAAM,CACnC,CACF;AAAA,GACF;AAEJ;;;ACzMO,IAAM,YAAA,GAAmC;AAAA,EAC9C,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,IAAA,IAAQ,KAAK,IAAA,EAAM,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,EAAC;AACvE,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAM,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA,EAAM,SAAS,IAAA,CAAK,MAAA;AACjE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAc;AAE9B,QAAA,IAAI,GAAA,GAAM,KAAK,GAAA,IAAO,EAAA;AACtB,QAAA,IAAI,IAAA,CAAK,aAAa,WAAA,EAAa;AACjC,UAAA,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,OAAA,CAAQ,UAAU,KAAK,CAAA;AAAA,QAC5D;AAEA,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAA;AAAA,UACtB,IAAA,EAAM,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,SAAA;AAAA,UACxC,MAAA,EAAQ,KAAK,UAAA,IAAc,gBAAA;AAAA,UAC3B,KAAA,EAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA,IAAS,EAAA;AAAA,UACxC,GAAA;AAAA,UACA,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAA,EAAQ,OAAA;AAAA,UACR,KAAA,EAAO,KAAK,SAAA,IAAa,CAAA;AAAA,UACzB,QAAA,EAAU,KAAK,MAAA,KAAW;AAAA,SAC5B;AAAA,MACF,CAAC,CAAA;AAAA,MACD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAA0B;AACxC,IAAA,OAAO,KAAK,GAAA,EAAK,GAAA,IAAO,KAAK,GAAA,EAAK,UAAA,GAAa,CAAC,CAAA,IAAK,IAAA;AAAA,EACvD,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA,IAAO,KAAK,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,IAAQ,EAAA;AAAA,EACpE;AACF;;;ACtCO,IAAM,cAAA,GAAqC;AAAA,EAChD,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,EAAC,CAAA;AAEjF,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QAChC,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA;AAAA,QACnE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,IAAA,CAAK,KAAA;AAAA,QAChC,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,KAAA,EAAO,MAAA;AAAA,QAC7B,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,IAAA,CAAK,GAAA,KAAQ,CAAA,IAAK,KAAK,GAAA,KAAQ,CAAA;AAAA,QACtC,QAAA,EAAU,KAAK,eAAA,KAAoB;AAAA,OACrC,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,SAAA,IAAa,KAAA,CAAM;AAAA,KACzC;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAAgB;AAC9B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAC1C,IAAA,OAAO,KAAK,GAAA,IAAO,IAAA;AAAA,EACrB,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,KAAK,KAAA,IAAS,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAM,KAAA,IAAS,EAAA;AAAA,EACvD;AACF;;;AChCO,IAAM,cAAA,GAAqC;AAAA,EAChD,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAG3D,IAAA,MAAM,QAAA,GAAW,KAAK,IAAA,EAAM,IAAA,EAAM,QAAQ,IAAA,CAAK,IAAA,EAAM,IAAA,IAAQ,IAAA,CAAK,IAAA,IAAQ,IAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,IAAQ,IAAA,CAAK,SAAS,EAAC;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAA,IAAY,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAEtD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,KAAc;AAE9B,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,GACpC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAC5C,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,IAAA,IAAQ,IAAA,CAAK,MAAA,IAAU,SAAA;AAG9C,QAAA,IAAI,MAAM,IAAA,CAAK,GAAA;AACf,QAAA,IAAI,CAAC,GAAA,IAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK;AAC3B,UAAA,GAAA,GAAM,CAAA,mDAAA,EAAsD,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,IAAA,CAAA;AAAA,QAC5E;AAEA,QAAA,OAAO;AAAA,UACL,EAAA,EAAI,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA;AAAA,UAChC,IAAA,EAAM,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA;AAAA,UACtC,MAAA;AAAA,UACA,OAAO,IAAA,CAAK,KAAA,EAAO,IAAA,IAAQ,IAAA,CAAK,aAAa,IAAA,CAAK,KAAA;AAAA,UAClD,KAAK,GAAA,IAAO,EAAA;AAAA,UACZ,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,QAAA,KAAa,CAAA;AAAA,UAC9B,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,MAAA,KAAW;AAAA,SACpC;AAAA,MACF,CAAC,CAAA;AAAA,MACD;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAA0B;AAExC,IAAA,MAAM,IAAA,GAAQ,IAAA;AAEd,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAA;AACzB,IAAA,IAAI,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,OAAO,EAAE,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAa,QAAQ,CAAA;AACnC,IAAA,OAAO,SAAS,UAAA,CAAW,MAAM,CAAA,GAAI,QAAA,GAAW,UAAU,QAAQ,CAAA,CAAA;AAAA,EACpE,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,KAAK,KAAA,IAAS,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,MAAM,KAAA,IAAS,EAAA;AAAA,EACvD;AACF;;;ACrDO,IAAM,YAAA,GAAmC;AAAA,EAC9C,kBAAkB,IAAA,EAAyB;AACzC,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAE3D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,EAAM,MAAA,IAAU,KAAK,MAAA,IAAU,IAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,KAAU,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAI,OAAO,EAAC,CAAA;AAE7D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAe;AAAA,QAChC,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,QAAA,EAAS,IAAK,EAAA;AAAA,QAC3B,IAAA,EAAM,KAAK,IAAA,IAAQ,SAAA;AAAA,QACnB,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,EAAE,CAAA,GACzB,KAAK,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,KAAW,EAAE,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA,GACxC,KAAK,MAAA,IAAU,gBAAA;AAAA,QACpB,KAAA,EAAO,IAAA,CAAK,EAAA,EAAI,IAAA,IAAQ,KAAK,KAAA,IAAS,EAAA;AAAA,QACtC,GAAA,EAAK,IAAA,CAAK,EAAA,EAAI,MAAA,IAAU,KAAK,GAAA,IAAO,EAAA;AAAA,QACpC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAA,EAAQ,OAAA;AAAA;AAAA,QAER,KAAA,EAAO,IAAA,CAAK,GAAA,KAAQ,CAAA,IAAK,KAAK,GAAA,KAAQ,CAAA;AAAA,QACtC,QAAA,EAAU,KAAK,SAAA,KAAc;AAAA,OAC/B,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,MAAA,CAAO,SAAA,IAAa,KAAA,CAAM;AAAA,KACnC;AAAA,EACF,CAAA;AAAA,EAEA,gBAAgB,IAAA,EAAgB;AAC9B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAE3D,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,CAAC,KAAK,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AACvD,IAAA,OAAO,KAAK,GAAA,IAAO,IAAA;AAAA,EACrB,CAAA;AAAA,EAEA,cAAc,IAAA,EAAgB;AAC5B,IAAA,MAAM,OAAO,OAAO,IAAA,KAAS,WAAW,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,GAAA,IAAO,KAAK,IAAA,EAAM,KAAA,IAAS,KAAK,IAAA,IAAQ,EAAA;AAAA,EACpE;AACF;;;AC7BA,IAAM,OAAA,GAAU,CAAC,GAAA,KAAgB,KAAA,CAAM,GAAG,EAAE,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,IAAA,EAAM,CAAA;AAElE,IAAM,QAAA,GAA+C;AAAA,EACnD,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIJ,eAA+B,IAAI,CAAA;AAG7E,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,WAAA,EAAa,SAAA,EAAW,aAAY,GAAIK,uBAAA;AAAA,IACpE,aAAA,GAAgB,6BAA6B,kBAAA,CAAmB,aAAA,CAAc,OAAO,CAAC,CAAA,QAAA,EAAW,aAAA,CAAc,MAAA,IAAUC,qCAAoB,CAAA,OAAA,EAAU,cAAc,KAAA,IAAS,EAAE,CAAA,QAAA,EAAW,aAAA,CAAc,MAAA,IAAU,CAAC,GAAG,aAAA,CAAc,IAAA,GAAO,YAAA,GAAe,EAAE,CAAA,CAAA,GAAK,IAAA;AAAA,IAClQ;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAeC,cAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS,IAAA,IAAQ,CAAC,eAAe,OAAO,MAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAA,IAAUD,qCAAoB,CAAA;AACrE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA,CAAQ,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAE3B,EAAA,MAAM,MAAA,GAASH,iBAAAA,CAAY,CAAC,OAAA,KAA2B;AACrD,IAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,EAAA,EAAY,SAAiBG,qCAAA,KAAsD;AACvH,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,qBAAqB,EAAE,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAClE,MAAA,MAAM,IAAA,GAA8B,MAAM,GAAA,CAAI,IAAA,EAAK;AACnD,MAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK,QAAO,OAAO,CAAA;AAC7C,MAAA,IAAI,OAAA,IAAW,KAAK,IAAA,EAAM;AACxB,QAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,IAAI,CAAA;AACpC,QAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,KAAK,IAAA,EAAM,GAAA;AAAA,IACpB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AACpD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,QAAA,GAAWH,iBAAAA,CAAY,OAAO,EAAA,EAAY,SAAiBG,qCAAA,KAAsD;AACrH,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,uBAAuB,EAAE,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AACpE,MAAA,MAAM,IAAA,GAA8B,MAAM,GAAA,CAAI,IAAA,EAAK;AACnD,MAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAA;AAC/B,MAAA,IAAI,OAAA,IAAW,KAAK,IAAA,EAAM;AACxB,QAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,KAAK,IAAA,EAAM,KAAA;AAAA,IACpB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AACjD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-UUM5BIOU.js","sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\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={`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={`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={`w-8 h-8 rounded-lg border flex items-center justify-center transition-colors ${\n 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 }`}\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={`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={`w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ${\n 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 }`}\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';\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={`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={`w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105 ${\n 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 }`}\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={`flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300 ${\n 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 }`}>\n <div className={`w-2 h-2 rounded-full transition-all duration-300 ${\n isPlaying ? 'bg-orange-400 animate-pulse' : 'bg-gray-400'\n }`}></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"]}
|