diff --git a/main.go b/main.go index 760be2e..0768f0a 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "log" + "math" "net/http" "os" "path" @@ -247,18 +248,21 @@ func main() { // concatenate VOD segments into full VOD fullVodExists := func () bool { // check if full VOD already exists with expected duration - if fullVodProbe, err := scanner.ProbeSegment(video.Filename); err != nil { - var totalLength float64 = 0 - for _, filename := range vodFiles { - probe, err := scanner.ProbeSegment(filename) - if err != nil { continue } - totalLength += probe.Format.Duration - } - return fullVodProbe.Format.Duration == totalLength + fullVodProbe, err := scanner.ProbeSegment(video.Filename) + if err != nil { return false } + video.SizeBytes = fullVodProbe.Format.Size + var totalLength float64 = 0 + + for _, filename := range vodFiles { + probe, err := scanner.ProbeSegment(path.Join(metadata.FootageDir, filename)) + if err != nil { continue } + totalLength += probe.Format.Duration } - return false + return math.Abs(fullVodProbe.Format.Duration - totalLength) < float64(0.1) }() - if !fullVodExists { + if fullVodExists { + log.Print("Full VOD appears to already exist- uploading this file...") + } else { video.SizeBytes, err = vid.ConcatVideo(video, vodFiles, verbose) if err != nil { log.Fatalf("Failed to concatenate VOD segments: %v", err) diff --git a/scanner/scanner.go b/scanner/scanner.go index 6f973fe..394c4f1 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -4,6 +4,7 @@ import ( "encoding/json" "os" "path" + "strconv" "strings" "time" @@ -28,13 +29,13 @@ type ( Category *Category `toml:"category" comment:"(Optional) Category details, for additional credits."` } - ffprobeFormat struct { + FFprobeFormat struct { Duration float64 `json:"duration"` Size int64 `json:"size"` } - ffprobeOutput struct { - Format ffprobeFormat `json:"format"` + FFprobeOutput struct { + Format FFprobeFormat `json:"format"` } ) @@ -58,15 +59,36 @@ func ScanSegments(directory string, extension string) ([]string, error) { return files, nil } -func ProbeSegment(filename string) (*ffprobeOutput, error) { +func ProbeSegment(filename string) (*FFprobeOutput, error) { out, err := ffmpeg_go.Probe(filename) if err != nil { return nil, err } - probe := ffprobeOutput{} + type ( + RawFFprobeFormat struct { + // these being strings upsets me immensely + Duration string `json:"duration"` + Size string `json:"size"` + } + RawFFprobeOutput struct { + Format RawFFprobeFormat `json:"format"` + } + ) + + probe := RawFFprobeOutput{} err = json.Unmarshal([]byte(out), &probe) if err != nil { return nil, err } - return &probe, nil + duration, err := strconv.ParseFloat(probe.Format.Duration, 64) + if err != nil { return nil, err } + size, err := strconv.ParseInt(probe.Format.Size, 10, 0) + if err != nil { return nil, err } + + return &FFprobeOutput{ + Format: FFprobeFormat{ + Duration: duration, + Size: size, + }, + }, nil } func ReadMetadata(directory string) (*Metadata, error) {