94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
package downloaders
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/gen2brain/beeep"
|
|
"github.com/kkdai/youtube/v2"
|
|
ytd "github.com/kkdai/youtube/v2/downloader"
|
|
)
|
|
|
|
type KidaiDownloader struct{}
|
|
|
|
func (d *KidaiDownloader) Download(url string) error {
|
|
_, ongoing := ongoingDownloads[url]
|
|
if ongoing {
|
|
// return fmt.Errorf("Download %s is already ongoing", url)
|
|
log.Printf("Download %s is already ongoing", url)
|
|
return nil
|
|
}
|
|
ongoingDownloadsMutex.Lock()
|
|
ongoingDownloads[url] = struct{}{}
|
|
ongoingDownloadsMutex.Unlock()
|
|
defer func() {
|
|
ongoingDownloadsMutex.Lock()
|
|
delete(ongoingDownloads, url)
|
|
ongoingDownloadsMutex.Unlock()
|
|
}()
|
|
|
|
log.Printf("Kidai downloading %s", url)
|
|
|
|
go func() {
|
|
err := beeep.Beep(beeep.DefaultFreq, beeep.DefaultDuration)
|
|
if err != nil {
|
|
log.Printf("Failed beeping with %+v", err)
|
|
}
|
|
err = beeep.Alert("Download Started", url, "assets/information.png")
|
|
if err != nil {
|
|
log.Printf("Failed alerting with %+v", err)
|
|
}
|
|
}()
|
|
|
|
client := youtube.Client{}
|
|
video, err := client.GetVideo(url)
|
|
if err != nil {
|
|
return fmt.Errorf("failed downloading %s with %+v", url, err)
|
|
}
|
|
// $ go run . download -m mp4 -q hd https://www.youtube.com/watch?v=D9trBXaXCgA
|
|
// This works fine, now I have to figure out how to plug -m and -q into this shit below
|
|
downloader := ytd.Downloader{
|
|
OutputDir: OUTPUT_DIR,
|
|
Client: client,
|
|
}
|
|
|
|
videoTitle := Sanitize(video.Title)
|
|
videoAuthor := Sanitize(video.Author)
|
|
|
|
videoFileRoot := filepath.Join(OUTPUT_DIR, videoAuthor)
|
|
err = os.MkdirAll(videoFileRoot, 0755)
|
|
if err != nil {
|
|
return fmt.Errorf("failed creating directory %s with %+v", videoFileRoot, err)
|
|
}
|
|
|
|
fullVideoPath := filepath.Join(OUTPUT_DIR, videoAuthor, videoTitle+".mp4")
|
|
videoFileHandle, err := os.Open(fullVideoPath)
|
|
if err == nil {
|
|
videoFileHandle.Close()
|
|
log.Printf("File %s already exists, skipping download", fullVideoPath)
|
|
return nil
|
|
}
|
|
|
|
videoFile := filepath.Join(videoAuthor, videoTitle+".mp4")
|
|
err = downloader.DownloadComposite(context.Background(), videoFile, video, "hd", "mp4", "")
|
|
if err != nil {
|
|
return fmt.Errorf("failed downloading %s with %+v", url, err)
|
|
}
|
|
|
|
log.Printf("Downloaded %s", url)
|
|
return nil
|
|
}
|
|
|
|
var re = regexp.MustCompile(`[#!$%&/()";:?;,|*]`)
|
|
|
|
func Sanitize(s string) string {
|
|
s = strings.ReplaceAll(s, "&", "and")
|
|
s = re.ReplaceAllString(s, "")
|
|
return s
|
|
}
|