#!/usr/bin/env lua -- 1. CONFIGURATION screen_width = 1150 -- FIXME... -- The screen is actually 1280, but at that height -- 3 rows of videos is actually too tall, so this is a quick -- hack to make sure they all fit vertically aspect_ratio = 1.5 -- a good default for dragonframe's typical 1620x1080 exports -- menubar_height = 39 menubar_height = 22 -- at 1280x800 the menu bar is shorter -- 2. UTILITY FUNCTIONS function exec(cmd) local handle = io.popen(cmd) local result = handle:read("*a") handle:close() result = result:sub(1, #result - 1) -- remove trailing newline return result end function linesToTable(s) local t = {} for x in string.gmatch(s, "([^%s]+)") do table.insert(t, x) end return t end -- 3. COUNT WINDOWS + SET UP GRID 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 number_of_windows <= 9 then cols = 3 rows = 3 elseif number_of_windows <= 12 then cols = 4 rows = 3 -- elseif number_of_windows <= 16 then -- cols = 5 -- rows = 3 --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 -- 4. PLAY + POSITION VIDEOS -- 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 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 + 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)) -- Loop local loopCmd = string.format('tell application "QuickTime Player" to set the looping of document %d to true', i) os.execute("osascript -e '"..loopCmd.."'") -- Play local playCmd = string.format('tell application "QuickTime Player" to play document %d', i) os.execute("osascript -e '"..playCmd.."'") -- 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 if current_col > cols then current_col = 1 current_row = current_row + 1 end end