package main import ( "log" "os" "path/filepath" "runtime" steamimmich "git.kapelle.org/niklas/steam-immich/internal" "github.com/alexflint/go-arg" ) type args struct { BaseURL string `arg:"--base-url,required" placeholder:"BASE_URL" help:"Base URL of the Immich instance e.g.: https://demo.immich.app"` APIKey string `arg:"--api-key,required" placeholder:"API_KEY" help:"API Key. Needs asset.upload, asset.update, albumAsset.create"` UserdataDir string `arg:"--steam-userdata-dir" placeholder:"USERDATA_DIR" help:"Steam userdata directory. If not set, search automaticly."` DeviceID string `arg:"--device-id" default:"steam-immich" help:"Device ID of the uploads"` Album string `arg:"--album" help:"UUID of a album to upload to"` } func main() { var args args arg.MustParse(&args) var steamUserdataDir = "" if args.UserdataDir != "" { steamUserdataDir = os.ExpandEnv(args.UserdataDir) } else { steamUserdataDir = findUserdataDir() } if steamUserdataDir == "" { log.Fatal("Can not find steam userdata dir. Please set with --steam-userdata-dir") } steamimmich.Run(steamimmich.Config{ APIKey: args.APIKey, BaseURL: args.BaseURL, UserdataDir: steamUserdataDir, DeiveID: args.DeviceID, Album: args.Album, }) } func findUserdataDir() string { var candidates []string switch runtime.GOOS { case "windows": // Common Steam install paths on Windows localAppData := os.Getenv("LOCALAPPDATA") programFiles := os.Getenv("ProgramFiles(x86)") if programFiles == "" { programFiles = os.Getenv("ProgramFiles") } candidates = []string{ filepath.Join(programFiles, "Steam"), filepath.Join(localAppData, "Steam"), } case "linux": home := os.Getenv("HOME") candidates = []string{ filepath.Join(home, ".steam", "steam"), // standard filepath.Join(home, ".local", "share", "Steam"), // alternate filepath.Join(home, ".var", "app", "com.valvesoftware.Steam", "data", "Steam"), // Flatpak } case "darwin": // Common Steam install path on macOS home := os.Getenv("HOME") candidates = []string{ filepath.Join(home, "Library", "Application Support", "Steam"), } default: return "" } for _, base := range candidates { userdata := filepath.Join(base, "userdata") info, err := os.Stat(userdata) if err == nil && info.IsDir() { return userdata } } return "" }