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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
import GLib from "gi://GLib"
import icons from "lib/icons"
import { dependencies, sh, bash } from "lib/utils"
const now = () => GLib.DateTime.new_now_local().format("%Y-%m-%d_%H-%M-%S")
class Recorder extends Service {
static {
Service.register(this, {}, {
"timer": ["int"],
"recording": ["boolean"],
})
}
#recordings = Utils.HOME + "/Videos/Screencasting"
#screenshots = Utils.HOME + "/Pictures/Screenshots"
#file = ""
#interval = 0
recording = false
timer = 0
async start() {
if (!dependencies("slurp", "wf-recorder"))
return
if (this.recording)
return
Utils.ensureDirectory(this.#recordings)
this.#file = `${this.#recordings}/${now()}.mp4`
sh(`wf-recorder -g "${await sh("slurp")}" -f ${this.#file} --pixel-format yuv420p`)
this.recording = true
this.changed("recording")
this.timer = 0
this.#interval = Utils.interval(1000, () => {
this.changed("timer")
this.timer++
})
}
async stop() {
if (!this.recording)
return
await bash("killall -INT wf-recorder")
this.recording = false
this.changed("recording")
GLib.source_remove(this.#interval)
Utils.notify({
iconName: icons.fallback.video,
summary: "Screenrecord",
body: this.#file,
actions: {
"Show in Files": () => sh(`xdg-open ${this.#recordings}`),
"View": () => sh(`xdg-open ${this.#file}`),
},
})
}
async screenshot(full = false) {
if (!dependencies("slurp", "wayshot"))
return
const file = `${this.#screenshots}/${now()}.png`
Utils.ensureDirectory(this.#screenshots)
if (full) {
await sh(`wayshot -f ${file}`)
}
else {
const size = await sh("slurp")
if (!size)
return
await sh(`wayshot -f ${file} -s "${size}"`)
}
bash(`wl-copy < ${file}`)
Utils.notify({
image: file,
summary: "Screenshot",
body: file,
actions: {
"Show in Files": () => sh(`xdg-open ${this.#screenshots}`),
"View": () => sh(`xdg-open ${file}`),
"Edit": () => {
if (dependencies("swappy"))
sh(`swappy -f ${file}`)
},
},
})
}
}
const recorder = new Recorder
Object.assign(globalThis, { recorder })
export default recorder
|