package installer import ( "os" "path/filepath" "strings" "gitgud.io/mike/mpv-manager/pkg/constants" ) // detectMacAppBundles reads standard bundle metadata without launching player // code, loading user configuration, or claiming ownership of external apps. func detectMacAppBundles(applicationsDir string) []DetectedApp { var apps []DetectedApp var seen []os.FileInfo for _, candidate := range []struct{ bundle, executable, name, method string }{ {"MPV.app", "mpv", "MPV", constants.MethodMPVApp}, {"mpv.app", "mpv", "MPV", constants.MethodMPVApp}, {"IINA.app", "IINA", "IINA", constants.MethodIINA}, } { bundle := filepath.Join(applicationsDir, candidate.bundle) info, err := os.Stat(bundle) if err != nil || !info.IsDir() { continue } duplicate := false for _, prior := range seen { if os.SameFile(info, prior) { duplicate = true break } } if duplicate { continue } executable, err := os.Stat(filepath.Join(bundle, "Contents", "MacOS", candidate.executable)) if err != nil || !executable.Mode().IsRegular() || executable.Mode().Perm()&0111 == 0 { continue } seen = append(seen, info) version := "" if output, err := runDetectionProbe("/usr/bin/plutil", "-extract", "CFBundleShortVersionString", "raw", "-o", "-", filepath.Join(bundle, "Contents", "Info.plist")); err == nil { version = strings.TrimSpace(string(output)) } apps = append(apps, DetectedApp{AppName: candidate.name, MethodID: candidate.method, Version: version, InstallPath: bundle, InstallType: "app"}) } return apps }