From 9cde384a3615c632c1d48c614ead5a0903c514f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Z=C3=BCrcher?= Date: Sat, 17 Jan 2026 22:39:50 +0100 Subject: [PATCH] add browser open function --- main.go | 13 +++++++- utils/utils.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 utils/utils.go diff --git a/main.go b/main.go index eced657..75fe6cf 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,8 @@ import ( "os" "slideshowApp/env" "slideshowApp/handlers" + "slideshowApp/utils" + "time" "github.com/gorilla/mux" ) @@ -23,11 +25,14 @@ func main() { if _, err := os.Stat(uploadFolder); err != nil { fmt.Println("upload folder for images not found: ", uploadFolder) - fmt.Println("use fallback") + fmt.Println("use fallback folder") uploadFolder = "./images" + env.PhotoDir.SetValue(uploadFolder) + } fmt.Println("upload folder for images: ", uploadFolder) + r.PathPrefix("/uploads/").Handler(http.StripPrefix("/uploads/", http.FileServer(http.Dir(uploadFolder)))) r.HandleFunc("/api/images", handlers.ListFilesHandler).Methods("GET") r.HandleFunc("/ws", handlers.Websocket) @@ -54,6 +59,12 @@ func main() { host := env.Host.GetValue() port := env.Port.GetValue() url := fmt.Sprintf("%s:%s", host, port) + go func() { + time.Sleep(3 * time.Second) + if err := utils.OpenBrowser(fmt.Sprintf("%s:%s/slideshow", handlers.GetLocalIP(), port)); err != nil { + fmt.Println(err) + } + }() fmt.Println("Server running at", url) log.Fatal(http.ListenAndServe(url, r)) } diff --git a/utils/utils.go b/utils/utils.go new file mode 100644 index 0000000..b11b1bc --- /dev/null +++ b/utils/utils.go @@ -0,0 +1,81 @@ +package utils + +import ( + "fmt" + "os" + "os/exec" + "runtime" +) + +func OpenBrowser(url string) error { + var commands [][]string + + switch runtime.GOOS { + case "windows": + commands = [][]string{ + // Chrome (most common) + {`C:\Program Files\Google\Chrome\Application\chrome.exe`, "--kiosk", url}, + {`C:\Program Files (x86)\Google\Chrome\Application\chrome.exe`, "--kiosk", url}, + + // Edge (default on modern Windows) + {`C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe`, "--kiosk", url}, + {`C:\Program Files\Microsoft\Edge\Application\msedge.exe`, "--kiosk", url}, + + // Firefox (no true kiosk, but fullscreen) + {`C:\Program Files\Mozilla Firefox\firefox.exe`, "--kiosk", url}, + {`C:\Program Files (x86)\Mozilla Firefox\firefox.exe`, "--kiosk", url}, + + // System default browser (always works) + {"rundll32", "url.dll,FileProtocolHandler", url}, + } + + case "darwin": + commands = [][]string{ + // Chrome + {"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", "--kiosk", url}, + + // Edge + {"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge", "--kiosk", url}, + + // Firefox + {"/Applications/Firefox.app/Contents/MacOS/firefox", "--kiosk", url}, + + // Safari (no kiosk flag, opens normally) + {"open", "-a", "Safari", url}, + + // System default browser + {"open", url}, + } + + default: // Linux + if os.Getenv("DISPLAY") == "" && + os.Getenv("WAYLAND_DISPLAY") == "" && + os.Getenv("XDG_SESSION_TYPE") != "wayland" { + return fmt.Errorf("os is running in headless mode; do not start browser") + } + + commands = [][]string{ + // Chromium / Chrome + {"chromium-browser", "--kiosk", url}, + {"chromium", "--kiosk", url}, + {"google-chrome", "--kiosk", url}, + + // Firefox + {"firefox", "--kiosk", url}, + + // System default browser (best universal fallback) + {"xdg-open", url}, + } + } + + for _, cmd := range commands { + execCmd := exec.Command(cmd[0], cmd[1:]...) + if err := execCmd.Start(); err == nil { + return nil + } else { + return err + } + } + + return fmt.Errorf("could not open browser") +}