# Free Software Foundation, version 3.
from dataclasses import dataclass
+from datetime import datetime
import os
import subprocess
from typing import Callable
def make_filename() -> str:
directory = os.environ.get(
'XDG_VIDEOS_DIR',
- os.path.expanduser('~/Videos'))
+ os.path.expanduser('~/Videos/SRec'))
os.makedirs(directory, exist_ok=True)
- return os.path.join(directory, "screen-recording.mkv")
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+ return os.path.join(directory, f'srec {timestamp}.mkv')
+
+
+def video_source(stack: Gtk.Stack) -> list[str]:
+ if stack.get_child_by_name('not_recording').get_first_child().get_active():
+ return ['-f', 'v4l2', '-i', '/dev/video0']
+ return ['-f', 'x11grab', '-i', ':0.0+0,0']
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',
- filename] # nopep8
+ command = (['ffmpeg', '-framerate', '25'] + video_source(stack) +
+ ['-f', 'pulse', '-ac', '2', '-i', 'default', filename])
# pylint: disable=consider-using-with
recording = Recording(
filename=filename,
def on_activate(app: Gtk.Application) -> None:
win = Gtk.ApplicationWindow(application=app)
win.set_title('SRec')
- stack = Gtk.Stack()
+ win.set_icon_name('srec')
- start_recording = make_button("Start Recording", on_start_recording, stack)
- stack.add_named(start_recording, "not_recording")
+ stack = Gtk.Stack()
- box = Gtk.Box()
- 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")
+ nr_box = Gtk.Box()
+ nr_box.set_orientation(Gtk.Orientation.VERTICAL)
+ webcam = Gtk.CheckButton(label='Webcam', active=True)
+ nr_box.append(webcam)
+ nr_box.append(Gtk.CheckButton(label='Screen', group=webcam))
+ nr_box.append(make_button("Start Recording", on_start_recording, stack))
+ stack.add_named(nr_box, "not_recording")
+
+ r_box = Gtk.Box()
+ r_box.set_orientation(Gtk.Orientation.VERTICAL)
+ r_box.append(make_button("Stop Recording", on_stop_recording, stack))
+ stack.add_named(r_box, "recording")
win.set_child(stack)
win.present()