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 */
2024-12-31 19:48:18 -05:00
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 */
2024-12-31 19:48:18 -05:00
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
2024-12-31 19:48:18 -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
2024-12-31 19:48:18 -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
}