72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
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()
|
|
}
|
|
}
|