!7 cm PlaywrightModule > DynPrintLogAndEnabled { transient autoDispose new Borrowable sharedBrowser; start-thread { time "Chromium preloaded" { sharedBrowser.set(playwrightWithChromium()); } } // borrow or create temporarily PlaywrightAndBrowser acquireBrowser(IResourceHolder res) { var borrowedBrowser = res.add(sharedBrowser.tempBorrow()); var browser = borrowedBrowser!; if (browser == null) browser = res.add(tempPlaywrightWithChromium()); else print("Using borrowed browser"); ret browser; } // API WithURL youTubeSearch(S query) { print exceptions { printFunctionCall youTubeSearch(query); temp res = resourceHolder(); var browser = acquireBrowser(res); ret print(result := main youTubeSearch(browser!, query)); }} WithURL webSearch(S query) { ret first(webSearch_all(query)); } L> webSearch_all(S query, MapSO urlParams default null) { print exceptions { printFunctionCall webSearch_all(query); temp res = resourceHolder(); var browser = acquireBrowser(res); GoogleSearch gs = new(browser!, query); addAll(gs.urlParams, urlParams); ret print(result := googleSearch_all(gs)); }} BufferedImage screenShootWebsite(S url, double delay default 2.0) { print exceptions { printFunctionCall screenShootWebsite(url, delay); temp res = resourceHolder(); var browser = acquireBrowser(res); temp page = playwrightOpenPage(browser!, url); ret playwrightScreenshot(page, delay); }} }