class Twitchi_MainWindow(QMainWindow): def __init__(self, *args): super() QMainWindow.__init__(self, *args) # LAYOUT CODE - GENERATED BY QTDESIGNER self.setWindowTitle("Twitchi") self.setGeometry(0, 0, 611, 392) self.center() self.setMaximumSize(QtCore.QSize(611, 392)) self.centralwidget = QtGui.QWidget(self) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.groupBox = QtGui.QGroupBox(self.centralwidget) self.groupBox.setGeometry(QtCore.QRect(10, 10, 591, 71)) self.groupBox.setTitle(_fromUtf8("")) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.layoutWidget = QtGui.QWidget(self.groupBox) self.layoutWidget.setGeometry(QtCore.QRect(10, 11, 571, 52)) self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) self.gridLayout = QtGui.QGridLayout(self.layoutWidget) self.gridLayout.setMargin(0) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.addButton = QtGui.QPushButton(self.layoutWidget) self.addButton.setMinimumSize(QtCore.QSize(0, 50)) self.addButton.setAutoFillBackground(False) self.addButton.setDefault(False) self.addButton.setFlat(False) self.addButton.setObjectName(_fromUtf8("addButton")) self.gridLayout.addWidget(self.addButton, 0, 1, 1, 1) self.removeButton = QtGui.QPushButton(self.layoutWidget) self.removeButton.setMinimumSize(QtCore.QSize(0, 50)) self.removeButton.setAutoFillBackground(False) self.removeButton.setDefault(False) self.removeButton.setFlat(False) self.removeButton.setObjectName(_fromUtf8("removeButton")) self.gridLayout.addWidget(self.removeButton, 0, 3, 1, 1) self.toggleButton = QtGui.QPushButton(self.layoutWidget) self.toggleButton.setMinimumSize(QtCore.QSize(0, 50)) self.toggleButton.setAutoFillBackground(False) self.toggleButton.setDefault(False) self.toggleButton.setFlat(False) self.toggleButton.setObjectName(_fromUtf8("toggleButton")) self.gridLayout.addWidget(self.toggleButton, 0, 4, 1, 1) self.refreshButton = QtGui.QPushButton(self.layoutWidget) self.refreshButton.setMinimumSize(QtCore.QSize(0, 50)) self.refreshButton.setSizeIncrement(QtCore.QSize(0, 0)) self.refreshButton.setAutoFillBackground(False) self.refreshButton.setDefault(False) self.refreshButton.setFlat(False) self.refreshButton.setObjectName(_fromUtf8("refreshButton")) self.gridLayout.addWidget(self.refreshButton, 0, 0, 1, 1) self.groupBox_2 = QtGui.QGroupBox(self.centralwidget) self.groupBox_2.setGeometry(QtCore.QRect(10, 90, 591, 251)) self.groupBox_2.setTitle(_fromUtf8("")) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.textBrowser = QtGui.QTextBrowser(self.groupBox_2) self.textBrowser.setGeometry(QtCore.QRect(10, 10, 571, 231)) self.textBrowser.setAutoFillBackground(False) self.textBrowser.setStyleSheet(_fromUtf8("background-color: rgba(255, 255, 255, 0);")) self.textBrowser.setFrameShape(QtGui.QFrame.NoFrame) self.textBrowser.setFrameShadow(QtGui.QFrame.Sunken) self.textBrowser.setOpenExternalLinks(True) self.textBrowser.setOpenLinks(True) self.textBrowser.setObjectName(_fromUtf8("textBrowser")) self.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(self) self.menubar.setGeometry(QtCore.QRect(0, 0, 620, 21)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuTest = QtGui.QMenu(self.menubar) self.menuTest.setObjectName(_fromUtf8("menuTest")) self.menuHelp = QtGui.QMenu(self.menubar) self.menuHelp.setObjectName(_fromUtf8("menuHelp")) self.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(self) self.statusbar.setObjectName(_fromUtf8("statusbar")) self.setStatusBar(self.statusbar) self.actionAbout = QtGui.QAction(self) self.actionAbout.setObjectName(_fromUtf8("actionAbout")) self.actionSettings = QtGui.QAction(self) self.actionSettings.setObjectName(_fromUtf8("actionSettings")) self.menuTest.addAction(self.actionSettings) self.menuHelp.addAction(self.actionAbout) self.menubar.addAction(self.menuTest.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) # RETRANSLATE UI - GENERATED BY QTDESIGNER self.setWindowTitle(_translate("MainWindow", "Twitchi", None)) self.addButton.setStatusTip(_translate("MainWindow", "Add a new stream to check", None)) self.addButton.setText(_translate("MainWindow", "Add Streamer", None)) self.removeButton.setStatusTip(_translate("MainWindow", "Remove an existing stream", None)) self.removeButton.setText(_translate("MainWindow", "Remove Streamer", None)) self.toggleButton.setStatusTip(_translate("MainWindow", "Toggle auto-refreshing of data", None)) self.toggleButton.setText(_translate("MainWindow", "Toggle Refresh", None)) self.refreshButton.setStatusTip(_translate("MainWindow", "Refresh stream data", None)) self.refreshButton.setText(_translate("MainWindow", "Refresh", None)) self.menuTest.setTitle(_translate("MainWindow", "Settings", None)) self.menuHelp.setTitle(_translate("MainWindow", "Help", None)) self.actionAbout.setText(_translate("MainWindow", "About", None)) self.actionAbout.setStatusTip(_translate("MainWindow", "About Twitchi", None)) self.actionSettings.setText(_translate("MainWindow", "Preferences", None)) self.actionSettings.setStatusTip(_translate("MainWindow", "Application settings", None)) #Button Connections self.refreshButton.clicked.connect(self.getTwitchData) self.addButton.clicked.connect(self.addStreamer) self.removeButton.clicked.connect(self.removeStreamer) self.toggleButton.clicked.connect(self.toggleTimer) # QtCore.QMetaObject.connectSlotsByName(self) #Define windows to be used as none self.removeStreamerWindow = None self.popupWindow = None # Array of currently live streamers self.liveChannels = [] self.beginChecker() # self.showPopup() def center(self): window = self.frameGeometry() centerPoint = QtGui.QDesktopWidget().availableGeometry().center() window.moveCenter(centerPoint) self.move(window.topLeft()) def beginChecker(self): # If names file does not exist, create it if not os.path.exists("names.txt"): file = open("names.txt", "w+") file.close() # Initially run a check self.getTwitchData() # Set timer to 3 minutes self.timerInterval = 180000 # self.timerInterval = 30000 # Create and start timer self.timer = QTimer() self.timer.timeout.connect(self.getTwitchData) self.timer.start(self.timerInterval) def toggleTimer(self): if self.timer.isActive(): self.timer.stop() print("stopping timer") else: self.timer.start(self.timerInterval) print("starting timer") def getTwitchData(self): print("refreshing data") #DEBUG LINE - TODO: REMOVE BEFORE RELEASE self.textBrowser.setHtml(_translate("MainWindow", "<html><head></head><body>Getting data...</body></html>", None)) file = open("names.txt", "r+") # Reset output and popup strings outputString = "" popupString = "" for streamer in file.readlines(): if len(streamer) > 1: #to prevent blank lines from being read streamer = streamer.rstrip() # strip newline characters url = "http://api.justin.tv/api/stream/list.json?channel=" + streamer f = urllib.request.urlopen(url).read() # Get JSON data from server if len(f) > 2: # If the JSON data returned is longer than 2 characters, the channel is live jsonData = json.loads(f.decode("utf8"))[0]["channel"] # Convert the JSON into python types outputString += "<p><b>{0}</b> is live playing <b>{1}!</b><br/>{2}<br /><a href=\"{3}\">Open Stream</a></p>".format(jsonData["title"], jsonData["meta_game"], jsonData["status"], jsonData["channel_url"]) # Add username to the list of currently live channels if streamer not in self.liveChannels: self.liveChannels.append(streamer) popupString += "<p><a href=\"{0}\" style=\" font-size:8pt; font-weight:600; text-decoration: underline; color:#55ffff;\"><b>{1}</b></a> is live playing <b>{2}!</b></p>".format(jsonData["channel_url"], jsonData["title"], jsonData["meta_game"]) #if the server returns an offline stream, check if the streamer is in the list of live channels - if they are, remove them elif streamer in self.liveChannels: print("streamer: " + streamer) self.liveChannels.remove(streamer) file.close() if len(outputString) == 0: outputString = "Nobody you follow is currently streaming." self.liveChannels = [] # Reset liveChannels if no live channels are found self.textBrowser.setHtml(_translate("MainWindow", "<html><head></head><body>" + outputString + "</body></html>", None)) if len(popupString) > 0: # popupWindow = self.showPopup(popupString) def addStreamer(self): text, ok = QInputDialog.getText(self, "Add Username", "Enter twitch username:"******"names.txt", "r") streamer_usernames = nameFile.readlines() numLines = len(streamer_usernames) nameFile.close() nameFile = open("names.txt", "a+") if numLines is 0: nameFile.write(str(text)) else: nameFile.write("\n" + str(text)) # Only print a newline if we're not writing the very first line nameFile.close() self.getTwitchData() def removeStreamer(self): self.removeStreamerWindow = RemoveUserWindow() self.removeStreamerWindow.show() def showPopup(self, infoHTML): self.popupWindow = PopupWindow(infoHTML) self.popupWindow.show() def closeEvent(self, event): if self.removeStreamerWindow is not None: self.removeStreamerWindow.close() if self.popupWindow is not None: self.popupWindow.close()
def removeStreamer(self): self.removeStreamerWindow = RemoveUserWindow() self.removeStreamerWindow.show()