Skip to content

Commit 3f9f11d

Browse files
committed
feat: 支持macOS
1 parent 7626215 commit 3f9f11d

File tree

3 files changed

+54
-31
lines changed

3 files changed

+54
-31
lines changed

internal/service/subtitle_service.go

+26-11
Original file line numberDiff line numberDiff line change
@@ -191,16 +191,19 @@ func (s Service) GetTaskStatus(req dto.GetVideoSubtitleTaskReq) (*dto.GetVideoSu
191191
// 新版流程:链接->本地音频文件->扣费->视频信息获取(若有)->本地字幕文件->cos上的字幕信息
192192

193193
func (s Service) linkToAudioFile(ctx context.Context, stepParam *types.SubtitleTaskStepParam) error {
194-
var err error
194+
var (
195+
err error
196+
output []byte
197+
)
195198
link := stepParam.Link
196199
audioPath := fmt.Sprintf("%s/%s", stepParam.TaskBasePath, types.SubtitleTaskAudioFileName)
197200
if strings.Contains(link, "local:") {
198201
// 本地文件
199202
videoPath := strings.ReplaceAll(link, "local:", "")
200203
cmd := exec.Command(storage.FfmpegPath, "-i", videoPath, "-vn", "-ar", "44100", "-ac", "2", "-ab", "192k", "-f", "mp3", audioPath)
201-
err = cmd.Run()
204+
output, err = cmd.CombinedOutput()
202205
if err != nil {
203-
log.GetLogger().Error("generateAudioSubtitles.Step1LinkToAudio ffmpeg err", zap.Any("step param", stepParam), zap.Error(err))
206+
log.GetLogger().Error("generateAudioSubtitles.Step1LinkToAudio ffmpeg err", zap.Any("step param", stepParam), zap.String("output", string(output)), zap.Error(err))
204207
return err
205208
}
206209
} else if strings.Contains(link, "youtube.com") {
@@ -215,10 +218,13 @@ func (s Service) linkToAudioFile(ctx context.Context, stepParam *types.SubtitleT
215218
cmdArgs := []string{"-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "192K", "-o", audioPath, stepParam.Link}
216219

217220
cmdArgs = append(cmdArgs, "--cookies", "./cookies.txt")
221+
if storage.FfmpegPath != "ffmpeg" {
222+
cmdArgs = append(cmdArgs, "--ffmpeg-location", storage.FfmpegPath)
223+
}
218224
cmd := exec.Command(storage.YtdlpPath, cmdArgs...)
219-
err = cmd.Run()
225+
output, err = cmd.CombinedOutput()
220226
if err != nil {
221-
log.GetLogger().Error("generateAudioSubtitles.Step2DownloadAudio yt-dlp err", zap.Any("step param", stepParam), zap.Error(err))
227+
log.GetLogger().Error("generateAudioSubtitles.Step2DownloadAudio yt-dlp err", zap.Any("step param", stepParam), zap.String("output", string(output)), zap.Error(err))
222228
return err
223229
}
224230
} else if strings.Contains(link, "bilibili.com") {
@@ -228,14 +234,17 @@ func (s Service) linkToAudioFile(ctx context.Context, stepParam *types.SubtitleT
228234
}
229235
stepParam.Link = "https://www.bilibili.com/video/" + videoId
230236
cmdArgs := []string{"-f", "bestaudio[ext=m4a]", "-x", "--audio-format", "mp3", "-o", audioPath, stepParam.Link}
237+
if storage.FfmpegPath != "ffmpeg" {
238+
cmdArgs = append(cmdArgs, "--ffmpeg-location", storage.FfmpegPath)
239+
}
231240
//proxy := conf.GetString("subtitle.proxy")
232241
//if proxy != "" {
233242
// cmdArgs = append(cmdArgs, "--proxy", proxy)
234243
//}
235244
cmd := exec.Command(storage.YtdlpPath, cmdArgs...)
236-
err = cmd.Run()
245+
output, err = cmd.CombinedOutput()
237246
if err != nil {
238-
log.GetLogger().Error("generateAudioSubtitles.Step2DownloadAudio yt-dlp err", zap.Any("step param", stepParam), zap.Error(err))
247+
log.GetLogger().Error("generateAudioSubtitles.Step2DownloadAudio yt-dlp err", zap.Any("step param", stepParam), zap.String("output", string(output)), zap.Error(err))
239248
return err
240249
}
241250
} else {
@@ -267,18 +276,24 @@ func (s Service) getVideoInfo(ctx context.Context, stepParam *types.SubtitleTask
267276
//}
268277
titleCmdArgs = append(titleCmdArgs, "--cookies", "./cookies.txt")
269278
descriptionCmdArgs = append(descriptionCmdArgs, "--cookies", "./cookies.txt")
279+
if storage.FfmpegPath != "ffmpeg" {
280+
titleCmdArgs = append(titleCmdArgs, "--ffmpeg-location", storage.FfmpegPath)
281+
descriptionCmdArgs = append(descriptionCmdArgs, "--ffmpeg-location", storage.FfmpegPath)
282+
}
270283
cmd := exec.Command(storage.YtdlpPath, titleCmdArgs...)
271284
var output []byte
272-
output, err = cmd.Output()
285+
output, err = cmd.CombinedOutput()
273286
if err != nil {
274-
log.GetLogger().Error("getVideoInfo yt-dlp error", zap.Any("stepParam", stepParam), zap.Error(err))
287+
log.GetLogger().Error("getVideoInfo yt-dlp error", zap.Any("stepParam", stepParam), zap.String("output", string(output)), zap.Error(err))
288+
output = []byte{}
275289
// 不需要整个流程退出
276290
}
277291
title = string(output)
278292
cmd = exec.Command(storage.YtdlpPath, descriptionCmdArgs...)
279-
output, err = cmd.Output()
293+
output, err = cmd.CombinedOutput()
280294
if err != nil {
281-
log.GetLogger().Error("getVideoInfo yt-dlp error", zap.Any("stepParam", stepParam), zap.Error(err))
295+
log.GetLogger().Error("getVideoInfo yt-dlp error", zap.Any("stepParam", stepParam), zap.String("output", string(output)), zap.Error(err))
296+
output = []byte{}
282297
}
283298
description = string(output)
284299
log.GetLogger().Debug("getVideoInfo title and description", zap.String("title", title), zap.String("description", description))

main

22.6 MB
Binary file not shown.

pkg/util/base.go

+28-20
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"go.uber.org/zap"
77
"io"
8+
"krillin-ai/config"
89
"krillin-ai/internal/storage"
910
"krillin-ai/log"
1011
"math"
@@ -76,20 +77,33 @@ func IsNumber(s string) bool {
7677
return err == nil
7778
}
7879

79-
// DownloadFile 下载文件并保存到指定路径
80-
func DownloadFile(url, filepath string) error {
81-
out, err := os.Create(filepath)
80+
// DownloadFile 下载文件并保存到指定路径,支持代理
81+
func DownloadFile(urlStr, filepath, proxyAddr string) error {
82+
proxyURL, err := url.Parse(proxyAddr)
8283
if err != nil {
8384
return err
8485
}
85-
defer out.Close()
8686

87-
resp, err := http.Get(url)
87+
client := &http.Client{}
88+
89+
if proxyURL != nil {
90+
client.Transport = &http.Transport{
91+
Proxy: http.ProxyURL(proxyURL),
92+
}
93+
}
94+
95+
resp, err := client.Get(urlStr)
8896
if err != nil {
8997
return err
9098
}
9199
defer resp.Body.Close()
92100

101+
out, err := os.Create(filepath)
102+
if err != nil {
103+
return err
104+
}
105+
defer out.Close()
106+
93107
_, err = io.Copy(out, resp.Body)
94108
return err
95109
}
@@ -169,7 +183,7 @@ func CheckAndDownloadFfmpeg() error {
169183

170184
// 下载
171185
ffmpegDownloadPath := "./bin/ffmpeg.zip"
172-
err = DownloadFile(ffmpegURL, ffmpegDownloadPath)
186+
err = DownloadFile(ffmpegURL, ffmpegDownloadPath, config.Conf.App.Proxy)
173187
if err != nil {
174188
log.GetLogger().Error("下载ffmpeg失败", zap.Error(err))
175189
return err
@@ -229,7 +243,7 @@ func CheckAndDownloadFfprobe() error {
229243

230244
// 下载
231245
ffprobeDownloadPath := "./bin/ffprobe.zip"
232-
err = DownloadFile(ffprobeURL, ffprobeDownloadPath)
246+
err = DownloadFile(ffprobeURL, ffprobeDownloadPath, config.Conf.App.Proxy)
233247
if err != nil {
234248
log.GetLogger().Error("下载ffprobe失败", zap.Error(err))
235249
return err
@@ -285,32 +299,26 @@ func CheckAndDownloadYtDlp() error {
285299
return fmt.Errorf("unsupported OS: %s", runtime.GOOS)
286300
}
287301

288-
ytDlpPathLocal := "./bin/yt-dlp"
289-
if runtime.GOOS != "windows" {
290-
err = os.Chmod(ytDlpPathLocal, 0755)
291-
if err != nil {
292-
log.GetLogger().Error("设置文件权限失败", zap.Error(err))
293-
return err
294-
}
295-
} else {
296-
ytDlpPathLocal += ".exe"
302+
ytDlpDownloadPath := "./bin/yt-dlp"
303+
if runtime.GOOS == "windows" {
304+
ytDlpDownloadPath += ".exe"
297305
}
298-
err = DownloadFile(ytDlpURL, ytDlpPathLocal)
306+
err = DownloadFile(ytDlpURL, ytDlpDownloadPath, config.Conf.App.Proxy)
299307
if err != nil {
300308
log.GetLogger().Error("下载yt-dlp失败", zap.Error(err))
301309
return err
302310
}
303311

304312
if runtime.GOOS != "windows" {
305-
err = os.Chmod(ytDlpPathLocal, 0755)
313+
err = os.Chmod(ytDlpDownloadPath, 0755)
306314
if err != nil {
307315
log.GetLogger().Error("设置文件权限失败", zap.Error(err))
308316
return err
309317
}
310318
}
311319

312-
storage.YtdlpPath = ytDlpPathLocal
313-
log.GetLogger().Info("yt-dlp安装完成", zap.String("路径", ytDlpPathLocal))
320+
storage.YtdlpPath = ytDlpDownloadPath
321+
log.GetLogger().Info("yt-dlp安装完成", zap.String("路径", ytDlpDownloadPath))
314322

315323
return nil
316324
}

0 commit comments

Comments
 (0)