package main import ( "context" "embed" "log" "net/http" "sync/atomic" "time" "github.com/wailsapp/wails/v2" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/assetserver" "github.com/wailsapp/wails/v2/pkg/options/windows" "github.com/wailsapp/wails/v2/pkg/runtime" "github.com/qingwuyingxing/douyin-live-fetcher/internal/api" "github.com/qingwuyingxing/douyin-live-fetcher/internal/broadcaster" "github.com/qingwuyingxing/douyin-live-fetcher/internal/db" ) //go:embed all:frontend/dist //go:embed assets/icon.png //go:embed build/windows/icon.ico var assets embed.FS var ( forceQuit atomic.Bool ) func main() { if err := db.InitDB(); err != nil { log.Printf("[main] db init error: %v", err) } bc := broadcaster.NewBroadcaster() go func() { if err := api.StartServer(bc, http.FS(assets), 5000); err != nil { log.Printf("[main] API server error: %v", err) } }() for i := 0; i < 30; i++ { if resp, err := http.Get("http://127.0.0.1:5000/api/status"); err == nil { resp.Body.Close() break } time.Sleep(200 * time.Millisecond) } log.Println("[main] API server ready") cfg := &options.App{ Title: "青梧映星", Width: 1280, Height: 800, MinWidth: 1024, MinHeight: 600, WindowStartState: options.Normal, AssetServer: &assetserver.Options{Assets: assets}, BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, Windows: &windows.Options{Theme: windows.SystemDefault}, OnBeforeClose: func(ctx context.Context) bool { if forceQuit.Load() { return false } runtime.WindowHide(ctx) return true }, OnShutdown: func(context.Context) { forceQuit.Store(true) }, Bind: []interface{}{&App{}}, } if err := wails.Run(cfg); err != nil { log.Fatal(err) } }