mirror of
https://github.com/xsghetti/HyprCrux.git
synced 2025-07-03 05:40:38 -04:00
93 lines
2.2 KiB
JavaScript
93 lines
2.2 KiB
JavaScript
import GLib from "gi://GLib"
|
|
import icons from "../lib/icons.js"
|
|
import { dependencies, sh, bash } from "../lib/utils.js"
|
|
|
|
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)
|
|
|
|
const wayshot = `wayshot -f ${file} ${full ? "" : `-s "${await sh("slurp")}"`}`
|
|
await sh(wayshot)
|
|
bash(`wl-copy < ${file}`)
|
|
|
|
Utils.notify({
|
|
image: file,
|
|
summary: "Screenshot",
|
|
body: this.#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
|
|
globalThis["recorder"] = recorder
|
|
export default recorder
|