92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
// Package utils 提供工具函数
|
||
package utils
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"time"
|
||
|
||
"gitea.malaihome.work/ans/podcast-search-go/model"
|
||
)
|
||
|
||
// JsonParser 用于解析JSON格式的转录文件
|
||
type JsonParser struct{}
|
||
|
||
// NewJsonParser 创建新的JSON解析器
|
||
func NewJsonParser() *JsonParser {
|
||
return &JsonParser{}
|
||
}
|
||
|
||
// Parse 解析JSON格式的转录文件
|
||
func (p *JsonParser) Parse(jsonData string) (*model.Transcript, error) {
|
||
// 解析JSON
|
||
var data map[string]interface{}
|
||
if err := json.Unmarshal([]byte(jsonData), &data); err != nil {
|
||
return nil, fmt.Errorf("解析JSON失败: %w", err)
|
||
}
|
||
|
||
// 创建转录
|
||
transcript := &model.Transcript{
|
||
Subtitles: make([]model.Subtitle, 0),
|
||
}
|
||
|
||
// 解析版本
|
||
_, ok := data["version"].(string)
|
||
if !ok {
|
||
return nil, fmt.Errorf("无效的JSON格式: 缺少版本信息")
|
||
}
|
||
|
||
// 解析段落
|
||
segments, ok := data["segments"].([]interface{})
|
||
if !ok {
|
||
return nil, fmt.Errorf("无效的JSON格式: 缺少段落信息")
|
||
}
|
||
|
||
// 解析每个段落
|
||
for i, segment := range segments {
|
||
seg, ok := segment.(map[string]interface{})
|
||
if !ok {
|
||
continue
|
||
}
|
||
|
||
// 解析开始时间
|
||
startTime, ok := seg["startTime"].(float64)
|
||
if !ok {
|
||
continue
|
||
}
|
||
|
||
// 解析结束时间
|
||
endTime, ok := seg["endTime"].(float64)
|
||
if !ok {
|
||
continue
|
||
}
|
||
|
||
// 解析内容
|
||
body, ok := seg["body"].(string)
|
||
if !ok {
|
||
continue
|
||
}
|
||
|
||
// 解析发言人
|
||
speaker := ""
|
||
if s, ok := seg["speaker"].(string); ok {
|
||
speaker = s
|
||
}
|
||
|
||
// 创建字幕
|
||
subtitle := model.Subtitle{
|
||
Index: i,
|
||
Start: time.Duration(startTime * float64(time.Second)),
|
||
End: time.Duration(endTime * float64(time.Second)),
|
||
Data: body,
|
||
Speaker: speaker,
|
||
}
|
||
|
||
transcript.Subtitles = append(transcript.Subtitles, subtitle)
|
||
}
|
||
|
||
// 我们已经解析了版本信息,但Transcript结构体中没有Version字段
|
||
// 所以这里只返回解析好的transcript对象
|
||
return transcript, nil
|
||
}
|