Example #1
0
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()
Example #2
0
	def showPopup(self, infoHTML):
		self.popupWindow = PopupWindow(infoHTML)
		self.popupWindow.show()