ytva/youtube.go
2024-12-31 14:33:46 -07:00

113 lines
2.6 KiB
Go

package main
import (
"context"
"fmt"
"os"
"io"
"errors"
"net/http"
"strconv"
"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
}
func downloadVideo(url string, videoFormat string, audioFormat string, outDir string, sizeLimit float64) (err error) {
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
}
path := outDir+strconv.Itoa(int(video.Info.Timestamp))+" - "+video.Info.Title
if ! video.Info.IsLive {
/* VIDEO */
{
log.Debugf("Downloading video \"%s\" with format \"%s\"", video.Info.ID, videoFormat)
videoDLResult, err := video.Download(context.Background(), videoFormat)
if err != nil {
return err
}
defer videoDLResult.Close()
file, err := os.OpenFile(path+"-vid", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
defer file.Close()
io.Copy(file, videoDLResult)
videoDLResult.Close()
file.Close()
}
/* AUDIO */
{
log.Debugf("Downloading audio \"%s\" with format \"%s\"", video.Info.ID, audioFormat)
audioDLResult, err := video.Download(context.Background(), audioFormat)
if err != nil {
return err
}
defer audioDLResult.Close()
file, err := os.OpenFile(path+"-audio", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
defer file.Close()
io.Copy(file, audioDLResult)
audioDLResult.Close()
file.Close()
}
mergeStreams(path+"-vid",path+"-audio",path+".mkv")
if err := os.Remove(path+"-vid"); err != nil {
log.Warnf("Could not remove file \"%s\"", path+"-vid")
}
if err := os.Remove(path+"-audio"); err != nil {
log.Warnf("Could not remove file \"%s\"", path+"-audio")
}
/*
extension, err := getExtension(path)
if err != nil {
return err
}
os.Rename(path, path+"."+extension)
*/
}
return nil
}