#!/usr/bin/env python3 import sys import signal from PyQt5.QtCore import Qt, QUrl, QTimer from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineProfile, QWebEnginePage, QWebEngineSettings from PyQt5.QtGui import QColor def find_screen(app, width=2560, height=1440): for screen in app.screens(): s = screen.size() if s.width() == width and s.height() == height: return screen print(f"Warning: no {width}x{height} screen found, falling back to primary") return app.primaryScreen() class Overlay(QMainWindow): def __init__(self, url, screen): super().__init__() self.setWindowFlags( Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool | Qt.WindowTransparentForInput ) self.setAttribute(Qt.WA_TranslucentBackground) view = QWebEngineView() profile = QWebEngineProfile(view) # off-the-record, no disk storage page = QWebEnginePage(profile, view) view.setPage(page) view.page().setBackgroundColor(QColor(0, 0, 0, 0)) view.page().setAudioMuted(False) settings = view.page().settings() settings.setAttribute(QWebEngineSettings.PlaybackRequiresUserGesture, False) settings.setAttribute(QWebEngineSettings.JavascriptEnabled, True) view.load(QUrl(url)) self.setCentralWidget(view) self.setGeometry(screen.geometry()) self.show() if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python3 overlay.py ") sys.exit(1) app = QApplication(sys.argv) signal.signal(signal.SIGINT, signal.SIG_DFL) timer = QTimer() timer.start(200) timer.timeout.connect(lambda: None) screen = find_screen(app) window = Overlay(sys.argv[1], screen) sys.exit(app.exec_())