Skip to content

Commit

Permalink
add more shit code
Browse files Browse the repository at this point in the history
  • Loading branch information
XiaoMengXinX committed Feb 12, 2023
1 parent ed7ba81 commit b8c7cd7
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 225 deletions.
160 changes: 0 additions & 160 deletions bot/downloader.go

This file was deleted.

2 changes: 2 additions & 0 deletions bot/init.go
Expand Up @@ -90,6 +90,8 @@ via @%s`
fetchInfoFailed = `获取歌曲信息失败`
waitForDown = `等待下载中...`
downloading = `下载中...`
downloadStatus = " %s\n%.2fMB/%.2fMB %d%%"
redownloading = `下载失败,尝试重新下载中...`
uploading = `下载完成, 发送中...`
md5VerFailed = "MD5校验失败"
reTrying = "尝试重新下载中 (%d/%d)"
Expand Down
100 changes: 68 additions & 32 deletions bot/processMusic.go
Expand Up @@ -6,12 +6,14 @@ import (
"net/http"
"os"
"path"
"strconv"
"strings"
"time"

marker "github.com/XiaoMengXinX/163KeyMarker"
"github.com/XiaoMengXinX/Music163Api-Go/api"
"github.com/XiaoMengXinX/Music163Api-Go/types"
downloader "github.com/XiaoMengXinX/SimpleDownloader"
"github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
Expand All @@ -21,6 +23,15 @@ import (
var musicLimiter = make(chan bool, 4)

func processMusic(musicID int, message tgbotapi.Message, bot *tgbotapi.BotAPI) (err error) {
d := downloader.NewDownloader().SetSavePath(cacheDir).SetBreakPoint(true)

timeout, _ := strconv.Atoi(config["DownloadTimeout"])
if timeout != 0 {
d.SetTimeOut(time.Duration(int64(timeout)) * time.Second)
} else {
d.SetTimeOut(60 * time.Second) // 默认超时时间为 60 秒
}

defer func() {
e := recover()
if e != nil {
Expand Down Expand Up @@ -185,50 +196,66 @@ func processMusic(musicID int, message tgbotapi.Message, bot *tgbotapi.BotAPI) (
return err
}

timeStamp := time.Now().UnixMicro()
hostReplacer := strings.NewReplacer("m8.", "m7.", "m801.", "m701.", "m804.", "m701.", "m704.", "m701.")

d, err := newDownloader(url, fmt.Sprintf("%d-%s", timeStamp, path.Base(url)), 8)
if err != nil {
sendFailed(err)
timeStamp := time.Now().UnixMicro()
musicFileName := fmt.Sprintf("%d-%s", timeStamp, path.Base(url))

task, _ := d.NewDownloadTask(url)
host := task.GetHostName()
task.ReplaceHostName(hostReplacer.Replace(host)).ForceHttps().ForceMultiThread()
errCh := task.SetFileName(musicFileName).DownloadWithChannel()

updateStatus := func(task *downloader.DownloadTask, ch chan error, statusText string) (err error) {
var lastUpdateTime int64
loop:
for {
select {
case err = <-ch:
break loop
default:
writtenBytes := task.GetWrittenBytes()
if task.GetFileSize() == 0 || writtenBytes == 0 || time.Now().Unix()-lastUpdateTime < 5 {
continue
}
editMsg = tgbotapi.NewEditMessageText(message.Chat.ID, msgResult.MessageID, fmt.Sprintf(musicInfoMsg+statusText+downloadStatus, songInfo.SongName, songInfo.SongAlbum, songInfo.FileExt, float64(songInfo.MusicSize)/1024/1024, task.CalculateSpeed(time.Millisecond*500), float64(writtenBytes)/1024/1024, float64(task.GetFileSize())/1024/1024, (writtenBytes*100)/task.GetFileSize()))
_, _ = bot.Send(editMsg)
lastUpdateTime = time.Now().Unix()
}
}
return err
}

var isMD5Verified = false
for i := 0; i < maxRetryTimes && songURL.Data[0].Md5 != ""; i++ {
err = d.download()
if err != nil && !isTimeout(err) {
sendFailed(err)
return err
} else if err != nil && isTimeout(err) {
sendFailed(fmt.Errorf(downloadTimeout + "\n" + retryLater))
return err
}

if isMD5Verified, err = verifyMD5(cacheDir+"/"+fmt.Sprintf("%d-%s", timeStamp, path.Base(url)), songURL.Data[0].Md5); !isMD5Verified && config["AutoRetry"] != "false" {
sendFailed(fmt.Errorf("%s\n"+reTrying, err, i+1, maxRetryTimes))
err := os.Remove(cacheDir + "/" + fmt.Sprintf("%d-%s", timeStamp, path.Base(url)))
err = updateStatus(task, errCh, downloading)
if err != nil {
if config["ReverseProxy"] != "" {
ch := task.WithResolvedIpOnHost(config["ReverseProxy"]).DownloadWithChannel()
err = updateStatus(task, ch, redownloading)
if err != nil {
logrus.Errorln(err)
}
if songUrl, _ := api.GetSongURL(data, api.SongURLConfig{Ids: []int{musicID}}); len(songUrl.Data) != 0 {
d, err = newDownloader(url, fmt.Sprintf("%d-%s", timeStamp, path.Base(songUrl.Data[0].Url)), 2)
if err != nil {
sendFailed(err)
return err
}
sendFailed(err)
task.CleanTempFiles()
return err
}
} else {
break
sendFailed(err)
task.CleanTempFiles()
return err
}
}

isMD5Verified, _ := verifyMD5(cacheDir+"/"+musicFileName, songURL.Data[0].Md5)
if !isMD5Verified && songURL.Data[0].Md5 != "" {
err = os.Remove(cacheDir + "/" + fmt.Sprintf("%d-%s", timeStamp, path.Base(url)))
if err != nil {
logrus.Errorln(err)
}
sendFailed(fmt.Errorf("%s\n%s", md5VerFailed, retryLater))
return nil
}

var picPath, resizePicPath string
p, _ := newDownloader(songDetail.Songs[0].Al.PicUrl, fmt.Sprintf("%d-%s", timeStamp, path.Base(songDetail.Songs[0].Al.PicUrl)), 8)
err = p.download()
p, _ := d.NewDownloadTask(songDetail.Songs[0].Al.PicUrl)
err = p.SetFileName(fmt.Sprintf("%d-%s", timeStamp, path.Base(songDetail.Songs[0].Al.PicUrl))).Download()
if err != nil {
logrus.Errorln(err)
} else {
Expand All @@ -255,6 +282,13 @@ func processMusic(musicID int, message tgbotapi.Message, bot *tgbotapi.BotAPI) (
logrus.Errorln(err)
}

var pic *os.File = nil

if picStat != nil && err == nil {
pic, _ = os.Open(musicPic)
defer pic.Close()
}

var replacer = strings.NewReplacer("/", " ", "?", " ", "*", " ", ":", " ", "|", " ", "\\", " ", "<", " ", ">", " ", "\"", " ")
fileName := replacer.Replace(fmt.Sprintf("%v - %v.%v", strings.Replace(songInfo.SongArtists, "/", ",", -1), songInfo.SongName, songInfo.FileExt))
err = os.Rename(cacheDir+"/"+fmt.Sprintf("%d-%s", timeStamp, path.Base(url)), cacheDir+"/"+fileName)
Expand All @@ -267,10 +301,12 @@ func processMusic(musicID int, message tgbotapi.Message, bot *tgbotapi.BotAPI) (
file, _ := os.Open(cacheDir + "/" + fileName)
defer file.Close()

pic, _ := os.Open(musicPic)
defer pic.Close()

err = marker.AddMusicID3V2(file, pic, mark)
if err != nil {
file, _ = os.Open(cacheDir + "/" + fileName)
defer file.Close()
err = marker.AddMusicID3V2(file, nil, mark)
}
if err != nil {
sendFailed(err)
return err
Expand Down
12 changes: 3 additions & 9 deletions config_example.ini
Expand Up @@ -11,7 +11,7 @@ MUSIC_U = YOUR_MUSIC_U
BotAPI = https://api.telegram.org

# 设置 bot 管理员 ID, 用 “," 分隔
BotAdmin = 1234,3456
BotAdmin = 115414,1919810

# 是否开启 bot 的 debug 功能
BotDebug = false
Expand All @@ -34,11 +34,5 @@ MaxRetryTimes = 3
# 下载超时时长 (单位秒, 默认为 60)
DownloadTimeout = 60

# 是否校验更新文件 md5 (默认开启), 若设置为 false 相当于 -no-md5-check 参数
CheckMD5 = true

# 自定义源码路径
SrcPath = ./src

# 自定义 bot 函数入口 (默认为 bot.Start)
BotEntry = bot.Start
# 自定义下载反向代理
ReverseProxy = 114.5.1.4:8080
19 changes: 10 additions & 9 deletions go.mod
Expand Up @@ -5,28 +5,29 @@ go 1.17
require (
github.com/XiaoMengXinX/163KeyMarker v0.0.0-20221030134715-67afb724a936
github.com/XiaoMengXinX/Music163Api-Go v0.1.29
github.com/XiaoMengXinX/SimpleDownloader v0.0.0-20221110191044-7a2606dfcf7c
github.com/glebarez/sqlite v1.5.0
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.0
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
github.com/sirupsen/logrus v1.8.1
gorm.io/gorm v1.24.0
github.com/sirupsen/logrus v1.9.0
gorm.io/gorm v1.24.1
)

require (
github.com/bogem/id3v2 v1.2.0 // indirect
github.com/glebarez/go-sqlite v1.19.1 // indirect
github.com/glebarez/go-sqlite v1.19.2 // indirect
github.com/go-flac/flacpicture v0.2.0 // indirect
github.com/go-flac/flacvorbis v0.1.0 // indirect
github.com/go-flac/go-flac v0.3.1 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
golang.org/x/text v0.3.7 // indirect
modernc.org/libc v1.19.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20220927061507-ef77025ab5aa // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/text v0.4.0 // indirect
modernc.org/libc v1.21.4 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.4.0 // indirect
modernc.org/sqlite v1.19.1 // indirect
modernc.org/sqlite v1.19.4 // indirect
)

0 comments on commit b8c7cd7

Please sign in to comment.