代码拉取完成,页面将自动刷新
同步操作将从 mzky/m4s-converter 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package main
import (
"fmt"
"github.com/bitly/go-simplejson"
"github.com/sirupsen/logrus"
"m4s-converter/common"
"m4s-converter/conver"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
"time"
)
func main() {
var c common.Config
c.InitConfig()
defer c.PanicHandler()
defer c.File.Close()
if c.LockMutex("m4sTool") != nil {
c.MessageBox("只能运行一个实例!")
os.Exit(1)
}
begin := time.Now().Unix()
fmt.Println("查找缓存目录下可转换的文件...")
// 查找m4s文件,并转换为mp4和mp3
if err := filepath.WalkDir(c.CachePath, c.FindM4sFiles); err != nil {
c.MessageBox(fmt.Sprintf("找不到 bilibili 目录下的 m4s 文件:%v", err))
wait()
}
dirs, err := common.GetCacheDir(c.CachePath) // 缓存根目录模式
if err != nil {
c.MessageBox(fmt.Sprintf("找不到 bilibili 的缓存目录:%v", err))
wait()
}
if dirs == nil {
// 判断非缓存根目录时,验证是否为子目录
if common.Exist(filepath.Join(c.CachePath, conver.VideoInfoSuffix)) ||
common.Exist(filepath.Join(c.CachePath, conver.VideoInfoJson)) {
dirs = append(dirs, c.CachePath)
}
}
// 合成音视频文件
var outputDir string
var outputFiles []string
var skipFilePaths []string
for _, v := range dirs {
video, audio, e := c.GetAudioAndVideo(v)
if e != nil {
logrus.Error("找不到已修复的音频和视频文件:", err)
continue
}
info := filepath.Join(v, conver.VideoInfoJson)
if !common.Exist(info) {
info = filepath.Join(v, conver.VideoInfoSuffix)
}
infoStr, e := os.ReadFile(info)
if e != nil {
logrus.Error("找不到videoInfo相关文件: ", info)
continue
}
js, e := simplejson.NewJson(infoStr)
if e != nil {
logrus.Error("videoInfo相关文件解析失败: ", info)
continue
}
groupTitle := common.Filter(js.Get("groupTitle").String())
title := common.Filter(js.Get("title").String())
uname := common.Filter(js.Get("uname").String())
status := common.Filter(js.Get("status").String())
itemId, _ := js.Get("itemId").Int()
if status != "completed" {
skipFilePaths = append(skipFilePaths, v)
logrus.Warn("未缓存完成,跳过合成", v, title+"-"+uname)
continue
}
outputDir = filepath.Join(filepath.Dir(v), "output")
if !common.Exist(outputDir) {
_ = os.Mkdir(outputDir, os.ModePerm)
}
groupDir := filepath.Join(outputDir, groupTitle+"-"+uname)
if !common.Exist(groupDir) {
if err = os.Mkdir(groupDir, os.ModePerm); err != nil {
c.MessageBox("无法创建目录:" + groupDir)
wait()
}
}
outputFile := filepath.Join(groupDir, title+conver.Mp4Suffix)
if common.Exist(outputFile) {
outputFile = filepath.Join(groupDir, title+strconv.Itoa(itemId)+conver.Mp4Suffix)
}
if er := c.Composition(video, audio, outputFile); er != nil {
logrus.Error("合成失败:", er)
continue
}
outputFiles = append(outputFiles, outputFile)
}
end := time.Now().Unix()
logrus.Print("==========================================")
if skipFilePaths != nil {
logrus.Print("跳过的目录:\n" + strings.Join(skipFilePaths, "\n"))
}
if outputFiles != nil {
logrus.Print("合成的文件:\n" + strings.Join(outputFiles, "\n"))
// 打开合成文件目录
go exec.Command("explorer", outputDir).Start()
} else {
logrus.Warn("未合成任何文件!")
}
logrus.Print("已完成本次任务,耗时:", end-begin, "秒")
logrus.Print("==========================================")
wait()
}
func wait() {
fmt.Print("按回车键退出...")
_, _ = fmt.Scanln()
os.Exit(0)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。