Files
podcast-search-go/utils/json_parser.go
T
ansandClaude Fable 5 6ffa8a248b refactor: 模块路径迁移到 gitea.malai.tech
仓库已迁到 gitea.malai.tech,同步更新 go.mod module 声明与全部内部 import,
使其可作为正式 Go 模块被 go get 解析(此前声明路径 gitea.malaihome.work 已不可达)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:27:48 +08:00

92 lines
1.9 KiB
Go

// Package utils 提供工具函数
package utils
import (
"encoding/json"
"fmt"
"time"
"gitea.malai.tech/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
}