fix: LRC parser support

This commit is contained in:
alikia2x 2024-08-03 17:48:47 +08:00
parent 26bb6b5bdf
commit 7947b46af5
9 changed files with 44 additions and 54 deletions

View File

@ -1,6 +1,6 @@
{
"name": "aquavox",
"version": "2.0.1",
"version": "2.0.2",
"private": false,
"scripts": {
"dev": "vite dev",

View File

@ -2,8 +2,7 @@
import userAdjustingProgress from '$lib/state/userAdjustingProgress';
import createLyricsSearcher from '$lib/lyrics/lyricSearcher';
import progressBarRaw from '$lib/state/progressBarRaw';
import type { LrcJsonData } from '$lib/lyrics/parser';
import progressBarSlideValue from '$lib/state/progressBarSlideValue';
import type { LrcJsonData } from '$lib/lyrics/LRCparser';
import nextUpdate from '$lib/state/nextUpdate';
import truncate from '$lib/utils/truncate';

View File

@ -0,0 +1,20 @@
import type { LyricLine } from '@applemusic-like-lyrics/core';
import type { ScriptItem } from '$lib/lyrics/LRCparser';
export default function mapLRCtoAMLL(line: ScriptItem, i: number, lines: ScriptItem[]): LyricLine {
return {
words: [
{
word: line.text,
startTime: line.start * 1000,
endTime: line.end * 1000
}
],
startTime: line.start * 1000,
endTime: line.end * 1000,
translatedLyric: line.translation ?? "",
romanLyric: '',
isBG: false,
isDuet: false
};
}

View File

@ -1,18 +0,0 @@
import type { LyricLine } from "@applemusic-like-lyrics/core";
import {
type LyricLine as RawLyricLine,
parseLrc,
parseYrc,
parseLys,
parseQrc,
} from "@applemusic-like-lyrics/lyric";
export const mapLyric = (line: RawLyricLine, i: number, lines: RawLyricLine[]): LyricLine => ({
words: line.words,
startTime: line.words[0]?.startTime ?? 0,
endTime: line.words[line.words.length - 1]?.endTime ?? Infinity,
translatedLyric: '',
romanLyric: '',
isBG: false,
isDuet: false
});

View File

@ -2,7 +2,7 @@
import { page } from '$app/stores';
import FileList from '$lib/components/import/fileList.svelte';
import FileSelector from '$lib/components/import/fileSelector.svelte';
import localforage from '$lib/utils/storage.js';
import localforage from '$lib/utils/storage';
import { fileListState } from '$lib/state/fileList.state';
import { useAtom } from 'jotai-svelte';
const fileList = useAtom(fileListState);

View File

@ -4,7 +4,7 @@
import { fileListState, finalFileListState } from '$lib/state/fileList.state';
import { localImportFailed, localImportSuccess } from '$lib/state/localImportStatus.state';
import { useAtom } from 'jotai-svelte';
import localforage from '$lib/utils/storage.js';
import localforage from '$lib/utils/storage';
import { v1 as uuidv1 } from 'uuid';
const fileList = useAtom(fileListState);
const finalFiles = useAtom(finalFileListState);

View File

@ -11,12 +11,13 @@
import type { IAudioMetadata } from 'music-metadata-browser';
import { onDestroy, onMount } from 'svelte';
import progressBarRaw from '$lib/state/progressBarRaw';
import { parseTTML, type TTMLLyric } from '$lib/ttml';
import { parseTTML } from '$lib/ttml';
import type { LyricLine, LyricLineMouseEvent, LyricPlayer } from '@applemusic-like-lyrics/core';
import NewLyrics from '$lib/components/newLyrics.svelte';
import { LyricPlayer as CoreLyricPlayer } from '@applemusic-like-lyrics/core';
import { parseLrc } from '@applemusic-like-lyrics/lyric';
import { mapLyric } from '$lib/lyrics/mapLyric';
import lrcParser from '$lib/lyrics/LRCparser';
import mapLRCtoAMLL from '$lib/lyrics/LRCtoAMLL';
//import { parseLrc } from '@applemusic-like-lyrics/lyric';
const audioId = $page.params.id;
let audioPlayer: HTMLAudioElement | null = null;
@ -100,32 +101,20 @@
}
});
localforage.getItem(`${audioId}-lyric`, function (err, file) {
if (file) {
if (!file) return;
const f = file as File;
f.text().then((lr) => {
if (f.name.endsWith('.ttml')) {
lyricLines = parseTTML(lr).lyricLines;
hasLyrics = true;
} else if (f.name.endsWith('.lrc')) {
lyricLines = parseLrc(lr).map((line, i, lines) => ({
words: [
{
word: line.words[0]?.word ?? '',
startTime: line.words[0]?.startTime ?? 0,
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity
}
],
startTime: line.words[0]?.startTime ?? 0,
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
translatedLyric: '',
romanLyric: '',
isBG: false,
isDuet: false
}));
else if (f.name.endsWith('.lrc')) {
const parsed = lrcParser(lr);
if (parsed.scripts == undefined) return;
lyricLines = lrcParser(lr).scripts!.map(mapLRCtoAMLL);
hasLyrics = true;
}
});
}
});
}
@ -235,7 +224,7 @@
playing={!paused}
{onLyricLineClick}
alignPosition={0.3}
class="absolute top-[6.5rem] md:top-36 xl:top-0 w-screen xl:w-[52vw] px-6 md:px-12 lg:px-[7.5rem] xl:left-[45vw]
class="absolute top-[6.5rem] md:top-36 xl:top-0 w-screen xl:w-[52vw] md:px-6 lg:px-[7.5rem] xl:left-[45vw]
xl:px-[3vw] h-[calc(100vh-17rem)] xl:h-screen font-sans
text-left no-scrollbar overflow-y-auto z-[1] font-semibold mix-blend-plus-lighter"
/>

View File

@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
import fs from 'fs';
import { parseLRC } from '$lib/lyrics/parser';
import { parseLRC } from '$lib/lyrics/LRCparser';
describe('LRC parser test', () => {
const test01Buffer = fs.readFileSync('./src/test/resources/test-01.lrc');