From 55c61cc2c3628107f53f20da5eef443eea246fad Mon Sep 17 00:00:00 2001 From: srgooglo Date: Thu, 19 Jun 2025 01:22:43 +0200 Subject: [PATCH] Added download current track lyrics --- .../[track_id]/tabs/lyrics/index.jsx | 16 ++++++- .../[track_id]/utils/lrcParser.js | 43 +++++-------------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/packages/app/src/pages/studio/music/track_lyrics/[track_id]/tabs/lyrics/index.jsx b/packages/app/src/pages/studio/music/track_lyrics/[track_id]/tabs/lyrics/index.jsx index 8eb4fae5..6e44b526 100644 --- a/packages/app/src/pages/studio/music/track_lyrics/[track_id]/tabs/lyrics/index.jsx +++ b/packages/app/src/pages/studio/music/track_lyrics/[track_id]/tabs/lyrics/index.jsx @@ -2,7 +2,7 @@ import React from "react" import PropTypes from "prop-types" import classnames from "classnames" -import { parseLRC } from "../../utils/lrcParser" +import { parseLRC, formatToLRC } from "../../utils/lrcParser" import { Input, @@ -351,6 +351,17 @@ const LyricsEditor = ({ player }) => { app.message.success("Language file loaded") } + const handleLanguageDownload = () => { + const data = formatToLRC(lines) + const blob = new Blob([data], { type: "text/plain" }) + const url = URL.createObjectURL(blob) + + const link = document.createElement("a") + link.href = url + link.download = `${state.track.title} - ${state.selectedLanguage}.txt` + link.click() + } + const followLineTick = () => { const currentTime = player.current.audio.current.currentTime @@ -409,6 +420,9 @@ const LyricsEditor = ({ player }) => { > Load file + diff --git a/packages/app/src/pages/studio/music/track_lyrics/[track_id]/utils/lrcParser.js b/packages/app/src/pages/studio/music/track_lyrics/[track_id]/utils/lrcParser.js index 25b22a7a..751fd9ee 100644 --- a/packages/app/src/pages/studio/music/track_lyrics/[track_id]/utils/lrcParser.js +++ b/packages/app/src/pages/studio/music/track_lyrics/[track_id]/utils/lrcParser.js @@ -92,43 +92,22 @@ export const parseLRC = (lrcContent) => { * @param {Object} lrcData - Structured LRC data * @returns {string} LRC formatted string */ -export const formatToLRC = (lrcData) => { - const { metadata = {}, lyrics = [] } = lrcData - const lines = [] +export const formatToLRC = (lines) => { + const data = [] - // Add metadata - const metadataMapping = { - artist: "ar", - title: "ti", - album: "al", - author: "au", - length: "length", - creator: "by", - editor: "re", - version: "ve", - offset: "offset", - } + lines.forEach((line) => { + if (line.time !== null) { + const timeStr = line.timeStr || formatSecondsToLRC(line.time) - Object.entries(metadata).forEach(([key, value]) => { - const tag = metadataMapping[key] || key - lines.push(`[${tag}:${value}]`) - }) - - if (lines.length > 0) { - lines.push("") // Empty line after metadata - } - - // Add lyrics - lyrics.forEach((lyric) => { - if (lyric.time !== null) { - const timeStr = lyric.timeStr || formatSecondsToLRC(lyric.time) - lines.push(`[${timeStr}]${lyric.text}`) - } else { - lines.push(lyric.text) + if (line.break) { + data.push(`[${timeStr}]`) + } else { + data.push(`[${timeStr}] ${line.text}`) + } } }) - return lines.join("\n") + return data.join("\n") } /**