diff --git a/.dockerignore b/.dockerignore index 327f485..8579a8b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,4 +2,5 @@ data config go.sum *.mp4 -*.m4a \ No newline at end of file +*.m4a +*.webm \ No newline at end of file diff --git a/.gitignore b/.gitignore index 031f65b..da744b4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ config go.sum *.mp4 *.m4a +*.webm data \ No newline at end of file diff --git a/config.go b/config.go index 374a819..29dd4f8 100644 --- a/config.go +++ b/config.go @@ -1,7 +1,6 @@ package main import ( - "errors" "fmt" "os" ) @@ -28,7 +27,7 @@ func getAdminInitialPassword() (string, error) { if exists { return value, nil } - return "", errors.New(fmt.Sprintf("please set %s", key)) + return "", fmt.Errorf("please set %s", key) } func getSessionAuthKey() ([]byte, error) { @@ -37,7 +36,7 @@ func getSessionAuthKey() ([]byte, error) { if exists { return []byte(value), nil } - return []byte{}, errors.New(fmt.Sprintf("please set %s", key)) + return []byte{}, fmt.Errorf("please set %s", key) } var GitSHA string diff --git a/handlers.go b/handlers.go index ab28fa8..78c9779 100644 --- a/handlers.go +++ b/handlers.go @@ -3,6 +3,7 @@ package main import ( "bytes" "fmt" + "math" "net/http" "os" "os/exec" @@ -163,7 +164,9 @@ func getYtdlpExt(url string, args []string) (string, error) { fmt.Println("getYtdlpExt error:", err, stdout.String()) return "", err } - return strings.TrimSpace(stdout.String()), nil + result := strings.TrimSpace(stdout.String()) + fmt.Println(result) + return result, nil } func getYtdlpMeta(url string, args []string) (Meta, error) { @@ -361,6 +364,27 @@ func getVideoMeta(path string) (VideoMeta, error) { }, nil } +func getAudioDuration(path string) (float64, error) { + + ffprobe := "ffprobe" + ffprobeArgs := []string{ + "-v", "error", + "-show_entries", "format=duration", + "-of", "default=noprint_wrappers=1:nokey=1", + path} + fmt.Println(ffprobe, strings.Join(ffprobeArgs, " ")) + cmd := exec.Command(ffprobe, ffprobeArgs...) + var stdout bytes.Buffer + cmd.Stdout = &stdout + err := cmd.Run() + if err != nil { + fmt.Println("getAudioDuration error:", err, stdout.String()) + return 0, err + } + durationStr := strings.TrimSpace(stdout.String()) + return strconv.ParseFloat(durationStr, 64) +} + func getAudioBitrate(path string) (uint, error) { ffprobe := "ffprobe" @@ -381,12 +405,27 @@ func getAudioBitrate(path string) (uint, error) { return 0, err } bitrateStr := strings.TrimSpace(stdout.String()) - bitrate, err := strconv.ParseUint(bitrateStr, 10, 32) - if err != nil { - fmt.Println("getAudioBitrate error:", err) - return 0, err + + // for opus files, or other files with variable birates, this may come back "N/A" + + if bitrateStr == "N/A" { + size, err := getSize(path) + if err != nil { + return 0, err + } + dur, err := getAudioDuration(path) + if err != nil { + return 0, err + } + return uint(math.Round(float64(size) / dur)), nil + } else { + bitrate, err := strconv.ParseUint(bitrateStr, 10, 32) + if err != nil { + fmt.Println("getAudioBitrate error:", err) + return 0, err + } + return uint(bitrate), nil } - return uint(bitrate), nil } @@ -482,7 +521,7 @@ func processOriginal(originalID uint) { fmt.Println(err) } else { fmt.Println(audioMeta) - db.Model(&Audio{}).Where("id = ?", audio.ID).Update("rate", fmt.Sprintf("%dk", audioMeta.rate/1000)) + db.Model(&Audio{}).Where("id = ?", audio.ID).Update("kbps", fmt.Sprintf("%.1fk", float64(audioMeta.rate)/1000)) } size, err := getSize(audioFilepath) diff --git a/models.go b/models.go index 26d867f..5272785 100644 --- a/models.go +++ b/models.go @@ -59,7 +59,7 @@ type Audio struct { gorm.Model OriginalID uint // Original.ID Source string // "original", "transcode" - Rate string // in kbps + Kbps string Length string Size string Type string diff --git a/templates/video.html b/templates/video.html index 6f598a1..c2a2a55 100644 --- a/templates/video.html +++ b/templates/video.html @@ -59,7 +59,7 @@ {{end}} {{range .audios}} -