diff --git a/src/main.go b/src/main.go index 05ce7d6..b0e890d 100644 --- a/src/main.go +++ b/src/main.go @@ -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.") diff --git a/src/media/updater.go b/src/media/updater.go new file mode 100644 index 0000000..f4e18ce --- /dev/null +++ b/src/media/updater.go @@ -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())) +} diff --git a/tidy.sh b/tidy.sh new file mode 100644 index 0000000..d0fe9e7 --- /dev/null +++ b/tidy.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -ex + +go mod tidy +go fmt ./... \ No newline at end of file