From 1556b11d5f5ba9ea0a3103579597d540f1aba845 Mon Sep 17 00:00:00 2001 From: CDN18 Date: Thu, 10 Oct 2024 15:22:06 +0800 Subject: [PATCH] fix: srt to lrc --- convert.go | 6 ++++++ srt.go | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/convert.go b/convert.go index d03527d..510eace 100644 --- a/convert.go +++ b/convert.go @@ -90,6 +90,12 @@ func srtToLrc(sourceFile, targetFile string) { Content: make([]string, len(srtEntries)), } + // Add default metadata + title := strings.TrimSuffix(filepath.Base(targetFile), filepath.Ext(targetFile)) + lyrics.Metadata["ti"] = title + lyrics.Metadata["ar"] = "" + lyrics.Metadata["al"] = "" + for i, entry := range srtEntries { lyrics.Timeline[i] = entry.StartTime lyrics.Content[i] = entry.Content diff --git a/srt.go b/srt.go index 6700b44..58cd75f 100644 --- a/srt.go +++ b/srt.go @@ -19,35 +19,55 @@ func parseSRT(filePath string) ([]SRTEntry, error) { scanner := bufio.NewScanner(file) var entries []SRTEntry var currentEntry SRTEntry + var isContent bool + var contentBuffer strings.Builder for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) + if line == "" { if currentEntry.Number != 0 { + currentEntry.Content = contentBuffer.String() entries = append(entries, currentEntry) currentEntry = SRTEntry{} + isContent = false + contentBuffer.Reset() } continue } if currentEntry.Number == 0 { currentEntry.Number, _ = strconv.Atoi(line) - } else if currentEntry.StartTime.Hours == 0 { + } else if isEntryTimeStampUnset(currentEntry) { times := strings.Split(line, " --> ") - currentEntry.StartTime = parseSRTTimestamp(times[0]) - currentEntry.EndTime = parseSRTTimestamp(times[1]) - } else { - currentEntry.Content += line + "\n" + if len(times) == 2 { + currentEntry.StartTime = parseSRTTimestamp(times[0]) + currentEntry.EndTime = parseSRTTimestamp(times[1]) + isContent = true + } + } else if isContent { + if contentBuffer.Len() > 0 { + contentBuffer.WriteString("\n") + } + contentBuffer.WriteString(line) } } if currentEntry.Number != 0 { + currentEntry.Content = contentBuffer.String() entries = append(entries, currentEntry) } return entries, scanner.Err() } +func isEntryTimeStampUnset(currentEntry SRTEntry) bool { + return currentEntry.StartTime.Hours == 0 && currentEntry.StartTime.Minutes == 0 && + currentEntry.StartTime.Seconds == 0 && currentEntry.StartTime.Milliseconds == 0 && + currentEntry.EndTime.Hours == 0 && currentEntry.EndTime.Minutes == 0 && + currentEntry.EndTime.Seconds == 0 && currentEntry.EndTime.Milliseconds == 0 +} + func convertSRT(sourceFile, targetFile, targetFmt string) { switch targetFmt { case "txt": @@ -64,12 +84,26 @@ func formatSRTTimestamp(ts Timestamp) string { } func parseSRTTimestamp(timeStr string) Timestamp { - t, _ := time.Parse("15:04:05,000", timeStr) + parts := strings.Split(timeStr, ",") + if len(parts) != 2 { + return Timestamp{} + } + + timeParts := strings.Split(parts[0], ":") + if len(timeParts) != 3 { + return Timestamp{} + } + + hours, _ := strconv.Atoi(timeParts[0]) + minutes, _ := strconv.Atoi(timeParts[1]) + seconds, _ := strconv.Atoi(timeParts[2]) + milliseconds, _ := strconv.Atoi(parts[1]) + return Timestamp{ - Hours: t.Hour(), - Minutes: t.Minute(), - Seconds: t.Second(), - Milliseconds: t.Nanosecond() / 1e6, + Hours: hours, + Minutes: minutes, + Seconds: seconds, + Milliseconds: milliseconds, } }