Support variable audio formats

This commit is contained in:
Carl Pearson
2024-09-13 05:35:57 -06:00
parent f8a182aa75
commit f0c1a8b00e
7 changed files with 61 additions and 17 deletions

View File

@@ -2,4 +2,5 @@ data
config
go.sum
*.mp4
*.m4a
*.m4a
*.webm

1
.gitignore vendored
View File

@@ -2,4 +2,5 @@ config
go.sum
*.mp4
*.m4a
*.webm
data

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -59,7 +59,7 @@
{{end}}
{{range .audios}}
<h2>{{.Rate}}</h2>
<h2>{{.Kbps}}</h2>
<div class="audio-container">
<audio controls playsinline preload="none">
<source src="/temp/{{.Token}}">

View File

@@ -128,7 +128,7 @@ func videoToAudio(transID uint, bitrate uint, videoFilepath string) {
db.First(&orig, "id = ?", trans.OriginalID)
// create audio record
audio := Audio{OriginalID: orig.ID, Filename: audioFilename, Rate: fmt.Sprintf("%dk", bitrate)}
audio := Audio{OriginalID: orig.ID, Filename: audioFilename, Kbps: fmt.Sprintf("%dk", bitrate)}
fileSize, err := getSize(audioFilepath)
if err == nil {
@@ -141,7 +141,7 @@ func videoToAudio(transID uint, bitrate uint, videoFilepath string) {
db.Delete(&trans)
}
func audioToAudio(transID uint, bitrate uint, srcFilepath string) {
func audioToAudio(transID uint, kbps uint, srcFilepath string) {
// determine destination path
dstFilename := uuid.Must(uuid.NewV7()).String()
@@ -159,7 +159,7 @@ func audioToAudio(transID uint, bitrate uint, srcFilepath string) {
ffmpeg := "ffmpeg"
ffmpegArgs := []string{"-i", srcFilepath, "-vn", "-acodec",
"mp3", "-b:a",
fmt.Sprintf("%dk", bitrate),
fmt.Sprintf("%dk", kbps),
dstFilepath}
fmt.Println(ffmpeg, strings.Join(ffmpegArgs, " "))
cmd := exec.Command(ffmpeg, ffmpegArgs...)
@@ -178,7 +178,11 @@ func audioToAudio(transID uint, bitrate uint, srcFilepath string) {
db.First(&orig, "id = ?", trans.OriginalID)
// create audio record
audio := Audio{OriginalID: orig.ID, Filename: dstFilename, Rate: fmt.Sprintf("%dk", bitrate)}
audio := Audio{
OriginalID: orig.ID,
Filename: dstFilename,
Kbps: fmt.Sprintf("%dk", kbps),
}
fileSize, err := getSize(dstFilepath)
if err == nil {