package main import ( "context" "log" "sync" "github.com/gen2brain/beeep" "github.com/lrstanley/go-ytdlp" ) const OUTPUT_DIR = "C:/Users/Administrator/ytdlpVideos" type DownloadWorker struct { id int input chan *DownloadTask } var ongoingDownloads = make(map[string]struct{}) var ongoingDownloadsMutex = &sync.Mutex{} var dl = ytdlp.New(). // FormatSort("bestvideo[ext=mp4]+bestaudio[ext=m4a]"). FormatSort("res,ext:mp4:m4a"). Output("C:/Users/Administrator/ytdlpVideos/%(uploader)s/%(title)s.%(ext)s"). LimitRate("10M"). // HTTPChunkSize("20M"). MarkWatched(). SponsorblockMark("all"). RecodeVideo("mp4"). ConcurrentFragments(6) func (w *DownloadWorker) Run() { for { task, ok := <-w.input if !ok { log.Printf("DownloadWorker %d: input channel closed, exiting", w.id) return } _, ongoing := ongoingDownloads[task.Url] if ongoing { log.Printf("DownloadWorker %d: Download %s is already ongoing", w.id, task.Url) continue } ongoingDownloadsMutex.Lock() ongoingDownloads[task.Url] = struct{}{} ongoingDownloadsMutex.Unlock() log.Printf("DownloadWorker %d: Downloading %s", w.id, task.Url) err := beeep.Beep(beeep.DefaultFreq, beeep.DefaultDuration) if err != nil { log.Printf("Failed beeping with %+v", err) } err = beeep.Alert("Download Started", task.Url, "assets/information.png") if err != nil { log.Printf("Failed alerting with %+v", err) } _, err = dl.Run(context.TODO(), task.Url) if err != nil { log.Printf("DownloadWorker %d: Failed downloading %s with %+v", w.id, task.Url, err) continue } log.Printf("DownloadWorker %d: Downloaded %s", w.id, task.Url) ongoingDownloadsMutex.Lock() delete(ongoingDownloads, task.Url) ongoingDownloadsMutex.Unlock() } }