2023-05-22 17:38:31 -07:00
|
|
|
import { useMemo } from 'react';
|
2025-06-24 00:04:36 -07:00
|
|
|
|
|
|
|
|
import styles from './unsynchronized-lyrics.module.css';
|
2025-05-18 14:03:18 -07:00
|
|
|
|
|
|
|
|
import { LyricLine } from '/@/renderer/features/lyrics/lyric-line';
|
2023-08-04 19:32:41 -07:00
|
|
|
import { useLyricsSettings } from '/@/renderer/store';
|
2025-05-20 19:23:36 -07:00
|
|
|
import { FullLyricsMetadata } from '/@/shared/types/domain-types';
|
2023-05-22 17:38:31 -07:00
|
|
|
|
2024-02-01 23:53:10 -08:00
|
|
|
export interface UnsynchronizedLyricsProps extends Omit<FullLyricsMetadata, 'lyrics'> {
|
2023-07-01 19:10:05 -07:00
|
|
|
lyrics: string;
|
2025-05-18 14:03:18 -07:00
|
|
|
translatedLyrics?: null | string;
|
2023-05-22 17:38:31 -07:00
|
|
|
}
|
|
|
|
|
|
2023-06-04 23:15:36 -07:00
|
|
|
export const UnsynchronizedLyrics = ({
|
2023-07-01 19:10:05 -07:00
|
|
|
artist,
|
|
|
|
|
lyrics,
|
|
|
|
|
name,
|
|
|
|
|
remote,
|
|
|
|
|
source,
|
2024-09-24 11:25:17 +08:00
|
|
|
translatedLyrics,
|
2023-06-04 23:15:36 -07:00
|
|
|
}: UnsynchronizedLyricsProps) => {
|
2023-08-04 19:32:41 -07:00
|
|
|
const settings = useLyricsSettings();
|
2023-07-01 19:10:05 -07:00
|
|
|
const lines = useMemo(() => {
|
|
|
|
|
return lyrics.split('\n');
|
|
|
|
|
}, [lyrics]);
|
2023-05-22 17:38:31 -07:00
|
|
|
|
2024-09-24 11:25:17 +08:00
|
|
|
const translatedLines = useMemo(() => {
|
|
|
|
|
return translatedLyrics ? translatedLyrics.split('\n') : [];
|
|
|
|
|
}, [translatedLyrics]);
|
|
|
|
|
|
2023-07-01 19:10:05 -07:00
|
|
|
return (
|
2025-06-24 00:04:36 -07:00
|
|
|
<div
|
|
|
|
|
className={styles.container}
|
|
|
|
|
style={{ gap: `${settings.gapUnsync}px` }}
|
2023-08-04 19:32:41 -07:00
|
|
|
>
|
2023-08-07 21:59:55 -07:00
|
|
|
{settings.showProvider && source && (
|
2023-07-01 19:10:05 -07:00
|
|
|
<LyricLine
|
2023-08-04 19:32:41 -07:00
|
|
|
alignment={settings.alignment}
|
2023-07-01 19:10:05 -07:00
|
|
|
className="lyric-credit"
|
2023-08-04 19:32:41 -07:00
|
|
|
fontSize={settings.fontSizeUnsync}
|
2023-07-01 19:10:05 -07:00
|
|
|
text={`Provided by ${source}`}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
2023-08-07 21:59:55 -07:00
|
|
|
{settings.showMatch && remote && (
|
2023-07-01 19:10:05 -07:00
|
|
|
<LyricLine
|
2023-08-04 19:32:41 -07:00
|
|
|
alignment={settings.alignment}
|
2023-07-01 19:10:05 -07:00
|
|
|
className="lyric-credit"
|
2023-08-04 19:32:41 -07:00
|
|
|
fontSize={settings.fontSizeUnsync}
|
2023-07-01 19:10:05 -07:00
|
|
|
text={`"${name} by ${artist}"`}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
{lines.map((text, idx) => (
|
2024-09-24 11:25:17 +08:00
|
|
|
<div key={idx}>
|
|
|
|
|
<LyricLine
|
|
|
|
|
alignment={settings.alignment}
|
|
|
|
|
className="lyric-line unsynchronized"
|
|
|
|
|
fontSize={settings.fontSizeUnsync}
|
|
|
|
|
id={`lyric-${idx}`}
|
|
|
|
|
text={text}
|
|
|
|
|
/>
|
|
|
|
|
{translatedLines[idx] && (
|
|
|
|
|
<LyricLine
|
|
|
|
|
alignment={settings.alignment}
|
|
|
|
|
className="lyric-line unsynchronized translation"
|
|
|
|
|
fontSize={settings.fontSizeUnsync * 0.8}
|
|
|
|
|
text={translatedLines[idx]}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
2023-07-01 19:10:05 -07:00
|
|
|
))}
|
2025-06-24 00:04:36 -07:00
|
|
|
</div>
|
2023-07-01 19:10:05 -07:00
|
|
|
);
|
2023-05-22 17:38:31 -07:00
|
|
|
};
|