download command finalized, beta
This commit is contained in:
parent
24bbd8926c
commit
26cddc7ae7
5 changed files with 157 additions and 71 deletions
|
@ -5,20 +5,52 @@ import (
|
||||||
"log"
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SendMessage(message tgbotapi.MessageConfig, bot *tgbotapi.BotAPI) {
|
func SendMessage(message tgbotapi.MessageConfig, bot *tgbotapi.BotAPI) (result tgbotapi.Message) {
|
||||||
_, err := bot.Send(message)
|
result, err := bot.Send(message)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to send message: %v\n", err)
|
log.Printf("Failed to send message: %v\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Printf("[bot] Sent Message: %s", message.Text)
|
log.Printf("[bot] Sent Message: %s", message.Text)
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendSticker(sticker tgbotapi.StickerConfig, bot *tgbotapi.BotAPI) {
|
func EditMessage(message tgbotapi.EditMessageTextConfig, bot *tgbotapi.BotAPI) (result tgbotapi.Message) {
|
||||||
_, err := bot.Send(sticker)
|
result, err := bot.Send(message)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to send message: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("[bot] Edited Message: %s", message.Text)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendVideo(message tgbotapi.VideoConfig, bot *tgbotapi.BotAPI) (result tgbotapi.Message) {
|
||||||
|
result, err := bot.Send(message)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to send message: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("[bot] Sent Video: %s", message.File)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendPhoto(message tgbotapi.PhotoConfig, bot *tgbotapi.BotAPI) (result tgbotapi.Message) {
|
||||||
|
result, err := bot.Send(message)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to send message: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Printf("[bot] Sent Photo: %s", message.File)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendSticker(sticker tgbotapi.StickerConfig, bot *tgbotapi.BotAPI) (result tgbotapi.Message) {
|
||||||
|
result, err := bot.Send(sticker)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to send Sticker: %v\n", err)
|
log.Printf("Failed to send Sticker: %v\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Printf("[bot] Sent Sticker")
|
log.Printf("[bot] Sent Sticker")
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ func Commands(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
|
||||||
notify.Reminder(update, bot)
|
notify.Reminder(update, bot)
|
||||||
case "download":
|
case "download":
|
||||||
go download.Download(update, bot)
|
go download.Download(update, bot)
|
||||||
|
case "dl":
|
||||||
|
go download.Download(update, bot)
|
||||||
case "help":
|
case "help":
|
||||||
help(update, bot)
|
help(update, bot)
|
||||||
case "info":
|
case "info":
|
||||||
|
|
|
@ -3,110 +3,96 @@ package download
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
||||||
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"watn3y/bloaterbotv3/botIO"
|
"watn3y/bloaterbotv3/botIO"
|
||||||
|
"watn3y/bloaterbotv3/commonlogic"
|
||||||
"watn3y/bloaterbotv3/config"
|
"watn3y/bloaterbotv3/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Download(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
|
func Download(update tgbotapi.Update, bot *tgbotapi.BotAPI) {
|
||||||
|
|
||||||
log.Println("[download] Downloading Video URL " + update.Message.CommandArguments() + " for " + strconv.FormatInt(update.Message.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
|
log.Println("[download] Downloading URL " + update.Message.CommandArguments() + " for " + strconv.FormatInt(update.Message.From.ID, 10) + " in chat " + strconv.FormatInt(update.Message.Chat.ID, 10))
|
||||||
|
|
||||||
commandArgs := strings.Fields(update.Message.CommandArguments())
|
commandArgs := strings.Fields(update.Message.CommandArguments())
|
||||||
var arg string
|
|
||||||
if len(commandArgs) >= 0 {
|
|
||||||
arg = commandArgs[0]
|
|
||||||
} else {
|
|
||||||
log.Println("[download] Failed to download Video URL " + update.Message.CommandArguments() + " NO URL")
|
|
||||||
message := tgbotapi.MessageConfig{
|
|
||||||
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
|
||||||
Text: "Please specify a valid YouTube or Reddit URL to download a Video",
|
|
||||||
}
|
|
||||||
botIO.SendMessage(message, bot)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
service := matchURL(arg)
|
|
||||||
|
|
||||||
if service == "" {
|
msg := tgbotapi.MessageConfig{
|
||||||
log.Println("[download] Failed to download Video URL " + update.Message.CommandArguments() + " INVALID URL")
|
|
||||||
message := tgbotapi.MessageConfig{
|
|
||||||
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
||||||
Text: "Please specify a valid YouTube or Reddit URL to download a Video",
|
Text: "Downloading your media...",
|
||||||
}
|
}
|
||||||
botIO.SendMessage(message, bot)
|
workingMessage := botIO.SendMessage(msg, bot)
|
||||||
|
|
||||||
|
if len(commandArgs) >= 1 && matchURL(commandArgs[0]) != "" {
|
||||||
|
//TODO distinguish
|
||||||
|
//service := matchURL(commandArgs[0])
|
||||||
|
} else {
|
||||||
|
log.Println("[download] Failed to download URL " + update.Message.CommandArguments() + " NO URL")
|
||||||
|
message := tgbotapi.EditMessageTextConfig{
|
||||||
|
BaseEdit: tgbotapi.BaseEdit{ChatID: workingMessage.Chat.ID, MessageID: workingMessage.MessageID},
|
||||||
|
Text: "Please specify a valid YouTube or Reddit URL to download something\\nI can only download media that is hosted by YouTube or Reddit. Reddit posts that link to Imgur, for example, won't work\"",
|
||||||
|
}
|
||||||
|
botIO.EditMessage(message, bot)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
downloadTarget := randomString(20)
|
downloadTarget := randomString(20)
|
||||||
|
|
||||||
videoDownloaded := runYTDL(arg, downloadTarget)
|
downloaded := runYTDL(commandArgs[0], downloadTarget)
|
||||||
|
|
||||||
if !videoDownloaded {
|
if !downloaded {
|
||||||
message := tgbotapi.MessageConfig{
|
message := tgbotapi.EditMessageTextConfig{
|
||||||
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
BaseEdit: tgbotapi.BaseEdit{ChatID: workingMessage.Chat.ID, MessageID: workingMessage.MessageID},
|
||||||
Text: "Something went wrong while downloading your video :(",
|
Text: "Something went wrong while downloading your media :(",
|
||||||
}
|
}
|
||||||
botIO.SendMessage(message, bot)
|
botIO.EditMessage(message, bot)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
files, err := os.ReadDir("./videos/" + downloadTarget)
|
files, err := os.ReadDir("./videos/" + downloadTarget)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("[download] Failed to process Video URL "+update.Message.CommandArguments(), " FAILED TO READ DIRECTORY: ", err.Error())
|
log.Println("[download] Failed to process URL "+update.Message.CommandArguments(), " FAILED TO READ DIRECTORY: ", err.Error())
|
||||||
message := tgbotapi.MessageConfig{
|
|
||||||
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
message := tgbotapi.EditMessageTextConfig{
|
||||||
Text: "Something went wrong while downloading your video :(",
|
BaseEdit: tgbotapi.BaseEdit{ChatID: workingMessage.Chat.ID, MessageID: workingMessage.MessageID},
|
||||||
|
Text: "Something went wrong while downloading your media :(",
|
||||||
}
|
}
|
||||||
botIO.SendMessage(message, bot)
|
botIO.EditMessage(message, bot)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(files) >= 2 {
|
if len(files) > 1 {
|
||||||
log.Println("[download] Failed to process Video URL "+update.Message.CommandArguments(), " TOO MANY FILES")
|
log.Println("[download] Failed to process URL "+update.Message.CommandArguments(), " TOO MANY FILES")
|
||||||
message := tgbotapi.MessageConfig{
|
message := tgbotapi.EditMessageTextConfig{
|
||||||
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
BaseEdit: tgbotapi.BaseEdit{ChatID: workingMessage.Chat.ID, MessageID: workingMessage.MessageID},
|
||||||
Text: "Something went wrong while downloading your video :(",
|
Text: "Something went wrong while downloading your media :(",
|
||||||
}
|
}
|
||||||
botIO.SendMessage(message, bot)
|
botIO.EditMessage(message, bot)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
/*fExt := filepath.Ext(config.BotConfig.Download.Prefix + "/" + downloadTarget + "/" + files[0].Name()
|
message := tgbotapi.EditMessageTextConfig{
|
||||||
|
BaseEdit: tgbotapi.BaseEdit{ChatID: workingMessage.Chat.ID, MessageID: workingMessage.MessageID},
|
||||||
|
Text: "Downloaded! Uploading now",
|
||||||
imageTypes := []string{"jpg","jpeg","png"}
|
|
||||||
|
|
||||||
if commonlogic.ContainsString(imageTypes,fExt) {
|
|
||||||
|
|
||||||
} else if fExt == "mp4" {
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
message := tgbotapi.MessageConfig{
|
|
||||||
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
|
||||||
DisableWebPagePreview: false,
|
|
||||||
Text: "Downloaded! You can get your video at: " + config.BotConfig.Download.Prefix + "/" + downloadTarget + "/" + url.PathEscape(files[0].Name()) + "\n It will be available for 30 Minutes.",
|
|
||||||
}
|
}
|
||||||
botIO.SendMessage(message, bot)
|
botIO.EditMessage(message, bot)
|
||||||
|
|
||||||
time.Sleep(30 * time.Minute)
|
serveMedia(update, bot, downloadTarget, files[0].Name())
|
||||||
|
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
|
|
||||||
|
bot.Send(tgbotapi.NewDeleteMessage(workingMessage.Chat.ID, workingMessage.MessageID))
|
||||||
|
|
||||||
err = os.RemoveAll("./videos/" + downloadTarget)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("[download] Failed to remove old Video "+update.Message.CommandArguments(), err.Error())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func randomString(n int) string {
|
func randomString(n int) string {
|
||||||
|
@ -121,7 +107,7 @@ func randomString(n int) string {
|
||||||
|
|
||||||
func runYTDL(URL string, targetDir string) (success bool) {
|
func runYTDL(URL string, targetDir string) (success bool) {
|
||||||
|
|
||||||
cmd := exec.Command("yt-dlp", "-f", "bv*[ext=mp4]+ba[ext=m4a] / bv*+ba/b", "--no-playlist", "-o", "videos/"+targetDir+"/"+"%(title)s.%(ext)s", URL)
|
cmd := exec.Command("yt-dlp", "-f", "bv*[ext=mp4]+ba[ext=m4a] / bv*+ba/b", "--no-playlist", "-o", "videos/"+targetDir+"/"+"%(title)s.%(ext)s", "--write-thumbnail", "--convert-thumbnails", "jpg", "-o", "thumbnail:videos/"+targetDir+"thumb"+"/"+"%(title)s.%(ext)s", URL)
|
||||||
|
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
var (
|
var (
|
||||||
|
@ -130,19 +116,19 @@ func runYTDL(URL string, targetDir string) (success bool) {
|
||||||
)
|
)
|
||||||
|
|
||||||
if errors.As(err, &ee) {
|
if errors.As(err, &ee) {
|
||||||
log.Println("[download.ytdl] Failed to download Video URL "+URL, " NON ZERO EXIT CODE: ", ee.ExitCode())
|
log.Println("[download.ytdl] Failed to download URL "+URL, " NON ZERO EXIT CODE: ", ee.ExitCode())
|
||||||
success = false
|
success = false
|
||||||
|
|
||||||
} else if errors.As(err, &pe) {
|
} else if errors.As(err, &pe) {
|
||||||
log.Println("[download.ytdl] Failed to download Video URL "+URL, " OS PATH ERROR: ", pe.Error())
|
log.Println("[download.ytdl] Failed to download URL "+URL, " OS PATH ERROR: ", pe.Error())
|
||||||
success = false
|
success = false
|
||||||
|
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
log.Println("[download.ytdl] Failed to download Video URL "+URL, " GENERAL ERROR: ", err.Error())
|
log.Println("[download.ytdl] Failed to download URL "+URL, " GENERAL ERROR: ", err.Error())
|
||||||
success = false
|
success = false
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
log.Println("[download.ytdl] Downloaded Video URL " + URL)
|
log.Println("[download.ytdl] Downloaded URL " + URL)
|
||||||
success = true
|
success = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +143,7 @@ func matchURL(URL string) (matchedURL string) {
|
||||||
parsedURL, err := url.Parse(URL)
|
parsedURL, err := url.Parse(URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var domainRegex = regexp.MustCompile(`(youtube\.com$)|(youtu\.be$)|(reddit\.com$)`)
|
var domainRegex = regexp.MustCompile(`(youtube\.com$)|(youtu\.be$)|(reddit\.com$)`)
|
||||||
|
@ -171,6 +158,63 @@ func matchURL(URL string) (matchedURL string) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func serverFile(file os.File) {
|
func shortURL(URL string) (shorturl string) {
|
||||||
|
resp, err := http.Get(config.BotConfig.Download.Yourls.APIPath + "?signature=" + config.BotConfig.Download.Yourls.Signature + "&action=shorturl&format=simple&url=" + URL)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return string(body)
|
||||||
|
}
|
||||||
|
|
||||||
|
func serveMedia(update tgbotapi.Update, bot *tgbotapi.BotAPI, randomNoise string, file string) {
|
||||||
|
fsPath := "./videos/" + randomNoise + "/" + file
|
||||||
|
fsThumbPath := "./videos/" + randomNoise + "thumb" + "/" + strings.TrimSuffix(file, "mp4") + "jpg"
|
||||||
|
fExt := filepath.Ext(fsPath)
|
||||||
|
|
||||||
|
imageTypes := []string{".jpg", ".jpeg", ".png"}
|
||||||
|
|
||||||
|
shortURL := shortURL(url.PathEscape(config.BotConfig.Download.Prefix + "/" + randomNoise + "/" + (file)))
|
||||||
|
|
||||||
|
fsPathStat, _ := os.Stat(fsPath)
|
||||||
|
|
||||||
|
if fsPathStat.Size() >= 52428800 {
|
||||||
|
fExt = "thisfuckingshitistoobig"
|
||||||
|
}
|
||||||
|
|
||||||
|
if fExt == ".mp4" {
|
||||||
|
vid := tgbotapi.VideoConfig{
|
||||||
|
BaseFile: tgbotapi.BaseFile{BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID}, File: tgbotapi.FilePath(fsPath)},
|
||||||
|
Thumb: tgbotapi.FilePath(fsThumbPath),
|
||||||
|
Caption: shortURL,
|
||||||
|
SupportsStreaming: true,
|
||||||
|
}
|
||||||
|
if _, err := os.Stat(fsThumbPath); err != nil {
|
||||||
|
vid.Thumb = nil
|
||||||
|
}
|
||||||
|
botIO.SendVideo(vid, bot)
|
||||||
|
|
||||||
|
} else if commonlogic.ContainsString(imageTypes, fExt) {
|
||||||
|
pic := tgbotapi.PhotoConfig{
|
||||||
|
BaseFile: tgbotapi.BaseFile{BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID}, File: tgbotapi.FilePath(fsPath)},
|
||||||
|
Caption: shortURL,
|
||||||
|
}
|
||||||
|
botIO.SendPhoto(pic, bot)
|
||||||
|
} else {
|
||||||
|
message := tgbotapi.MessageConfig{
|
||||||
|
BaseChat: tgbotapi.BaseChat{ChatID: update.Message.Chat.ID, ReplyToMessageID: update.Message.MessageID},
|
||||||
|
DisableWebPagePreview: false,
|
||||||
|
ParseMode: "html",
|
||||||
|
Text: shortURL,
|
||||||
|
}
|
||||||
|
botIO.SendMessage(message, bot)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,3 +19,7 @@ ModifyUsers = [-00000,-111111,-22222]
|
||||||
|
|
||||||
[Download]
|
[Download]
|
||||||
Prefix = "http://192.168.0.10:3556"
|
Prefix = "http://192.168.0.10:3556"
|
||||||
|
[Download.Yourls]
|
||||||
|
APIPath = "https://yourl.tld/yourls-api.php"
|
||||||
|
Signature = "u8zibfd876sfvb"
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,10 @@ type config struct {
|
||||||
}
|
}
|
||||||
Download struct {
|
Download struct {
|
||||||
Prefix string
|
Prefix string
|
||||||
|
Yourls struct {
|
||||||
|
APIPath string
|
||||||
|
Signature string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue