Skip to content

Instantly share code, notes, and snippets.

@progandy
Created August 25, 2023 19:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save progandy/549afb830c128ad13a1dfca694bf65d5 to your computer and use it in GitHub Desktop.
Save progandy/549afb830c128ad13a1dfca694bf65d5 to your computer and use it in GitHub Desktop.
getUserMedia in WebKitGTK2
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, WebKit2
class WebKitWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="WebKitGTK2 Video Example")
html_content = """
<html>
<head>
<script>
navigator.mediaDevices.getUserMedia({video: true, audio: false }).then((mediaStream) => {
const video = document.querySelector('video');
video.srcObject = mediaStream;
video.onloadedmetadata = () => {
video.play();
};
});
</script>
</head>
<body>
<video/>
</body>
</html>
"""
self.webview = WebKit2.WebView()
# enable permissions
self.webview.connect("permission-request", self.on_permission_request)
# enable inspector
settings = self.webview.get_settings()
settings.set_property("enable-developer-extras", True)
inspector = self.webview.get_inspector()
inspector.show()
self.webview.load_html(html_content, "file:///")
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.add(self.webview)
self.add(scrolled_window)
def on_permission_request(self, webview, request):
if isinstance(request, WebKit2.UserMediaPermissionRequest):
# Display a message box and ask for permission
audio = "audio" if request.props.is_for_audio_device else ""
video = "video" if request.props.is_for_video_device else ""
dialog = Gtk.MessageDialog(
parent=self,
flags=Gtk.DialogFlags.MODAL,
message_type=Gtk.MessageType.QUESTION,
buttons=Gtk.ButtonsType.YES_NO,
text=f"Allow user media access to {audio}{video}?"
)
response = dialog.run()
dialog.destroy()
if response == Gtk.ResponseType.YES:
request.allow()
return
request.deny()
win = WebKitWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment