Refactor yt-dlp calls

This commit is contained in:
Carl Pearson
2024-10-04 06:02:08 -06:00
parent 303262efe1
commit e188fd8174
2 changed files with 44 additions and 47 deletions

View File

@@ -1,7 +1,6 @@
package main package main
import ( import (
"bytes"
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
@@ -155,53 +154,33 @@ type Meta struct {
} }
func getYtdlpTitle(url string, args []string) (string, error) { func getYtdlpTitle(url string, args []string) (string, error) {
ytdlp := "yt-dlp"
args = append(args, "--simulate", "--print", "%(title)s", url) args = append(args, "--simulate", "--print", "%(title)s", url)
fmt.Println(ytdlp, strings.Join(args, " ")) stdout, _, err := runYtdlp(args...)
cmd := exec.Command(ytdlp, args...)
var stdout bytes.Buffer
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil { if err != nil {
fmt.Println("getYtdlpTitle error:", err, stdout.String()) log.Errorln(err)
return "", err return "", err
} }
return strings.TrimSpace(stdout.String()), nil return strings.TrimSpace(string(stdout)), nil
} }
func getYtdlpArtist(url string, args []string) (string, error) { func getYtdlpArtist(url string, args []string) (string, error) {
ytdlp := "yt-dlp"
args = append(args, "--simulate", "--print", "%(uploader)s", url) args = append(args, "--simulate", "--print", "%(uploader)s", url)
fmt.Println(ytdlp, strings.Join(args, " ")) stdout, _, err := runYtdlp(args...)
cmd := exec.Command(ytdlp, args...)
var stdout bytes.Buffer
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil { if err != nil {
fmt.Println("getYtdlpArtist error:", err, stdout.String()) log.Errorln(err)
return "", err return "", err
} }
return strings.TrimSpace(stdout.String()), nil return strings.TrimSpace(string(stdout)), nil
} }
func getYtdlpExt(url string, args []string) (string, error) { func getYtdlpExt(url string, args []string) (string, error) {
ytdlp := "yt-dlp"
args = append(args, "--simulate", "--print", "%(ext)s", url) args = append(args, "--simulate", "--print", "%(ext)s", url)
fmt.Println(ytdlp, strings.Join(args, " ")) stdout, _, err := runYtdlp(args...)
cmd := exec.Command(ytdlp, args...)
var stdout bytes.Buffer
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil { if err != nil {
fmt.Println("getYtdlpExt error:", err, stdout.String()) log.Errorln(err)
return "", err return "", err
} }
result := strings.TrimSpace(stdout.String()) return strings.TrimSpace(string(stdout)), nil
fmt.Println(result)
return result, nil
} }
func getYtdlpMeta(url string, args []string) (Meta, error) { func getYtdlpMeta(url string, args []string) (Meta, error) {
@@ -235,26 +214,21 @@ func getYtdlpVideoMeta(url string) (Meta, error) {
// return the length in seconds of a video file at `path` // return the length in seconds of a video file at `path`
func getLength(path string) (float64, error) { func getLength(path string) (float64, error) {
cmd := exec.Command("ffprobe", "-v", "error", "-show_entries", "format=duration", stdout, _, err := runFfprobe("-v", "error", "-show_entries", "format=duration",
"-of", "default=noprint_wrappers=1:nokey=1", path) "-of", "default=noprint_wrappers=1:nokey=1", path)
var stdout bytes.Buffer
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil { if err != nil {
fmt.Println("getLength cmd error:", err) log.Errorln("ffprobe error:", err)
return -1, err return -1, err
} }
result, err := strconv.ParseFloat(strings.TrimSpace(stdout.String()), 64) result, err := strconv.ParseFloat(strings.TrimSpace(string(stdout)), 64)
if err != nil { if err != nil {
fmt.Println("getLength parse error:", err, stdout.String()) log.Errorln("parse error:", err, string(stdout))
} }
return result, nil return result, nil
} }
func getVideoWidth(path string) (uint, error) { func getVideoWidth(path string) (uint, error) {
stdout, _, err := runFfprobe("-v", "error", "-select_streams", stdout, _, err := runFfprobe("-v", "error", "-select_streams",
"v:0", "-count_packets", "-show_entries", "v:0", "-count_packets", "-show_entries",
"stream=width", "-of", "csv=p=0", path) "stream=width", "-of", "csv=p=0", path)
@@ -266,27 +240,24 @@ func getVideoWidth(path string) (uint, error) {
result, err := strconv.ParseUint(strings.TrimSpace(string(stdout)), 10, 32) result, err := strconv.ParseUint(strings.TrimSpace(string(stdout)), 10, 32)
if err != nil { if err != nil {
fmt.Println("parse width error:", err, string(stdout)) log.Errorln("parse width error:", err, string(stdout))
} }
return uint(result), nil return uint(result), nil
} }
func getVideoHeight(path string) (uint, error) { func getVideoHeight(path string) (uint, error) {
cmd := exec.Command("ffprobe", "-v", "error", "-select_streams", stdout, _, err := runFfprobe("-v", "error", "-select_streams",
"v:0", "-count_packets", "-show_entries", "v:0", "-count_packets", "-show_entries",
"stream=height", "-of", "csv=p=0", path) "stream=height", "-of", "csv=p=0", path)
var stdout bytes.Buffer
cmd.Stdout = &stdout
err := cmd.Run()
if err != nil { if err != nil {
fmt.Println("getVideoHeight cmd error:", err) log.Errorln("ffprobe error:", err)
return 0, err return 0, err
} }
result, err := strconv.ParseUint(strings.TrimSpace(stdout.String()), 10, 32) result, err := strconv.ParseUint(strings.TrimSpace(string(stdout)), 10, 32)
if err != nil { if err != nil {
fmt.Println("getVideoHeight parse error:", err, stdout.String()) log.Errorln("getVideoHeight parse error:", err, string(stdout))
} }
return uint(result), nil return uint(result), nil
} }

26
ytdlp.go Normal file
View File

@@ -0,0 +1,26 @@
package main
import (
"bytes"
"os/exec"
"strings"
)
// runs ffprobe with the provided args and returns (stdout, stderr, error)
func runYtdlp(args ...string) ([]byte, []byte, error) {
ytdlp := "yt-dlp"
log.Infoln(ytdlp, strings.Join(args, " "))
cmd := exec.Command(ytdlp, args...)
var stdout bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Errorf("yt-dlp error: %v", err)
}
log.Infoln("stdout:", stdout.String())
log.Infoln("stderr:", stderr.String())
return stdout.Bytes(), stderr.Bytes(), err
}