Wanted to share my qt4reactor webkit cv2 video capture script. It's comes in handy whenever I've needed to scrape just the browser and not my whole screen or capture unit tests etc.
here is a demo quick demo in action: http://www.youtube.com/watch?v=2XMXtUISY1g&feature=youtu.be It's a hack, but that's why I like python (espeically twisted)...it's so versatile. https://github.com/kmcintyre/scewpt/blob/master/pyscewpt/maybevideo.py Cheers, Kevin
from PyQt4.QtGui import QApplication, QKeyEvent, QPainter, QImage import cv2 import sys print 'args:', sys.argv video = None if len(sys.argv) > 2: print 'start video:', sys.argv[2] video = cv2.VideoWriter( sys.argv[2] + '.avi', cv2.cv.CV_FOURCC('M','J','P','G'), 24, (1024, 768),True) from PyQt4.QtWebKit import QWebView, QWebPage, QWebSettings class MaybeVideo(QApplication): # you may need def spoof_hit_enter(self, receiver): print 'spoof' super(MaybeVideo, self).notify(receiver, QKeyEvent(QEvent.KeyPress, Qt.Key_Enter, Qt.NoModifier)) super(MaybeVideo, self).notify(receiver, QKeyEvent(QEvent.KeyRelease, Qt.Key_Enter, Qt.NoModifier)) painter = QPainter() events = [] ready = False def notify(self, receiver, event): if MaybeVideo.ready and isinstance(receiver, QWebView) and not MaybeVideo.painter.isActive() and video is not None: try: #print 'clip screenshot' image = QImage(QSize(1024, 768), QImage.Format_RGB32) MaybeVideo.painter.begin(image) MaybeVideo.painter.setRenderHint(QPainter.Antialiasing, True) MaybeVideo.painter.setRenderHint(QPainter.TextAntialiasing, True) MaybeVideo.painter.setRenderHint(QPainter.SmoothPixmapTransform, True) MaybeVideo.painter.setRenderHint(QPainter.HighQualityAntialiasing, True) receiver.page().mainFrame().render(MaybeVideo.painter) image.save("temp.jpg", "jpg") video.write( cv2.imread('temp.jpg')) MaybeVideo.painter.end() except Exception as e: print e if event.type() == QEvent.SockAct: MaybeVideo.ready = True elif not event.type() in MaybeVideo.events: #print 'new type', receiver, event.type(), QEvent.User MaybeVideo.events.append(event.type()) else: pass return super(MaybeVideo, self).notify(receiver, event) app = MaybeVideo([]) import qt4reactor qt4reactor.install() from PyQt4.QtGui import QMainWindow from PyQt4.QtCore import QEvent, Qt, QSize, QUrl from twisted.internet import reactor import signal from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkCookieJar class MaybeVideoWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.web_page = QWebPage() print self.web_page.settings() self.web_page.setNetworkAccessManager(QNetworkAccessManager()) self.web_page.networkAccessManager().setCookieJar(QNetworkCookieJar()) self.resize(QSize(1024, 768)) web_view = QWebView() web_view.resize(QSize(1024, 768)) web_view.settings().setAttribute(QWebSettings.AutoLoadImages, True) web_view.settings().setAttribute(QWebSettings.JavascriptEnabled, True) web_view.settings().setAttribute(QWebSettings.JavaEnabled, False) web_view.settings().setAttribute(QWebSettings.JavascriptCanOpenWindows, False) web_view.settings().setAttribute(QWebSettings.PluginsEnabled, True) self.web_page.setView(web_view) self.setCentralWidget(web_view) self.setWindowTitle('MaybeVideo') self.web_page.view().urlChanged.connect(self._page_url_change) self.web_page.loadStarted.connect(self._page_start) self.web_page.loadProgress.connect(self._page_progress) self.web_page.loadFinished.connect(self._page_finished) def go(self, url): #print 'go:', url self.web_page.view().load(QUrl(url)) def _page_progress(self, percent): #print 'page progress', percent pass def _page_start(self): #print 'page start' pass def _page_finished(self, ok): #print 'page finished:', str(ok) pass def _page_url_change(self, url): print '_url_change:', str(url.toString()) mvw = MaybeVideoWindow() def end(ign, ign2): print 'stopping' reactor.stop() def start(): mvw.show() if len(sys.argv) > 1: mvw.go('http://' + sys.argv[1] ) else: mvw.go('http://www.google.com') print 'start' signal.signal(signal.SIGINT, end) reactor.callLater(2, start) reactor.run()
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python