package dl import ( "bufio" "log" "net/url" "os/exec" "path/filepath" "sync" ) type Download struct { Url *url.URL OutDir string AfterDate string Name string } func Get(d Download) { output := filepath.Join(d.Name, "%(upload_date>%Y)s/%(upload_date)s-%(title)s-%(id)s.%(ext)s") archive := filepath.Join(d.OutDir, d.Name, "archive.txt") outdir := filepath.Join(d.OutDir, d.Name) cmd := exec.Command("yt-dlp", d.Url.String(), "--no-simulate", "--no-progress", "--sleep-interval", "1", "--sleep-subtitles", "3", "--sleep-requests", "1", "--prefer-free-formats", "--write-subs", "--no-write-automatic-subs", "--sub-langs", "en", "--dateafter", d.AfterDate, "--paths", outdir, "--output", output, "--download-archive", archive, "--break-on-existing", "--restrict-filenames", ) stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } stderr, err := cmd.StderrPipe() if err != nil { log.Fatal(err) } log.Printf("[%s] running yt-dlp for: %s", d.Name, d.Url) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() scanner := bufio.NewScanner(stdout) for scanner.Scan() { log.Printf("[%s] %s\n", d.Name, scanner.Text()) } }() go func() { defer wg.Done() scanner := bufio.NewScanner(stderr) for scanner.Scan() { log.Printf("[%s] %s\n", d.Name, scanner.Text()) } }() err = cmd.Start() if err != nil { log.Fatal(err) } wg.Wait() err = cmd.Wait() if err != nil { log.Printf("Error: %s\n", err) } }