# under the terms of the GNU General Public License as published by the
# Free Software Foundation, version 3.
+from dataclasses import dataclass
+from datetime import datetime
+import os
import subprocess
from typing import Callable
from gi.repository import Gtk # nopep8 pylint: disable=wrong-import-position
-recording = None
+@dataclass
+class Recording:
+ filename: str
+ process: subprocess.Popen[bytes]
+
+
+recording: Recording | None = None
+
+
+def make_filename() -> str:
+ directory = os.environ.get(
+ 'XDG_VIDEOS_DIR',
+ os.path.expanduser('~/Videos'))
+ os.makedirs(directory, exist_ok=True)
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ return os.path.join(directory, f'srec {timestamp}.mkv')
def on_start_recording(_: Gtk.Button, stack: Gtk.Stack) -> None:
global recording # pylint: disable=global-statement
assert recording is None
- screen_size = '1366x768' # TODO
+ filename = make_filename()
command = [
'ffmpeg',
- '-video_size', screen_size,
'-framerate', '25',
'-f', 'x11grab', '-i', ':0.0+0,0',
'-f', 'pulse', '-ac', '2', '-i', 'default',
- 'screen-recording.mkv'] # nopep8
+ filename] # nopep8
# pylint: disable=consider-using-with
- recording = subprocess.Popen(command, stdin=subprocess.PIPE)
+ recording = Recording(
+ filename=filename,
+ process=subprocess.Popen(command, stdin=subprocess.PIPE))
stack.set_visible_child_name("recording")
def on_stop_recording(_: Gtk.Button, stack: Gtk.Stack) -> None:
global recording # pylint: disable=global-statement
assert recording is not None
- stdin = recording.stdin
+ stdin = recording.process.stdin
assert stdin is not None
stdin.write(b'q')
stdin.flush()
- recording.wait()
+ recording.process.wait()
recording = None
stack.set_visible_child_name("not_recording")
win.set_title('SRec')
stack = Gtk.Stack()
+ nr_box = Gtk.Box()
+ nr_box.set_orientation(Gtk.Orientation.VERTICAL)
start_recording = make_button("Start Recording", on_start_recording, stack)
- stack.add_named(start_recording, "not_recording")
+ nr_box.append(start_recording)
+ stack.add_named(nr_box, "not_recording")
- box = Gtk.Box()
- box.set_orientation(Gtk.Orientation.VERTICAL)
+ r_box = Gtk.Box()
+ r_box.set_orientation(Gtk.Orientation.VERTICAL)
stop_recording = make_button("Stop Recording", on_stop_recording, stack)
- box.append(stop_recording)
- stack.add_named(box, "recording")
+ r_box.append(stop_recording)
+ stack.add_named(r_box, "recording")
win.set_child(stack)
win.present()