feat: vtt converting
This commit is contained in:
parent
ba2e477dc0
commit
ba66894e42
7 changed files with 693 additions and 107 deletions
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue