Support variable audio formats
This commit is contained in:
@@ -2,4 +2,5 @@ data
|
||||
config
|
||||
go.sum
|
||||
*.mp4
|
||||
*.m4a
|
||||
*.m4a
|
||||
*.webm
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,4 +2,5 @@ config
|
||||
go.sum
|
||||
*.mp4
|
||||
*.m4a
|
||||
*.webm
|
||||
data
|
@@ -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
|
||||
|
53
handlers.go
53
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)
|
||||
|
@@ -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
|
||||
|
@@ -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}}">
|
||||
|
12
workers.go
12
workers.go
@@ -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 {
|
||||
|
Reference in New Issue
Block a user