Created
August 25, 2023 19:03
-
-
Save progandy/549afb830c128ad13a1dfca694bf65d5 to your computer and use it in GitHub Desktop.
getUserMedia in WebKitGTK2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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