@applemusic-like-lyrics/lyric 0.0.2 → 0.1.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.
- package/README.md +39 -0
- package/package.json +17 -9
- package/{lyric.d.ts → pkg/lyric.d.ts} +23 -3
- package/{lyric_bg.js → pkg/lyric_bg.js} +92 -32
- package/pkg/lyric_bg.wasm +0 -0
- package/pkg/lyric_bg.wasm.d.ts +21 -0
- package/lyric_bg.wasm +0 -0
- /package/{lyric.js → pkg/lyric.js} +0 -0
package/README.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Lyric parser/writer for AMLL
|
|
2
2
|
|
|
3
|
+
> 警告:此为个人项目,且尚未完成开发,可能仍有大量问题,所以请勿直接用于生产环境!
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
[](https://www.npmjs.com/package/@applemusic-like-lyrics/lyric)
|
|
7
|
+
[](https://www.npmjs.com/package/@applemusic-like-lyrics/lyric)
|
|
8
|
+
|
|
3
9
|
一个 AMLL 的歌词解析/生成模块,使用 Rust 编写,并通过 `wasm-pack`
|
|
4
10
|
构建成 WASM 模块以提供给其他项目使用。
|
|
5
11
|
|
|
@@ -17,3 +23,36 @@
|
|
|
17
23
|
- QQ 音乐逐词歌词格式 `.qrc`
|
|
18
24
|
- Lyricify Syllable 逐词歌词格式 `.lys`
|
|
19
25
|
- ASS 字幕格式 `.ass`
|
|
26
|
+
|
|
27
|
+
## 与 Core 歌词组件一起使用
|
|
28
|
+
|
|
29
|
+
在和二者合用的时候,需要注意**两者的歌词行结构并不完全相同**,需要进行诸如(以 LyRiC 举例)下面的方式进行转换方可被歌词组件正确解析:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { parseLrc } from "@applemusic-like-lyrics/lyric";
|
|
33
|
+
const lines = parseLrc("[00:00.00]test");
|
|
34
|
+
const converted = lines.map((line, i, lines) => ({
|
|
35
|
+
words: [
|
|
36
|
+
{
|
|
37
|
+
word: line.words[0]?.word ?? "",
|
|
38
|
+
startTime: line.words[0]?.startTime ?? 0,
|
|
39
|
+
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
startTime: line.words[0]?.startTime ?? 0,
|
|
43
|
+
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
|
|
44
|
+
translatedLyric: "",
|
|
45
|
+
romanLyric: "",
|
|
46
|
+
isBG: false,
|
|
47
|
+
isDuet: false,
|
|
48
|
+
}));
|
|
49
|
+
// 此时就可以将 converted 传给 LyricPlayer 了
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
推荐使用 TypeScript,这样可以更方便地查错。
|
|
53
|
+
|
|
54
|
+
## 构建
|
|
55
|
+
|
|
56
|
+
```shell
|
|
57
|
+
wasm-pack build --target bundler --release --scope applemusic-like-lyrics
|
|
58
|
+
```
|
package/package.json
CHANGED
|
@@ -4,18 +4,26 @@
|
|
|
4
4
|
"SteveXMH <39523898+Steve-xmh@users.noreply.github.com>"
|
|
5
5
|
],
|
|
6
6
|
"description": "一个歌词解析/生成模块,着重于歌词内容解析,支持多种格式",
|
|
7
|
-
"version": "0.0
|
|
7
|
+
"version": "0.1.0",
|
|
8
8
|
"license": "GPL-3.0",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/Steve-xmh/applemusic-like-lyrics"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "wasm-pack build --release",
|
|
15
|
+
"build:dev": "wasm-pack build --dev",
|
|
16
|
+
"fmt": "cargo fmt"
|
|
17
|
+
},
|
|
9
18
|
"files": [
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"lyric.d.ts"
|
|
19
|
+
"pkg/*.wasm",
|
|
20
|
+
"pkg/*.js",
|
|
21
|
+
"pkg/*.d.ts"
|
|
14
22
|
],
|
|
15
|
-
"module": "lyric.js",
|
|
16
|
-
"types": "lyric.d.ts",
|
|
23
|
+
"module": "pkg/lyric.js",
|
|
24
|
+
"types": "pkg/lyric.d.ts",
|
|
17
25
|
"sideEffects": [
|
|
18
|
-
"./lyric.js",
|
|
19
|
-
"./snippets/*"
|
|
26
|
+
"./pkg/lyric.js",
|
|
27
|
+
"./pkg/snippets/*"
|
|
20
28
|
]
|
|
21
29
|
}
|
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
*/
|
|
11
11
|
export function set_panic_hook(): void;
|
|
12
12
|
|
|
13
|
-
|
|
14
13
|
/**
|
|
15
14
|
* 解析 LyRiC 格式的歌词字符串
|
|
16
15
|
* @param src 歌词字符串
|
|
@@ -67,6 +66,20 @@ export function parseLys(src: string): LyricLine[];
|
|
|
67
66
|
*/
|
|
68
67
|
export function stringifyLys(lines: LyricLine[]): string;
|
|
69
68
|
|
|
69
|
+
/**
|
|
70
|
+
* 解析 ESLyric 格式的歌词字符串
|
|
71
|
+
* @param src 歌词字符串
|
|
72
|
+
* @returns 成功解析出来的歌词
|
|
73
|
+
*/
|
|
74
|
+
export function parseEslrc(src: string): LyricLine[];
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* 将歌词数组转换为 ESLyric 格式的字符串
|
|
78
|
+
* @param lines 歌词数组
|
|
79
|
+
* @returns ESLyric 格式的字符串
|
|
80
|
+
*/
|
|
81
|
+
export function stringifyEslrc(lines: LyricLine[]): string;
|
|
82
|
+
|
|
70
83
|
/**
|
|
71
84
|
* 将歌词数组转换为 ASS 字幕格式的字符串
|
|
72
85
|
*
|
|
@@ -90,7 +103,7 @@ export interface LyricWord {
|
|
|
90
103
|
endTime: number;
|
|
91
104
|
/** 单词 */
|
|
92
105
|
word: string;
|
|
93
|
-
}
|
|
106
|
+
}
|
|
94
107
|
|
|
95
108
|
/**
|
|
96
109
|
* 一行歌词,存储多个单词
|
|
@@ -112,7 +125,14 @@ export interface LyricLine {
|
|
|
112
125
|
* 此选项只有作为 Lyricify Syllable 文件格式导入导出时才有意义
|
|
113
126
|
*/
|
|
114
127
|
isDuet?: boolean;
|
|
115
|
-
}
|
|
128
|
+
}
|
|
116
129
|
|
|
130
|
+
/**
|
|
131
|
+
* 解密十六进制字符串格式的 Qrc 歌词数据
|
|
132
|
+
* 解密后可去头尾 XML 数据后通过调用 `parseQrc` 解析歌词行
|
|
133
|
+
* @param hexData 十六进制格式的字符串,代表被加密的歌词数据
|
|
134
|
+
* @returns 被解密出来的歌词字符串,是前后有 XML 混合的 QRC 歌词
|
|
135
|
+
*/
|
|
136
|
+
export function decryptQrcHex(hexData: string): string;
|
|
117
137
|
|
|
118
138
|
|
|
@@ -205,14 +205,58 @@ function debugString(val) {
|
|
|
205
205
|
// TODO we could test for more things here, like `Set`s and `Map`s.
|
|
206
206
|
return className;
|
|
207
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* @param {any} lrc
|
|
210
|
+
* @returns {string}
|
|
211
|
+
*/
|
|
212
|
+
export function stringifyAss(lrc) {
|
|
213
|
+
let deferred1_0;
|
|
214
|
+
let deferred1_1;
|
|
215
|
+
try {
|
|
216
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
217
|
+
wasm.stringifyAss(retptr, addHeapObject(lrc));
|
|
218
|
+
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
219
|
+
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
220
|
+
deferred1_0 = r0;
|
|
221
|
+
deferred1_1 = r1;
|
|
222
|
+
return getStringFromWasm0(r0, r1);
|
|
223
|
+
} finally {
|
|
224
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
225
|
+
wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @param {string} hex_data
|
|
231
|
+
* @returns {string}
|
|
232
|
+
*/
|
|
233
|
+
export function decryptQrcHex(hex_data) {
|
|
234
|
+
let deferred2_0;
|
|
235
|
+
let deferred2_1;
|
|
236
|
+
try {
|
|
237
|
+
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
238
|
+
const ptr0 = passStringToWasm0(hex_data, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
239
|
+
const len0 = WASM_VECTOR_LEN;
|
|
240
|
+
wasm.decryptQrcHex(retptr, ptr0, len0);
|
|
241
|
+
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
242
|
+
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
243
|
+
deferred2_0 = r0;
|
|
244
|
+
deferred2_1 = r1;
|
|
245
|
+
return getStringFromWasm0(r0, r1);
|
|
246
|
+
} finally {
|
|
247
|
+
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
248
|
+
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
208
252
|
/**
|
|
209
253
|
* @param {string} src
|
|
210
254
|
* @returns {any}
|
|
211
255
|
*/
|
|
212
|
-
export function
|
|
256
|
+
export function parseEslrc(src) {
|
|
213
257
|
const ptr0 = passStringToWasm0(src, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
214
258
|
const len0 = WASM_VECTOR_LEN;
|
|
215
|
-
const ret = wasm.
|
|
259
|
+
const ret = wasm.parseEslrc(ptr0, len0);
|
|
216
260
|
return takeObject(ret);
|
|
217
261
|
}
|
|
218
262
|
|
|
@@ -220,12 +264,12 @@ export function parseLrc(src) {
|
|
|
220
264
|
* @param {any} lrc
|
|
221
265
|
* @returns {string}
|
|
222
266
|
*/
|
|
223
|
-
export function
|
|
267
|
+
export function stringifyEslrc(lrc) {
|
|
224
268
|
let deferred1_0;
|
|
225
269
|
let deferred1_1;
|
|
226
270
|
try {
|
|
227
271
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
228
|
-
wasm.
|
|
272
|
+
wasm.stringifyEslrc(retptr, addHeapObject(lrc));
|
|
229
273
|
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
230
274
|
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
231
275
|
deferred1_0 = r0;
|
|
@@ -241,10 +285,10 @@ export function stringifyLrc(lrc) {
|
|
|
241
285
|
* @param {string} src
|
|
242
286
|
* @returns {any}
|
|
243
287
|
*/
|
|
244
|
-
export function
|
|
288
|
+
export function parseLrc(src) {
|
|
245
289
|
const ptr0 = passStringToWasm0(src, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
246
290
|
const len0 = WASM_VECTOR_LEN;
|
|
247
|
-
const ret = wasm.
|
|
291
|
+
const ret = wasm.parseLrc(ptr0, len0);
|
|
248
292
|
return takeObject(ret);
|
|
249
293
|
}
|
|
250
294
|
|
|
@@ -252,12 +296,12 @@ export function parseQrc(src) {
|
|
|
252
296
|
* @param {any} lrc
|
|
253
297
|
* @returns {string}
|
|
254
298
|
*/
|
|
255
|
-
export function
|
|
299
|
+
export function stringifyLrc(lrc) {
|
|
256
300
|
let deferred1_0;
|
|
257
301
|
let deferred1_1;
|
|
258
302
|
try {
|
|
259
303
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
260
|
-
wasm.
|
|
304
|
+
wasm.stringifyLrc(retptr, addHeapObject(lrc));
|
|
261
305
|
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
262
306
|
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
263
307
|
deferred1_0 = r0;
|
|
@@ -269,26 +313,14 @@ export function stringifyQrc(lrc) {
|
|
|
269
313
|
}
|
|
270
314
|
}
|
|
271
315
|
|
|
272
|
-
/**
|
|
273
|
-
* When the `console_error_panic_hook` feature is enabled, we can call the
|
|
274
|
-
* `set_panic_hook` function at least once during initialization, and then
|
|
275
|
-
* we will get better error messages if our code ever panics.
|
|
276
|
-
*
|
|
277
|
-
* For more details see
|
|
278
|
-
* https://github.com/rustwasm/console_error_panic_hook#readme
|
|
279
|
-
*/
|
|
280
|
-
export function set_panic_hook() {
|
|
281
|
-
wasm.set_panic_hook();
|
|
282
|
-
}
|
|
283
|
-
|
|
284
316
|
/**
|
|
285
317
|
* @param {string} src
|
|
286
318
|
* @returns {any}
|
|
287
319
|
*/
|
|
288
|
-
export function
|
|
320
|
+
export function parseLys(src) {
|
|
289
321
|
const ptr0 = passStringToWasm0(src, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
290
322
|
const len0 = WASM_VECTOR_LEN;
|
|
291
|
-
const ret = wasm.
|
|
323
|
+
const ret = wasm.parseLys(ptr0, len0);
|
|
292
324
|
return takeObject(ret);
|
|
293
325
|
}
|
|
294
326
|
|
|
@@ -296,12 +328,12 @@ export function parseYrc(src) {
|
|
|
296
328
|
* @param {any} lrc
|
|
297
329
|
* @returns {string}
|
|
298
330
|
*/
|
|
299
|
-
export function
|
|
331
|
+
export function stringifyLys(lrc) {
|
|
300
332
|
let deferred1_0;
|
|
301
333
|
let deferred1_1;
|
|
302
334
|
try {
|
|
303
335
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
304
|
-
wasm.
|
|
336
|
+
wasm.stringifyLys(retptr, addHeapObject(lrc));
|
|
305
337
|
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
306
338
|
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
307
339
|
deferred1_0 = r0;
|
|
@@ -317,10 +349,10 @@ export function stringifyYrc(lrc) {
|
|
|
317
349
|
* @param {string} src
|
|
318
350
|
* @returns {any}
|
|
319
351
|
*/
|
|
320
|
-
export function
|
|
352
|
+
export function parseQrc(src) {
|
|
321
353
|
const ptr0 = passStringToWasm0(src, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
322
354
|
const len0 = WASM_VECTOR_LEN;
|
|
323
|
-
const ret = wasm.
|
|
355
|
+
const ret = wasm.parseQrc(ptr0, len0);
|
|
324
356
|
return takeObject(ret);
|
|
325
357
|
}
|
|
326
358
|
|
|
@@ -328,12 +360,12 @@ export function parseLys(src) {
|
|
|
328
360
|
* @param {any} lrc
|
|
329
361
|
* @returns {string}
|
|
330
362
|
*/
|
|
331
|
-
export function
|
|
363
|
+
export function stringifyQrc(lrc) {
|
|
332
364
|
let deferred1_0;
|
|
333
365
|
let deferred1_1;
|
|
334
366
|
try {
|
|
335
367
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
336
|
-
wasm.
|
|
368
|
+
wasm.stringifyQrc(retptr, addHeapObject(lrc));
|
|
337
369
|
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
338
370
|
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
339
371
|
deferred1_0 = r0;
|
|
@@ -345,16 +377,39 @@ export function stringifyLys(lrc) {
|
|
|
345
377
|
}
|
|
346
378
|
}
|
|
347
379
|
|
|
380
|
+
/**
|
|
381
|
+
* When the `console_error_panic_hook` feature is enabled, we can call the
|
|
382
|
+
* `set_panic_hook` function at least once during initialization, and then
|
|
383
|
+
* we will get better error messages if our code ever panics.
|
|
384
|
+
*
|
|
385
|
+
* For more details see
|
|
386
|
+
* https://github.com/rustwasm/console_error_panic_hook#readme
|
|
387
|
+
*/
|
|
388
|
+
export function set_panic_hook() {
|
|
389
|
+
wasm.set_panic_hook();
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* @param {string} src
|
|
394
|
+
* @returns {any}
|
|
395
|
+
*/
|
|
396
|
+
export function parseYrc(src) {
|
|
397
|
+
const ptr0 = passStringToWasm0(src, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
398
|
+
const len0 = WASM_VECTOR_LEN;
|
|
399
|
+
const ret = wasm.parseYrc(ptr0, len0);
|
|
400
|
+
return takeObject(ret);
|
|
401
|
+
}
|
|
402
|
+
|
|
348
403
|
/**
|
|
349
404
|
* @param {any} lrc
|
|
350
405
|
* @returns {string}
|
|
351
406
|
*/
|
|
352
|
-
export function
|
|
407
|
+
export function stringifyYrc(lrc) {
|
|
353
408
|
let deferred1_0;
|
|
354
409
|
let deferred1_1;
|
|
355
410
|
try {
|
|
356
411
|
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
357
|
-
wasm.
|
|
412
|
+
wasm.stringifyYrc(retptr, addHeapObject(lrc));
|
|
358
413
|
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
359
414
|
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
360
415
|
deferred1_0 = r0;
|
|
@@ -466,6 +521,11 @@ export function __wbindgen_number_get(arg0, arg1) {
|
|
|
466
521
|
getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);
|
|
467
522
|
};
|
|
468
523
|
|
|
524
|
+
export function __wbindgen_as_number(arg0) {
|
|
525
|
+
const ret = +getObject(arg0);
|
|
526
|
+
return ret;
|
|
527
|
+
};
|
|
528
|
+
|
|
469
529
|
export function __wbindgen_number_new(arg0) {
|
|
470
530
|
const ret = arg0;
|
|
471
531
|
return addHeapObject(ret);
|
|
@@ -481,12 +541,12 @@ export function __wbindgen_string_new(arg0, arg1) {
|
|
|
481
541
|
return addHeapObject(ret);
|
|
482
542
|
};
|
|
483
543
|
|
|
484
|
-
export function
|
|
544
|
+
export function __wbg_getwithrefkey_4a92a5eca60879b9(arg0, arg1) {
|
|
485
545
|
const ret = getObject(arg0)[getObject(arg1)];
|
|
486
546
|
return addHeapObject(ret);
|
|
487
547
|
};
|
|
488
548
|
|
|
489
|
-
export function
|
|
549
|
+
export function __wbg_set_9182712abebf82ef(arg0, arg1, arg2) {
|
|
490
550
|
getObject(arg0)[takeObject(arg1)] = takeObject(arg2);
|
|
491
551
|
};
|
|
492
552
|
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
export const memory: WebAssembly.Memory;
|
|
4
|
+
export function stringifyAss(a: number, b: number): void;
|
|
5
|
+
export function decryptQrcHex(a: number, b: number, c: number): void;
|
|
6
|
+
export function parseEslrc(a: number, b: number): number;
|
|
7
|
+
export function stringifyEslrc(a: number, b: number): void;
|
|
8
|
+
export function parseLrc(a: number, b: number): number;
|
|
9
|
+
export function stringifyLrc(a: number, b: number): void;
|
|
10
|
+
export function parseLys(a: number, b: number): number;
|
|
11
|
+
export function stringifyLys(a: number, b: number): void;
|
|
12
|
+
export function parseQrc(a: number, b: number): number;
|
|
13
|
+
export function stringifyQrc(a: number, b: number): void;
|
|
14
|
+
export function set_panic_hook(): void;
|
|
15
|
+
export function parseYrc(a: number, b: number): number;
|
|
16
|
+
export function stringifyYrc(a: number, b: number): void;
|
|
17
|
+
export function __wbindgen_malloc(a: number, b: number): number;
|
|
18
|
+
export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number;
|
|
19
|
+
export function __wbindgen_add_to_stack_pointer(a: number): number;
|
|
20
|
+
export function __wbindgen_free(a: number, b: number, c: number): void;
|
|
21
|
+
export function __wbindgen_exn_store(a: number): void;
|
package/lyric_bg.wasm
DELETED
|
Binary file
|
|
File without changes
|