aboutsummaryrefslogtreecommitdiff
path: root/.config/ags/service/screenrecord.ts
blob: 58721d2dceaf3ef59b94f336449edb545b4754ca (plain)
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