package worker import ( "encoding/json" "strings" "gitea.kazu634.com/kazu634/tver/internal/store" ) type outputEvent struct { Event string `json:"event"` FormatID string `json:"format_id"` Filepath string `json:"filepath"` Progress struct { DownloadedBytes *float64 `json:"downloaded_bytes"` TotalBytes *float64 `json:"total_bytes"` TotalBytesEstimate *float64 `json:"total_bytes_estimate"` Speed *float64 `json:"speed"` ETA *float64 `json:"eta"` FragmentIndex *float64 `json:"fragment_index"` FragmentCount *float64 `json:"fragment_count"` } `json:"progress"` } func parseProgress(line string) (store.Progress, bool) { var event outputEvent if err := json.Unmarshal([]byte(line), &event); err != nil { return store.Progress{}, false } phase := "" switch event.Event { case "download": if strings.Contains(strings.ToLower(event.FormatID), "audio") { phase = "audio" } else { phase = "video" } case "postprocess": phase = "merging" default: return store.Progress{}, false } total := int64Pointer(event.Progress.TotalBytes) estimate := false if total == nil && event.Progress.TotalBytesEstimate != nil { total = int64Pointer(event.Progress.TotalBytesEstimate) estimate = true } var formatID *string if event.FormatID != "" { formatID = &event.FormatID } return store.Progress{Phase: phase, DownloadedBytes: int64Pointer(event.Progress.DownloadedBytes), TotalBytes: total, TotalIsEstimate: estimate, SpeedBPS: event.Progress.Speed, ETASeconds: event.Progress.ETA, FragmentIndex: int32Pointer(event.Progress.FragmentIndex), FragmentCount: int32Pointer(event.Progress.FragmentCount), FormatID: formatID}, true } func int64Pointer(value *float64) *int64 { if value == nil { return nil } result := int64(*value) return &result } func int32Pointer(value *float64) *int32 { if value == nil { return nil } result := int32(*value) return &result } func parseAfterMove(line string) (string, bool) { var event outputEvent if err := json.Unmarshal([]byte(line), &event); err != nil || event.Event != "after_move" || event.Filepath == "" { return "", false } return event.Filepath, true }