Support variable audio formats
This commit is contained in:
@@ -3,3 +3,4 @@ config
|
|||||||
go.sum
|
go.sum
|
||||||
*.mp4
|
*.mp4
|
||||||
*.m4a
|
*.m4a
|
||||||
|
*.webm
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,4 +2,5 @@ config
|
|||||||
go.sum
|
go.sum
|
||||||
*.mp4
|
*.mp4
|
||||||
*.m4a
|
*.m4a
|
||||||
|
*.webm
|
||||||
data
|
data
|
@@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
@@ -28,7 +27,7 @@ func getAdminInitialPassword() (string, error) {
|
|||||||
if exists {
|
if exists {
|
||||||
return value, nil
|
return value, nil
|
||||||
}
|
}
|
||||||
return "", errors.New(fmt.Sprintf("please set %s", key))
|
return "", fmt.Errorf("please set %s", key)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getSessionAuthKey() ([]byte, error) {
|
func getSessionAuthKey() ([]byte, error) {
|
||||||
@@ -37,7 +36,7 @@ func getSessionAuthKey() ([]byte, error) {
|
|||||||
if exists {
|
if exists {
|
||||||
return []byte(value), nil
|
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
|
var GitSHA string
|
||||||
|
53
handlers.go
53
handlers.go
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@@ -163,7 +164,9 @@ func getYtdlpExt(url string, args []string) (string, error) {
|
|||||||
fmt.Println("getYtdlpExt error:", err, stdout.String())
|
fmt.Println("getYtdlpExt error:", err, stdout.String())
|
||||||
return "", err
|
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) {
|
func getYtdlpMeta(url string, args []string) (Meta, error) {
|
||||||
@@ -361,6 +364,27 @@ func getVideoMeta(path string) (VideoMeta, error) {
|
|||||||
}, nil
|
}, 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) {
|
func getAudioBitrate(path string) (uint, error) {
|
||||||
|
|
||||||
ffprobe := "ffprobe"
|
ffprobe := "ffprobe"
|
||||||
@@ -381,12 +405,27 @@ func getAudioBitrate(path string) (uint, error) {
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
bitrateStr := strings.TrimSpace(stdout.String())
|
bitrateStr := strings.TrimSpace(stdout.String())
|
||||||
bitrate, err := strconv.ParseUint(bitrateStr, 10, 32)
|
|
||||||
if err != nil {
|
// for opus files, or other files with variable birates, this may come back "N/A"
|
||||||
fmt.Println("getAudioBitrate error:", err)
|
|
||||||
return 0, err
|
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)
|
fmt.Println(err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Println(audioMeta)
|
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)
|
size, err := getSize(audioFilepath)
|
||||||
|
@@ -59,7 +59,7 @@ type Audio struct {
|
|||||||
gorm.Model
|
gorm.Model
|
||||||
OriginalID uint // Original.ID
|
OriginalID uint // Original.ID
|
||||||
Source string // "original", "transcode"
|
Source string // "original", "transcode"
|
||||||
Rate string // in kbps
|
Kbps string
|
||||||
Length string
|
Length string
|
||||||
Size string
|
Size string
|
||||||
Type string
|
Type string
|
||||||
|
@@ -59,7 +59,7 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{range .audios}}
|
{{range .audios}}
|
||||||
<h2>{{.Rate}}</h2>
|
<h2>{{.Kbps}}</h2>
|
||||||
<div class="audio-container">
|
<div class="audio-container">
|
||||||
<audio controls playsinline preload="none">
|
<audio controls playsinline preload="none">
|
||||||
<source src="/temp/{{.Token}}">
|
<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)
|
db.First(&orig, "id = ?", trans.OriginalID)
|
||||||
|
|
||||||
// create audio record
|
// 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)
|
fileSize, err := getSize(audioFilepath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -141,7 +141,7 @@ func videoToAudio(transID uint, bitrate uint, videoFilepath string) {
|
|||||||
db.Delete(&trans)
|
db.Delete(&trans)
|
||||||
}
|
}
|
||||||
|
|
||||||
func audioToAudio(transID uint, bitrate uint, srcFilepath string) {
|
func audioToAudio(transID uint, kbps uint, srcFilepath string) {
|
||||||
|
|
||||||
// determine destination path
|
// determine destination path
|
||||||
dstFilename := uuid.Must(uuid.NewV7()).String()
|
dstFilename := uuid.Must(uuid.NewV7()).String()
|
||||||
@@ -159,7 +159,7 @@ func audioToAudio(transID uint, bitrate uint, srcFilepath string) {
|
|||||||
ffmpeg := "ffmpeg"
|
ffmpeg := "ffmpeg"
|
||||||
ffmpegArgs := []string{"-i", srcFilepath, "-vn", "-acodec",
|
ffmpegArgs := []string{"-i", srcFilepath, "-vn", "-acodec",
|
||||||
"mp3", "-b:a",
|
"mp3", "-b:a",
|
||||||
fmt.Sprintf("%dk", bitrate),
|
fmt.Sprintf("%dk", kbps),
|
||||||
dstFilepath}
|
dstFilepath}
|
||||||
fmt.Println(ffmpeg, strings.Join(ffmpegArgs, " "))
|
fmt.Println(ffmpeg, strings.Join(ffmpegArgs, " "))
|
||||||
cmd := exec.Command(ffmpeg, ffmpegArgs...)
|
cmd := exec.Command(ffmpeg, ffmpegArgs...)
|
||||||
@@ -178,7 +178,11 @@ func audioToAudio(transID uint, bitrate uint, srcFilepath string) {
|
|||||||
db.First(&orig, "id = ?", trans.OriginalID)
|
db.First(&orig, "id = ?", trans.OriginalID)
|
||||||
|
|
||||||
// create audio record
|
// 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)
|
fileSize, err := getSize(dstFilepath)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
Reference in New Issue
Block a user