From bef14bee8e839230ede7bd3b1451884082f26421 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sat, 26 Oct 2024 05:10:46 +0800 Subject: [PATCH] feature: header in the homepage fix: incorrect lyric post-processing ref: move homepage to path /home --- .gitignore | 3 +- bun.lockb | Bin 183342 -> 193561 bytes package.json | 9 +- src/lib/components/homepage/headBar.svelte | 15 ++ src/lib/components/lyrics/newLyrics.svelte | 34 +-- src/lib/lyrics/LRCparser.ts | 270 --------------------- src/lib/lyrics/LRCtoAMLL.ts | 20 -- src/lib/lyrics/lrc/parser.ts | 31 ++- src/routes/+error.svelte | 13 + src/routes/+page.server.js | 1 - src/routes/+page.svelte | 98 +------- src/routes/home/+page.server.js | 1 + src/routes/home/+page.svelte | 100 ++++++++ src/routes/play/[id]/+page.svelte | 8 +- src/test/lrcParser.test.ts | 12 +- src/test/resources/test-03.lrc | 144 +++++------ src/test/resources/test-04.lrc | 49 ++++ 17 files changed, 322 insertions(+), 486 deletions(-) create mode 100644 src/lib/components/homepage/headBar.svelte delete mode 100644 src/lib/lyrics/LRCparser.ts delete mode 100644 src/lib/lyrics/LRCtoAMLL.ts create mode 100644 src/routes/+error.svelte create mode 100644 src/routes/home/+page.server.js create mode 100644 src/routes/home/+page.svelte create mode 100644 src/test/resources/test-04.lrc diff --git a/.gitignore b/.gitignore index b967bbb..31e6a16 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ node_modules vite.config.js.timestamp-* vite.config.ts.timestamp-* data/pending -.vscode \ No newline at end of file +.vscode +.idea \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 98d6a6f1a97ad0c58225eedab2760fd223520d6e..bec545ea14e66a2c60eb7b52d933b45957d2cb27 100755 GIT binary patch delta 38031 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 G@_zt;Q=ZHK delta 33138 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 diff --git a/package.json b/package.json index b0d01d6..95e588a 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "test": "vitest", "lint": "prettier --check . && eslint .", "format": "prettier --write .", - "go": "PORT=4173 bun ./build" + "go": "PORT=4173 deno ./build" }, "devDependencies": { "@iconify/svelte": "^4.0.2", @@ -29,11 +29,11 @@ "postcss": "^8.4.38", "prettier": "^3.2.5", "prettier-plugin-svelte": "^3.2.3", - "svelte": "^4.2.17", + "svelte": "^4.2.19", "svelte-check": "^3.7.1", "tailwindcss": "^3.4.3", "typescript": "^5.4.5", - "vite": "^5.2.11", + "vite": "5.4.6", "vite-plugin-wasm": "^3.3.0", "vitest": "^1.6.0" }, @@ -61,6 +61,7 @@ "node-cache": "^5.1.2", "rollup-plugin-node-polyfills": "^0.2.1", "typescript-parsec": "^0.3.4", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "vite-tsconfig-paths": "^5.0.1" } } diff --git a/src/lib/components/homepage/headBar.svelte b/src/lib/components/homepage/headBar.svelte new file mode 100644 index 0000000..49aec05 --- /dev/null +++ b/src/lib/components/homepage/headBar.svelte @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/src/lib/components/lyrics/newLyrics.svelte b/src/lib/components/lyrics/newLyrics.svelte index d8e3762..29768fc 100644 --- a/src/lib/components/lyrics/newLyrics.svelte +++ b/src/lib/components/lyrics/newLyrics.svelte @@ -1,16 +1,15 @@ + + +
+

错误

