package main import ( "bufio" "fmt" "log" "net/url" "os" "os/exec" "path/filepath" "strings" "sync" "git.meatbag.se/varl/subsyt/internal/opml" toml "github.com/pelletier/go-toml/v2" ) func check(e error) { if e != nil { panic(e) } } type Provider struct { Url string } type Channel struct { Name string Id string Provider string } type Config struct { Out_dir string Provider map[string]Provider } type Download struct { Url *url.URL OutDir string AfterDate string Name string } func dl(d Download) { output := filepath.Join(d.OutDir, 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", "1", "--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", ) stdout, err := cmd.StdoutPipe() if err != nil { log.Fatal(err) } stderr, err := cmd.StderrPipe() if err != nil { log.Fatal(err) } log.Printf("Running yt-dlp for: %s", d.Url) var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() scanner := bufio.NewScanner(stdout) for scanner.Scan() { log.Printf("%s\n", scanner.Text()) } }() go func() { defer wg.Done() scanner := bufio.NewScanner(stderr) for scanner.Scan() { log.Printf("%s\n", 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) } } func main() { data, err := os.ReadFile("./config.toml") check(err) cfg := Config{} err = toml.Unmarshal(data, &cfg) check(err) pUrl := cfg.Provider["youtube"].Url fmt.Printf("provider url: %s", pUrl) opml := opml.Unmarshal("./subs-opml.xml") fmt.Printf("XMLName: %#v\n", opml.XMLName) for _, outlines := range opml.Body.Outline { fmt.Printf("%s\n", outlines.Title) for _, outline := range outlines.Outlines { curl := strings.TrimPrefix(outline.XmlUrl, "/feed/") furl, err := url.JoinPath(pUrl, curl) check(err) fmt.Printf("%s - %s\n", outline.Text, furl) fullUrl, err := url.Parse(furl) check(err) dl(Download{ Name: outline.Title, Url: fullUrl, OutDir: cfg.Out_dir, AfterDate: "20250326", }) } } }