feat: vtt converting

This commit is contained in:
CDN 2025-04-23 10:44:08 +08:00
parent ba2e477dc0
commit ba66894e42
Signed by: CDN
GPG key ID: 0C656827F9F80080
7 changed files with 693 additions and 107 deletions

View file

@ -180,3 +180,87 @@ func Format(filePath string) error {
return Generate(lyrics, filePath)
}
// ConvertToSubtitle converts LRC file to our intermediate Subtitle representation
func ConvertToSubtitle(filePath string) (model.Subtitle, error) {
lyrics, err := Parse(filePath)
if err != nil {
return model.Subtitle{}, err
}
subtitle := model.NewSubtitle()
subtitle.Format = "lrc"
// Copy metadata
for key, value := range lyrics.Metadata {
subtitle.Metadata[key] = value
}
// Check for specific LRC metadata we should use for title
if title, ok := lyrics.Metadata["ti"]; ok {
subtitle.Title = title
}
// Create entries from timeline and content
for i, content := range lyrics.Content {
if i >= len(lyrics.Timeline) {
break
}
entry := model.NewSubtitleEntry()
entry.Index = i + 1
entry.StartTime = lyrics.Timeline[i]
// Set end time based on next timeline entry if available, otherwise add a few seconds
if i+1 < len(lyrics.Timeline) {
entry.EndTime = lyrics.Timeline[i+1]
} else {
// Default end time: start time + 3 seconds
entry.EndTime = model.Timestamp{
Hours: entry.StartTime.Hours,
Minutes: entry.StartTime.Minutes,
Seconds: entry.StartTime.Seconds + 3,
Milliseconds: entry.StartTime.Milliseconds,
}
// Handle overflow
if entry.EndTime.Seconds >= 60 {
entry.EndTime.Seconds -= 60
entry.EndTime.Minutes++
}
if entry.EndTime.Minutes >= 60 {
entry.EndTime.Minutes -= 60
entry.EndTime.Hours++
}
}
entry.Text = content
subtitle.Entries = append(subtitle.Entries, entry)
}
return subtitle, nil
}
// ConvertFromSubtitle converts our intermediate Subtitle representation to LRC format
func ConvertFromSubtitle(subtitle model.Subtitle, filePath string) error {
lyrics := model.Lyrics{
Metadata: make(map[string]string),
}
// Copy metadata
for key, value := range subtitle.Metadata {
lyrics.Metadata[key] = value
}
// Add title if present and not already in metadata
if subtitle.Title != "" && lyrics.Metadata["ti"] == "" {
lyrics.Metadata["ti"] = subtitle.Title
}
// Convert entries to timeline and content
for _, entry := range subtitle.Entries {
lyrics.Timeline = append(lyrics.Timeline, entry.StartTime)
lyrics.Content = append(lyrics.Content, entry.Text)
}
return Generate(lyrics, filePath)
}