+ {#if $page.status === 404} +

{$page.status}: 页面不存在

+ {:else} +

{$page.status}: {$page.error.message}

+ {/if} +
diff --git a/src/routes/+page.server.js b/src/routes/+page.server.js index 5829b7e..e69de29 100644 --- a/src/routes/+page.server.js +++ b/src/routes/+page.server.js @@ -1 +0,0 @@ -export const ssr = false; \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 0b7cfca..e1c7433 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,97 +1,19 @@ - Aquavox - 音乐库 + AquaVox -
-

AquaVox

-

音乐库

-
- -
-

- AquaVox {getVersion()} · 早期公开预览 · 源代码参见 - GitHub -

- 导入音乐
- -

音乐数据库

-

你可以在这里探索,提交和分享好听的歌曲。

-
+
+ LOADING
+
+ - +
+
\ No newline at end of file diff --git a/src/routes/home/+page.server.js b/src/routes/home/+page.server.js new file mode 100644 index 0000000..5829b7e --- /dev/null +++ b/src/routes/home/+page.server.js @@ -0,0 +1 @@ +export const ssr = false; \ No newline at end of file diff --git a/src/routes/home/+page.svelte b/src/routes/home/+page.svelte new file mode 100644 index 0000000..29da5cc --- /dev/null +++ b/src/routes/home/+page.svelte @@ -0,0 +1,100 @@ + + + + AquaVox - 首页 + + + + +
+

AquaVox

+

音乐库

+
+
+ {#each idList as id} + + + + {/each} +
+
+

+ AquaVox {getVersion()} · 早期公开预览 · 源代码参见 + GitHub +

+ 导入音乐
+ +

音乐数据库

+

你可以在这里探索,提交和分享好听的歌曲。

+
+ + diff --git a/src/routes/play/[id]/+page.svelte b/src/routes/play/[id]/+page.svelte index c07a216..952bb07 100644 --- a/src/routes/play/[id]/+page.svelte +++ b/src/routes/play/[id]/+page.svelte @@ -13,7 +13,7 @@ import type { IAudioMetadata } from 'music-metadata-browser'; import { onMount } from 'svelte'; import progressBarRaw from '$lib/state/progressBarRaw'; - import { parseTTML, type LyricLine } from '$lib/lyrics/ttml'; + import { parseTTML } from '$lib/lyrics/ttml'; import NewLyrics from '$lib/components/lyrics/newLyrics.svelte'; const audioId = $page.params.id; @@ -79,14 +79,14 @@ singer = metadata.common.artist ? metadata.common.artist : '未知歌手'; prepared.push('duration'); }); - localforage.getItem(`${audioId}-cover`, function (err, file) { + localforage.getItem(`${audioId}-cover`, function (_, file) { if (file) { const path = URL.createObjectURL(file as File); coverPath.set(path); } prepared.push('cover'); }); - localforage.getItem(`${audioId}-file`, function (err, file) { + localforage.getItem(`${audioId}-file`, function (_, file) { if (audioPlayer === null) return; if (file) { const f = file as File; @@ -97,7 +97,7 @@ prepared.push('file'); } }); - localforage.getItem(`${audioId}-lyric`, function (err, file) { + localforage.getItem(`${audioId}-lyric`, function (_, file) { if (file) { const f = file as File; f.text().then((lr) => { diff --git a/src/test/lrcParser.test.ts b/src/test/lrcParser.test.ts index 12b4b45..bb3c0eb 100644 --- a/src/test/lrcParser.test.ts +++ b/src/test/lrcParser.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import fs from 'fs'; -import { parseLRC } from '$lib/lyrics/lrc/parser'; +import lrcParser, { parseLRC } from '$lib/lyrics/lrc/parser'; describe('LRC parser test', () => { const test01Buffer = fs.readFileSync('./src/test/resources/test-01.lrc'); @@ -9,6 +9,8 @@ describe('LRC parser test', () => { const test02Text = test02Buffer.toString('utf-8'); const test03Buffer = fs.readFileSync('./src/test/resources/test-03.lrc'); const test03Text = test03Buffer.toString('utf-8'); + const test04Buffer = fs.readFileSync('./src/test/resources/test-04.lrc'); + const test04Text = test04Buffer.toString('utf-8'); const lf_alternatives = ['\n', '\r\n', '\r']; @@ -37,14 +39,18 @@ describe('LRC parser test', () => { expect(result.scripts!![0].words!![1].beginIndex).toBe("[00:00.00] <00:00.04> When <00:00.16> the".indexOf("the")); expect(result.scripts!![0].words!![1].start).toBe(160); }); + it('Parses test-04.lrc', () => { + const result = lrcParser(test04Text); + expect(result.scripts!![48].text).toBe("迎来每个人的结局"); + }); it('Parses test-03.lrc', () => { - const result = parseLRC(test03Text, { wordDiv: ' ', strict: true }); + const result = lrcParser(test03Text); expect(result.scripts!![5].text).toBe("བྲོ་ར་འདི་ལ་བྲོ་ཅིག་འཁྲབ།"); expect(result.scripts!![5].translation).toBe("在舞池里舞一舞"); expect(result.scripts!![6].text).toBe("祝祷转过千年 五色经幡飘飞"); - expect(result.scripts!![6].singer).toBe("a"); expect(result.scripts!![11].singer).toBeUndefined(); expect(result.scripts!![11].translation).toBe("我们在此相聚"); + expect(result.scripts!![70].translation).toBe("祝愿平安富足"); }); it('Rejects some invalid LRCs', () => { const cases = [ diff --git a/src/test/resources/test-03.lrc b/src/test/resources/test-03.lrc index 20a669c..3fb9e84 100644 --- a/src/test/resources/test-03.lrc +++ b/src/test/resources/test-03.lrc @@ -3,75 +3,75 @@ [al: 游四方] [tool: 歌词滚动姬 https://lrc-maker.github.io] [length: 04:17.400] -[00:34.280] 浸透了经卷 记忆的呼喊 -[00:37.800] 雪珠滚落山巅 栽下一个春天 -[00:47.390] 松石敲响玲珑清脆的银花 -[00:51.600] 穿过玛瑙的红霞 -[00:54.430] 在她眼中结编 亘久诗篇 -[01:05.440] a: བྲོ་ར་འདི་ལ་བྲོ་ཅིག་འཁྲབ། | 在舞池里舞一舞 -[01:08.780] a: 祝祷转过千年 五色经幡飘飞 -[01:12.040] 奏起悠扬巴叶 任岁月拨弦 -[01:19.130] གཞས་ར་འདི་ལ་གཞས་གཅིག་བཏང་། 我在歌坛献首歌 -[01:22.330] 宫殿 塔尖 彩绘 日月 同辉 -[01:25.810] 那层厚重壁垒化身 蝉翼一片 -[01:29.110] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 -[01:30.790] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[01:32.510] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[01:34.120] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[01:35.920] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[01:37.630] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[01:39.350] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[01:41.050] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[01:42.740] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[01:44.630] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[01:46.280] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[01:48.010] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[01:49.600] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[01:51.380] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[01:53.070] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[01:54.820] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[01:58.580] སྔོན་དང་པོ་གྲུབ་ཐོབ་ཐང་སྟོང་རྒྱལ་པོས་མཛད་པའི་མཛད་ཚུལ་དུ། དང་པོ་རྔོན་པའི་ས་སྦྱངས་ས་འདུལ། གཉིས་པ་རྒྱ་ལུའི་བྱིན་འབེབས། གསུམ་པ་ལྷ་མོའི་གླུ་གར་སོགས་རིན་ཆེན་གསུང་མགུར་གཞུང་བཟང་མང་པོ་འདུག་སྟེ། དེ་ཡང་མ་ཉུང་གི་ཚིག་ལ་དུམ་མཚམས་གཅིག་ཞུས་པ་བྱུང་བ་ཡིན་པ་ལགས་སོ། 如祖师唐东杰布所著,一有温巴净地,二有甲鲁祈福,三有仙女歌舞,所著繁多,在此简略献之。 -[02:24.240] 浸透了经卷 记忆的呼喊 -[02:27.450] 雪珠滚落山巅 栽下一个春天 -[02:37.090] 松石敲响玲珑清脆的银花 -[02:41.280] 穿过玛瑙的红霞 -[02:44.010] 在她眼中结编 亘久诗篇 -[02:55.250] བྲོ་ར་འདི་ལ་བྲོ་ཅིག་འཁྲབ། 在舞池里舞一舞 -[02:58.410] 祝祷转过千年 五色经幡飘飞 -[03:01.750] 奏起悠扬巴叶 任岁月拨弦 -[03:08.840] གཞས་ར་འདི་ལ་གཞས་གཅིག་བཏང་། 我在歌坛献首歌 -[03:12.050] 宫殿 塔尖 彩绘 日月 同辉 -[03:15.400] 那层厚重壁垒化身 蝉翼一片 -[03:18.850] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[03:20.480] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[03:22.210] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[03:23.910] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[03:25.662] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[03:27.391] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[03:29.096] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[03:30.789] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[03:32.496] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[03:34.175] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[03:35.876] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[03:37.606] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[03:39.290] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[03:41.030] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[03:42.679] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[03:44.455] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[03:46.176] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[03:47.910] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[03:49.625] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[03:51.293] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[03:53.005] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[03:54.742] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[03:56.479] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[03:58.159] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[03:59.859] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[04:01.548] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[04:03.312] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[04:05.026] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[04:06.721] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། 我们在此相聚 -[04:08.479] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། 希望可以常聚 -[04:10.175] གཏན་དུ་འཛོམས་པའི་མི་ལ། 在此相聚的人们 -[04:11.923] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། 祝愿平安富足 -[04:17.400] \ No newline at end of file +[00:33.880] 浸透了经卷 记忆的呼喊 +[00:37.400] 雪珠滚落山巅 栽下一个春天 +[00:46.990] 松石敲响玲珑清脆的银花 +[00:51.200] 穿过玛瑙的红霞 +[00:54.030] 在她眼中结编 亘久诗篇 +[01:05.040] བྲོ་ར་འདི་ལ་བྲོ་ཅིག་འཁྲབ། | 在舞池里舞一舞 +[01:08.380] 祝祷转过千年 五色经幡飘飞 +[01:11.640] 奏起悠扬巴叶 任岁月拨弦 +[01:18.730] གཞས་ར་འདི་ལ་གཞས་གཅིག་བཏང་། | 我在歌坛献首歌 +[01:21.930] 宫殿 塔尖 彩绘 日月 同辉 +[01:25.410] 那层厚重壁垒化身 蝉翼一片 +[01:28.710] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[01:30.390] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[01:32.110] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[01:33.720] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[01:35.520] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[01:37.230] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[01:38.950] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[01:40.650] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[01:42.340] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[01:44.230] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[01:45.880] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[01:47.610] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[01:49.200] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[01:50.980] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[01:52.670] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[01:54.420] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[01:58.180] སྔོན་དང་པོ་གྲུབ་ཐོབ་ཐང་སྟོང་རྒྱལ་པོས་མཛད་པའི་མཛད་ཚུལ་དུ། དང་པོ་རྔོན་པའི་ས་སྦྱངས་ས་འདུལ། གཉིས་པ་རྒྱ་ལུའི་བྱིན་འབེབས། གསུམ་པ་ལྷ་མོའི་གླུ་གར་སོགས་རིན་ཆེན་གསུང་མགུར་གཞུང་བཟང་མང་པོ་འདུག་སྟེ། དེ་ཡང་མ་ཉུང་གི་ཚིག་ལ་དུམ་མཚམས་གཅིག་ཞུས་པ་བྱུང་བ་ཡིན་པ་ལགས་སོ། | 如祖师唐东杰布所著,一有温巴净地,二有甲鲁祈福,三有仙女歌舞,所著繁多,在此简略献之。 +[02:23.840] 浸透了经卷 记忆的呼喊 +[02:27.050] 雪珠滚落山巅 栽下一个春天 +[02:36.690] 松石敲响玲珑清脆的银花 +[02:40.880] 穿过玛瑙的红霞 +[02:43.610] 在她眼中结编 亘久诗篇 +[02:54.850] བྲོ་ར་འདི་ལ་བྲོ་ཅིག་འཁྲབ། | 在舞池里舞一舞 +[02:58.010] 祝祷转过千年 五色经幡飘飞 +[03:01.350] 奏起悠扬巴叶 任岁月拨弦 +[03:08.440] གཞས་ར་འདི་ལ་གཞས་གཅིག་བཏང་། | 我在歌坛献首歌 +[03:11.650] 宫殿 塔尖 彩绘 日月 同辉 +[03:15.000] 那层厚重壁垒化身 蝉翼一片 +[03:18.450] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[03:20.080] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[03:21.810] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[03:23.510] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[03:25.262] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[03:26.991] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[03:28.696] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[03:30.389] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[03:32.096] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[03:33.775] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[03:35.476] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[03:37.206] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[03:38.890] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[03:40.630] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[03:42.279] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[03:44.055] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[03:45.776] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[03:47.510] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[03:49.225] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[03:50.893] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[03:52.605] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[03:54.342] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[03:56.079] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[03:57.759] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[03:59.459] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[04:01.148] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[04:02.912] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[04:04.626] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[04:06.321] ང་ཚོ་འདི་ལ་འཛོམས་འཛོམས། | 我们在此相聚 +[04:08.079] གཏན་དུ་འཛོམས་རྒྱུ་བྱུང་ན། | 希望可以常聚 +[04:09.775] གཏན་དུ་འཛོམས་པའི་མི་ལ། | 在此相聚的人们 +[04:11.523] སྙུན་གཞི་གོད་ཆགས་མ་གཏོང༌། | 祝愿平安富足 +[04:17.000] \ No newline at end of file diff --git a/src/test/resources/test-04.lrc b/src/test/resources/test-04.lrc new file mode 100644 index 0000000..8349378 --- /dev/null +++ b/src/test/resources/test-04.lrc @@ -0,0 +1,49 @@ +[00:13.07]蝉时雨 化成淡墨渲染暮色 +[00:17.84]渗透着 勾勒出足迹与车辙 +[00:22.99]欢笑声 与漂浮的水汽饱和 +[00:28.01]隔着窗 同城市一并模糊了 +[00:33.02]拨弄着 旧吉他 哼着四拍子的歌 +[00:38.18]回音中 一个人 仿佛颇悠然自得 +[00:43.11]等凉雨 的温度 将不安燥热中和 +[00:48.15]寻觅着 风的波折 +[00:52.84]我仍然在无人问津的阴雨霉湿之地 +[00:57.55]和着雨音 唱着没有听众的歌曲 +[01:02.87]人潮仍是漫无目的地向目的地散去 +[01:08.34]忙碌着 无为着 继续 +[01:13.10]等待着谁能够将我的心房轻轻叩击 +[01:17.95]即使是你 也仅仅驻足了片刻便离去 +[01:22.96]想着或许 下个路口会有谁与我相遇 +[01:28.52]哪怕只 一瞬的 奇迹 +[01:55.08]夏夜空 出现在遥远的的记忆 +[02:00.01]绽放的 璀璨花火拥着繁星 +[02:05.10]消失前 做出最温柔的给予 +[02:10.21]一如那些模糊身影的别离 +[02:15.19]困惑地 拘束着 如城市池中之鱼 +[02:20.39]或哽咽 或低泣 都融进了泡沫里 +[02:25.37]拖曳疲惫身躯 沉入冰冷的池底 +[02:30.48]注视着 色彩褪去 +[02:34.86]我仍然在无人问津的阴雨霉湿之地 +[02:39.55]和着雨音 唱着没有听众的歌曲 +[02:44.90]人潮仍是漫无目的地向目的地散去 +[02:50.56]忙碌着 无为着 继续 +[02:55.19]祈求着谁能够将我的心房轻轻叩击 +[03:00.02]今天的你 是否会留意并转身去靠近 +[03:05.13]因为或许 下个路口仍是同样的结局 +[03:10.90]不存在 刹那的 奇迹 +[03:17.37]极夜与永昼 +[03:22.38]别离与欢聚 +[03:27.43]脉搏与呼吸 +[03:32.45]找寻着意义 +[03:38.18]我仍然在无人问津的阴雨霉湿之地 +[03:43.16]和着雨音 唱着卖不出去的歌曲 +[03:48.47]浮游之人也挣扎不已执着存在下去 +[03:54.04]追逐着 梦想着 继续 +[03:58.34]请别让我独自匍匐于滂沱世末之雨 +[04:03.53]和着雨音 唱着见证终结的歌曲 +[04:08.69]人们终于 结束了寻觅呆滞伫立原地 +[04:14.31]哭泣着 乞求着 奇迹 +[04:18.86]用这双手 拨出残缺染了锈迹的弦音 +[04:23.70]都隐没于淋漓的雨幕无声无息 +[04:28.89]曲终之时 你是否便会回应我的心音 +[04:34.73]将颤抖的双手牵起 +[04:39.80]迎来每个人的结局 \ No newline at end of file