import random import time import platform import sys, subprocess, os import urllib.parse import urllib.request import json import zipfile try: import vlc except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'python-vlc']) import vlc try: import youtube_dl except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'youtube_dl']) import youtube_dl try: import pafy except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'pafy']) import pafy try: import requests except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'requests']) import requests try: from PyQt5 import QtCore, QtGui, QtWidgets except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'PyQt5']) from PyQt5 import QtCore, QtGui, QtWidgets try: import psycopg2 except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'psycopg2']) import psycopg2 try: from pypresence import Presence except: subprocess.check_call([sys.executable, "-m", "pip", "install", 'pypresence']) from pypresence import Presence def cls(): os.system('cls' if os.name == 'nt' else 'clear') playlist = {} instance = vlc.Instance() media = None mediaplayer = instance.media_player_new() is_paused = False timeToSleep = 0 playnext = True newindex = 0 listplaylist = list() playerStarted = False configfile = "resources/cfg.cfg" if not os.path.isfile(configfile): cfgwrite = open(configfile, 'w+') empty = {} json.dump(empty, cfgwrite, indent=3) cfgwrite.close() cfgread = open(configfile) config = json.load(cfgread) cfgread.close() rpc = Presence("896669007342633000") try: rpc.connect() if config['showrpc']: rpc.update(details="Just started app", state="Nothing is beeing listened...", large_image="multimate", start=time.time()) except: pass try: check_var = config['mainbuild'] except: if "MultiMate_Player.py" in os.listdir(os.getcwd()): config['mainbuild'] = 'MultiMate_Player.py' elif "MultiMate_Player.pyw" in os.listdir(os.getcwd()): config['mainbuild'] = 'MultiMate_Player.pyw' elif "MultiMate_Player.exe" in os.listdir(os.getcwd()): config['mainbuild'] = 'MultiMate_Player.exe' cfgwrite = open(configfile, 'w+') json.dump(config, cfgwrite, indent=3) cfgwrite.close() try: check_var = config['showrpc'] except: config['showrpc'] = True cfgwrite = open(configfile, 'w+') json.dump(config, cfgwrite, indent=3) cfgwrite.close() class Ui_MainWindow(QtWidgets.QMainWindow): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(801, 580) MainWindow.setMinimumSize(QtCore.QSize(801, 580)) MainWindow.setMaximumSize(QtCore.QSize(801, 580)) MainWindow.setWindowIcon(QtGui.QIcon('resources/MultiMate.ico')) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.timeline = QtWidgets.QSlider(self.centralwidget) self.timeline.setGeometry(QtCore.QRect(10, 490, 781, 22)) self.timeline.setPageStep(1) self.timeline.setOrientation(QtCore.Qt.Horizontal) self.timeline.setObjectName("timeline") self.timeline.setMaximum(1000) self.playpausebutton = QtWidgets.QPushButton(self.centralwidget) self.playpausebutton.setEnabled(True) self.playpausebutton.setGeometry(QtCore.QRect(390, 520, 40, 40)) font = QtGui.QFont() font.setKerning(True) self.playpausebutton.setFont(font) self.playpausebutton.setStyleSheet("background-color: rgba(10, 0, 0, 0);\n" "") self.playpausebutton.setText("") self.playpausebutton.setObjectName("playpausebutton") self.playpausePicture = QtWidgets.QLabel(self.centralwidget) self.playpausePicture.setGeometry(QtCore.QRect(390, 520, 40, 40)) self.playpausePicture.setText("") self.playpausePicture.setPixmap(QtGui.QPixmap("resources/MultiMate40x40.png")) self.playpausePicture.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.playpausePicture.setObjectName("playpausePicture") self.prevbutton = QtWidgets.QPushButton(self.centralwidget) self.prevbutton.setEnabled(True) self.prevbutton.setGeometry(QtCore.QRect(340, 520, 40, 40)) font = QtGui.QFont() font.setKerning(True) self.prevbutton.setFont(font) self.prevbutton.setStyleSheet("background-color: rgba(10, 0, 0, 0);\n" "") self.prevbutton.setText("") self.prevbutton.setObjectName("prevbutton") self.prevPicture = QtWidgets.QLabel(self.centralwidget) self.prevPicture.setGeometry(QtCore.QRect(340, 520, 40, 40)) self.prevPicture.setText("") self.prevPicture.setPixmap(QtGui.QPixmap("resources/prev.png")) self.prevPicture.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.prevPicture.setObjectName("prevPicture") self.nextbutton = QtWidgets.QPushButton(self.centralwidget) self.nextbutton.setEnabled(True) self.nextbutton.setGeometry(QtCore.QRect(440, 520, 40, 40)) font = QtGui.QFont() font.setKerning(True) self.nextbutton.setFont(font) self.nextbutton.setStyleSheet("background-color: rgba(10, 0, 0, 0);\n" "") self.nextbutton.setText("") self.nextbutton.setObjectName("nextbutton") self.nextPicture = QtWidgets.QLabel(self.centralwidget) self.nextPicture.setGeometry(QtCore.QRect(440, 520, 40, 40)) self.nextPicture.setText("") self.nextPicture.setPixmap(QtGui.QPixmap("resources/next.png")) self.nextPicture.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.nextPicture.setObjectName("nextPicture") self.speedBox = QtWidgets.QDoubleSpinBox(self.centralwidget) self.speedBox.setGeometry(QtCore.QRect(10, 515, 62, 22)) self.speedBox.setDecimals(1) self.speedBox.setProperty("value", 1.0) self.speedBox.setSingleStep(0.2) self.speedBox.setObjectName("speedBox") self.timenow = QtWidgets.QTextEdit(self.centralwidget) self.timenow.setGeometry(QtCore.QRect(713, 515, 81, 23)) self.timenow.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.timenow.setObjectName("timenow") self.speedTextLabel = QtWidgets.QLabel(self.centralwidget) self.speedTextLabel.setGeometry(QtCore.QRect(25, 536, 47, 13)) self.speedTextLabel.setObjectName("speedTextLabel") self.timeTextLabel = QtWidgets.QLabel(self.centralwidget) self.timeTextLabel.setGeometry(QtCore.QRect(740, 536, 47, 13)) self.timeTextLabel.setObjectName("timeTextLabel") self.volumeDial = QtWidgets.QDial(self.centralwidget) self.volumeDial.setGeometry(QtCore.QRect(719, 0, 81, 81)) self.volumeDial.setStyleSheet("") self.volumeDial.setMinimum(1) self.volumeDial.setMaximum(100) self.volumeDial.setPageStep(1) self.volumeDial.setProperty("value", 100) self.volumeDial.setObjectName("volumeDial") self.VolDialBG = QtWidgets.QLabel(self.centralwidget) self.VolDialBG.setGeometry(QtCore.QRect(720, 0, 81, 81)) self.VolDialBG.setText("") self.VolDialBG.setPixmap(QtGui.QPixmap("resources/MultiMate80x80.png")) self.VolDialBG.setObjectName("VolDialBG") self.playlistsComboBox = QtWidgets.QComboBox(self.centralwidget) self.playlistsComboBox.setGeometry(QtCore.QRect(0, 0, 231, 22)) self.playlistsComboBox.setCurrentText("") self.playlistsComboBox.setDuplicatesEnabled(True) self.playlistsComboBox.setObjectName("playlistsComboBox") for playlist in os.listdir(os.getcwd()): self.playlistsComboBox.addItem(playlist) self.nowPlaying = QtWidgets.QTextBrowser(self.centralwidget) self.nowPlaying.setGeometry(QtCore.QRect(10, 460, 781, 23)) self.nowPlaying.setObjectName("nowPlaying") self.openPlaylistButton = QtWidgets.QPushButton(self.centralwidget) self.openPlaylistButton.setGeometry(QtCore.QRect(230, 0, 75, 23)) self.openPlaylistButton.setObjectName("openPlaylistButton") self.songList = QtWidgets.QListWidget(self.centralwidget) self.songList.setGeometry(QtCore.QRect(0, 43, 301, 411)) self.songList.setObjectName("songList") self.TextAllSongs = QtWidgets.QTextEdit(self.centralwidget) self.TextAllSongs.setGeometry(QtCore.QRect(0, 20, 301, 23)) self.TextAllSongs.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.TextAllSongs.setObjectName("TextAllSongs") self.toFindName = QtWidgets.QTextEdit(self.centralwidget) self.toFindName.setGeometry(QtCore.QRect(310, 0, 331, 23)) self.toFindName.setObjectName("toFindName") self.findSongButton = QtWidgets.QPushButton(self.centralwidget) self.findSongButton.setGeometry(QtCore.QRect(640, 0, 75, 23)) self.findSongButton.setObjectName("findSongButton") self.foundSongs = QtWidgets.QComboBox(self.centralwidget) self.foundSongs.setGeometry(QtCore.QRect(310, 30, 331, 22)) self.foundSongs.setObjectName("foundSongs") self.addThisSongButton = QtWidgets.QPushButton(self.centralwidget) self.addThisSongButton.setGeometry(QtCore.QRect(640, 30, 75, 23)) self.addThisSongButton.setObjectName("addThisSongButton") self.mixButton = QtWidgets.QPushButton(self.centralwidget) self.mixButton.setGeometry(QtCore.QRect(720, 90, 75, 41)) self.mixButton.setObjectName("mixButton") self.playlistSettingsButton = QtWidgets.QPushButton(self.centralwidget) self.playlistSettingsButton.setGeometry(QtCore.QRect(720, 140, 75, 51)) self.playlistSettingsButton.setObjectName("playlistSettingsButton") self.settingsButton = QtWidgets.QPushButton(self.centralwidget) self.settingsButton.setGeometry(QtCore.QRect(720, 200, 75, 45)) self.settingsButton.setObjectName("settingsButton") self.extendedFunctButton = QtWidgets.QPushButton(self.centralwidget) self.extendedFunctButton.setGeometry(QtCore.QRect(720, 260, 75, 45)) self.extendedFunctButton.setObjectName("extendedFunctButton") if platform.system() == "Darwin": # for MacOS self.videoframe = QtWidgets.QMacCocoaViewContainer(self.centralwidget) else: self.videoframe = QtWidgets.QFrame(self.centralwidget) self.videoframe.setGeometry(QtCore.QRect(310, 60, 394, 394)) self.videoframe.setObjectName("videoframe") self.timeline.raise_() self.playpausePicture.raise_() self.prevPicture.raise_() self.nextPicture.raise_() self.speedBox.raise_() self.nextbutton.raise_() self.prevbutton.raise_() self.playpausebutton.raise_() self.timenow.raise_() self.speedTextLabel.raise_() self.timeTextLabel.raise_() self.VolDialBG.raise_() self.volumeDial.raise_() self.playlistsComboBox.raise_() self.nowPlaying.raise_() self.openPlaylistButton.raise_() self.songList.raise_() self.TextAllSongs.raise_() self.toFindName.raise_() self.findSongButton.raise_() self.foundSongs.raise_() self.addThisSongButton.raise_() self.mixButton.raise_() self.playlistSettingsButton.raise_() self.videoframe.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 801, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.timer = QtCore.QTimer(self) self.timer.timeout.connect(self.update_ui) def update_ui(self): global mediaplayer global playnext media_pos = int(mediaplayer.get_position() * 1000) if mediaplayer.get_position() > 0.99: playallpl(newindex) self.timeline.setValue(media_pos) self.timenow.setText(str(time.strftime("%M:%S", time.gmtime(int(mediaplayer.get_time()/1000)))) + "/" + str(time.strftime("%M:%S", time.gmtime(int(mediaplayer.get_length()/1000))))) if not mediaplayer.is_playing(): self.timer.stop() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MultiMate Player")) self.speedBox.setPrefix(_translate("MainWindow", "x")) self.speedTextLabel.setText(_translate("MainWindow", "Speed")) self.timeTextLabel.setText(_translate("MainWindow", "Time")) self.nowPlaying.setPlaceholderText(_translate("MainWindow", "Choose playlist and open it...")) self.openPlaylistButton.setText(_translate("MainWindow", "Open playlist")) self.TextAllSongs.setHtml(_translate("MainWindow", "\n" "\n" "

