VideoConcat/wails/main.go
2026-01-10 19:00:52 +08:00

150 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"embed"
"io/fs"
"os"
"videoconcat/services"
"github.com/wailsapp/wails/v3/pkg/application"
)
//go:embed assets
var assets embed.FS
// 在开发模式下列出嵌入的文件,用于调试
func init() {
if os.Getenv("DEV") == "true" {
fs.WalkDir(assets, ".", func(path string, d fs.DirEntry, err error) error {
if err == nil {
services.LogDebugf("嵌入资源: %s (目录: %v)", path, d.IsDir())
}
return nil
})
}
}
// getEmbeddedFFmpeg 在平台特定文件中实现ffmpeg_darwin.go, ffmpeg_windows.go, ffmpeg_linux.go, ffmpeg_default.go
// 根据编译时的 GOOS 自动选择对应的实现
// 注意:此函数没有在此文件中声明,而是在平台特定文件中声明和实现
func main() {
// 检测开发模式并设置日志级别
if os.Getenv("DEV") == "true" {
services.SetLogLevel("DEBUG")
services.LogInfo("=== 开发模式启动 ===")
services.LogDebug("详细日志已启用")
}
// 注意:如果看到 "SetProcessDpiAwarenessContext failed" 错误,这是非致命的
// Wails 运行时尝试设置 DPI 感知,但清单文件已经声明了 DPI 感知
// Windows 可能不允许运行时再次设置,这不会影响应用功能
// 初始化 FFmpeg 助手(传递嵌入的文件系统,根据编译平台自动选择)
services.InitFFmpegHelper(getEmbeddedFFmpeg())
// 创建服务
services.LogDebug("开始创建服务...")
videoService := services.NewVideoService()
extractService := services.NewExtractService()
authService := services.NewAuthService()
fileService := services.NewFileService()
services.LogDebug("所有服务创建完成")
services.LogDebug("创建 Wails 应用...")
// 尝试不同的路径映射方式
// 方式1使用子文件系统推荐去除 "assets" 前缀
// 这样 /index.html 会映射到 assets/index.html
assetsFS, err := fs.Sub(assets, "assets")
var useSubFS bool
if err != nil {
services.LogErrorf("创建子文件系统失败: %v使用原始文件系统", err)
assetsFS = assets
useSubFS = false
} else {
services.LogDebug("成功创建子文件系统")
useSubFS = true
}
app := application.New(application.Options{
Name: "VideoConcat",
Description: "视频拼接工具",
Assets: application.AssetOptions{Handler: application.AssetFileServerFS(assetsFS)},
Services: []application.Service{
application.NewService(videoService),
application.NewService(extractService),
application.NewService(authService),
application.NewService(fileService),
},
Mac: application.MacOptions{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
services.LogDebug("Wails 应用创建完成")
// 创建窗口
services.LogDebug("创建应用窗口...")
window := app.Window.NewWithOptions(application.WebviewWindowOptions{
Title: "视频拼接工具",
Width: 1100,
Height: 800,
MinWidth: 800,
MinHeight: 600,
DevToolsEnabled: true, // 暂时启用开发者工具以便调试
})
// 加载主页面
// 使用子文件系统时,路径映射:
// URL /index.html -> 文件系统 index.html (对应 assets/index.html)
// URL /assets/xxx.js -> 文件系统 assets/xxx.js (对应 assets/assets/xxx.js)
urlPath := "/index.html"
if !useSubFS {
// 如果不使用子文件系统,需要调整路径
urlPath = "/assets/index.html"
services.LogWarn("未使用子文件系统URL 路径: " + urlPath)
}
window.SetURL(urlPath)
services.LogInfo("应用窗口已创建URL: " + urlPath)
// 注意:如果页面空白,可能是:
// 1. JavaScript 文件加载失败(检查网络请求)
// 2. Vue 应用未正确挂载
// 3. 资源路径不正确(虽然验证通过,但实际加载时可能有问题)
// 验证文件是否存在并列出所有可用文件(用于调试)
// 使用 LogInfo 确保在所有模式下都能看到
services.LogInfo("=== 开始验证嵌入的资源文件 ===")
// 列出所有文件
fs.WalkDir(assetsFS, ".", func(path string, d fs.DirEntry, err error) error {
if err == nil {
if d.IsDir() {
services.LogInfof("目录: %s", path)
} else {
services.LogInfof("文件: %s", path)
}
}
return nil
})
// 验证关键文件
testFiles := []string{"index.html", "assets/index-B-ziti-G.js", "assets/index-dkqEFoMI.css"}
for _, file := range testFiles {
if data, err := assetsFS.Open(file); err == nil {
data.Close()
services.LogInfof("✓ 验证成功: %s 存在", file)
} else {
services.LogErrorf("✗ 验证失败: %s 不存在 - %v", file, err)
}
}
services.LogInfo("=== 验证完成 ===")
services.LogInfo("=== 应用启动完成,开始运行 ===")
if err := app.Run(); err != nil {
services.LogErrorf("应用运行错误: %v", err)
panic(err)
}
}