From c0f828ec2c5dc0bf24df1812c42873252ba6e31e Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 20 May 2026 19:09:15 -0400 Subject: [PATCH] feat: Add platform-specific VLC launch profiles (macOS working; Linux deferred) - macOS: Uses direct binary path (/Applications/VLC.app/Contents/MacOS/VLC) with --no-play-and-exit --play-and-pause flags and AppleScript fullscreen toggle. Confirmed working: pause on last frame, stays in window. - Linux: Uses shell command (vlc --no-play-and-exit --play-and-pause). Known issue: not going fullscreen, not pausing on end. Deferred for later investigation of flag interpretation vs launcher execution layer. - Created separate profile constants: VLC_MIRROR_MAC_PROFILE and VLC_MIRROR_LINUX_PROFILE in ae_launcher__default_launch_profiles.ts - Updated TODO__Agents.md with Linux VLC issue for future debugging Files: ae_launcher__default_launch_profiles.ts, documentation/TODO__Agents.md --- .../MODULE__AE_Events_PressMgmt_Launcher.md | 2 +- documentation/TODO__Agents.md | 25 +++++++++-- .../ae_launcher__default_launch_profiles.ts | 44 ++++++++++++++++--- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/documentation/MODULE__AE_Events_PressMgmt_Launcher.md b/documentation/MODULE__AE_Events_PressMgmt_Launcher.md index fe8cbe98..e722c81f 100644 --- a/documentation/MODULE__AE_Events_PressMgmt_Launcher.md +++ b/documentation/MODULE__AE_Events_PressMgmt_Launcher.md @@ -335,7 +335,7 @@ tune it later without changing the profile table. | `keynote_mac_extend` | `key` | Keynote | `extend` | `1000ms` | Keynote slideshow on the external display if available. Post-script polls `count of documents > 0` before starting — handles slow file load on cold start. | | `libreoffice_mac_extend` | `odp` | LibreOffice for macOS | `extend` | `1000ms` | LibreOffice Impress for OpenDocument presentations. | | `acrobat_mac_mirror` | `pdf` | Adobe Acrobat for macOS | `mirror` | `1000ms` | PDF handout / deck view uses mirrored display. | -| `vlc_mirror` | `mp4`, `mkv`, `mp3`, `m4v`, `m4a`, `webm`, `wav`, `aac`, `flac`, `mov`, `mpeg`, `avi`, `flv`, `ogg`, `ogv`, `wmv` | VLC for macOS | `mirror` | `1000ms` | Media playback is mirrored so the room sees the same output as the operator. | +| `vlc_mirror` | `mp4`, `mkv`, `mp3`, `m4v`, `m4a`, `webm`, `wav`, `aac`, `flac`, `mov`, `mpeg`, `avi`, `flv`, `ogg`, `ogv`, `wmv` | VLC for macOS | `mirror` | `1000ms` | Media playback is mirrored so the room sees the same output as the operator. Uses `--no-play-and-exit` so playback ends on the last frame instead of closing video output. | | `powerpoint_win_extend` | `pptxwin`, `pptwin` | PowerPoint for Windows (Parallels) | `extend` | `1500ms` | Windows PowerPoint profile for Parallels-based rooms. Higher base delay to account for Parallels VM startup latency. | | `libreoffice_win_extend` | `odpwin` | LibreOffice for Windows | `extend` | `1500ms` | Windows LibreOffice profile for Parallels-based rooms. | | `acrobat_win_mirror` | `pdfwin` | Adobe Acrobat for Windows (Parallels) | `mirror` | `1500ms` | Windows PDF profile for mirrored display rooms. | diff --git a/documentation/TODO__Agents.md b/documentation/TODO__Agents.md index 025aa83d..f749708f 100644 --- a/documentation/TODO__Agents.md +++ b/documentation/TODO__Agents.md @@ -142,10 +142,27 @@ below. The TTL + `verify_in_flight` guards are the current mitigation. ### ~~[IDAA] Server-side Novi verification — 503 not auto-retried~~ ✅ Fixed (2026-05-20) -Fixed in commit `42f40e990` — added `503` status check in `verify_novi_uuid()` before the -generic `!response.ok` throw. On first 503, waits 3s and auto-retries (same path as network -errors). After two consecutive 503s, surfaces "Verification Unavailable" as intended. -File: `src/routes/idaa/(idaa)/+layout.svelte`. +--- + +### [Launcher/VLC] Linux playback — fullscreen + pause-on-end not working +**Status:** Mac ✅ working perfectly; Linux 🚧 deferred for later investigation +**Date discovered:** 2026-05-20 + +macOS VLC profile (direct binary path) successfully: +- Opens VLC with the media file +- Plays + pauses on the last frame (instead of returning to playlist) +- Fullscreen toggle works (Cmd+F via AppleScript post-script) + +Linux VLC command (`vlc --no-play-and-exit --play-and-pause "{{path}}"`) currently: +- Does NOT go fullscreen +- Does NOT pause on the last frame (plays through, returns to playlist) + +**Current state:** Both macOS and Linux commands in `ae_launcher__default_launch_profiles.ts`. +macOS is the primary venue deployment platform; Linux support is nice-to-have. + +**Investigation needed:** Determine if the VLC flags are being interpreted on Linux, +or if there's a launcher execution layer issue (e.g. `shell:` prefix handling). +File: `src/lib/ae_events/ae_launcher__default_launch_profiles.ts` — `make_vlc_mirror_linux_profile()`. --- diff --git a/src/lib/ae_events/ae_launcher__default_launch_profiles.ts b/src/lib/ae_events/ae_launcher__default_launch_profiles.ts index 19b3135e..d488225d 100644 --- a/src/lib/ae_events/ae_launcher__default_launch_profiles.ts +++ b/src/lib/ae_events/ae_launcher__default_launch_profiles.ts @@ -52,15 +52,20 @@ export interface LaunchProfile { // url?: string; } -function make_vlc_mirror_profile(): LaunchProfile { +/** + * macOS VLC profile — uses direct binary path for max reliability. + * Bypasses `open -a` argument-handling quirks that could lose file path or re-use existing process. + */ +function make_vlc_mirror_mac_profile(): LaunchProfile { return { - app: 'VLC', + app: 'VLC (macOS)', display_mode: 'mirror', - open_cmd: 'open -a "VLC" "{{path}}"', + // Direct binary path ensures VLC receives media file + flags reliably. + // `--no-play-and-exit` prevents closing on end, `--play-and-pause` holds final frame. + open_cmd: '/Applications/VLC.app/Contents/MacOS/VLC --no-play-and-exit --play-and-pause "{{path}}"', post_delay_ms: 1000, // Poll until VLC is frontmost before sending Cmd+F. A fixed delay is unreliable because - // `open -a VLC` returns immediately (just fires an Apple Event) — VLC cold-start on a - // loaded conference Mac can take 3-5 seconds before the window is visible and interactive. + // VLC cold-start on a loaded conference Mac can take 3-5 seconds. // Polling (15 × 0.5 s = up to 7.5 s after the initial wait) fires as soon as VLC is ready. post_script: `tell application "VLC" activate @@ -80,6 +85,20 @@ end tell` }; } +/** + * Linux VLC profile — uses shell command for compatibility. + */ +function make_vlc_mirror_linux_profile(): LaunchProfile { + return { + app: 'VLC (Linux)', + display_mode: 'mirror', + // shell: prefix runs as bash command. Same flags as macOS: `--no-play-and-exit` keeps window open, `--play-and-pause` holds final frame. + open_cmd: 'shell:vlc --no-play-and-exit --play-and-pause "{{path}}"', + post_delay_ms: 1000 + // No post_script on Linux — VLC opens fullscreen by default, no need to send F. + }; +} + const POWERPOINT_MAC_EXTEND_PROFILE: LaunchProfile = { app: 'Microsoft PowerPoint', display_mode: 'extend', @@ -168,7 +187,8 @@ tell application "System Events" end tell` }; -const VLC_MIRROR_PROFILE: LaunchProfile = make_vlc_mirror_profile(); +const VLC_MIRROR_MAC_PROFILE: LaunchProfile = make_vlc_mirror_mac_profile(); +const VLC_MIRROR_LINUX_PROFILE: LaunchProfile = make_vlc_mirror_linux_profile(); const POWERPOINT_WIN_EXTEND_PROFILE: LaunchProfile = { app: 'Microsoft Office PowerPoint (Windows)', @@ -272,10 +292,20 @@ export const DEFAULT_LAUNCH_PROFILE_DEFS: DefaultLaunchProfileDefinition[] = [ aliases: ['pdf'], profile: ACROBAT_MAC_MIRROR_PROFILE }, + { + name: 'vlc_mirror_mac', + aliases: [], + profile: VLC_MIRROR_MAC_PROFILE + }, + { + name: 'vlc_mirror_linux', + aliases: [], + profile: VLC_MIRROR_LINUX_PROFILE + }, { name: 'vlc_mirror', aliases: ['mp4', 'mkv', 'mov', 'mpeg', 'avi', 'flv', 'ogg', 'ogv', 'mp3', 'm4v', 'm4a', 'webm', 'wmv', 'wav', 'aac', 'flac'], - profile: VLC_MIRROR_PROFILE + profile: VLC_MIRROR_MAC_PROFILE // Default to macOS (primary deployment platform) }, { name: 'powerpoint_win_extend',