@applemusic-like-lyrics/core 0.2.0-alpha.6 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.md +35 -0
  2. package/dist/amll-core.css +2 -1
  3. package/dist/amll-core.js +10626 -7358
  4. package/dist/amll-core.js.map +1 -1
  5. package/dist/bg-render/base.d.ts +2 -3
  6. package/dist/bg-render/img.d.ts +0 -1
  7. package/dist/bg-render/index.d.ts +0 -1
  8. package/dist/bg-render/mesh-renderer/cp-generate.d.ts +0 -1
  9. package/dist/bg-render/mesh-renderer/cp-presets.d.ts +1 -2
  10. package/dist/bg-render/mesh-renderer/index.d.ts +5 -3
  11. package/dist/bg-render/pixi-renderer.d.ts +0 -1
  12. package/dist/canvas-test.d.ts +0 -1
  13. package/dist/index.d.ts +0 -1
  14. package/dist/interfaces.d.ts +52 -4
  15. package/dist/lyric-player/base.d.ts +52 -8
  16. package/dist/lyric-player/bottom-line.d.ts +4 -2
  17. package/dist/lyric-player/canvas/index.d.ts +0 -1
  18. package/dist/lyric-player/canvas/lyric-line.d.ts +0 -2
  19. package/dist/lyric-player/canvas/text-layout.d.ts +0 -1
  20. package/dist/lyric-player/dom/index.d.ts +0 -1
  21. package/dist/lyric-player/dom/interlude-dots.d.ts +0 -1
  22. package/dist/lyric-player/dom/lyric-line.d.ts +15 -8
  23. package/dist/lyric-player/dom-slim/index.d.ts +0 -1
  24. package/dist/lyric-player/dom-slim/interlude-dots.d.ts +0 -1
  25. package/dist/lyric-player/dom-slim/lyric-line.d.ts +2 -4
  26. package/dist/lyric-player/index.d.ts +21 -3
  27. package/dist/mg-test.d.ts +0 -1
  28. package/dist/utils/debounce.d.ts +0 -1
  29. package/dist/utils/derivative.d.ts +0 -1
  30. package/dist/utils/eq-set.d.ts +0 -1
  31. package/dist/utils/flagsets.d.ts +0 -1
  32. package/dist/utils/is-cjk.d.ts +0 -1
  33. package/dist/utils/linear.d.ts +0 -1
  34. package/dist/utils/lyric-split-words.d.ts +0 -1
  35. package/dist/utils/matrix.d.ts +0 -1
  36. package/dist/utils/mutex.d.ts +0 -1
  37. package/dist/utils/optimize-lyric.d.ts +9 -0
  38. package/dist/utils/resource.d.ts +0 -1
  39. package/dist/utils/schedule.d.ts +0 -1
  40. package/dist/utils/spring.d.ts +0 -1
  41. package/dist/utils/wa-spring.d.ts +0 -7
  42. package/package.json +12 -12
  43. package/dist/bg-render/base.d.ts.map +0 -1
  44. package/dist/bg-render/img.d.ts.map +0 -1
  45. package/dist/bg-render/index.d.ts.map +0 -1
  46. package/dist/bg-render/mesh-renderer/cp-generate.d.ts.map +0 -1
  47. package/dist/bg-render/mesh-renderer/cp-presets.d.ts.map +0 -1
  48. package/dist/bg-render/mesh-renderer/index.d.ts.map +0 -1
  49. package/dist/bg-render/pixi-renderer.d.ts.map +0 -1
  50. package/dist/canvas-test.d.ts.map +0 -1
  51. package/dist/index.d.ts.map +0 -1
  52. package/dist/interfaces.d.ts.map +0 -1
  53. package/dist/lyric-player/base.d.ts.map +0 -1
  54. package/dist/lyric-player/bottom-line.d.ts.map +0 -1
  55. package/dist/lyric-player/canvas/index.d.ts.map +0 -1
  56. package/dist/lyric-player/canvas/lyric-line.d.ts.map +0 -1
  57. package/dist/lyric-player/canvas/text-layout.d.ts.map +0 -1
  58. package/dist/lyric-player/dom/index.d.ts.map +0 -1
  59. package/dist/lyric-player/dom/interlude-dots.d.ts.map +0 -1
  60. package/dist/lyric-player/dom/lyric-line.d.ts.map +0 -1
  61. package/dist/lyric-player/dom-slim/index.d.ts.map +0 -1
  62. package/dist/lyric-player/dom-slim/interlude-dots.d.ts.map +0 -1
  63. package/dist/lyric-player/dom-slim/lyric-line.d.ts.map +0 -1
  64. package/dist/lyric-player/index.d.ts.map +0 -1
  65. package/dist/mg-test.d.ts.map +0 -1
  66. package/dist/utils/debounce.d.ts.map +0 -1
  67. package/dist/utils/derivative.d.ts.map +0 -1
  68. package/dist/utils/eq-set.d.ts.map +0 -1
  69. package/dist/utils/flagsets.d.ts.map +0 -1
  70. package/dist/utils/is-cjk.d.ts.map +0 -1
  71. package/dist/utils/linear.d.ts.map +0 -1
  72. package/dist/utils/lyric-split-words.d.ts.map +0 -1
  73. package/dist/utils/matrix.d.ts.map +0 -1
  74. package/dist/utils/mutex.d.ts.map +0 -1
  75. package/dist/utils/resource.d.ts.map +0 -1
  76. package/dist/utils/schedule.d.ts.map +0 -1
  77. package/dist/utils/spring.d.ts.map +0 -1
  78. package/dist/utils/wa-spring.d.ts.map +0 -1
