176 lines
4.9 KiB
Go
176 lines
4.9 KiB
Go
/*
|
||
* @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
|
||
}
|