rework ytdlp in terms of start/wait, fix audio transcode error
This commit is contained in:
11
handlers.go
11
handlers.go
@@ -178,7 +178,14 @@ type Meta struct {
|
|||||||
|
|
||||||
func getYtdlpTitle(url string, args []string) (string, error) {
|
func getYtdlpTitle(url string, args []string) (string, error) {
|
||||||
args = append(args, "--simulate", "--print", "%(title)s", url)
|
args = append(args, "--simulate", "--print", "%(title)s", url)
|
||||||
stdout, _, err := ytdlp.Run(args...)
|
|
||||||
|
cmd, cancel, err := ytdlp.Start(args...)
|
||||||
|
defer cancel()
|
||||||
|
if err != nil {
|
||||||
|
log.Errorln(err)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
stdout, _, err := cmd.Wait()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorln(err)
|
log.Errorln(err)
|
||||||
return "", err
|
return "", err
|
||||||
@@ -541,7 +548,7 @@ func processOriginal(originalID uint) {
|
|||||||
|
|
||||||
// create audio transcodes
|
// create audio transcodes
|
||||||
for _, bitrate := range []uint{64 /*, 96, 128, 160, 192*/} {
|
for _, bitrate := range []uint{64 /*, 96, 128, 160, 192*/} {
|
||||||
addAudioTranscode(video.ID, originalID, bitrate, "audio")
|
addAudioTranscode(audio.ID, originalID, bitrate, "audio")
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@@ -270,7 +270,7 @@ func transcodePending() {
|
|||||||
var srcAudio media.Audio
|
var srcAudio media.Audio
|
||||||
err = db.First(&srcAudio, "id = ?", trans.SrcID).Error
|
err = db.First(&srcAudio, "id = ?", trans.SrcID).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("no such source audio for audio Transcode", trans)
|
log.Errorln("no such source audio for audio Transcode", trans)
|
||||||
db.Delete(&trans)
|
db.Delete(&trans)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@@ -2,25 +2,66 @@ package ytdlp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// runs ffprobe with the provided args and returns (stdout, stderr, error)
|
// runs ffprobe with the provided args and returns (stdout, stderr, error)
|
||||||
func Run(args ...string) ([]byte, []byte, error) {
|
func Run(args ...string) ([]byte, []byte, error) {
|
||||||
ytdlp := "yt-dlp"
|
cmd, cancel, err := Start(args...)
|
||||||
log.Infoln(ytdlp, strings.Join(args, " "))
|
defer cancel()
|
||||||
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 {
|
if err != nil {
|
||||||
log.Errorf("yt-dlp error: %v", err)
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
log.Infoln("stdout:", stdout.String())
|
return cmd.Wait()
|
||||||
log.Infoln("stderr:", stderr.String())
|
}
|
||||||
return stdout.Bytes(), stderr.Bytes(), err
|
|
||||||
|
type Cmd struct {
|
||||||
|
ctx context.Context
|
||||||
|
cmd *exec.Cmd
|
||||||
|
|
||||||
|
stdout *bytes.Buffer
|
||||||
|
stderr *bytes.Buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
func Start(args ...string) (*Cmd, context.CancelFunc, error) {
|
||||||
|
|
||||||
|
ytdlp := "yt-dlp"
|
||||||
|
stdout := new(bytes.Buffer)
|
||||||
|
stderr := new(bytes.Buffer)
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
cmd := exec.CommandContext(ctx, ytdlp, args...)
|
||||||
|
cmd.Stdout = stdout
|
||||||
|
cmd.Stderr = stderr
|
||||||
|
|
||||||
|
log.Infoln(ytdlp, strings.Join(args, " "))
|
||||||
|
err := cmd.Start()
|
||||||
|
if err != nil {
|
||||||
|
return nil, cancel, err // FIXME: okay to just return this cancel thing?
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Cmd{
|
||||||
|
ctx: ctx,
|
||||||
|
cmd: cmd,
|
||||||
|
stdout: stdout,
|
||||||
|
stderr: stderr,
|
||||||
|
}, cancel, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Cmd) Wait() ([]byte, []byte, error) {
|
||||||
|
err := c.cmd.Wait()
|
||||||
|
if err != nil {
|
||||||
|
if c.ctx.Err() == context.Canceled {
|
||||||
|
log.Debugln("command canceled")
|
||||||
|
} else {
|
||||||
|
log.Errorln("yt-dlp error", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Infoln("stdout:", c.stdout.String())
|
||||||
|
log.Infoln("stderr:", c.stderr.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.stdout.Bytes(), c.stderr.Bytes(), err
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user