mirror-nourybot/cmd/nourybot/download.go

379 lines
11 KiB
Go
Raw Normal View History

2023-10-05 21:21:26 +02:00
package main
import (
"context"
"fmt"
"io"
"os"
"strings"
2023-10-05 21:21:26 +02:00
"github.com/gempir/go-twitch-irc/v4"
2023-10-05 21:21:26 +02:00
"github.com/google/uuid"
ffmpeg "github.com/u2takey/ffmpeg-go"
2023-10-05 21:21:26 +02:00
"github.com/wader/goutubedl"
)
func (app *application) NewDownload(destination, target, link string, msg twitch.PrivateMessage) {
identifier := uuid.NewString()
go app.Models.Uploads.Insert(
msg.User.Name,
msg.User.ID,
msg.Channel,
msg.Message,
destination,
link,
identifier,
)
2023-10-05 21:21:26 +02:00
switch destination {
case "catbox":
app.CatboxDownload(target, link, identifier, msg)
2023-10-05 21:21:26 +02:00
case "yaf":
app.YafDownload(target, link, identifier, msg)
2023-10-05 21:21:26 +02:00
case "kappa":
app.KappaDownload(target, link, identifier, msg)
2023-10-05 21:21:26 +02:00
case "gofile":
app.GofileDownload(target, link, identifier, msg)
2023-10-05 21:21:26 +02:00
}
}
2024-02-28 11:53:39 +01:00
// ConvertAndSave downloads a given video link with yt-dlp, then tries to convert it
// to mp4 with ffmpeg and afterwards serves the video from /public/uploads
func (app *application) ConvertAndSave(fName, link string, msg twitch.PrivateMessage) {
goutubedl.Path = "yt-dlp"
uuid_og := uuid.NewString()
app.Send(msg.Channel, "Downloading... dankCircle", msg)
result, err := goutubedl.New(context.Background(), link, goutubedl.Options{})
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
var rExt string
// For some reason youtube links return webm as result.Info.Ext but
// are in reality mp4.
if strings.HasPrefix(link, "https://www.youtube.com/") || strings.HasPrefix(link, "https://youtu.be/") {
rExt = "mp4"
} else {
rExt = result.Info.Ext
}
downloadResult, err := result.Download(context.Background(), "best")
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
2023-12-19 23:16:53 +01:00
fileName := fmt.Sprintf("/public/uploads/%s.%s", uuid_og, rExt)
f, err := os.Create(fileName)
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
defer f.Close()
if _, err = io.Copy(f, downloadResult); err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
downloadResult.Close()
f.Close()
out := fmt.Sprintf("/public/uploads/%s.mp4", fName)
fn, err := os.Create(out)
if err != nil {
app.Log.Errorln(err)
2024-02-29 21:17:39 +01:00
app.Send(msg.Channel, fmt.Sprint(ErrGenericErrorMessage), msg)
return
}
defer fn.Close()
err = ffmpeg.Input(fileName).
Output(out).
OverWriteOutput().ErrorToStdOut().Run()
2024-02-29 21:17:39 +01:00
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprint(ErrGenericErrorMessage), msg)
return
}
2023-12-19 23:16:53 +01:00
defer os.Remove(fileName)
2024-01-08 16:25:54 +01:00
app.Send(msg.Channel, fmt.Sprintf("https://bot.noury.li/uploads/%s.mp4", fName), msg)
}
2023-12-19 23:16:53 +01:00
2024-02-28 11:53:39 +01:00
// ConvertAndSave downloads a given video link with yt-dlp, then tries to convert it
// to mp4 with ffmpeg and afterwards passes the result to NewUpload with yaf.li as destination.
func (app *application) ConvertToMP4(link string, msg twitch.PrivateMessage) {
fName := "in"
goutubedl.Path = "yt-dlp"
uuid_og := uuid.NewString()
uuid_new := uuid.NewString()
app.Send(msg.Channel, "Downloading... dankCircle", msg)
result, err := goutubedl.New(context.Background(), link, goutubedl.Options{})
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
// For some reason youtube links return webm as result.Info.Ext but
// are in reality mp4.
var rExt string
if strings.HasPrefix(link, "https://www.youtube.com/") || strings.HasPrefix(link, "https://youtu.be/") {
rExt = "mp4"
} else {
rExt = result.Info.Ext
}
downloadResult, err := result.Download(context.Background(), "best")
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
fileName := fmt.Sprintf("/public/uploads/%s.%s", uuid_og, rExt)
f, err := os.Create(fileName)
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
defer f.Close()
if _, err = io.Copy(f, downloadResult); err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
downloadResult.Close()
f.Close()
out := fmt.Sprintf("/public/uploads/%s.mp4", fName)
fn, err := os.Create(out)
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
return
}
defer fn.Close()
err = ffmpeg.Input(fileName).
Output(out).
OverWriteOutput().ErrorToStdOut().Run()
2024-02-29 21:17:39 +01:00
if err != nil {
app.Log.Errorln(err)
app.Send(msg.Channel, fmt.Sprint(ErrGenericErrorMessage), msg)
return
}
defer os.Remove(fileName)
go app.NewUpload("yaf", out, msg.Channel, uuid_new, msg)
}
2023-10-05 21:21:26 +02:00
2024-02-28 11:53:39 +01:00
// YafDownload downloads a given link with yt-dlp and then passes the result on to the NewUpload function
// with yaf.li as destination.
func (app *application) YafDownload(target, link, identifier string, msg twitch.PrivateMessage) {
2023-10-05 21:21:26 +02:00
goutubedl.Path = "yt-dlp"
app.Send(target, "Downloading... dankCircle", msg)
2023-10-05 21:21:26 +02:00
result, err := goutubedl.New(context.Background(), link, goutubedl.Options{})
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
// For some reason youtube links return webm as result.Info.Ext but
// are in reality mp4.
var rExt string
if strings.HasPrefix(link, "https://www.youtube.com/") || strings.HasPrefix(link, "https://youtu.be/") {
rExt = "mp4"
} else {
rExt = result.Info.Ext
}
2023-10-05 21:21:26 +02:00
downloadResult, err := result.Download(context.Background(), "best")
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
fileName := fmt.Sprintf("/public/uploads/%s.%s", identifier, rExt)
2023-10-05 21:21:26 +02:00
f, err := os.Create(fileName)
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
defer f.Close()
if _, err = io.Copy(f, downloadResult); err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
downloadResult.Close()
f.Close()
go app.NewUpload("yaf", fileName, target, identifier, msg)
2023-10-05 21:21:26 +02:00
}
2024-02-28 11:53:39 +01:00
// KappaDownload downloads a given link with yt-dlp and then passes the result on to the NewUpload function
// with kappa.lol as destination.
func (app *application) KappaDownload(target, link, identifier string, msg twitch.PrivateMessage) {
2023-10-05 21:21:26 +02:00
goutubedl.Path = "yt-dlp"
app.Send(target, "Downloading... dankCircle", msg)
2023-10-05 21:21:26 +02:00
result, err := goutubedl.New(context.Background(), link, goutubedl.Options{})
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
// For some reason youtube links return webm as result.Info.Ext but
// are in reality mp4.
var rExt string
if strings.HasPrefix(link, "https://www.youtube.com/") || strings.HasPrefix(link, "https://youtu.be/") {
rExt = "mp4"
} else {
rExt = result.Info.Ext
}
2023-10-05 21:21:26 +02:00
downloadResult, err := result.Download(context.Background(), "best")
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
2023-12-03 15:58:33 +01:00
//app.Send(target, "Downloaded.", msg)
fileName := fmt.Sprintf("/public/uploads/%s.%s", identifier, rExt)
2023-10-05 21:21:26 +02:00
f, err := os.Create(fileName)
2023-12-03 15:58:33 +01:00
//app.Send(target, fmt.Sprintf("Filename: %s", fileName), msg)
2023-10-05 21:21:26 +02:00
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
defer f.Close()
if _, err = io.Copy(f, downloadResult); err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
downloadResult.Close()
f.Close()
go app.NewUpload("kappa", fileName, target, identifier, msg)
2023-10-05 21:21:26 +02:00
}
2024-02-28 11:53:39 +01:00
// GoFileDownload downloads a given link with yt-dlp and then passes the result to the NewUpload function
// with gofile.io as destination.
func (app *application) GofileDownload(target, link, identifier string, msg twitch.PrivateMessage) {
2023-10-05 21:21:26 +02:00
goutubedl.Path = "yt-dlp"
app.Send(target, "Downloading... dankCircle", msg)
2023-10-05 21:21:26 +02:00
result, err := goutubedl.New(context.Background(), link, goutubedl.Options{})
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
safeFilename := fmt.Sprintf("download_%s", result.Info.Title)
// For some reason youtube links return webm as result.Info.Ext but
// are in reality mp4.
var rExt string
if strings.HasPrefix(link, "https://www.youtube.com/") || strings.HasPrefix(link, "https://youtu.be/") {
rExt = "mp4"
} else {
rExt = result.Info.Ext
}
2023-10-05 21:21:26 +02:00
downloadResult, err := result.Download(context.Background(), "best")
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
2023-12-03 15:58:33 +01:00
//app.Send(target, "Downloaded.", msg)
fileName := fmt.Sprintf("/public/uploads/%s.%s", safeFilename, rExt)
2023-10-05 21:21:26 +02:00
f, err := os.Create(fileName)
2023-12-03 15:58:33 +01:00
//app.Send(target, fmt.Sprintf("Filename: %s", fileName), msg)
2023-10-05 21:21:26 +02:00
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
defer f.Close()
if _, err = io.Copy(f, downloadResult); err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
downloadResult.Close()
f.Close()
// duration := 5 * time.Second
// dl.twitchClient.Say(target, "ResidentSleeper ..")
// time.Sleep(duration)
go app.NewUpload("gofile", fileName, target, identifier, msg)
2023-10-05 21:21:26 +02:00
}
2024-02-28 11:53:39 +01:00
// CatboxDownload downloads a given link with yt-dlp and then passes the result to NewUpload function
// with catbox.moe as destination.
func (app *application) CatboxDownload(target, link, identifier string, msg twitch.PrivateMessage) {
2023-10-05 21:21:26 +02:00
goutubedl.Path = "yt-dlp"
var fileName string
app.Send(target, "Downloading... dankCircle", msg)
2023-10-05 21:21:26 +02:00
result, err := goutubedl.New(context.Background(), link, goutubedl.Options{})
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
// I don't know why but I need to set it to mp4, otherwise if
// I use `result.Into.Ext` catbox won't play the video in the
// browser and say this message:
// `No video with supported format and MIME type found.`
rExt := "mp4"
downloadResult, err := result.Download(context.Background(), "best")
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
fileName = fmt.Sprintf("/public/uploads/%s.%s", identifier, rExt)
2023-10-05 21:21:26 +02:00
f, err := os.Create(fileName)
if err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
defer f.Close()
if _, err = io.Copy(f, downloadResult); err != nil {
app.Log.Errorln(err)
app.Send(target, fmt.Sprintf("Something went wrong FeelsBadMan: %q", err), msg)
2023-10-05 21:21:26 +02:00
return
}
downloadResult.Close()
f.Close()
go app.NewUpload("catbox", fileName, target, identifier, msg)
2023-10-05 21:21:26 +02:00
}