ytva/download.go

132 lines
3.8 KiB
Go
Raw Normal View History

2024-12-31 17:53:17 -05:00
package main
import (
"context"
"fmt"
"os"
"io"
"errors"
"net/http"
2024-12-31 18:59:03 -05:00
//"strconv"
2024-12-31 17:53:17 -05:00
"github.com/charmbracelet/log"
"github.com/wader/goutubedl"
)
func checkURL(input string) (error) {
request, err := http.NewRequest("GET", input, nil)
if err != nil {
return err
}
client := &http.Client{}
resp, err := client.Do(request)
if err != nil {
return err
}
if resp.StatusCode == http.StatusNotFound {
return errors.New(fmt.Sprintf("Video does not exist!"))
}
return nil
}
2024-12-31 18:59:03 -05:00
func downloadVideo(url string, path string, group GroupConfig) (err error) {
2024-12-31 17:53:17 -05:00
goutubedl.Path = "yt-dlp"
if err := checkURL(url); err != nil {
return err
}
log.Debugf("URL \"%s\" exists.", url)
video, err := goutubedl.New(context.Background(), url, goutubedl.Options{})
if err != nil {
return err
}
2024-12-31 18:59:03 -05:00
if video.Info.IsLive {
log.Info("Video is a live stream. Skipping.")
return nil
}
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
/* VIDEO */
if group.VideoFormat != "" {
2024-12-31 18:59:03 -05:00
log.Debugf("Downloading video \"%s\" with format \"%s\"", video.Info.ID, group.VideoFormat)
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
videoDLResult, err := video.Download(context.Background(), group.VideoFormat)
if err != nil {
return err
}
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
defer videoDLResult.Close()
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
file, err := os.OpenFile(MainConfig.TempDir+"/"+video.Info.ID+"-vid", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
defer file.Close()
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
io.Copy(file, videoDLResult)
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
videoDLResult.Close()
file.Close()
}
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
/* AUDIO */
if group.AudioFormat != "" {
2024-12-31 18:59:03 -05:00
log.Debugf("Downloading audio \"%s\" with format \"%s\"", video.Info.ID, group.AudioFormat)
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
audioDLResult, err := video.Download(context.Background(), group.AudioFormat)
if err != nil {
return err
}
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
defer audioDLResult.Close()
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
file, err := os.OpenFile(MainConfig.TempDir+"/"+video.Info.ID+"-audio", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
defer file.Close()
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
io.Copy(file, audioDLResult)
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
audioDLResult.Close()
file.Close()
}
2024-12-31 17:53:17 -05:00
if group.VideoFormat != "" && group.AudioFormat != "" {
if err := mergeStreams(MainConfig.TempDir+"/"+video.Info.ID+"-vid",MainConfig.TempDir+"/"+video.Info.ID+"-audio", group.CFormat, path); err != nil {
log.Errorf("Could not merge files \"%s\" and \"%s\" to \"%s\"", MainConfig.TempDir+"/"+video.Info.ID+"-vid", MainConfig.TempDir+"/"+video.Info.ID+"-audio", path)
}
2024-12-31 17:53:17 -05:00
if err := os.Remove(MainConfig.TempDir+"/"+video.Info.ID+"-vid"); err != nil {
log.Warnf("Could not remove file \"%s\"", MainConfig.TempDir+"/"+video.Info.ID+"-vid")
}
if err := os.Remove(MainConfig.TempDir+"/"+video.Info.ID+"-audio"); err != nil {
log.Warnf("Could not remove file \"%s\"", MainConfig.TempDir+"/"+video.Info.ID+"-audio")
}
} else if group.VideoFormat != "" {
copyFile(MainConfig.TempDir+"/"+video.Info.ID+"-vid", path)
if err := os.Remove(MainConfig.TempDir+"/"+video.Info.ID+"-vid"); err != nil {
log.Warnf("Could not remove file \"%s\"", MainConfig.TempDir+"/"+video.Info.ID+"-vid")
}
} else if group.AudioFormat != "" {
if err := copyFile(MainConfig.TempDir+"/"+video.Info.ID+"-audio", path); err != nil {
log.Errorf("Could not copy file \"%s\" to \"%s\"", MainConfig.TempDir+"/"+video.Info.ID+"-audio", path)
}
if err := os.Remove(MainConfig.TempDir+"/"+video.Info.ID+"-audio"); err != nil {
log.Warnf("Could not remove file \"%s\"", MainConfig.TempDir+"/"+video.Info.ID+"-audio")
}
2024-12-31 18:59:03 -05:00
}
2024-12-31 17:53:17 -05:00
2024-12-31 18:59:03 -05:00
/*
extension, err := getExtension(path)
if err != nil {
return err
2024-12-31 17:53:17 -05:00
}
2024-12-31 18:59:03 -05:00
os.Rename(path, path+"."+extension)
*/
2024-12-31 17:53:17 -05:00
return nil
}