From d936f622de6e1f548a038c45173e95081db182c6 Mon Sep 17 00:00:00 2001 From: BarsTiger Date: Fri, 1 Oct 2021 16:27:46 +0300 Subject: [PATCH] Development. Just some dev --- MultiMate.py | 3 + resources/MultiMate40x40.png | Bin 0 -> 4407 bytes resources/MultiMate80x80.png | Bin 0 -> 5735 bytes .../MultiMate_Player.py | 132 ++++++++++++++++-- resources/hardplaybutton.png | Bin 0 -> 5057 bytes resources/hardstopbutton.png | Bin 0 -> 3626 bytes resources/next.png | Bin 0 -> 5620 bytes resources/prev.png | Bin 0 -> 6165 bytes 8 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 MultiMate.py create mode 100644 resources/MultiMate40x40.png create mode 100644 resources/MultiMate80x80.png rename MultiMate_Player.py => resources/MultiMate_Player.py (79%) create mode 100644 resources/hardplaybutton.png create mode 100644 resources/hardstopbutton.png create mode 100644 resources/next.png create mode 100644 resources/prev.png diff --git a/MultiMate.py b/MultiMate.py new file mode 100644 index 0000000..cc51270 --- /dev/null +++ b/MultiMate.py @@ -0,0 +1,3 @@ +import os + +os.system("python " + 'resources/MultiMate_Player.py') \ No newline at end of file diff --git a/resources/MultiMate40x40.png b/resources/MultiMate40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..229efb97339555c5474b3b8a8b43b707dca50c93 GIT binary patch literal 4407 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 EpF0hs3;+NC literal 0 HcmV?d00001 diff --git a/resources/MultiMate80x80.png b/resources/MultiMate80x80.png new file mode 100644 index 0000000000000000000000000000000000000000..d827f9da8afd4e17a81bbd3700b37fee3ac2070a GIT binary patch literal 5735 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 literal 0 HcmV?d00001 diff --git a/MultiMate_Player.py b/resources/MultiMate_Player.py similarity index 79% rename from MultiMate_Player.py rename to resources/MultiMate_Player.py index cb742ba..26d6512 100644 --- a/MultiMate_Player.py +++ b/resources/MultiMate_Player.py @@ -1,3 +1,4 @@ +import random import threading import time from tkinter import * @@ -32,6 +33,7 @@ except: def cls(): os.system('cls' if os.name == 'nt' else 'clear') +playlist = {} instance = vlc.Instance() media = None mediaplayer = instance.media_player_new() @@ -44,6 +46,7 @@ class Ui_MainWindow(QtWidgets.QMainWindow): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(801, 580) + MainWindow.setWindowIcon(QtGui.QIcon('resources/MultiMate.ico')) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.timeline = QtWidgets.QSlider(self.centralwidget) @@ -201,9 +204,9 @@ class Ui_MainWindow(QtWidgets.QMainWindow): self.mixButton = QtWidgets.QPushButton(self.centralwidget) self.mixButton.setGeometry(QtCore.QRect(720, 90, 75, 41)) self.mixButton.setObjectName("mixButton") - self.settingsButton = QtWidgets.QPushButton(self.centralwidget) - self.settingsButton.setGeometry(QtCore.QRect(720, 140, 75, 51)) - self.settingsButton.setObjectName("settingsButton") + self.playlistSettingsButton = QtWidgets.QPushButton(self.centralwidget) + self.playlistSettingsButton.setGeometry(QtCore.QRect(720, 140, 75, 51)) + self.playlistSettingsButton.setObjectName("playlistSettingsButton") if platform.system() == "Darwin": # for MacOS self.videoframe = QtWidgets.QMacCocoaViewContainer(self.centralwidget) else: @@ -233,7 +236,7 @@ class Ui_MainWindow(QtWidgets.QMainWindow): self.foundSongs.raise_() self.addThisSongButton.raise_() self.mixButton.raise_() - self.settingsButton.raise_() + self.playlistSettingsButton.raise_() self.videoframe.raise_() self.hardplaybutton.raise_() self.hardstopbutton.raise_() @@ -259,6 +262,7 @@ class Ui_MainWindow(QtWidgets.QMainWindow): 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() @@ -280,7 +284,68 @@ class Ui_MainWindow(QtWidgets.QMainWindow): self.findSongButton.setText(_translate("MainWindow", "Find song")) self.addThisSongButton.setText(_translate("MainWindow", "Add this song")) self.mixButton.setText(_translate("MainWindow", "Mix")) - self.settingsButton.setText(_translate("MainWindow", "Settings")) + self.playlistSettingsButton.setText(_translate("MainWindow", "Playlist \nsettings")) + + +class Ui_PlaylistSettings(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(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_DelSongs(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(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 YoutubeSearch: def __init__(self, search_terms: str, max_results=None): @@ -429,6 +494,7 @@ def playmusic(url, name, author): time.sleep(0.5) timeToSleep = mediaplayer.get_length() / 1000 cls() + ui.nowPlaying.setText(author + " - " + name) print("Playing " + author + " - " + name) app = QtWidgets.QApplication(sys.argv) @@ -436,25 +502,36 @@ MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) -playlist = {} +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) def getplaylist(): global playlist global newindex + global listplaylist newindex = 0 playlist = readpl(ui.playlistsComboBox.currentText()) ui.songList.clear() for item in list(playlist): ui.songList.append(str(playlist[item]['author'] + " - " + playlist[item]['name'])) - -# addtopl(playlist, 'play.list') + listplaylist = list(playlist) def playallpl(index=0): + global listplaylist global newindex - listplaylist = list(playlist) item = listplaylist[index] playmusic(playlist[item]['url'], playlist[item]['name'], playlist[item]['author']) - newindex += 1 + if newindex < len(listplaylist) - 1: + newindex += 1 + else: + newindex = 0 def playnextsong(): global newindex @@ -488,7 +565,36 @@ def changespeed(): 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() + + getplaylist() + +def mixPlaylist(): + global listplaylist + random.shuffle(listplaylist) + print("Mixed!") + MainWindow.show() +cls() ui.openPlaylistButton.clicked.connect(getplaylist) ui.hardplaybutton.clicked.connect(playallpl) @@ -502,5 +608,11 @@ 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) + +uiPlSet.deletesongButton.clicked.connect(showMainWindowDelS) + +uiDelS.delButton.clicked.connect(delSongFromPl) sys.exit(app.exec_()) diff --git a/resources/hardplaybutton.png b/resources/hardplaybutton.png new file mode 100644 index 0000000000000000000000000000000000000000..b61c53730ea41cfdb809a0548cb43a5aad4f78ba GIT binary patch literal 5057 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 literal 0 HcmV?d00001 diff --git a/resources/hardstopbutton.png b/resources/hardstopbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..aef1c371e9ad4c8d725f36fed20832b16695116c GIT binary patch literal 3626 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 literal 0 HcmV?d00001 diff --git a/resources/next.png b/resources/next.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b2652c85d912acbc04cc0bbf07843e14f0507b GIT binary patch literal 5620 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 literal 0 HcmV?d00001 diff --git a/resources/prev.png b/resources/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..ab622803c5ca0762997b9769dee1dacb90035a5c GIT binary patch literal 6165 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