-
Notifications
You must be signed in to change notification settings - Fork 3
/
screen.clj
68 lines (60 loc) · 2.15 KB
/
screen.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
(ns webdriver.screen
(:gen-class)
(:require [org.httpkit.client :as http]
[clojure.java.io :as io]
[clojure.string :as s]
[komcrad-utils.io :as kio]
[komcrad-utils.wait :refer [wait-for]]
[clj-file-zip.core :as zip]
[me.raynes.conch.low-level :as sh]
[me.raynes.conch :refer [programs with-programs let-programs]])
(:import (org.openqa.selenium.logging
LoggingPreferences LogType)
(java.util.logging Level Logger)))
(defn screen-port-available? [n]
(with-programs [ps]
(empty?
(filter #(s/includes? % (str "Xvfb :" n))
(filter #(s/includes? % "Xvfb")
(s/split (ps "aux") #"\n"))))))
(defn screen-port []
(let [port (+ 50 (rand-int 999999950))]
(if (screen-port-available? port)
port
(screen-port))))
(defn start-screen []
(let [port (screen-port)
xvfb (sh/proc "Xvfb" (str ":" port) "-screen" "0" "1920x1080x24")]
{:xvfb xvfb
:xvfb-port port}))
(defn stop-screen [m]
(sh/destroy (:xvfb m)))
(defn start-recorder [m]
{:xvfb-recorder
(sh/proc "ffmpeg" "-y" "-f" "x11grab" "-video_size" "1920x1080" "-i"
(str ":" (:xvfb-port m)) "-codec:v" "libx264" "-r"
"60" (:vid-out m))})
(defn stop-recorder [m]
(spit (:in (:xvfb-recorder m)) "q")
(wait-for #(try (.exitValue (:process (:xvfb-recorder m)))
(catch Exception e nil)) 10000 10)
(sh/destroy (:xvfb-recorder m)))
(defmacro with-screen [[screen] & body]
`(let [~screen (webdriver.screen/start-screen)]
(try
~@body
(catch Exception e# (throw e#))
(finally (webdriver.screen/stop-screen ~screen)))))
(defmacro with-recorded-screen
[[screen & {:keys [vid-out]
:as params
:or {vid-out "/tmp/webdriver.mp4"}}] & body]
`(let [~screen (webdriver.screen/start-screen)
recorder# (webdriver.screen/start-recorder
(merge ~screen {:vid-out ~vid-out}))]
(try
~@body
(catch Exception e# (throw e#))
(finally
(webdriver.screen/stop-recorder recorder#)
(webdriver.screen/stop-screen ~screen)))))