Songs in playlist

")) self.findSongButton.setText(_translate("MainWindow", "Find song")) self.addThisSongButton.setText(_translate("MainWindow", "Add this song")) self.mixButton.setText(_translate("MainWindow", "Mix")) self.playlistSettingsButton.setText(_translate("MainWindow", "Playlist \nsettings")) self.settingsButton.setText(_translate("MainWindow", "Settings")) self.extendedFunctButton.setText(_translate("MainWindow", "Extended \n functions")) class Ui_PlaylistSettings(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(160, 97) MainWindow.setMinimumSize(QtCore.QSize(160, 97)) MainWindow.setMaximumSize(QtCore.QSize(160, 97)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 160, 80)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.deletesongButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.deletesongButton.setObjectName("deletesongButton") self.verticalLayout.addWidget(self.deletesongButton) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 160, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Playlist settings")) self.deletesongButton.setText(_translate("MainWindow", "Manage songs in playlist")) class Ui_Settings(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(160, 100) MainWindow.setMinimumSize(QtCore.QSize(160, 100)) MainWindow.setMaximumSize(QtCore.QSize(160, 100)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 160, 80)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.updateButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.updateButton.setObjectName("updateButton") self.verticalLayout.addWidget(self.updateButton) self.appBuildButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.appBuildButton.setObjectName("appBuildButton") self.verticalLayout.addWidget(self.appBuildButton) self.RPCButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.RPCButton.setObjectName("RPCButton") self.verticalLayout.addWidget(self.RPCButton) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 160, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Settings")) self.updateButton.setText(_translate("MainWindow", "Upgrade player")) self.appBuildButton.setText(_translate("MainWindow", "Choose main build")) self.RPCButton.setText(_translate("MainWindow", "Discord RPC settings")) class Ui_Updater(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(160, 97) MainWindow.setMinimumSize(QtCore.QSize(160, 97)) MainWindow.setMaximumSize(QtCore.QSize(160, 97)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 160, 80)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.updateButton = QtWidgets.QPushButton(self.verticalLayoutWidget) self.updateButton.setObjectName("updateButton") self.verticalLayout.addWidget(self.updateButton) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 160, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Updater")) self.updateButton.setText(_translate("MainWindow", "Download newest")) class Ui_DelSongs(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(300, 510) MainWindow.setMinimumSize(QtCore.QSize(300, 510)) MainWindow.setMaximumSize(QtCore.QSize(300, 510)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.listWidget = QtWidgets.QListWidget(self.centralwidget) self.listWidget.setGeometry(QtCore.QRect(0, 0, 300, 461)) self.listWidget.setObjectName("listWidget") self.delButton = QtWidgets.QPushButton(self.centralwidget) self.delButton.setGeometry(QtCore.QRect(0, 460, 300, 23)) self.delButton.setObjectName("delButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Songs manager")) self.delButton.setText(_translate("MainWindow", "Delete selected song")) class Ui_ProSearch(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(750, 600) MainWindow.setMinimumSize(QtCore.QSize(750, 600)) MainWindow.setMaximumSize(QtCore.QSize(750, 600)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.listWidget = QtWidgets.QListWidget(self.centralwidget) self.listWidget.setGeometry(QtCore.QRect(0, 180, 750, 361)) self.listWidget.setObjectName("listWidget") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(160, 70, 440, 30)) self.lineEdit.setStyleSheet("border-radius:\n" " 1 px;") self.lineEdit.setReadOnly(False) self.lineEdit.setObjectName("lineEdit") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(285, 20, 180, 31)) self.label.setObjectName("label") self.searchButton = QtWidgets.QPushButton(self.centralwidget) self.searchButton.setGeometry(QtCore.QRect(300, 110, 150, 30)) self.searchButton.setObjectName("searchButton") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(300, 550, 150, 31)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 750, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Pro search")) self.lineEdit.setPlaceholderText(_translate("MainWindow", "Never gonna give you up")) self.label.setText(_translate("MainWindow", "

Advanced search

")) self.searchButton.setText(_translate("MainWindow", "Search")) self.pushButton.setText(_translate("MainWindow", "Add selected")) def searchinYT(self): global results search = self.lineEdit.text() results = YoutubeSearch(search, max_results=150).to_dict() self.listWidget.clear() for i in range(len(results)): item = QtWidgets.QListWidgetItem(results[i]["channel"] + ": " + results[i]["title"]) item.setCheckState(QtCore.Qt.Unchecked) self.listWidget.addItem(item) return results def addtopl(self): global results global playlist whichres = list() for index in range(self.listWidget.count()): if self.listWidget.item(index).checkState() == QtCore.Qt.Checked: whichres.append(index) for i in whichres: i = int(i) url = "https://www.youtube.com" + results[i]["url_suffix"] willbesong = {} willbesong['name'] = results[i]["title"] willbesong['author'] = results[i]["channel"] willbesong['url'] = url playlist[str(len(list(playlist)))] = willbesong playlistfile = open(ui.playlistsComboBox.currentText(), 'w+') json.dump(playlist, playlistfile, indent=3, ensure_ascii=False) playlistfile.close() getplaylist() class Ui_ExtendedMenu(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(151, 74) MainWindow.setMinimumSize(QtCore.QSize(151, 74)) MainWindow.setMaximumSize(QtCore.QSize(151, 74)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.prosearchButton = QtWidgets.QPushButton(self.centralwidget) self.prosearchButton.setGeometry(QtCore.QRect(0, 0, 150, 50)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.prosearchButton.sizePolicy().hasHeightForWidth()) self.prosearchButton.setSizePolicy(sizePolicy) self.prosearchButton.setMaximumSize(QtCore.QSize(150, 50)) self.prosearchButton.setObjectName("prosearchButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 151, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Extended functions")) self.prosearchButton.setText(_translate("MainWindow", "Pro search")) class Ui_RPCsettings(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(160, 100) MainWindow.setMinimumSize(QtCore.QSize(160, 100)) MainWindow.setMaximumSize(QtCore.QSize(160, 100)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) self.verticalLayoutWidget.setGeometry(QtCore.QRect(9, 0, 151, 80)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.ShowRPCcheckBox = QtWidgets.QCheckBox(self.verticalLayoutWidget) self.ShowRPCcheckBox.setObjectName("ShowRPCcheckBox") self.verticalLayout.addWidget(self.ShowRPCcheckBox) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 160, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.ShowRPCcheckBox.setChecked(config['showrpc']) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "RPC settings")) self.ShowRPCcheckBox.setText(_translate("MainWindow", "Show RPC")) class Ui_MainBuild(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(161, 157) MainWindow.setMinimumSize(QtCore.QSize(161, 157)) MainWindow.setMaximumSize(QtCore.QSize(161, 157)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.listWidget = QtWidgets.QListWidget(self.centralwidget) self.listWidget.setGeometry(QtCore.QRect(0, 0, 161, 111)) self.listWidget.setObjectName("listWidget") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(0, 110, 161, 23)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 161, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) for file in os.listdir(os.getcwd()): if file == "MultiMate_Player.py": self.listWidget.addItem(file) elif file == "MultiMate_Player.pyw": self.listWidget.addItem(file) elif file == "MultiMate_Player.exe": self.listWidget.addItem(file) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "Choose main build")) self.pushButton.setText(_translate("MainWindow", "Choose main build")) class YoutubeSearch: def __init__(self, search_terms: str, max_results=None): self.search_terms = search_terms self.max_results = max_results self.videos = self._search() def _search(self): encoded_search = urllib.parse.quote_plus(self.search_terms) BASE_URL = "https://youtube.com" url = f"{BASE_URL}/search?q={encoded_search}" response = requests.get(url).text while "ytInitialData" not in response: response = requests.get(url).text results = self._parse_html(response) if self.max_results is not None and len(results) > self.max_results: return results[: self.max_results] return results def _parse_html(self, response): results = [] start = ( response.index("ytInitialData") + len("ytInitialData") + 3 ) end = response.index("};", start) + 1 json_str = response[start:end] data = json.loads(json_str) videos = data["contents"]["twoColumnSearchResultsRenderer"]["primaryContents"][ "sectionListRenderer" ]["contents"][0]["itemSectionRenderer"]["contents"] for video in videos: res = {} if "videoRenderer" in video.keys(): video_data = video.get("videoRenderer", {}) res["id"] = video_data.get("videoId", None) res["thumbnails"] = [thumb.get("url", None) for thumb in video_data.get("thumbnail", {}).get("thumbnails", [{}]) ] res["title"] = video_data.get("title", {}).get("runs", [[{}]])[0].get("text", None) res["long_desc"] = video_data.get("descriptionSnippet", {}).get("runs", [{}])[0].get("text", None) res["channel"] = video_data.get("longBylineText", {}).get("runs", [[{}]])[0].get("text", None) res["duration"] = video_data.get("lengthText", {}).get("simpleText", 0) res["views"] = video_data.get("viewCountText", {}).get("simpleText", 0) res["publish_time"] = video_data.get("publishedTimeText", {}).get("simpleText", 0) res["url_suffix"] = video_data.get("navigationEndpoint", {}).get("commandMetadata", {}).get("webCommandMetadata", {}).get("url", None) results.append(res) return results def to_dict(self, clear_cache=True): result = self.videos if clear_cache: self.videos = "" return result def to_json(self, clear_cache=True): result = json.dumps({"videos": self.videos}) if clear_cache: self.videos = "" return result def readpl(plname): playlistfile = open(plname) playlist = json.load(playlistfile) playlistfile.close() return playlist def searchinYT(): global results search = ui.toFindName.toPlainText() results = YoutubeSearch(search, max_results=10).to_dict() ui.foundSongs.clear() for i in range(len(results)): ui.foundSongs.addItem(results[i]["channel"] + ": " + results[i]["title"]) return results results = dict() def addtopl(): global results global playlist whichres = ui.foundSongs.currentIndex() url = "https://www.youtube.com" + results[whichres]["url_suffix"] print(str(len(list(playlist)))) willbesong = {} # willbesong['name'] = bytes(results[whichres]["title"], 'Windows-1251', 'ignore').decode('Windows-1251', 'ignore') # willbesong['author'] = bytes(results[whichres]["channel"], 'Windows-1251', 'ignore').decode('Windows-1251', 'ignore') # willbesong['url'] = url willbesong['name'] = results[whichres]["title"] willbesong['author'] = results[whichres]["channel"] willbesong['url'] = url playlist[str(len(list(playlist)))] = willbesong playlistfile = open(ui.playlistsComboBox.currentText(), 'w+') json.dump(playlist, playlistfile, indent=3, ensure_ascii=False) playlistfile.close() getplaylist() def set_position(): global instance global media global mediaplayer global is_paused ui.timer.stop() pos = ui.timeline.value() mediaplayer.set_position(pos / 1000.0) ui.timer.start(100) def playmusic(url, name, author): video = None while video is None: try: video = pafy.new(url) except: print("Cannot create translation link, I will try once more") best = video.getbest() playurl = best.url global instance global media global mediaplayer global is_paused global timeToSleep global playnext playnext = False media = instance.media_new(playurl) mediaplayer.set_media(media) if platform.system() == "Linux": # for Linux using the X Server mediaplayer.set_xwindow(int(ui.videoframe.winId())) elif platform.system() == "Windows": # for Windows mediaplayer.set_hwnd(int(ui.videoframe.winId())) elif platform.system() == "Darwin": # for MacOS mediaplayer.set_nsobject(int(ui.videoframe.winId())) playpause() ui.timer.stop() time.sleep(1) if int(mediaplayer.get_length()/60000) <= 3: timeToSleepForUnbug = 0 else: timeToSleepForUnbug = (mediaplayer.get_length()/60000)/2.6 time.sleep(timeToSleepForUnbug) ui.timer.start(100) mediaplayer.audio_set_volume(ui.volumeDial.value()) time.sleep(0.5) timeToSleep = mediaplayer.get_length() / 1000 cls() ui.nowPlaying.setText(author + " - " + name) try: if config['showrpc']: rpc.update(details="Listening " + author, state=name, large_image="multimate", start=time.time()) except: pass print("Playing " + author + " - " + name) app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) appPlSet = QtWidgets.QApplication(sys.argv) MainWindowPlSet = QtWidgets.QMainWindow() uiPlSet = Ui_PlaylistSettings() uiPlSet.setupUi(MainWindowPlSet) appDelS = QtWidgets.QApplication(sys.argv) MainWindowDelS = QtWidgets.QMainWindow() uiDelS = Ui_DelSongs() uiDelS.setupUi(MainWindowDelS) appSet = QtWidgets.QApplication(sys.argv) MainWindowSet = QtWidgets.QMainWindow() uiSet = Ui_Settings() uiSet.setupUi(MainWindowSet) appUpd = QtWidgets.QApplication(sys.argv) MainWindowUpd = QtWidgets.QMainWindow() uiUpd = Ui_Updater() uiUpd.setupUi(MainWindowUpd) appExt = QtWidgets.QApplication(sys.argv) MainWindowExt = QtWidgets.QMainWindow() uiExt = Ui_ExtendedMenu() uiExt.setupUi(MainWindowExt) appPSearch = QtWidgets.QApplication(sys.argv) MainWindowPSearch = QtWidgets.QMainWindow() uiPSearch = Ui_ProSearch() uiPSearch.setupUi(MainWindowPSearch) appRPCSet = QtWidgets.QApplication(sys.argv) MainWindowRPCSet = QtWidgets.QMainWindow() uiRPCSet = Ui_RPCsettings() uiRPCSet.setupUi(MainWindowRPCSet) appMainBuild = QtWidgets.QApplication(sys.argv) MainWindowMainBuild = QtWidgets.QMainWindow() uiMainBuild = Ui_MainBuild() uiMainBuild.setupUi(MainWindowMainBuild) def getplaylist(): global playlist global newindex global listplaylist newindex = 0 playlist = readpl(ui.playlistsComboBox.currentText()) ui.songList.clear() listplaylist = list(playlist) for item in listplaylist: ui.songList.addItem(str(playlist[item]['author'] + " - " + playlist[item]['name'])) ui.nowPlaying.setPlaceholderText("Click play button or song name...") def playallpl(index=0): global listplaylist global newindex ui.playpausebutton.clicked.disconnect() ui.playpausebutton.clicked.connect(playpause) item = listplaylist[index] playmusic(playlist[item]['url'], playlist[item]['name'], playlist[item]['author']) ui.songList.setCurrentRow(index) if newindex < len(listplaylist) - 1: newindex = index + 1 else: newindex = 0 def playnextsong(): global newindex playallpl(newindex) def playprevsong(): global newindex newindex -= 2 playallpl(newindex) def playpause(): global is_paused if mediaplayer.is_playing(): mediaplayer.pause() is_paused = True ui.timer.stop() else: mediaplayer.play() ui.timer.start(100) is_paused = False def changevolume(): mediaplayer.audio_set_volume(ui.volumeDial.value()) def changespeed(): mediaplayer.set_rate(ui.speedBox.value()) def addtofoundsongs(): ui.toFindName.toPlainText() def generateDeletionList(): global playlist songList = [] for item in list(playlist): songList.append(str(playlist[item]['author'] + " - " + playlist[item]['name'])) uiDelS.listWidget.clear() uiDelS.listWidget.addItems(songList) def showMainWindowDelS(): generateDeletionList() MainWindowDelS.show() def delSongFromPl(): global playlist indextodel = uiDelS.listWidget.selectedIndexes()[0].row() toDelID = list(playlist)[indextodel] playlist.pop(toDelID) playlistfile = open(ui.playlistsComboBox.currentText(), 'w+') json.dump(playlist, playlistfile, indent=3, ensure_ascii=False) playlistfile.close() generateDeletionList() getplaylist() def mixPlaylist(): global listplaylist try: random.shuffle(listplaylist) ui.songList.clear() for item in listplaylist: ui.songList.addItem(str(playlist[item]['author'] + " - " + playlist[item]['name'])) except: pass def updateAppPy(): try: if config['showrpc']: rpc.update(details="Updating", state="Everything needs to be up-to-date", large_image="multimate", start=time.time()) except: pass urllib.request.urlretrieve("https://github.com/BarsTiger/MultiMatePlayer/raw/master/resources/resources.zip", 'resources/resources.zip') with zipfile.ZipFile('resources/resources.zip', 'r') as archfile: archfile.extractall("resources") if config['mainbuild'] != "MultiMate_Player.exe": urllib.request.urlretrieve("https://raw.githubusercontent.com/BarsTiger/MultiMatePlayer/master/MultiMate_Player.py", config['mainbuild']) subprocess.Popen(sys.executable + ' ' + config['mainbuild']) elif config['mainbuild'] == "MultiMate_Player.exe": urllib.request.urlretrieve("https://github.com/BarsTiger/MultiMatePlayer/raw/master/MultiMate_Player.exe", config['mainbuild']) subprocess.Popen(config['mainbuild']) time.sleep(0.5) exit() def changeRPCinCFG(): config['showrpc'] = uiRPCSet.ShowRPCcheckBox.isChecked() cfgwrite = open(configfile, 'w+') json.dump(config, cfgwrite, indent=3) cfgwrite.close() def changeMainBuild(): config['mainbuild'] = uiMainBuild.listWidget.currentItem().text() cfgwrite = open(configfile, 'w+') json.dump(config, cfgwrite, indent=3) cfgwrite.close() def playActivatedSong(): playallpl(ui.songList.currentRow()) MainWindow.show() cls() ui.openPlaylistButton.clicked.connect(getplaylist) ui.playpausebutton.clicked.connect(playallpl) ui.timeline.sliderMoved.connect(set_position) ui.timeline.sliderPressed.connect(set_position) ui.nextbutton.clicked.connect(playnextsong) ui.prevbutton.clicked.connect(playprevsong) ui.volumeDial.valueChanged.connect(changevolume) ui.findSongButton.clicked.connect(searchinYT) ui.addThisSongButton.clicked.connect(addtopl) ui.speedBox.valueChanged.connect(changespeed) ui.playlistSettingsButton.clicked.connect(MainWindowPlSet.show) ui.mixButton.clicked.connect(mixPlaylist) ui.settingsButton.clicked.connect(MainWindowSet.show) ui.extendedFunctButton.clicked.connect(MainWindowExt.show) ui.songList.itemClicked.connect(playActivatedSong) uiPlSet.deletesongButton.clicked.connect(showMainWindowDelS) uiDelS.delButton.clicked.connect(delSongFromPl) uiSet.updateButton.clicked.connect(MainWindowUpd.show) uiSet.appBuildButton.clicked.connect(MainWindowMainBuild.show) uiSet.RPCButton.clicked.connect(MainWindowRPCSet.show) uiUpd.updateButton.clicked.connect(updateAppPy) uiExt.prosearchButton.clicked.connect(MainWindowPSearch.show) uiPSearch.searchButton.clicked.connect(uiPSearch.searchinYT) uiPSearch.pushButton.clicked.connect(uiPSearch.addtopl) uiRPCSet.ShowRPCcheckBox.clicked.connect(changeRPCinCFG) uiMainBuild.pushButton.clicked.connect(changeMainBuild) sys.exit(app.exec_())