@applemusic-like-lyrics/core 0.5.0 → 0.5.1
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/amll-core.cjs +398 -214
- package/dist/amll-core.cjs.map +1 -1
- package/dist/amll-core.d.cts +125 -67
- package/dist/amll-core.d.mts +125 -67
- package/dist/amll-core.mjs +398 -214
- package/dist/amll-core.mjs.map +1 -1
- package/dist/style.css +129 -63
- package/package.json +2 -2
package/dist/amll-core.d.cts
CHANGED
|
@@ -368,6 +368,58 @@ declare class Spring {
|
|
|
368
368
|
getCurrentPosition(): number;
|
|
369
369
|
}
|
|
370
370
|
//#endregion
|
|
371
|
+
//#region src/lyric-player/dom/interlude-dots.d.ts
|
|
372
|
+
declare class InterludeDots implements HasElement, Disposable {
|
|
373
|
+
private element;
|
|
374
|
+
private dot0;
|
|
375
|
+
private dot1;
|
|
376
|
+
private dot2;
|
|
377
|
+
private left;
|
|
378
|
+
private top;
|
|
379
|
+
private playing;
|
|
380
|
+
private lastStyle;
|
|
381
|
+
private currentInterlude?;
|
|
382
|
+
private currentTime;
|
|
383
|
+
private targetBreatheDuration;
|
|
384
|
+
constructor();
|
|
385
|
+
getElement(): HTMLElement;
|
|
386
|
+
setTransform(left?: number, top?: number): void;
|
|
387
|
+
setInterlude(interlude?: [number, number]): void;
|
|
388
|
+
pause(): void;
|
|
389
|
+
resume(): void;
|
|
390
|
+
update(delta?: number): void;
|
|
391
|
+
dispose(): void;
|
|
392
|
+
}
|
|
393
|
+
//#endregion
|
|
394
|
+
//#region src/lyric-player/base/bottom-line.d.ts
|
|
395
|
+
interface LineTransforms$1 {
|
|
396
|
+
posX: Spring;
|
|
397
|
+
posY: Spring;
|
|
398
|
+
}
|
|
399
|
+
declare class BottomLineEl implements HasElement, Disposable {
|
|
400
|
+
private lyricPlayer;
|
|
401
|
+
private element;
|
|
402
|
+
private left;
|
|
403
|
+
private top;
|
|
404
|
+
private delay;
|
|
405
|
+
lineSize: [number, number];
|
|
406
|
+
readonly lineTransforms: LineTransforms$1;
|
|
407
|
+
private isFocused;
|
|
408
|
+
private blur;
|
|
409
|
+
constructor(lyricPlayer: LyricPlayerBase);
|
|
410
|
+
measureSize(): Promise<[number, number]>;
|
|
411
|
+
private lastStyle;
|
|
412
|
+
show(): void;
|
|
413
|
+
hide(): void;
|
|
414
|
+
setFocused(focused: boolean): void;
|
|
415
|
+
private rebuildStyle;
|
|
416
|
+
getElement(): HTMLElement;
|
|
417
|
+
setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
|
|
418
|
+
update(delta?: number): void;
|
|
419
|
+
get isInSight(): boolean;
|
|
420
|
+
dispose(): void;
|
|
421
|
+
}
|
|
422
|
+
//#endregion
|
|
371
423
|
//#region src/lyric-player/base/consts.d.ts
|
|
372
424
|
type ValueOf<T extends Record<PropertyKey, unknown>> = T[keyof T];
|
|
373
425
|
/** 歌词中不雅用语的掩码模式 */
|
|
@@ -401,8 +453,7 @@ declare const LayoutAlignAnchor: {
|
|
|
401
453
|
type LayoutAlignAnchor = ValueOf<typeof LayoutAlignAnchor>;
|
|
402
454
|
//#endregion
|
|
403
455
|
//#region src/lyric-player/base/line.d.ts
|
|
404
|
-
interface LineTransforms
|
|
405
|
-
posY: Spring;
|
|
456
|
+
interface LineTransforms {
|
|
406
457
|
scale: Spring;
|
|
407
458
|
}
|
|
408
459
|
/**
|
|
@@ -415,7 +466,7 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
|
|
|
415
466
|
protected blur: number;
|
|
416
467
|
protected opacity: number;
|
|
417
468
|
protected delay: number;
|
|
418
|
-
readonly lineTransforms: LineTransforms
|
|
469
|
+
readonly lineTransforms: LineTransforms;
|
|
419
470
|
/**
|
|
420
471
|
* 用于 CJK 词语边界检测的分词器
|
|
421
472
|
*/
|
|
@@ -430,8 +481,8 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
|
|
|
430
481
|
abstract disable(): void;
|
|
431
482
|
abstract resume(): void;
|
|
432
483
|
abstract pause(): void;
|
|
433
|
-
onLineSizeChange(
|
|
434
|
-
setTransform(
|
|
484
|
+
abstract onLineSizeChange(size: [number, number]): void;
|
|
485
|
+
setTransform(scale?: number, opacity?: number, blur?: number, _force?: boolean, delay?: number, _mode?: LyricLineRenderMode): void;
|
|
435
486
|
rebuildElement(): void;
|
|
436
487
|
/**
|
|
437
488
|
* 判定歌词是否可以应用强调辉光效果
|
|
@@ -448,55 +499,37 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
|
|
|
448
499
|
dispose(): void;
|
|
449
500
|
}
|
|
450
501
|
//#endregion
|
|
451
|
-
//#region src/lyric-player/
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
private left;
|
|
458
|
-
private top;
|
|
459
|
-
private playing;
|
|
460
|
-
private lastStyle;
|
|
461
|
-
private currentInterlude?;
|
|
462
|
-
private currentTime;
|
|
463
|
-
private targetBreatheDuration;
|
|
464
|
-
constructor();
|
|
465
|
-
getElement(): HTMLElement;
|
|
466
|
-
setTransform(left?: number, top?: number): void;
|
|
467
|
-
setInterlude(interlude?: [number, number]): void;
|
|
468
|
-
pause(): void;
|
|
469
|
-
resume(): void;
|
|
470
|
-
update(delta?: number): void;
|
|
471
|
-
dispose(): void;
|
|
502
|
+
//#region src/lyric-player/base/group.d.ts
|
|
503
|
+
interface LyricPlayerFlags {
|
|
504
|
+
getEnableSpring(): boolean;
|
|
505
|
+
getEnableScale(): boolean;
|
|
506
|
+
getIsPlaying(): boolean;
|
|
507
|
+
getAlwaysPostpositionBackground(): boolean;
|
|
472
508
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
509
|
+
declare abstract class LyricLineGroupBase<T extends LyricLineBase = LyricLineBase> implements Disposable {
|
|
510
|
+
mainLine: T;
|
|
511
|
+
bgLine?: T | undefined;
|
|
512
|
+
protected abstract readonly lyricPlayer: LyricPlayerFlags;
|
|
477
513
|
posY: Spring;
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
|
|
498
|
-
update(delta?: number): void;
|
|
499
|
-
get isInSight(): boolean;
|
|
514
|
+
bgSlideY: Spring;
|
|
515
|
+
top: number;
|
|
516
|
+
delay: number;
|
|
517
|
+
isActive: boolean;
|
|
518
|
+
opacity: number;
|
|
519
|
+
blur: number;
|
|
520
|
+
isBgFirst: boolean;
|
|
521
|
+
constructor(mainLine: T, bgLine?: T | undefined);
|
|
522
|
+
get startTime(): number;
|
|
523
|
+
get endTime(): number;
|
|
524
|
+
onLineSizeChange(size: [number, number]): void;
|
|
525
|
+
setTransform(top: number, force: boolean, delay: number, isActive: boolean, opacity: number, blur: number): void;
|
|
526
|
+
private setLineTransformations;
|
|
527
|
+
protected abstract renderStyles(): void;
|
|
528
|
+
abstract get isInSight(): boolean;
|
|
529
|
+
update(delta: number): void;
|
|
530
|
+
rebuildAllLines(): void;
|
|
531
|
+
enable(time?: number, shouldPlay?: boolean): void;
|
|
532
|
+
disable(): void;
|
|
500
533
|
dispose(): void;
|
|
501
534
|
}
|
|
502
535
|
//#endregion
|
|
@@ -551,18 +584,18 @@ interface PlayerScrollState {
|
|
|
551
584
|
/**
|
|
552
585
|
* 播放时间线状态。
|
|
553
586
|
*
|
|
554
|
-
*
|
|
587
|
+
* 描述播放器在时间轴上的当前位置,当前处于激活状态的歌词组信息
|
|
555
588
|
*/
|
|
556
589
|
interface PlayerTimelineState {
|
|
557
590
|
/** 当前播放时间,单位为毫秒 */
|
|
558
591
|
currentTime: number;
|
|
559
592
|
/** 上一次提交到时间线状态的播放时间,单位为毫秒 */
|
|
560
593
|
lastCurrentTime: number;
|
|
561
|
-
/** 热行:当前时间 {@link currentTime}
|
|
562
|
-
|
|
563
|
-
/**
|
|
564
|
-
|
|
565
|
-
/**
|
|
594
|
+
/** 热行:当前时间 {@link currentTime} 正在命中的组(含主行+可能的背景行) */
|
|
595
|
+
hotGroups: Set<number>;
|
|
596
|
+
/** 缓冲组:UI 上还保持激活表现的组索引,通常包含热组,和刚结束仍在过渡中的组 */
|
|
597
|
+
bufferedGroups: Set<number>;
|
|
598
|
+
/** 当前应滚动对齐到的歌词组索引 */
|
|
566
599
|
scrollToIndex: number;
|
|
567
600
|
/** 是否正在拖拽进度条。若是,更新时丢弃缓冲行,并根据当前时间直接计算热行 */
|
|
568
601
|
isSeeking: boolean;
|
|
@@ -583,9 +616,7 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
|
|
|
583
616
|
/** 播放时间线状态 */
|
|
584
617
|
protected timelineState: PlayerTimelineState;
|
|
585
618
|
/** @internal */
|
|
586
|
-
|
|
587
|
-
/** @internal */
|
|
588
|
-
lyricLineElementMap: WeakMap<Element, LyricLineBase>;
|
|
619
|
+
lyricGroupElementMap: WeakMap<Element, LyricLineGroupBase>;
|
|
589
620
|
protected currentLyricLines: LyricLine[];
|
|
590
621
|
protected processedLines: LyricLine[];
|
|
591
622
|
protected lyricLinesIndexes: WeakMap<LyricLineBase, number>;
|
|
@@ -601,10 +632,13 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
|
|
|
601
632
|
protected maskObsceneWordChar: string;
|
|
602
633
|
protected hidePassedLines: boolean;
|
|
603
634
|
protected scrollState: PlayerScrollState;
|
|
604
|
-
|
|
635
|
+
currentLyricGroups: LyricLineGroupBase[];
|
|
636
|
+
lyricGroupSize: WeakMap<LyricLineGroupBase, [number, number]>;
|
|
605
637
|
readonly size: [number, number];
|
|
606
638
|
protected isPageVisible: boolean;
|
|
607
639
|
protected optimizeOptions: OptimizeLyricOptions;
|
|
640
|
+
/** 是否强制让背景人声行始终后置(即始终在主歌词下方显示,不前置背景人声) */
|
|
641
|
+
protected alwaysPostpositionBackground: boolean;
|
|
608
642
|
protected posXSpringParams: Partial<SpringParams>;
|
|
609
643
|
protected posYSpringParams: Partial<SpringParams>;
|
|
610
644
|
protected scaleSpringParams: Partial<SpringParams>;
|
|
@@ -823,6 +857,16 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
|
|
|
823
857
|
* @returns 当前播放位置
|
|
824
858
|
*/
|
|
825
859
|
getCurrentTime(): number;
|
|
860
|
+
/**
|
|
861
|
+
* 设置是否让背景人声行始终后置显示
|
|
862
|
+
*
|
|
863
|
+
* 默认情况下,如果背景歌词开始时间早于主歌词,会在主歌词上方展示;
|
|
864
|
+
* 如果设置为 `true`,则无论时间顺序如何,背景歌词都会始终在主歌词下方展示
|
|
865
|
+
* @param enable 是否启用始终后置
|
|
866
|
+
*/
|
|
867
|
+
setAlwaysPostpositionBackground(enable: boolean): void;
|
|
868
|
+
/** 获取当前是否设置了让背景人声行始终后置显示 */
|
|
869
|
+
getAlwaysPostpositionBackground(): boolean;
|
|
826
870
|
getElement(): HTMLElement;
|
|
827
871
|
dispose(): void;
|
|
828
872
|
}
|
|
@@ -875,10 +919,8 @@ declare class LyricLineEl extends LyricLineBase {
|
|
|
875
919
|
pause(): Promise<void>;
|
|
876
920
|
setMaskAnimationState(maskAnimationTime?: number): void;
|
|
877
921
|
getLine(): LyricLine;
|
|
878
|
-
private _prevParentEl;
|
|
879
922
|
private lastStyle;
|
|
880
923
|
show(): void;
|
|
881
|
-
hide(): void;
|
|
882
924
|
private rebuildStyle;
|
|
883
925
|
override rebuildElement(): void;
|
|
884
926
|
/** 设置翻译与音译行文本 */
|
|
@@ -897,14 +939,30 @@ declare class LyricLineEl extends LyricLineBase {
|
|
|
897
939
|
getElement(): HTMLElement;
|
|
898
940
|
private updateMaskAlphaTargets;
|
|
899
941
|
private applyAlphaToDom;
|
|
900
|
-
override setTransform(
|
|
942
|
+
override setTransform(scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number, mode?: LyricLineRenderMode): void;
|
|
901
943
|
update(delta?: number): void;
|
|
902
944
|
_getDebugTargetPos(): string;
|
|
903
|
-
|
|
945
|
+
teardownContent(): void;
|
|
904
946
|
private disposeElements;
|
|
905
947
|
override dispose(): void;
|
|
906
948
|
}
|
|
907
949
|
//#endregion
|
|
950
|
+
//#region src/lyric-player/dom/lyric-group.d.ts
|
|
951
|
+
declare class LyricLineGroup extends LyricLineGroupBase<LyricLineEl> {
|
|
952
|
+
lyricPlayer: DomLyricPlayer;
|
|
953
|
+
element: HTMLElement;
|
|
954
|
+
bgWrapper?: HTMLElement;
|
|
955
|
+
private lastIsActive?;
|
|
956
|
+
constructor(lyricPlayer: DomLyricPlayer, mainLine: LyricLineEl);
|
|
957
|
+
get isInSight(): boolean;
|
|
958
|
+
show(): void;
|
|
959
|
+
hide(): void;
|
|
960
|
+
override update(delta: number): void;
|
|
961
|
+
addBgLine(bgLine: LyricLineEl): void;
|
|
962
|
+
protected renderStyles(): void;
|
|
963
|
+
override dispose(): void;
|
|
964
|
+
}
|
|
965
|
+
//#endregion
|
|
908
966
|
//#region src/lyric-player/dom/index.d.ts
|
|
909
967
|
/**
|
|
910
968
|
* 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素
|
|
@@ -927,7 +985,7 @@ type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
|
|
|
927
985
|
* 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施
|
|
928
986
|
*/
|
|
929
987
|
declare class DomLyricPlayer extends LyricPlayerBase {
|
|
930
|
-
override
|
|
988
|
+
override currentLyricGroups: LyricLineGroup[];
|
|
931
989
|
override onResize(): void;
|
|
932
990
|
readonly supportPlusLighter: boolean;
|
|
933
991
|
readonly supportMaskImage: boolean;
|
package/dist/amll-core.d.mts
CHANGED
|
@@ -368,6 +368,58 @@ declare class Spring {
|
|
|
368
368
|
getCurrentPosition(): number;
|
|
369
369
|
}
|
|
370
370
|
//#endregion
|
|
371
|
+
//#region src/lyric-player/dom/interlude-dots.d.ts
|
|
372
|
+
declare class InterludeDots implements HasElement, Disposable {
|
|
373
|
+
private element;
|
|
374
|
+
private dot0;
|
|
375
|
+
private dot1;
|
|
376
|
+
private dot2;
|
|
377
|
+
private left;
|
|
378
|
+
private top;
|
|
379
|
+
private playing;
|
|
380
|
+
private lastStyle;
|
|
381
|
+
private currentInterlude?;
|
|
382
|
+
private currentTime;
|
|
383
|
+
private targetBreatheDuration;
|
|
384
|
+
constructor();
|
|
385
|
+
getElement(): HTMLElement;
|
|
386
|
+
setTransform(left?: number, top?: number): void;
|
|
387
|
+
setInterlude(interlude?: [number, number]): void;
|
|
388
|
+
pause(): void;
|
|
389
|
+
resume(): void;
|
|
390
|
+
update(delta?: number): void;
|
|
391
|
+
dispose(): void;
|
|
392
|
+
}
|
|
393
|
+
//#endregion
|
|
394
|
+
//#region src/lyric-player/base/bottom-line.d.ts
|
|
395
|
+
interface LineTransforms$1 {
|
|
396
|
+
posX: Spring;
|
|
397
|
+
posY: Spring;
|
|
398
|
+
}
|
|
399
|
+
declare class BottomLineEl implements HasElement, Disposable {
|
|
400
|
+
private lyricPlayer;
|
|
401
|
+
private element;
|
|
402
|
+
private left;
|
|
403
|
+
private top;
|
|
404
|
+
private delay;
|
|
405
|
+
lineSize: [number, number];
|
|
406
|
+
readonly lineTransforms: LineTransforms$1;
|
|
407
|
+
private isFocused;
|
|
408
|
+
private blur;
|
|
409
|
+
constructor(lyricPlayer: LyricPlayerBase);
|
|
410
|
+
measureSize(): Promise<[number, number]>;
|
|
411
|
+
private lastStyle;
|
|
412
|
+
show(): void;
|
|
413
|
+
hide(): void;
|
|
414
|
+
setFocused(focused: boolean): void;
|
|
415
|
+
private rebuildStyle;
|
|
416
|
+
getElement(): HTMLElement;
|
|
417
|
+
setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
|
|
418
|
+
update(delta?: number): void;
|
|
419
|
+
get isInSight(): boolean;
|
|
420
|
+
dispose(): void;
|
|
421
|
+
}
|
|
422
|
+
//#endregion
|
|
371
423
|
//#region src/lyric-player/base/consts.d.ts
|
|
372
424
|
type ValueOf<T extends Record<PropertyKey, unknown>> = T[keyof T];
|
|
373
425
|
/** 歌词中不雅用语的掩码模式 */
|
|
@@ -401,8 +453,7 @@ declare const LayoutAlignAnchor: {
|
|
|
401
453
|
type LayoutAlignAnchor = ValueOf<typeof LayoutAlignAnchor>;
|
|
402
454
|
//#endregion
|
|
403
455
|
//#region src/lyric-player/base/line.d.ts
|
|
404
|
-
interface LineTransforms
|
|
405
|
-
posY: Spring;
|
|
456
|
+
interface LineTransforms {
|
|
406
457
|
scale: Spring;
|
|
407
458
|
}
|
|
408
459
|
/**
|
|
@@ -415,7 +466,7 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
|
|
|
415
466
|
protected blur: number;
|
|
416
467
|
protected opacity: number;
|
|
417
468
|
protected delay: number;
|
|
418
|
-
readonly lineTransforms: LineTransforms
|
|
469
|
+
readonly lineTransforms: LineTransforms;
|
|
419
470
|
/**
|
|
420
471
|
* 用于 CJK 词语边界检测的分词器
|
|
421
472
|
*/
|
|
@@ -430,8 +481,8 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
|
|
|
430
481
|
abstract disable(): void;
|
|
431
482
|
abstract resume(): void;
|
|
432
483
|
abstract pause(): void;
|
|
433
|
-
onLineSizeChange(
|
|
434
|
-
setTransform(
|
|
484
|
+
abstract onLineSizeChange(size: [number, number]): void;
|
|
485
|
+
setTransform(scale?: number, opacity?: number, blur?: number, _force?: boolean, delay?: number, _mode?: LyricLineRenderMode): void;
|
|
435
486
|
rebuildElement(): void;
|
|
436
487
|
/**
|
|
437
488
|
* 判定歌词是否可以应用强调辉光效果
|
|
@@ -448,55 +499,37 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
|
|
|
448
499
|
dispose(): void;
|
|
449
500
|
}
|
|
450
501
|
//#endregion
|
|
451
|
-
//#region src/lyric-player/
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
private left;
|
|
458
|
-
private top;
|
|
459
|
-
private playing;
|
|
460
|
-
private lastStyle;
|
|
461
|
-
private currentInterlude?;
|
|
462
|
-
private currentTime;
|
|
463
|
-
private targetBreatheDuration;
|
|
464
|
-
constructor();
|
|
465
|
-
getElement(): HTMLElement;
|
|
466
|
-
setTransform(left?: number, top?: number): void;
|
|
467
|
-
setInterlude(interlude?: [number, number]): void;
|
|
468
|
-
pause(): void;
|
|
469
|
-
resume(): void;
|
|
470
|
-
update(delta?: number): void;
|
|
471
|
-
dispose(): void;
|
|
502
|
+
//#region src/lyric-player/base/group.d.ts
|
|
503
|
+
interface LyricPlayerFlags {
|
|
504
|
+
getEnableSpring(): boolean;
|
|
505
|
+
getEnableScale(): boolean;
|
|
506
|
+
getIsPlaying(): boolean;
|
|
507
|
+
getAlwaysPostpositionBackground(): boolean;
|
|
472
508
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
509
|
+
declare abstract class LyricLineGroupBase<T extends LyricLineBase = LyricLineBase> implements Disposable {
|
|
510
|
+
mainLine: T;
|
|
511
|
+
bgLine?: T | undefined;
|
|
512
|
+
protected abstract readonly lyricPlayer: LyricPlayerFlags;
|
|
477
513
|
posY: Spring;
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
|
|
498
|
-
update(delta?: number): void;
|
|
499
|
-
get isInSight(): boolean;
|
|
514
|
+
bgSlideY: Spring;
|
|
515
|
+
top: number;
|
|
516
|
+
delay: number;
|
|
517
|
+
isActive: boolean;
|
|
518
|
+
opacity: number;
|
|
519
|
+
blur: number;
|
|
520
|
+
isBgFirst: boolean;
|
|
521
|
+
constructor(mainLine: T, bgLine?: T | undefined);
|
|
522
|
+
get startTime(): number;
|
|
523
|
+
get endTime(): number;
|
|
524
|
+
onLineSizeChange(size: [number, number]): void;
|
|
525
|
+
setTransform(top: number, force: boolean, delay: number, isActive: boolean, opacity: number, blur: number): void;
|
|
526
|
+
private setLineTransformations;
|
|
527
|
+
protected abstract renderStyles(): void;
|
|
528
|
+
abstract get isInSight(): boolean;
|
|
529
|
+
update(delta: number): void;
|
|
530
|
+
rebuildAllLines(): void;
|
|
531
|
+
enable(time?: number, shouldPlay?: boolean): void;
|
|
532
|
+
disable(): void;
|
|
500
533
|
dispose(): void;
|
|
501
534
|
}
|
|
502
535
|
//#endregion
|
|
@@ -551,18 +584,18 @@ interface PlayerScrollState {
|
|
|
551
584
|
/**
|
|
552
585
|
* 播放时间线状态。
|
|
553
586
|
*
|
|
554
|
-
*
|
|
587
|
+
* 描述播放器在时间轴上的当前位置,当前处于激活状态的歌词组信息
|
|
555
588
|
*/
|
|
556
589
|
interface PlayerTimelineState {
|
|
557
590
|
/** 当前播放时间,单位为毫秒 */
|
|
558
591
|
currentTime: number;
|
|
559
592
|
/** 上一次提交到时间线状态的播放时间,单位为毫秒 */
|
|
560
593
|
lastCurrentTime: number;
|
|
561
|
-
/** 热行:当前时间 {@link currentTime}
|
|
562
|
-
|
|
563
|
-
/**
|
|
564
|
-
|
|
565
|
-
/**
|
|
594
|
+
/** 热行:当前时间 {@link currentTime} 正在命中的组(含主行+可能的背景行) */
|
|
595
|
+
hotGroups: Set<number>;
|
|
596
|
+
/** 缓冲组:UI 上还保持激活表现的组索引,通常包含热组,和刚结束仍在过渡中的组 */
|
|
597
|
+
bufferedGroups: Set<number>;
|
|
598
|
+
/** 当前应滚动对齐到的歌词组索引 */
|
|
566
599
|
scrollToIndex: number;
|
|
567
600
|
/** 是否正在拖拽进度条。若是,更新时丢弃缓冲行,并根据当前时间直接计算热行 */
|
|
568
601
|
isSeeking: boolean;
|
|
@@ -583,9 +616,7 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
|
|
|
583
616
|
/** 播放时间线状态 */
|
|
584
617
|
protected timelineState: PlayerTimelineState;
|
|
585
618
|
/** @internal */
|
|
586
|
-
|
|
587
|
-
/** @internal */
|
|
588
|
-
lyricLineElementMap: WeakMap<Element, LyricLineBase>;
|
|
619
|
+
lyricGroupElementMap: WeakMap<Element, LyricLineGroupBase>;
|
|
589
620
|
protected currentLyricLines: LyricLine[];
|
|
590
621
|
protected processedLines: LyricLine[];
|
|
591
622
|
protected lyricLinesIndexes: WeakMap<LyricLineBase, number>;
|
|
@@ -601,10 +632,13 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
|
|
|
601
632
|
protected maskObsceneWordChar: string;
|
|
602
633
|
protected hidePassedLines: boolean;
|
|
603
634
|
protected scrollState: PlayerScrollState;
|
|
604
|
-
|
|
635
|
+
currentLyricGroups: LyricLineGroupBase[];
|
|
636
|
+
lyricGroupSize: WeakMap<LyricLineGroupBase, [number, number]>;
|
|
605
637
|
readonly size: [number, number];
|
|
606
638
|
protected isPageVisible: boolean;
|
|
607
639
|
protected optimizeOptions: OptimizeLyricOptions;
|
|
640
|
+
/** 是否强制让背景人声行始终后置(即始终在主歌词下方显示,不前置背景人声) */
|
|
641
|
+
protected alwaysPostpositionBackground: boolean;
|
|
608
642
|
protected posXSpringParams: Partial<SpringParams>;
|
|
609
643
|
protected posYSpringParams: Partial<SpringParams>;
|
|
610
644
|
protected scaleSpringParams: Partial<SpringParams>;
|
|
@@ -823,6 +857,16 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
|
|
|
823
857
|
* @returns 当前播放位置
|
|
824
858
|
*/
|
|
825
859
|
getCurrentTime(): number;
|
|
860
|
+
/**
|
|
861
|
+
* 设置是否让背景人声行始终后置显示
|
|
862
|
+
*
|
|
863
|
+
* 默认情况下,如果背景歌词开始时间早于主歌词,会在主歌词上方展示;
|
|
864
|
+
* 如果设置为 `true`,则无论时间顺序如何,背景歌词都会始终在主歌词下方展示
|
|
865
|
+
* @param enable 是否启用始终后置
|
|
866
|
+
*/
|
|
867
|
+
setAlwaysPostpositionBackground(enable: boolean): void;
|
|
868
|
+
/** 获取当前是否设置了让背景人声行始终后置显示 */
|
|
869
|
+
getAlwaysPostpositionBackground(): boolean;
|
|
826
870
|
getElement(): HTMLElement;
|
|
827
871
|
dispose(): void;
|
|
828
872
|
}
|
|
@@ -875,10 +919,8 @@ declare class LyricLineEl extends LyricLineBase {
|
|
|
875
919
|
pause(): Promise<void>;
|
|
876
920
|
setMaskAnimationState(maskAnimationTime?: number): void;
|
|
877
921
|
getLine(): LyricLine;
|
|
878
|
-
private _prevParentEl;
|
|
879
922
|
private lastStyle;
|
|
880
923
|
show(): void;
|
|
881
|
-
hide(): void;
|
|
882
924
|
private rebuildStyle;
|
|
883
925
|
override rebuildElement(): void;
|
|
884
926
|
/** 设置翻译与音译行文本 */
|
|
@@ -897,14 +939,30 @@ declare class LyricLineEl extends LyricLineBase {
|
|
|
897
939
|
getElement(): HTMLElement;
|
|
898
940
|
private updateMaskAlphaTargets;
|
|
899
941
|
private applyAlphaToDom;
|
|
900
|
-
override setTransform(
|
|
942
|
+
override setTransform(scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number, mode?: LyricLineRenderMode): void;
|
|
901
943
|
update(delta?: number): void;
|
|
902
944
|
_getDebugTargetPos(): string;
|
|
903
|
-
|
|
945
|
+
teardownContent(): void;
|
|
904
946
|
private disposeElements;
|
|
905
947
|
override dispose(): void;
|
|
906
948
|
}
|
|
907
949
|
//#endregion
|
|
950
|
+
//#region src/lyric-player/dom/lyric-group.d.ts
|
|
951
|
+
declare class LyricLineGroup extends LyricLineGroupBase<LyricLineEl> {
|
|
952
|
+
lyricPlayer: DomLyricPlayer;
|
|
953
|
+
element: HTMLElement;
|
|
954
|
+
bgWrapper?: HTMLElement;
|
|
955
|
+
private lastIsActive?;
|
|
956
|
+
constructor(lyricPlayer: DomLyricPlayer, mainLine: LyricLineEl);
|
|
957
|
+
get isInSight(): boolean;
|
|
958
|
+
show(): void;
|
|
959
|
+
hide(): void;
|
|
960
|
+
override update(delta: number): void;
|
|
961
|
+
addBgLine(bgLine: LyricLineEl): void;
|
|
962
|
+
protected renderStyles(): void;
|
|
963
|
+
override dispose(): void;
|
|
964
|
+
}
|
|
965
|
+
//#endregion
|
|
908
966
|
//#region src/lyric-player/dom/index.d.ts
|
|
909
967
|
/**
|
|
910
968
|
* 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素
|
|
@@ -927,7 +985,7 @@ type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
|
|
|
927
985
|
* 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施
|
|
928
986
|
*/
|
|
929
987
|
declare class DomLyricPlayer extends LyricPlayerBase {
|
|
930
|
-
override
|
|
988
|
+
override currentLyricGroups: LyricLineGroup[];
|
|
931
989
|
override onResize(): void;
|
|
932
990
|
readonly supportPlusLighter: boolean;
|
|
933
991
|
readonly supportMaskImage: boolean;
|