1717</template >
1818
1919<script setup lang="ts">
20- import { useStatusStore } from " @/stores" ;
20+ import { useMusicStore , useSettingStore , useStatusStore } from " @/stores" ;
2121import { msToTime } from " @/utils/time" ;
2222import { usePlayerController } from " @/core/player/PlayerController" ;
23+ import { LyricLine } from " @applemusic-like-lyrics/lyric" ;
2324
2425withDefaults (defineProps <{ showTooltip? : boolean }>(), { showTooltip: true });
2526
26- const player = usePlayerController ();
27+ const musicStore = useMusicStore ();
2728const statusStore = useStatusStore ();
29+ const settingStore = useSettingStore ();
30+
31+ const player = usePlayerController ();
2832
2933// 拖动时的临时值
3034const dragValue = ref (0 );
@@ -45,9 +49,7 @@ const sliderProgress = computed({
4549 return ;
4650 }
4751 // 结束或者为点击
48- useThrottleFn ((value : number ) => {
49- player .setSeek (value );
50- }, 30 );
52+ useThrottleFn ((value : number ) => setSeek (value ), 30 );
5153 },
5254});
5355
@@ -62,12 +64,47 @@ const startDrag = () => {
6264const endDrag = () => {
6365 isDragging .value = false ;
6466 // 直接更改进度
65- player .setSeek (dragValue .value );
67+ setSeek (dragValue .value );
68+ };
69+
70+ /**
71+ * 获取当前时间最近一句歌词
72+ * @param value 当前时间
73+ * @returns 最近一句歌词的开始时间和内容
74+ */
75+ const getCurrentLyric = (value : number ) => {
76+ const lyric = toRaw (musicStore .songLyric .lrcData );
77+ if (! lyric ?.length ) return null ;
78+ // 查找最近一句歌词
79+ let nearestLyric: LyricLine | null = null ;
80+ for (let i = lyric .length - 1 ; i >= 0 ; i -- ) {
81+ if (value >= lyric [i ].startTime ) {
82+ nearestLyric = lyric [i ];
83+ break ;
84+ }
85+ }
86+ return {
87+ time: nearestLyric ?.startTime ,
88+ text: nearestLyric ?.words ?.[0 ]?.word || " " ,
89+ };
90+ };
91+
92+ // 调节进度
93+ const setSeek = (value : number ) => {
94+ if (settingStore .progressAdjustLyric ) {
95+ const nearestLyric = getCurrentLyric (value );
96+ player .setSeek (nearestLyric ?.time ?? value );
97+ return ;
98+ }
99+ player .setSeek (value );
66100};
67101
68102// 格式化提示
69103const formatTooltip = (value : number ) => {
70- return ` ${msToTime (value )} / ${msToTime (statusStore .duration )} ` ;
104+ const nearestLyric = getCurrentLyric (value );
105+ return nearestLyric
106+ ? ` ${msToTime (value )} / ${nearestLyric .text .length > 30 ? nearestLyric .text .slice (0 , 30 ) + " ..." : nearestLyric .text } `
107+ : msToTime (value );
71108};
72109 </script >
73110
@@ -85,5 +122,20 @@ const formatTooltip = (value: number) => {
85122 }
86123 }
87124 }
125+ :deep(.n-slider-handles ) {
126+ .n-slider-handle {
127+ opacity : 0 ;
128+ transform : scale (0.6 );
129+ }
130+ }
131+ & :hover ,
132+ & .drag {
133+ :deep (.n-slider-handles ) {
134+ .n- slider- handle {
135+ opacity : 1 ;
136+ transform : scale (1 );
137+ }
138+ }
139+ }
88140}
89141 </style >
0 commit comments