From a46b8388c7dfe8046807580dc154a97297f4ed68 Mon Sep 17 00:00:00 2001 From: orestonce Date: Tue, 9 Aug 2022 21:02:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=BD=E4=BB=A4=E8=A1=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E4=B8=80=E4=B8=AA=E7=9B=AE=E5=BD=95=E4=B8=8B?= =?UTF-8?q?=E7=9A=84ts=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- cmd/main.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 524da6c..92b4216 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ * 显示下载速度、合并ts的速度 * 提供macos的图形化界面 * 支持设置代理: http/socks5 - * http代理解释: 要访问的真实url是http协议, 使用代理服务器可见的GET形式; 如果要访问的真实url是https协议, 使用代理服务器不可见的CONNECT形式 + * http代理解释: 要访问的真实url是http协议, 使用代理服务器可见的GET形式; 如果要访问的真实url是https协议, 使用代理服务器不可见的CONNECT形式 ## TODO: * [ ] 支持多国语言 * [ ] 支持从一个txt里读取下载列表,批量下载 diff --git a/cmd/main.go b/cmd/main.go index c0ea8e2..962407b 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -1,9 +1,16 @@ package main import ( + "context" "fmt" "github.com/spf13/cobra" + "io/ioutil" + "log" "m3u8d" + "os" + "path/filepath" + "sort" + "strings" ) var rootCmd = &cobra.Command{ @@ -50,6 +57,54 @@ var curlCmd = &cobra.Command{ var gRunReq m3u8d.RunDownload_Req +var gMergeReq struct { + InputTsDir string + OutputMp4Name string +} + +var mergeCmd = &cobra.Command{ + Use: "merge", + Run: func(cmd *cobra.Command, args []string) { + if gMergeReq.InputTsDir == "" { + var err error + gMergeReq.InputTsDir, err = os.Getwd() + if err != nil { + log.Fatalln("获取当前目录失败") + return + } + } + fList, err := ioutil.ReadDir(gMergeReq.InputTsDir) + if err != nil { + log.Fatalln("读取目录失败", err) + return + } + var tsFileList []string + for _, f := range fList { + if f.Mode().IsRegular() && strings.HasSuffix(strings.ToLower(f.Name()), ".ts") { + tsFileList = append(tsFileList, filepath.Join(gMergeReq.InputTsDir, f.Name())) + } + } + if len(tsFileList) == 0 { + log.Fatalln("目录下不存在ts文件", gMergeReq.InputTsDir) + return + } + sort.Strings(tsFileList) // 按照字典顺序排序 + if gMergeReq.OutputMp4Name == "" { + gMergeReq.OutputMp4Name = filepath.Join(gMergeReq.InputTsDir, "all.mp4") + } + err = m3u8d.MergeTsFileListToSingleMp4(m3u8d.MergeTsFileListToSingleMp4_Req{ + TsFileList: tsFileList, + OutputMp4: gMergeReq.OutputMp4Name, + Ctx: context.Background(), + }) + if err != nil { + log.Fatalln("合并失败", err) + return + } + log.Println("合并成功", gMergeReq.OutputMp4Name) + }, +} + func init() { downloadCmd.Flags().StringVarP(&gRunReq.M3u8Url, "M3u8Url", "u", "", "M3u8Url") downloadCmd.Flags().BoolVarP(&gRunReq.Insecure, "Insecure", "", false, "是否允许不安全的请求") @@ -61,6 +116,9 @@ func init() { rootCmd.AddCommand(downloadCmd) curlCmd.DisableFlagParsing = true rootCmd.AddCommand(curlCmd) + mergeCmd.Flags().StringVarP(&gMergeReq.InputTsDir, "InputTsDir", "", "", "存放ts文件的目录(默认为当前工作目录)") + mergeCmd.Flags().StringVarP(&gMergeReq.OutputMp4Name, "OutputMp4Name", "", "", "输出mp4文件名(默认为输入ts文件的目录下的all.mp4)") + rootCmd.AddCommand(mergeCmd) } func main() {