Skip to content

Instantly share code, notes, and snippets.

@morgan9e
Created March 4, 2026 07:59
Show Gist options
  • Select an option

  • Save morgan9e/8a33f8d1f6fec0a90131b8e31725fc0d to your computer and use it in GitHub Desktop.

Select an option

Save morgan9e/8a33f8d1f6fec0a90131b8e31725fc0d to your computer and use it in GitHub Desktop.
open piepwire screencast node for you to use in gst pipeline
#!/usr/bin/env python3
import sys
import signal
import dbus
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GLib
REQUEST_IFACE = "org.freedesktop.portal.Request"
def get_response(bus, req_path):
loop = GLib.MainLoop()
result = [None]
def signal_callback(*args, **kwargs):
if (kwargs.get('dbus_interface') == REQUEST_IFACE and
kwargs.get('member') == "Response" and
kwargs.get('path') == req_path):
result[0] = args
loop.quit()
bus.add_signal_receiver(
signal_callback,
interface_keyword='dbus_interface',
path_keyword='path',
member_keyword='member'
)
GLib.timeout_add_seconds(30, lambda: loop.quit() or True)
loop.run()
return result[0]
def main():
DBusGMainLoop(set_as_default=True)
loop = GLib.MainLoop()
signal.signal(signal.SIGINT, lambda *_: loop.quit())
signal.signal(signal.SIGTERM, lambda *_: loop.quit())
bus = dbus.SessionBus()
portal = bus.get_object("org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop")
screencast = dbus.Interface(portal, "org.freedesktop.portal.ScreenCast")
resp = get_response(bus, screencast.CreateSession(
{"session_handle_token": "u2", "handle_token": "u1"}))
if not resp or resp[0] != 0:
print("Failed to create session", file=sys.stderr)
return 1
session = dbus.ObjectPath(resp[1]['session_handle'])
resp = get_response(bus, screencast.SelectSources(
session, {"multiple": False, "types": dbus.UInt32(1 | 2)}))
if not resp or resp[0] != 0:
print("Failed to select sources", file=sys.stderr)
return 1
resp = get_response(bus, screencast.Start(session, "", {}))
if not resp or resp[0] != 0:
print("Failed to start screencast", file=sys.stderr)
return 1
node_id = resp[1]['streams'][0][0]
print(node_id, flush=True)
print(f"Screencast open on node {node_id}, waiting...", file=sys.stderr)
loop.run()
print("Closing screencast session.", file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment