From dbf832784ae23197d069c424734dd797ca759ac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20Sch=C3=B6nbach?= Date: Wed, 27 Aug 2014 19:59:48 +0200 Subject: [PATCH] my try with pyqt as a gui --- flashget/qtgui.py | 73 +++++++++++++++++++ gui_qt.py | 176 ++++++++++++++++++++++++++++++++++++++++++++++ qtgui.ui | 143 +++++++++++++++++++++++++++++++++++++ 3 files changed, 392 insertions(+) create mode 100644 flashget/qtgui.py create mode 100644 gui_qt.py create mode 100644 qtgui.ui diff --git a/flashget/qtgui.py b/flashget/qtgui.py new file mode 100644 index 0000000..8926318 --- /dev/null +++ b/flashget/qtgui.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'qtgui.ui' +# +# Created: Wed Aug 27 19:34:42 2014 +# by: PyQt4 UI code generator 4.10.3 +# +# WARNING! All changes made in this file will be lost! + +from PyQt4 import QtCore, QtGui + +try: + _fromUtf8 = QtCore.QString.fromUtf8 +except AttributeError: + def _fromUtf8(s): + return s + +try: + _encoding = QtGui.QApplication.UnicodeUTF8 + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig, _encoding) +except AttributeError: + def _translate(context, text, disambig): + return QtGui.QApplication.translate(context, text, disambig) + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName(_fromUtf8("Dialog")) + Dialog.resize(640, 480) + Dialog.setMinimumSize(QtCore.QSize(640, 480)) + self.label = QtGui.QLabel(Dialog) + self.label.setGeometry(QtCore.QRect(9, 9, 21, 16)) + self.label.setObjectName(_fromUtf8("label")) + self.url = QtGui.QLineEdit(Dialog) + self.url.setGeometry(QtCore.QRect(40, 10, 110, 20)) + self.url.setObjectName(_fromUtf8("url")) + self.okButton = QtGui.QPushButton(Dialog) + self.okButton.setGeometry(QtCore.QRect(510, 10, 77, 26)) + self.okButton.setObjectName(_fromUtf8("okButton")) + self.label_2 = QtGui.QLabel(Dialog) + self.label_2.setGeometry(QtCore.QRect(0, 60, 118, 16)) + self.label_2.setObjectName(_fromUtf8("label_2")) + self.parallel_downloads = QtGui.QLineEdit(Dialog) + self.parallel_downloads.setGeometry(QtCore.QRect(150, 60, 16, 16)) + self.parallel_downloads.setObjectName(_fromUtf8("parallel_downloads")) + self.progress_1_label = QtGui.QLabel(Dialog) + self.progress_1_label.setGeometry(QtCore.QRect(10, 140, 73, 16)) + self.progress_1_label.setObjectName(_fromUtf8("progress_1_label")) + self.progressBar_1 = QtGui.QProgressBar(Dialog) + self.progressBar_1.setGeometry(QtCore.QRect(89, 133, 95, 22)) + self.progressBar_1.setProperty("value", 0) + self.progressBar_1.setObjectName(_fromUtf8("progressBar_1")) + self.label_5 = QtGui.QLabel(Dialog) + self.label_5.setGeometry(QtCore.QRect(9, 189, 22, 16)) + self.label_5.setObjectName(_fromUtf8("label_5")) + self.logBrowser = QtGui.QTextBrowser(Dialog) + self.logBrowser.setGeometry(QtCore.QRect(9, 209, 631, 241)) + self.logBrowser.setObjectName(_fromUtf8("logBrowser")) + self.current_downloads = QtGui.QTableView(Dialog) + self.current_downloads.setGeometry(QtCore.QRect(250, 110, 351, 81)) + self.current_downloads.setObjectName(_fromUtf8("current_downloads")) + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) + self.label.setText(_translate("Dialog", "Url:", None)) + self.okButton.setText(_translate("Dialog", "OK", None)) + self.label_2.setText(_translate("Dialog", "Parallel Downloads", None)) + self.progress_1_label.setText(_translate("Dialog", "Download 1", None)) + self.label_5.setText(_translate("Dialog", "Log", None)) + diff --git a/gui_qt.py b/gui_qt.py new file mode 100644 index 0000000..7dc7920 --- /dev/null +++ b/gui_qt.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +import flashget +from flashget.qtgui import Ui_Dialog +from flashget.main import main as flashget_main +from flashget.config import updateConfig, loadConfig +from PyQt4 import QtGui, QtCore +from PyQt4.QtCore import QVariant, Qt, QAbstractTableModel, QThread +import sys + + +class FlashgetDialog(QtGui.QDialog, Ui_Dialog): + def __init__(self, parent=None): + QtGui.QWidget.__init__(self, parent) + + # Set up the user interface from Designer. + self.setupUi(parent) + + self.okButton.clicked.connect(self.accept) + + self.config = loadConfig() + + self.setFields() + self.started = False + + def setFields(self): + self.parallel_downloads.setText(self.config["dl_instances"]) + self.url.setText("http://de.ddl.me/ein-seltsames-paar-deutsch-stream-download_0_5707.html") + + XStream.stdout().messageWritten.connect( self.logBrowser.insertPlainText) + XStream.stderr().messageWritten.connect( self.logBrowser.insertPlainText ) + + self.tableModel = DownloadsModel([["","","","",""]], self) + self.current_downloads.setModel(self.tableModel) + + def accept(self): + if self.started: + return + url = self.url.text() + url = unicode(url).strip() + self.config = updateConfig({"links": [url], + "progress_handler": progress_handler, + "sleep_handler": sleep_handler, + "captcha_selfsolve": True}) + self.thread = FlashgetThread(self.config, self) + self.thread.start() + self.started = True + + +class FlashgetThread(QThread): + def __init__(self, config, parent=None): + QThread.__init__(self, parent) + + self.config = config + + def run(self): + flashget_main(self.config) + +def progress_handler(self, uid, event, data): + emptyRow = ["", "", "", "", ""] + arraydata = main.centralWidget().tableModel.arraydata + if event == "new" or event == "update": + while len(arraydata) <= uid: + arraydata.append(emptyRow) + arraydata[uid] = [data["basename"], data["downloaded"] + " / " + data["size"], data["percent"], data["eta"], data["speed"]] + #self.logProgress(' [%s%%] %s/%s at %s ETA %s %s' % (data["percent"], data["downloaded"], data["size"], data["speed"], data["eta"], data["basename"])) + elif event == "delete": + if len(arraydata) <= uid: + arraydata[uid] = emptyRow + # cleanup + while True: + if arraydata[len(arraydata)-1] == emptyRow: + del arraydata[len(arraydata)-1] + # we need at least one row + if len(arraydata) == 0: + arraydata = [emptyRow] + # self.logProgress(' ') # clear our old line + main.centralWidget().tableModel.layoutChanged.emit() + +def sleep_handler(self, timeout): + import time + start = time.time() + print("sleeping for %d" % timeout) + main.centralWidget().progress_1_label.setText(self.ename) + while True: + diff = time.time() - start + if diff > timeout: + break + # TODO this one is crashing the application - especially when I add a "print" before + # I guess signals are required for it so it doesn't run in a separate thread + # val = int((diff*10/(timeout*10))*100) + # main.centralWidget().progressBar_1.setValue(val) + time.sleep(0.1) + main.centralWidget().progressBar_1._active = False + return True + + +class DownloadsModel(QAbstractTableModel): + def __init__(self, datain, parent=None, *args): + QAbstractTableModel.__init__(self, parent, *args) + self.arraydata = datain + + def rowCount(self, parent): + return len(self.arraydata) + + def columnCount(self, parent): + return len(self.arraydata[0]) + + def data(self, index, role): + if not index.isValid(): + return QVariant() + elif role != Qt.DisplayRole: + return QVariant() + return QVariant(self.arraydata[index.row()][index.column()]) + +class MainWindow(QtGui.QMainWindow): + def __init__(self): + QtGui.QMainWindow.__init__(self) + + self.setWindowTitle(flashget.__name__ + " - " + flashget.__version__) + self.resize(433, 318) + + w = FlashgetDialog(self) + self.setCentralWidget(w) + + + + +import logging + +class QtHandler(logging.Handler): + def __init__(self): + logging.Handler.__init__(self) + def emit(self, record): + record = self.format(record) + if record: XStream.stdout().write('%s\n'%record) + # originally: XStream.stdout().write("{}\n".format(record)) + +logger = logging.getLogger() +handler = QtHandler() +handler.setFormatter(logging.Formatter("%(levelname)s: %(message)s")) +logger.addHandler(handler) +logger.setLevel(logging.DEBUG) + + +class XStream(QtCore.QObject): + _stdout = None + _stderr = None + messageWritten = QtCore.pyqtSignal(str) + def flush( self ): + pass + def fileno( self ): + return -1 + def write( self, msg ): + if ( not self.signalsBlocked() ): + self.messageWritten.emit(unicode(msg)) + @staticmethod + def stdout(): + if ( not XStream._stdout ): + XStream._stdout = XStream() + sys.stdout = XStream._stdout + return XStream._stdout + @staticmethod + def stderr(): + if ( not XStream._stderr ): + XStream._stderr = XStream() + sys.stderr = XStream._stderr + return XStream._stderr + + + + + +app = QtGui.QApplication(sys.argv) +main = MainWindow() +main.show() +sys.exit(app.exec_()) diff --git a/qtgui.ui b/qtgui.ui new file mode 100644 index 0000000..b99266a --- /dev/null +++ b/qtgui.ui @@ -0,0 +1,143 @@ + + + Dialog + + + + 0 + 0 + 640 + 480 + + + + + 640 + 480 + + + + Dialog + + + + + 9 + 9 + 21 + 16 + + + + Url: + + + + + + 40 + 10 + 110 + 20 + + + + + + + 510 + 10 + 77 + 26 + + + + OK + + + + + + 0 + 60 + 118 + 16 + + + + Parallel Downloads + + + + + + 150 + 60 + 16 + 16 + + + + + + + 10 + 140 + 73 + 16 + + + + Download 1 + + + + + + 89 + 133 + 95 + 22 + + + + 0 + + + + + + 9 + 189 + 22 + 16 + + + + Log + + + + + + 9 + 209 + 631 + 241 + + + + + + + 250 + 110 + 351 + 81 + + + + + + +