Auto update yt-dlp to the nightly build every 12 hours

This commit is contained in:
rroller 2024-10-19 17:31:29 -07:00
parent 0195630dc0
commit f51c8d1643
3 changed files with 102 additions and 0 deletions

View file

@ -37,6 +37,8 @@ func main() {
log.Panic().Msgf("%s\n", err.Error())
}
go startYtDlpUpdater()
// The HTTP Server
server := &http.Server{Addr: ":3000", Handler: router}
@ -78,6 +80,29 @@ func main() {
log.Info().Msgf("Shutdown complete")
}
// startYtDlpUpdater will update the yt-dlp to the latest nightly version ever few hours
func startYtDlpUpdater() {
log.Info().Msgf("yt-dlp version: %s", media.GetInstalledVersion())
ticker := time.NewTicker(12 * time.Hour)
// Do one update now
_, _ = media.UpdateYtDlp()
quit := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
_, _ = media.UpdateYtDlp()
log.Info().Msgf("yt-dlp version: %s", media.GetInstalledVersion())
case <-quit:
ticker.Stop()
return
}
}
}()
}
func fileServer(r chi.Router, public string, static string) {
if strings.ContainsAny(public, "{}*") {
panic("FileServer does not permit URL parameters.")

72
src/media/updater.go Normal file
View file

@ -0,0 +1,72 @@
package media
import (
"bytes"
"github.com/rs/zerolog/log"
"io"
"os"
"os/exec"
"strings"
"sync"
)
func UpdateYtDlp() (string, error) {
log.Info().Msgf("Updateing yt-dlp")
cmd := exec.Command("yt-dlp",
"--update",
"--update-to", "nightly",
)
var stdoutBuf, stderrBuf bytes.Buffer
stdoutIn, _ := cmd.StdoutPipe()
stderrIn, _ := cmd.StderrPipe()
var errStdout, errStderr error
stdout := io.MultiWriter(os.Stdout, &stdoutBuf)
stderr := io.MultiWriter(os.Stderr, &stderrBuf)
err := cmd.Start()
if err != nil {
log.Error().Msgf("Error starting command: %v", err)
return "", err
}
var wg sync.WaitGroup
wg.Add(1)
go func() {
_, errStdout = io.Copy(stdout, stdoutIn)
wg.Done()
}()
_, errStderr = io.Copy(stderr, stderrIn)
wg.Wait()
err = cmd.Wait()
if err != nil {
log.Error().Msgf("cmd.Run() failed with %s", err)
return "", err
} else if errStdout != nil {
log.Error().Msgf("failed to capture stdout: %v", errStdout)
} else if errStderr != nil {
log.Error().Msgf("failed to capture stderr: %v", errStderr)
}
log.Info().Msgf("Done updating yt-dlp")
return "", nil
}
func GetInstalledVersion() string {
cmd := exec.Command("yt-dlp", "--version")
var s bytes.Buffer
cmd.Stdout = &s
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return ""
}
return strings.TrimSpace(string(s.Bytes()))
}

5
tidy.sh Normal file
View file

@ -0,0 +1,5 @@
#!/usr/bin/env bash
set -ex
go mod tidy
go fmt ./...