@@ -75,8 +75,8 @@ export declare abstract class BaseRenderer extends AbstractBaseRenderer {
75
75
  */
76
76
  protected onResize(width: number, height: number): void;
77
77
  /**
78
- * 修改背景的流动速度,数字越大越快,默认为 4
79
- * @param speed 背景的流动速度,默认为 4
78
+ * 修改背景的流动速度,数字越大越快,默认为 1
79
+ * @param speed 背景的流动速度,默认为 1
80
80
  */
81
81
  setFlowSpeed(speed: number): void;
82
82
  /**
@@ -107,4 +107,3 @@ export declare abstract class BaseRenderer extends AbstractBaseRenderer {
107
107
  dispose(): void;
108
108
  getElement(): HTMLElement;
109
109
  }
110
- //# sourceMappingURL=base.d.ts.map
@@ -2,4 +2,3 @@ export declare function blurImage(imageData: ImageData, radius: number, quality:
2
2
  export declare function saturateImage(imageData: ImageData, saturation: number): void;
3
3
  export declare function brightnessImage(imageData: ImageData, brightness: number): void;
4
4
  export declare function contrastImage(imageData: ImageData, contrast: number): void;
5
- //# sourceMappingURL=img.d.ts.map
@@ -26,4 +26,3 @@ export declare class BackgroundRender<Renderer extends BaseRenderer> implements
26
26
  getElement(): HTMLCanvasElement;
27
27
  dispose(): void;
28
28
  }
29
- //# sourceMappingURL=index.d.ts.map
@@ -4,4 +4,3 @@ normalOffset?: number, // = 0.3,
4
4
  blendFactor?: number, smoothIters?: number, // = 3,
5
5
  smoothFactor?: number, // = 0.3,
6
6
  smoothModifier?: number): ControlPointPreset;
7
- //# sourceMappingURL=cp-generate.d.ts.map
@@ -19,5 +19,4 @@ export interface ControlPointPreset {
19
19
  export declare const p: (cx: number, cy: number, x: number, y: number, ur?: number, vr?: number, up?: number, vp?: number) => ControlPointConf;
20
20
  /** @internal */
21
21
  export declare const preset: (width: number, height: number, conf: ControlPointConf[]) => ControlPointPreset;
22
- export declare const CONTROL_POINT_PRESETS: readonly [ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset];
23
- //# sourceMappingURL=cp-presets.d.ts.map
22
+ export declare const CONTROL_POINT_PRESETS: readonly [ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset];
@@ -25,7 +25,6 @@ export declare class MeshGradientRenderer extends BaseRenderer {
25
25
  private gl;
26
26
  private lastFrameTime;
27
27
  private frameTime;
28
- private currentImageData?;
29
28
  private lastTickTime;
30
29
  private smoothedVolume;
31
30
  private volume;
@@ -34,6 +33,10 @@ export declare class MeshGradientRenderer extends BaseRenderer {
34
33
  private paused;
35
34
  private staticMode;
36
35
  private mainProgram;
36
+ private quadProgram;
37
+ private quadBuffer;
38
+ private fbo;
39
+ private fboTexture;
37
40
  private manualControl;
38
41
  private reduceImageSizeCanvas;
39
42
  private targetSize;
@@ -52,10 +55,10 @@ export declare class MeshGradientRenderer extends BaseRenderer {
52
55
  resetSubdivition(subDivisions: number): void;
53
56
  private onTick;
54
57
  private checkIfResize;
58
+ private updateFBO;
55
59
  private onRedraw;
56
60
  private onTickBinded;
57
61
  private requestTick;
58
- private supportTextureFloat;
59
62
  constructor(canvas: HTMLCanvasElement);
60
63
  protected onResize(width: number, height: number): void;
61
64
  setStaticMode(enable: boolean): void;
@@ -71,4 +74,3 @@ export declare class MeshGradientRenderer extends BaseRenderer {
71
74
  private updatePerformanceStats;
72
75
  }
73
76
  export {};
74
- //# sourceMappingURL=index.d.ts.map
@@ -20,4 +20,3 @@ export declare class PixiRenderer extends BaseRenderer {
20
20
  dispose(): void;
21
21
  getElement(): HTMLElement;
22
22
  }
23
- //# sourceMappingURL=pixi-renderer.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=canvas-test.d.ts.map
package/dist/index.d.ts CHANGED
@@ -2,4 +2,3 @@ export * from './bg-render/index.ts';
2
2
  export type * from './interfaces.ts';
3
3
  export * from './lyric-player/index.ts';
4
4
  export type * as spring from './utils/spring.ts';
5
- //# sourceMappingURL=index.d.ts.map
@@ -23,17 +23,21 @@ export interface Disposable {
23
23
  dispose(): void;
24
24
  }
25
25
  /** 一个歌词单词 */
26
- export interface LyricWord {
26
+ export interface LyricWordBase {
27
27
  /** 单词的起始时间,单位为毫秒 */
28
28
  startTime: number;
29
29
  /** 单词的结束时间,单位为毫秒 */
30
30
  endTime: number;
31
31
  /** 单词内容 */
32
32
  word: string;
33
+ }
34
+ export interface LyricWord extends LyricWordBase {
33
35
  /** 单词的音译内容 */
34
- romanWord: string;
36
+ romanWord?: string;
35
37
  /** 单词内容是否包含冒犯性的不雅用语 */
36
- obscene: boolean;
38
+ obscene?: boolean;
39
+ /** 单词的注音内容 */
40
+ ruby?: LyricWordBase[];
37
41
  }
38
42
  /** 一行歌词,存储多个单词 */
39
43
  export interface LyricLine {
@@ -55,4 +59,48 @@ export interface LyricLine {
55
59
  /** 该行是否为对唱歌词行(即歌词行靠右对齐) */
56
60
  isDuet: boolean;
57
61
  }
58
- //# sourceMappingURL=interfaces.d.ts.map
62
+ /**
63
+ * 优化歌词行的配置选项
64
+ */
65
+ export interface OptimizeLyricOptions {
66
+ /**
67
+ * 规范化歌词中的空格
68
+ *
69
+ * 将多个连续空格替换为一个空格
70
+ * @default true
71
+ */
72
+ normalizeSpaces?: boolean;
73
+ /**
74
+ * 是否将行级时间戳强行设为字级时间戳
75
+ * @default true
76
+ */
77
+ resetLineTimestamps?: boolean;
78
+ /**
79
+ * 把多行背景人声转换为单行背景人声 + 主歌词行的形式
80
+ * @default true
81
+ */
82
+ convertExcessiveBackgroundLines?: boolean;
83
+ /**
84
+ * 是否同步主歌词与背景人声的时间
85
+ * @default true
86
+ */
87
+ syncMainAndBackgroundLines?: boolean;
88
+ /**
89
+ * 清洗非刻意的重叠,以免不必要的多行高亮效果
90
+ *
91
+ * 如果两行时间轴有重叠的歌词同时满足下列条件:
92
+ * * 重叠小于 100ms
93
+ * * 重叠时长不足下一行时长的 10%
94
+ *
95
+ * 则截断上一行歌词的结束时间为下一行歌词的开始时间
96
+ * @default true
97
+ */
98
+ cleanUnintentionalOverlaps?: boolean;
99
+ /**
100
+ * 尝试让歌词提前最多 1 秒开始
101
+ *
102
+ * 有重叠则尝试最多提前 400ms 或上一行时长的 30%
103
+ * @default true
104
+ */
105
+ tryAdvanceStartTime?: boolean;
106
+ }
@@ -1,12 +1,14 @@
1
- import { Disposable, HasElement, LyricLine, LyricWord } from '../interfaces.ts';
1
+ import { Disposable, HasElement, LyricLine, LyricWord, OptimizeLyricOptions } from '../interfaces.ts';
2
2
  import { Spring, SpringParams } from '../utils/spring.ts';
3
3
  import { BottomLineEl } from './bottom-line.ts';
4
4
  import { InterludeDots } from './dom/interlude-dots.ts';
5
+ import { LyricLineRenderMode, MaskObsceneWordsMode } from './index.ts';
5
6
  /**
6
7
  * 歌词播放器的基类,已经包含了有关歌词操作和排版的功能,子类需要为其实现对应的显示展示操作
7
8
  */
8
9
  export declare abstract class LyricPlayerBase extends EventTarget implements HasElement, Disposable {
9
10
  protected element: HTMLElement;
11
+ abstract get baseFontSize(): number;
10
12
  protected currentTime: number;
11
13
  /** @internal */
12
14
  lyricLinesSize: WeakMap<LyricLineBase, [number, number]>;
@@ -26,6 +28,8 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
26
28
  protected bottomLine: BottomLineEl;
27
29
  protected enableBlur: boolean;
28
30
  protected enableScale: boolean;
31
+ protected maskObsceneWords: MaskObsceneWordsMode;
32
+ protected maskObsceneWordChar: string;
29
33
  protected hidePassedLines: boolean;
30
34
  protected scrollBoundary: number[];
31
35
  protected currentLyricLineObjects: LyricLineBase[];
@@ -37,7 +41,13 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
37
41
  readonly size: [number, number];
38
42
  protected allowScroll: boolean;
39
43
  protected isPageVisible: boolean;
44
+ protected optimizeOptions: OptimizeLyricOptions;
40
45
  protected initialLayoutFinished: boolean;
46
+ /**
47
+ * 标记用户是否正在进行滚动交互
48
+ */
49
+ protected isUserScrolling: boolean;
50
+ protected wheelTimeout: ReturnType<typeof setTimeout> | undefined;
41
51
  /**
42
52
  * 视图额外预渲染(overscan)距离,单位:像素。
43
53
  * 用于决定在视口之外多少距离内也认为是“可见”,以便提前创建/保留行元素。
@@ -55,7 +65,8 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
55
65
  resizeObserver: ResizeObserver;
56
66
  protected wordFadeWidth: number;
57
67
  protected targetAlignIndex: number;
58
- constructor();
68
+ protected lastInterludeState: boolean;
69
+ constructor(element?: HTMLElement);
59
70
  private beginScrollHandler;
60
71
  private endScrollHandler;
61
72
  private limitScrollOffset;
@@ -101,6 +112,24 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
101
112
  * @param enable 是否启用
102
113
  */
103
114
  setEnableBlur(enable: boolean): void;
115
+ /**
116
+ * 设置歌词中不雅用语的掩码模式
117
+ * @param mode 掩码模式
118
+ * @see {@link MaskObsceneWordsMode}
119
+ */
120
+ setMaskObsceneWords(mode: MaskObsceneWordsMode): void;
121
+ /**
122
+ * 设置不雅用语掩码使用的字符,默认为 `*`
123
+ * @param char 单个字符,用于替换不雅用语中的字符
124
+ */
125
+ setMaskObsceneWordChar(char: string): void;
126
+ rebuildLyricLines(): void;
127
+ /**
128
+ * 根据当前配置处理不雅用语单词
129
+ * @param word 单词对象
130
+ * @internal
131
+ */
132
+ processObsceneWord(word: LyricWord): string;
104
133
  /**
105
134
  * 设置目标歌词行的对齐方式,默认为 `center`
106
135
  *
@@ -144,12 +173,25 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
144
173
  * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间
145
174
  */
146
175
  protected getCurrentInterlude(): [number, number, number, boolean] | undefined;
176
+ /**
177
+ * 设置歌词的优化配置项,这些配置项默认全部开启
178
+ *
179
+ * 注意,如果在 `setLyricLines` 之后修改此配置,需要重新调用 `setLyricLines()` 才能对当前歌词生效
180
+ * @param options 优化配置选项
181
+ * @see {@link OptimizeLyricOptions}
182
+ */
183
+ setOptimizeOptions(options: OptimizeLyricOptions): void;
147
184
  /**
148
185
  * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误
149
186
  * @param lines 歌词数组
150
187
  * @param initialTime 初始时间,默认为 0
151
188
  */
152
189
  setLyricLines(lines: LyricLine[], initialTime?: number): void;
190
+ /**
191
+ * 获取当前是否在播放
192
+ * @returns 当前是否在播放
193
+ */
194
+ getIsPlaying(): boolean;
153
195
  /**
154
196
  * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息
155
197
  * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好
@@ -158,6 +200,7 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
158
200
  * @param time 当前播放进度,单位为毫秒
159
201
  */
160
202
  setCurrentTime(time: number, isSeek?: boolean): void;
203
+ protected updateDynamicSpringParams(): void;
161
204
  /**
162
205
  * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`
163
206
  * 函数即可让歌词通过动画移动到目标位置。
@@ -172,10 +215,11 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
172
215
  * 2. 加载了新的歌词时(不论前后歌词是否完全一样)
173
216
  * 3. 用户自行跳转了歌曲播放位置(不论距离远近)
174
217
  *
175
- * @param force 是否不经过动画直接修改布局定位
176
- * @param reflow 是否进行重新布局(重新计算每行歌词大小)
218
+ * @param sync 是否同步执行,通常用于初始化或 Resize 时立即布局
219
+ * @param force 是否绕过弹簧效果强制更新位置
177
220
  */
178
- calcLayout(sync?: boolean): Promise<void>;
221
+ calcLayout(sync?: boolean, force?: boolean): Promise<void>;
222
+ protected calculateBlur(itemIndex: number, isActive: boolean, latestIndex: number): number;
179
223
  /**
180
224
  * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。
181
225
  *
@@ -260,12 +304,13 @@ export declare abstract class LyricLineBase extends EventTarget implements Dispo
260
304
  scale: Spring;
261
305
  };
262
306
  abstract getLine(): LyricLine;
263
- abstract enable(): void;
307
+ abstract enable(time?: number, shouldPlay?: boolean): void;
264
308
  abstract disable(): void;
265
309
  abstract resume(): void;
266
310
  abstract pause(): void;
267
311
  onLineSizeChange(_size: [number, number]): void;
268
- setTransform(top?: number, scale?: number, opacity?: number, blur?: number, _force?: boolean, delay?: number): void;
312
+ setTransform(top?: number, scale?: number, opacity?: number, blur?: number, _force?: boolean, delay?: number, _mode?: LyricLineRenderMode): void;
313
+ rebuildElement(): void;
269
314
  /**
270
315
  * 判定歌词是否可以应用强调辉光效果
271
316
  *
@@ -280,4 +325,3 @@ export declare abstract class LyricLineBase extends EventTarget implements Dispo
280
325
  abstract update(delta?: number): void;
281
326
  dispose(): void;
282
327
  }
283
- //# sourceMappingURL=base.d.ts.map
@@ -12,16 +12,18 @@ export declare class BottomLineEl implements HasElement, Disposable {
12
12
  posX: Spring;
13
13
  posY: Spring;
14
14
  };
15
+ private isFocused;
16
+ private blur;
15
17
  constructor(lyricPlayer: LyricPlayerBase);
16
18
  measureSize(): Promise<[number, number]>;
17
19
  private lastStyle;
18
20
  show(): void;
19
21
  hide(): void;
22
+ setFocused(focused: boolean): void;
20
23
  private rebuildStyle;
21
24
  getElement(): HTMLElement;
22
- setTransform(left?: number, top?: number, force?: boolean, delay?: number): void;
25
+ setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
23
26
  update(delta?: number): void;
24
27
  get isInSight(): boolean;
25
28
  dispose(): void;
26
29
  }
27
- //# sourceMappingURL=bottom-line.d.ts.map
@@ -22,4 +22,3 @@ export declare class CanvasLyricPlayer extends LyricPlayerBase {
22
22
  setFontSize(emSize: number): void;
23
23
  update(delta?: number): void;
24
24
  }
25
- //# sourceMappingURL=index.d.ts.map
@@ -14,7 +14,6 @@ export declare class CanvasLyricLine extends LyricLineBase {
14
14
  private lineCanvas;
15
15
  /** @internal */
16
16
  relayout(): void;
17
- private enabled;
18
17
  enable(): void;
19
18
  disable(): void;
20
19
  resume(): void;
@@ -23,4 +22,3 @@ export declare class CanvasLyricLine extends LyricLineBase {
23
22
  get isInSight(): boolean;
24
23
  update(delta?: number): void;
25
24
  }
26
- //# sourceMappingURL=lyric-line.d.ts.map
@@ -37,4 +37,3 @@ export declare function layoutWord(ctx: CanvasRenderingContext2D, text: string,
37
37
  * @param initialX 初始 X 坐标,对于需要布局多段文本的情况下有所帮助
38
38
  */
39
39
  export declare function layoutLine(ctx: CanvasRenderingContext2D, text: string, config: TextLayoutConfig, initialX?: number): Generator<TextLayoutResult, void, void>;
40
- //# sourceMappingURL=text-layout.d.ts.map
@@ -57,4 +57,3 @@ export declare class DomLyricPlayer extends LyricPlayerBase {
57
57
  update(delta?: number): void;
58
58
  dispose(): void;
59
59
  }
60
- //# sourceMappingURL=index.d.ts.map
@@ -20,4 +20,3 @@ export declare class InterludeDots implements HasElement, Disposable {
20
20
  update(delta?: number): void;
21
21
  dispose(): void;
22
22
  }
23
- //# sourceMappingURL=interlude-dots.d.ts.map
@@ -1,5 +1,6 @@
1
1
  import { LyricLine, LyricWord } from '../../interfaces.ts';
2
2
  import { LyricLineBase } from '../base.ts';
3
+ import { LyricLineRenderMode } from '../index.ts';
3
4
  import { DomLyricPlayer } from '.';
4
5
  interface RealWord extends LyricWord {
5
6
  mainElement: HTMLSpanElement;
@@ -27,6 +28,12 @@ export declare class LyricLineEl extends LyricLineBase {
27
28
  private splittedWords;
28
29
  private built;
29
30
  lineSize: number[];
31
+ private renderMode;
32
+ private currentBrightAlpha;
33
+ private currentDarkAlpha;
34
+ private targetBrightAlpha;
35
+ private targetDarkAlpha;
36
+ private segmenter;
30
37
  constructor(lyricPlayer: DomLyricPlayer, lyricLine?: LyricLine);
31
38
  private listenersMap;
32
39
  private readonly onMouseEvent;
@@ -34,14 +41,13 @@ export declare class LyricLineEl extends LyricLineBase {
34
41
  removeMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | EventListenerOptions | undefined): void;
35
42
  areWordsOnSameLine(word1: RealWord, word2: RealWord): boolean;
36
43
  private isEnabled;
37
- enable(maskAnimationTime?: number): Promise<void>;
44
+ enable(maskAnimationTime?: number, shouldPlay?: boolean): Promise<void>;
38
45
  disable(): void;
39
46
  private lastWord?;
40
47
  resume(): Promise<void>;
41
48
  pause(): Promise<void>;
42
49
  setMaskAnimationState(maskAnimationTime?: number): void;
43
50
  getLine(): LyricLine;
44
- private _hide;
45
51
  private _prevParentEl;
46
52
  private lastStyle;
47
53
  show(): void;
@@ -50,10 +56,10 @@ export declare class LyricLineEl extends LyricLineBase {
50
56
  rebuildElement(): void;
51
57
  /** 设置翻译与音译行文本 */
52
58
  private setSubLinesText;
53
- /** 处理一组连写(无空格)单词,包含强调效果 */
54
- private buildChunkGroup;
55
- /** 渲染单个词(含强调与音译处理) */
56
- private buildSingleWord;
59
+ private getRubyCharCount;
60
+ private getRubySegments;
61
+ private createWord;
62
+ private buildWord;
57
63
  private initFloatAnimation;
58
64
  private initEmphasizeAnimation;
59
65
  private get totalDuration();
@@ -62,7 +68,9 @@ export declare class LyricLineEl extends LyricLineBase {
62
68
  private generateCalcBasedMaskImage;
63
69
  private generateWebAnimationBasedMaskImage;
64
70
  getElement(): HTMLElement;
65
- setTransform(top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number): void;
71
+ private updateMaskAlphaTargets;
72
+ private applyAlphaToDom;
73
+ setTransform(top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number, mode?: LyricLineRenderMode): void;
66
74
  update(delta?: number): void;
67
75
  _getDebugTargetPos(): string;
68
76
  get isInSight(): boolean;
@@ -70,4 +78,3 @@ export declare class LyricLineEl extends LyricLineBase {
70
78
  dispose(): void;
71
79
  }
72
80
  export {};
73
- //# sourceMappingURL=lyric-line.d.ts.map
@@ -36,4 +36,3 @@ export declare class DomSlimLyricPlayer extends LyricPlayerBase {
36
36
  calcLayout(sync?: boolean): Promise<void>;
37
37
  dispose(): void;
38
38
  }
39
- //# sourceMappingURL=index.d.ts.map
@@ -20,4 +20,3 @@ export declare class InterludeDots implements HasElement, Disposable {
20
20
  update(delta?: number): void;
21
21
  dispose(): void;
22
22
  }
23
- //# sourceMappingURL=interlude-dots.d.ts.map
@@ -42,13 +42,12 @@ export declare class LyricLineEl extends LyricLineBase {
42
42
  private measureLockMark;
43
43
  private measureLock;
44
44
  getLine(): LyricLine;
45
- private _prevParentEl;
46
- private lastStyle;
47
45
  show(): void;
48
46
  hide(): void;
49
47
  private rebuildStyle;
48
+ private getRubySegments;
49
+ private buildWordElement;
50
50
  rebuildElement(): void;
51
- private initFloatAnimation;
52
51
  private initEmphasizeAnimation;
53
52
  private get totalDuration();
54
53
  private maskImageDirty;
@@ -68,4 +67,3 @@ export declare class LyricLineEl extends LyricLineBase {
68
67
  dispose(): void;
69
68
  }
70
69
  export {};
71
- //# sourceMappingURL=lyric-line.d.ts.map
@@ -1,11 +1,29 @@
1
1
  import { DomLyricPlayer } from './dom/index.ts';
2
2
  export { LyricPlayerBase } from './base.ts';
3
3
  export * from './canvas/index.ts';
4
- export * from './dom-slim/index.ts';
5
4
  export * from './dom/index.ts';
5
+ export * from './dom-slim/index.ts';
6
+ /**
7
+ * 歌词中不雅用语的掩码模式
8
+ */
9
+ declare enum MaskObsceneWordsMode {
10
+ /** 禁用任何不雅用语掩码 */
11
+ Disabled = "",
12
+ /** 完全掩码所有不雅用语 */
13
+ FullMask = "full-mask",
14
+ /** 保留首尾字符,屏蔽中间字符 */
15
+ PartialMask = "partial-mask"
16
+ }
17
+ /**
18
+ * 歌词行的渲染模式
19
+ * @internal
20
+ */
21
+ declare enum LyricLineRenderMode {
22
+ SOLID = 0,
23
+ GRADIENT = 1
24
+ }
6
25
  export {
7
26
  /**
8
27
  * 默认导出的歌词播放组件
9
28
  */
10
- DomLyricPlayer as LyricPlayer, };
11
- //# sourceMappingURL=index.d.ts.map
29
+ DomLyricPlayer as LyricPlayer, LyricLineRenderMode, MaskObsceneWordsMode, };
package/dist/mg-test.d.ts CHANGED
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=mg-test.d.ts.map
@@ -1,3 +1,2 @@
1
1
  export declare function debounce<T extends Function>(cb: T, wait?: number): (...args: any) => void;
2
2
  export declare function debounceFrame<T extends Function>(cb: T, frameTime?: number): (...args: any) => void;
3
- //# sourceMappingURL=debounce.d.ts.map
@@ -1,3 +1,2 @@
1
1
  export declare function derivative(f: (x: number) => number): (x: number) => number;
2
2
  export declare function getVelocity(f: (t: number) => number): (t: number) => number;
3
- //# sourceMappingURL=derivative.d.ts.map
@@ -1,2 +1 @@
1
1
  export declare const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean;
2
- //# sourceMappingURL=eq-set.d.ts.map
@@ -15,4 +15,3 @@ export declare class FlagSets {
15
15
  delete(flag: number): void;
16
16
  has(flag: number): boolean;
17
17
  }
18
- //# sourceMappingURL=flagsets.d.ts.map
@@ -1,2 +1 @@
1
1
  export declare const isCJK: (char: string) => boolean;
2
- //# sourceMappingURL=is-cjk.d.ts.map
@@ -19,4 +19,3 @@ export declare class Linear {
19
19
  setTargetPosition(targetPosition: number, delay?: number): void;
20
20
  getCurrentPosition(): number;
21
21
  }
22
- //# sourceMappingURL=linear.d.ts.map
@@ -9,4 +9,3 @@ import { LyricWord } from '../interfaces.ts';
9
9
  * @returns 重新分组后的单词数组
10
10
  */
11
11
  export declare function chunkAndSplitLyricWords(words: LyricWord[]): (LyricWord | LyricWord[])[];
12
- //# sourceMappingURL=lyric-split-words.d.ts.map
@@ -23,4 +23,3 @@ export declare function scaleMatrix4(m: Matrix4, scale?: number, origin?: {
23
23
  }): Matrix4;
24
24
  export declare function translateMatrix4(m: Matrix4, x?: number, y?: number, z?: number): Matrix4;
25
25
  export declare function matrix4ToCSS(m: Matrix4, fractionDigits?: number): string;
26
- //# sourceMappingURL=matrix.d.ts.map
@@ -1,3 +1,2 @@
1
1
  export declare function mutexifyFunction<F extends (...args: Args) => Promise<Result>, Args extends any[], Result>(func: F): F;
2
2
  export default mutexifyFunction;
3
- //# sourceMappingURL=mutex.d.ts.map
@@ -0,0 +1,9 @@
1
+ import { LyricLine, OptimizeLyricOptions } from '../interfaces.ts';
2
+ /**
3
+ * 优化歌词行的展示效果
4
+ *
5
+ * 注意会直接原地修改入参,确保你已经提前深克隆了歌词行数组
6
+ * @param lines 歌词行数组
7
+ * @param options 优化的可选配置,默认全部开启
8
+ */
9
+ export declare function optimizeLyricLines(lines: LyricLine[], options?: OptimizeLyricOptions): void;
@@ -2,4 +2,3 @@ export declare function loadImage(imageUrl: string): Promise<HTMLImageElement>;
2
2
  export declare function loadVideo(videoUrl: string): Promise<HTMLVideoElement>;
3
3
  export declare function loadResourceFromUrl(url: string, isVideo?: boolean): Promise<HTMLImageElement | HTMLVideoElement>;
4
4
  export declare function loadResourceFromElement(element: HTMLImageElement | HTMLVideoElement): Promise<HTMLImageElement | HTMLVideoElement>;
5
- //# sourceMappingURL=resource.d.ts.map
@@ -4,4 +4,3 @@
4
4
  */
5
5
  export declare function measure<T>(callback: () => T): Promise<T>;
6
6
  export declare function mutate(callback: () => void): Promise<unknown>;
7
- //# sourceMappingURL=schedule.d.ts.map
@@ -24,4 +24,3 @@ export declare class Spring {
24
24
  setTargetPosition(targetPosition: number, delay?: number): void;
25
25
  getCurrentPosition(): number;
26
26
  }
27
- //# sourceMappingURL=spring.d.ts.map
@@ -1,9 +1,4 @@
1
1
  import { Disposable } from '../interfaces.ts';
2
- export interface SpringParams {
3
- mass: number;
4
- damping: number;
5
- stiffness: number;
6
- }
7
2
  type CSSStyleKeys = {
8
3
  [Style in keyof CSSStyleDeclaration]: Style extends string ? CSSStyleDeclaration[Style] extends string ? Style : never : never;
9
4
  }[keyof CSSStyleDeclaration];
@@ -18,7 +13,6 @@ export declare class WebAnimationSpring extends EventTarget implements Disposabl
18
13
  private currentAnimation;
19
14
  private targetPosition;
20
15
  private isStatic;
21
- private params;
22
16
  private currentSolver;
23
17
  private getV;
24
18
  constructor(element: HTMLElement, styleName: CSSStyleKeys, valueGenerator: (value: number) => string, currentPosition?: number);
@@ -31,4 +25,3 @@ export declare class WebAnimationSpring extends EventTarget implements Disposabl
31
25
  dispose(): void;
32
26
  }
33
27
  export {};
34
- //# sourceMappingURL=wa-spring.d.ts.map