/* * @Author: BlackTeay * @Date: 2024-04-30 09:37:39 * @LastEditTime: 2024-05-09 16:08:54 * @LastEditors: BlackTeay * @Description: * @FilePath: /hls_builder/main.go * Copyright 2024 JLNTV NMTD, All Rights Reserved. */ package main import ( _ "embed" "errors" "fmt" "log" "net/url" "os" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/dialog" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/storage" "fyne.io/fyne/v2/widget" "github.com/google/uuid" ) // main 是应用程序的入口点。 func main() { // 打印当前工作目录 log.Println("Current path:", os.Getenv("PWD")) // 初始化应用并设置主题 myApp := app.NewWithID("hls_builder") myApp.Settings().SetTheme(MyTheme{}) // 创建主窗口并设置大小 myWindow := myApp.NewWindow("HLS-builder 视频切片上传工具") myWindow.Resize(fyne.NewSize(750, 550)) // 初始化UI组件:文件选择提示、输出路径选择提示、进度条 inputFile := widget.NewLabel("请选择mp4文件!") outputDir := widget.NewLabel("请选择输出路径!") sliceProgressBar := widget.NewProgressBar() uploadProgressBar := widget.NewProgressBar() // 创建选择视频文件按钮并设置点击事件 btnSelectFile := widget.NewButton("选择mp4文件", func() { // 设置文件类型过滤器 filter := storage.NewExtensionFileFilter([]string{".mp4"}) fileDialog := dialog.NewFileOpen(func(file fyne.URIReadCloser, err error) { if err != nil { log.Println("Error opening file:", err) return } if file != nil { log.Println("Opened file:", file.URI().Path()) inputFile.SetText(file.URI().Path()) } }, myWindow) fileDialog.SetFilter(filter) fileDialog.Show() }) // 创建选择输出路径按钮并设置点击事件 btnSelectOutput := widget.NewButton("选择输出路径", func() { dialog.ShowFolderOpen(func(uri fyne.ListableURI, err error) { if err == nil && uri != nil { log.Println("Selected folder:", uri.Path()) outputDir.SetText(uri.Path()) } }, myWindow) }) var randDir string var hlsDir string // 初始化上传按钮 uploadLabel := widget.NewLabel("上传切片到Ucloud:") var btnUpload *widget.Button btnUpload = widget.NewButton("上传", func() { btnUpload.Text = "正在上传..." btnUpload.Disable() // 调用上传函数,并在上传完成后启用按钮 go upload(hlsDir, randDir, uploadProgressBar, myWindow, func() { btnUpload.Text = "上传" btnUpload.Enable() }) }) // 初始化切片按钮及相关变量 var btnSlice *widget.Button btnSlice = widget.NewButton("开始切片", func() { fmt.Println(inputFile.Text) fmt.Println(outputDir.Text) // 验证用户选择 if inputFile.Text == "请选择mp4文件!" || outputDir.Text == "请选择输出路径!" { dialog.ShowError(errors.New("请选择视频文件和输出路径"), myWindow) return } // 禁用UI元素以防止用户干预 btnSelectFile.Disable() btnSelectOutput.Disable() btnSlice.Disable() btnSlice.SetText("切片中...") // 生成随机目录名并在输出路径下创建该目录 randDir = uuid.New().String() hlsDir = outputDir.Text + "/" + randDir err := os.Mkdir(hlsDir, 0755) if err != nil { dialog.ShowError(errors.New("建立随机目录出错!"), myWindow) } // 调用切片函数,并在切片完成后更新UI go sliceVideo(inputFile.Text, hlsDir, sliceProgressBar, func() { btnSelectFile.Enable() btnSelectOutput.Enable() btnSlice.Enable() btnSlice.SetText("开始切片") }, btnSelectFile, btnSelectOutput, btnSlice, btnUpload, myWindow) }) btnUpload.Disable() copyRight := widget.NewLabelWithStyle("© 2024 JLNTV ", fyne.TextAlignCenter, fyne.TextStyle{Bold: true}) blogLink := widget.NewHyperlink("BlackTeay", createURL("https://iteay.top")) copyRightHyperlink := container.NewHBox(copyRight, blogLink) // 创建一个水平和垂直居中的布局 centeredLayout := container.NewBorder(nil, nil, nil, nil, copyRightHyperlink) // 组合UI元素 content := container.NewVBox( inputFile, btnSelectFile, outputDir, btnSelectOutput, sliceProgressBar, btnSlice, uploadLabel, btnUpload, uploadProgressBar, ) // 将内容放置在水平和垂直居中的布局中 centeredContent := container.New(layout.NewVBoxLayout(), content, centeredLayout) // 设置窗口内容并显示 myWindow.SetContent(centeredContent) myWindow.ShowAndRun() } // createURL 是一个用于创建并返回一个url.URL指针的函数。 // 它接受一个字符串类型的参数link,表示待解析的URL链接。 // 如果链接解析失败,将会记录错误信息并终止程序。 // // 参数: // // link string - 待解析的URL字符串。 // // 返回值: // // *url.URL - 解析后的URL结构体指针。 func createURL(link string) *url.URL { // 解析提供的链接 url, err := url.Parse(link) if err != nil { // 如果解析失败,记录错误信息并终止程序 log.Fatalf("Error parsing URL: %v", err) } return url }