From fb46b59591d4836931b7f9135a79b26125b2383a Mon Sep 17 00:00:00 2001 From: n loewen Date: Mon, 6 May 2024 16:56:59 -0700 Subject: [PATCH] Use already-open QuickTime windows, instead of taking a file list to open --- mosaic.lua | 88 ++++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/mosaic.lua b/mosaic.lua index 6e28a50..7559d3d 100644 --- a/mosaic.lua +++ b/mosaic.lua @@ -1,8 +1,8 @@ -- 1. CONFIGURATION -screen_width = 1000 -- FIXME +screen_width = 1080 -- FIXME aspect_ratio = 1.5 -- a good default for dragonframe's typical 1620x1080 exports -window_titlebar_height = 39 +menubar_height = 39 -- 2. UTILITY FUNCTIONS @@ -23,74 +23,70 @@ function linesToTable(s) return t end +-- 3. COUNT WINDOWS + SET UP GRID --- 3. GET FILE LIST --- TODO: get these some other way that's easier to use... --- maybe args passed in from an Automater script? - -local cd = exec("pwd") -local files = exec('stat -f "%N" *.mp4') - --- Create a table containing the complete path to every video: -local filetable = linesToTable(files) -for k, file in ipairs(filetable) do - print("k "..k.." v "..file) - filetable[k] = cd.."/"..file - print(filetable[k]) -end - - --- 4. PREP FOR PLAYING +number_of_windows = tonumber(exec("osascript -e 'tell application \"System Events\" to count (windows of process \"QuickTime Player\" where value of attribute \"AXMinimized\" is false)'")) +print("There are currently "..number_of_windows.." non-minimized QuickTime windows") -- FIXME: -if #filetable <= 9 then +if number_of_windows <= 9 then cols = 3 rows = 3 +elseif number_of_windows <= 12 then + cols = 3 + rows = 4 +elseif number_of_windows <= 16 then + cols = 4 + rows = 4 +elseif number_of_windows <= 20 then + cols = 4 + rows = 5 +elseif number_of_windows <= 25 then + cols = 5 + rows = 5 +elseif number_of_windows <= 30 then + cols = 5 + rows = 6 +elseif number_of_windows <= 36 then + cols = 6 + rows = 6 +else + os.execute("osascript -e 'display dialog \"you have too many videos lol\"'") + os.exit() end video_width = screen_width // cols -- "floor division" returns an integer video_height = video_width // aspect_ratio --- 5. PLAY + POSITION VIDEOS +-- 4. PLAY + POSITION VIDEOS --- We're going to loop through the list of videos. --- For each video we will: --- 1. use AppleScript to open it, playing on loop +-- For each QuickTime window we will: +-- 1. use AppleScript to play it on loop -- 2. move it to the appropriate position current_col = 1 current_row = 1 -for _, file in ipairs(filetable) do - print("opening "..file) - print(string.format(" col: %s, row: %s", current_col, current_row)) - +for i = 1, number_of_windows do -- Calculate position / dimensions local x1 = (current_col * video_width) - video_width - local y1 = (current_row * video_height) - video_height + (current_row * window_titlebar_height) - window_titlebar_height + local y1 = (current_row * video_height) - video_height + menubar_height local x2 = x1 + video_width local y2 = y1 + video_height local bounds = string.format("{%d, %d, %d, %d}", x1, y1, x2, y2) + print(string.format("row %s, col %s: %s", current_row, current_col, bounds)) - print(" "..bounds) - print() + -- Loop + local loopCmd = string.format('tell application "QuickTime Player" to set the looping of document %d to true', i) + os.execute("osascript -e '"..loopCmd.."'") - -- Open the video + play it on loop - os.execute( - string.format( - [[osascript -e ' - set f to POSIX file "%s" - tell application "QuickTime Player" - set theMovie to open file f - tell theMovie - set the looping of theMovie to true - play - end tell - end tell' - ]], file)) + -- Play + local playCmd = string.format('tell application "QuickTime Player" to play document %d', i) + os.execute("osascript -e '"..playCmd.."'") - -- Move it to the correct spot on the screen - os.execute(string.format("osascript -e 'tell application \"%s\" to set the bounds of the front window to %s'", "QuickTime Player", bounds)) + -- Move + local moveCmd = string.format('tell application "QuickTime Player" to set the bounds of window %d to %s', i, bounds) + os.execute("osascript -e '"..moveCmd.."'") -- Update grid positioning for the next iteration current_col = current_col + 1