Koragg

Snake MP3 Player [Python {PyQt}]

Jul 8th, 2018
1,306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 53.70 KB | None | 0 0
  1. import sys, tkinter, pygame, mutagen, os, warnings, time
  2. from tkinter import filedialog
  3. from mutagen import File
  4. from mutagen.easyid3 import EasyID3
  5. from PyLyrics import *
  6. from PySide.QtCore import *
  7. from PySide.QtGui import *
  8. from mutagen.mp3 import MP3, MPEGInfo
  9. from PySide import QtCore, QtGui
  10.  
  11. '''
  12. Contents: class - line(s)
  13.  
  14. QJumpSlider class - 24~36
  15. Track class       - 38~42
  16. Graphics class    - 44~232
  17. BlackTheme class  - 234~312
  18. BlueTheme class   - 314~392
  19. PinkTheme class   - 394~472
  20. WhiteTheme class  - 474~552
  21. MusicPlayer class - 554~1324
  22. '''
  23.  
  24. class QJumpSlider(QtGui.QSlider):
  25.     def __init__(self, parent = None):
  26.         super(QJumpSlider, self).__init__(parent)
  27.    
  28.     def mousePressEvent(self, event): # Jump to click position
  29.         if window.fileDialogFilePath != "":
  30.             window.seekMusic(QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
  31.             self.setValue(QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
  32.    
  33.     def mouseMoveEvent(self, event): # Jump to pointer position while moving
  34.         if window.fileDialogFilePath != "":
  35.             window.seekMusic(QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
  36.             self.setValue(QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width()))
  37.  
  38. class Track():
  39.     def __init__(self, length, title, path):
  40.         self.length = length
  41.         self.title = title
  42.         self.path = path
  43.  
  44. class Graphics(object):
  45.     def setupUi(self, MainWindow):
  46.         root = tkinter.Tk()
  47.         root.withdraw()
  48.         self.x = root.winfo_screenwidth() / 1920
  49.         self.y = root.winfo_screenheight() / 1080
  50.         self.playlistWindowFontSize = 9.3
  51.         self.lyricsWindowFontSize = 8.5
  52.         self.generalFontSize = 8.6
  53.         MainWindow.setObjectName("MainWindow")
  54.         MainWindow.resize(1125*self.x, 865*self.y)
  55.         self.centralwidget = QtGui.QWidget(MainWindow)
  56.         self.centralwidget.setObjectName("centralwidget")
  57.         self.playlistWindow = QtGui.QListView(self.centralwidget)
  58.         self.playlistWindow.setGeometry(QtCore.QRect(10*self.x, 40*self.y, 301*self.x, 801*self.y))
  59.         self.playlistWindow.setObjectName("playlistWindow")
  60.         self.font = self.playlistWindow.font()
  61.         self.font.setPointSizeF(self.playlistWindowFontSize*self.y)
  62.         self.playlistWindow.setFont(self.font)
  63.         self.lyricsWindow = QtGui.QTextBrowser(self.centralwidget)
  64.         self.lyricsWindow.setGeometry(QtCore.QRect(810*self.x, 40*self.y, 301*self.x, 801*self.y))
  65.         self.lyricsWindow.setObjectName("lyricsWindow")
  66.         self.font = self.lyricsWindow.font()
  67.         self.font.setPointSizeF(self.lyricsWindowFontSize*self.y)
  68.         self.lyricsWindow.setFont(self.font)
  69.         self.albumArt = QtGui.QGraphicsView(self.centralwidget)
  70.         self.albumArt.setGeometry(QtCore.QRect(325*self.x, 40*self.y, 471*self.x, 431*self.y))
  71.         self.albumArt.setObjectName("albumArt")
  72.         self.openFileButton = QtGui.QPushButton(self.centralwidget)
  73.         self.openFileButton.setGeometry(QtCore.QRect(523*self.x, 10*self.y, 75*self.x, 23*self.y))
  74.         self.openFileButton.setObjectName("openFileButton")
  75.         self.songName = QtGui.QLabel(self.centralwidget)
  76.         self.songName.setGeometry(QtCore.QRect(330*self.x, 640*self.y, 461*self.x, 21*self.y))
  77.         self.songName.setObjectName("songName")
  78.         self.font = self.songName.font()
  79.         self.font.setPointSizeF(self.generalFontSize*self.y)
  80.         self.songName.setFont(self.font)
  81.         self.artistName = QtGui.QLabel(self.centralwidget)
  82.         self.artistName.setGeometry(QtCore.QRect(330*self.x, 670*self.y, 461*self.x, 21*self.y))
  83.         self.artistName.setObjectName("artistName")
  84.         self.font = self.artistName.font()
  85.         self.font.setPointSizeF(self.generalFontSize*self.y)
  86.         self.artistName.setFont(self.font)
  87.         self.albumName = QtGui.QLabel(self.centralwidget)
  88.         self.albumName.setGeometry(QtCore.QRect(330*self.x, 700*self.y, 461*self.x, 21*self.y))
  89.         self.albumName.setObjectName("albumName")
  90.         self.font = self.albumName.font()
  91.         self.font.setPointSizeF(self.generalFontSize*self.y)
  92.         self.albumName.setFont(self.font)
  93.         self.songsCount = QtGui.QLabel(self.centralwidget)
  94.         self.songsCount.setGeometry(QtCore.QRect(740*self.x, 670*self.y, 61*self.x, 21*self.y))
  95.         self.songsCount.setObjectName("songsCount")
  96.         self.font = self.songsCount.font()
  97.         self.font.setPointSizeF(self.generalFontSize*self.y)
  98.         self.songsCount.setFont(self.font)
  99.         self.seekSlider = QJumpSlider(self.centralwidget)
  100.         self.seekSlider.setGeometry(QtCore.QRect(330*self.x, 500*self.y, 461*self.x, 22*self.y))
  101.         self.seekSlider.setOrientation(QtCore.Qt.Horizontal)
  102.         self.seekSlider.setObjectName("seekSlider")
  103.         self.volumeSlider = QtGui.QSlider(self.centralwidget)
  104.         self.volumeSlider.setGeometry(QtCore.QRect(330*self.x, 780*self.y, 461*self.x, 22*self.y))
  105.         self.volumeSlider.setOrientation(QtCore.Qt.Horizontal)
  106.         self.volumeSlider.setObjectName("volumeSlider")
  107.         self.seekLabel = QtGui.QLabel(self.centralwidget)
  108.         self.seekLabel.setGeometry(QtCore.QRect(330*self.x, 480*self.y, 461*self.x, 20*self.y))
  109.         self.seekLabel.setObjectName("seekLabel")
  110.         self.font = self.seekLabel.font()
  111.         self.font.setPointSizeF(self.generalFontSize*self.y)
  112.         self.seekLabel.setFont(self.font)
  113.         self.prevSongButton = QtGui.QPushButton(self.centralwidget)
  114.         self.prevSongButton.setGeometry(QtCore.QRect(440*self.x, 550*self.y, 71*self.x, 71*self.y))
  115.         self.prevSongButton.setText("")
  116.         self.prevSongButton.setIconSize(QtCore.QSize(80*self.x, 80*self.y))
  117.         self.prevSongButton.setObjectName("prevSongButton")
  118.         self.playPauseButton = QtGui.QPushButton(self.centralwidget)
  119.         self.playPauseButton.setGeometry(QtCore.QRect(520*self.x, 550*self.y, 81*self.x, 71*self.y))
  120.         self.playPauseButton.setText("")
  121.         self.playPauseButton.setIconSize(QtCore.QSize(80*self.x, 80*self.y))
  122.         self.playPauseButton.setObjectName("playPauseButton")
  123.         self.nextSongButton = QtGui.QPushButton(self.centralwidget)
  124.         self.nextSongButton.setGeometry(QtCore.QRect(610*self.x, 550*self.y, 71*self.x, 71*self.y))
  125.         self.nextSongButton.setText("")
  126.         self.nextSongButton.setIconSize(QtCore.QSize(80*self.x, 80*self.y))
  127.         self.nextSongButton.setObjectName("nextSongButton")
  128.         self.volumeLabel = QtGui.QLabel(self.centralwidget)
  129.         self.volumeLabel.setGeometry(QtCore.QRect(330*self.x, 760*self.y, 461*self.x, 20*self.y))
  130.         self.volumeLabel.setObjectName("volumeLabel")
  131.         self.font = self.volumeLabel.font()
  132.         self.font.setPointSizeF(self.generalFontSize*self.y)
  133.         self.volumeLabel.setFont(self.font)
  134.         self.minVolLabel = QtGui.QLabel(self.centralwidget)
  135.         self.minVolLabel.setGeometry(QtCore.QRect(330*self.x, 810*self.y, 21*self.x, 21*self.y))
  136.         self.minVolLabel.setObjectName("minVolLabel")
  137.         self.font = self.minVolLabel.font()
  138.         self.font.setPointSizeF(self.generalFontSize*self.y)
  139.         self.minVolLabel.setFont(self.font)
  140.         self.maxVolLabel = QtGui.QLabel(self.centralwidget)
  141.         self.maxVolLabel.setGeometry(QtCore.QRect(760*self.x, 810*self.y, 41*self.x, 21*self.y))
  142.         self.maxVolLabel.setObjectName("maxVolLabel")
  143.         self.font = self.maxVolLabel.font()
  144.         self.font.setPointSizeF(self.generalFontSize*self.y)
  145.         self.maxVolLabel.setFont(self.font)
  146.         self.curVolLabel = QtGui.QLabel(self.centralwidget)
  147.         self.curVolLabel.setGeometry(QtCore.QRect(540*self.x, 810*self.y, 41*self.x, 21*self.y))
  148.         self.curVolLabel.setObjectName("curVolLabel")
  149.         self.font = self.curVolLabel.font()
  150.         self.font.setPointSizeF(self.generalFontSize*self.y)
  151.         self.curVolLabel.setFont(self.font)
  152.         self.playlistLabel = QtGui.QLabel(self.centralwidget)
  153.         self.playlistLabel.setGeometry(QtCore.QRect(10*self.x, 10*self.y, 301*self.x, 21*self.y))
  154.         self.playlistLabel.setObjectName("playlistLabel")
  155.         self.font = self.playlistLabel.font()
  156.         self.font.setPointSizeF(self.generalFontSize*self.y)
  157.         self.playlistLabel.setFont(self.font)
  158.         self.lyricsLabel = QtGui.QLabel(self.centralwidget)
  159.         self.lyricsLabel.setGeometry(QtCore.QRect(810*self.x, 10*self.y, 301*self.x, 21*self.y))
  160.         self.lyricsLabel.setObjectName("lyricsLabel")
  161.         self.font = self.lyricsLabel.font()
  162.         self.font.setPointSizeF(self.generalFontSize*self.y)
  163.         self.lyricsLabel.setFont(self.font)
  164.         self.totalSongTimeLabel = QtGui.QLabel(self.centralwidget)
  165.         self.totalSongTimeLabel.setGeometry(QtCore.QRect(760*self.x, 520*self.y, 41*self.x, 21*self.y))
  166.         self.totalSongTimeLabel.setObjectName("totalSongTimeLabel")
  167.         self.font = self.totalSongTimeLabel.font()
  168.         self.font.setPointSizeF(self.generalFontSize*self.y)
  169.         self.totalSongTimeLabel.setFont(self.font)
  170.         self.curSongTimeLabel = QtGui.QLabel(self.centralwidget)
  171.         self.curSongTimeLabel.setGeometry(QtCore.QRect(320*self.x, 520*self.y, 41*self.x, 21*self.y))
  172.         self.curSongTimeLabel.setObjectName("curSongTimeLabel")
  173.         self.font = self.curSongTimeLabel.font()
  174.         self.font.setPointSizeF(self.generalFontSize*self.y)
  175.         self.curSongTimeLabel.setFont(self.font)
  176.         self.blackThemeButton = QtGui.QPushButton(self.centralwidget)
  177.         self.blackThemeButton.setGeometry(QtCore.QRect(330*self.x, 10*self.y, 71*self.x, 23*self.y))
  178.         self.blackThemeButton.setObjectName("blackThemeButton")
  179.         self.font = self.blackThemeButton.font()
  180.         self.font.setPointSizeF(self.generalFontSize*self.y)
  181.         self.blackThemeButton.setFont(self.font)
  182.         self.blueThemeButton = QtGui.QPushButton(self.centralwidget)
  183.         self.blueThemeButton.setGeometry(QtCore.QRect(410*self.x, 10*self.y, 71*self.x, 23*self.y))
  184.         self.blueThemeButton.setObjectName("blueThemeButton")
  185.         self.font = self.blueThemeButton.font()
  186.         self.font.setPointSizeF(self.generalFontSize*self.y)
  187.         self.blueThemeButton.setFont(self.font)
  188.         self.whiteThemeButton = QtGui.QPushButton(self.centralwidget)
  189.         self.whiteThemeButton.setGeometry(QtCore.QRect(720*self.x, 10*self.y, 71*self.x, 23*self.y))
  190.         self.whiteThemeButton.setObjectName("whiteThemeButton")
  191.         self.font = self.whiteThemeButton.font()
  192.         self.font.setPointSizeF(self.generalFontSize*self.y)
  193.         self.whiteThemeButton.setFont(self.font)
  194.         self.pinkThemeButton = QtGui.QPushButton(self.centralwidget)
  195.         self.pinkThemeButton.setGeometry(QtCore.QRect(640*self.x, 10*self.y, 71*self.x, 23*self.y))
  196.         self.pinkThemeButton.setObjectName("pinkThemeButton")
  197.         self.font = self.pinkThemeButton.font()
  198.         self.font.setPointSizeF(self.generalFontSize*self.y)
  199.         self.pinkThemeButton.setFont(self.font)
  200.         MainWindow.setCentralWidget(self.centralwidget)
  201.         self.statusbar = QtGui.QStatusBar(MainWindow)
  202.         self.statusbar.setObjectName("statusbar")
  203.         MainWindow.setStatusBar(self.statusbar)
  204.        
  205.         self.retranslateUi(MainWindow)
  206.         QtCore.QMetaObject.connectSlotsByName(MainWindow)
  207.        
  208.     def retranslateUi(self, MainWindow):
  209.         MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "Snake MP3 Player", None, QtGui.QApplication.UnicodeUTF8))
  210.         self.lyricsWindow.setHtml(QtGui.QApplication.translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
  211.         "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
  212.         "p, li { white-space: pre-wrap; }\n"
  213.         "</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
  214.         "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
  215.         self.openFileButton.setText(QtGui.QApplication.translate("MainWindow", "Open File", None, QtGui.QApplication.UnicodeUTF8))
  216.         self.songName.setText(QtGui.QApplication.translate("MainWindow", "Song:  ", None, QtGui.QApplication.UnicodeUTF8))
  217.         self.artistName.setText(QtGui.QApplication.translate("MainWindow", "Artist:  ", None, QtGui.QApplication.UnicodeUTF8))
  218.         self.albumName.setText(QtGui.QApplication.translate("MainWindow", "Album: ", None, QtGui.QApplication.UnicodeUTF8))
  219.         self.songsCount.setText(QtGui.QApplication.translate("MainWindow", "0 / 0", None, QtGui.QApplication.UnicodeUTF8))
  220.         self.seekLabel.setText(QtGui.QApplication.translate("MainWindow", "<html><head/><body><p align=\"center\">Seek</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
  221.         self.volumeLabel.setText(QtGui.QApplication.translate("MainWindow", "<html><head/><body><p align=\"center\">Volume</p></body></html>", None, QtGui.QApplication.UnicodeUTF8))
  222.         self.minVolLabel.setText(QtGui.QApplication.translate("MainWindow", "0 %", None, QtGui.QApplication.UnicodeUTF8))
  223.         self.maxVolLabel.setText(QtGui.QApplication.translate("MainWindow", "100 %", None, QtGui.QApplication.UnicodeUTF8))
  224.         self.curVolLabel.setText(QtGui.QApplication.translate("MainWindow", "100 %", None, QtGui.QApplication.UnicodeUTF8))
  225.         self.playlistLabel.setText(QtGui.QApplication.translate("MainWindow", "Playlist (.m3u)", None, QtGui.QApplication.UnicodeUTF8))
  226.         self.lyricsLabel.setText(QtGui.QApplication.translate("MainWindow", "Lyrics (http://www.lyrics.wikia.com)", None, QtGui.QApplication.UnicodeUTF8))
  227.         self.totalSongTimeLabel.setText(QtGui.QApplication.translate("MainWindow", "00:00", None, QtGui.QApplication.UnicodeUTF8))
  228.         self.curSongTimeLabel.setText(QtGui.QApplication.translate("MainWindow", "00:00", None, QtGui.QApplication.UnicodeUTF8))
  229.         self.blackThemeButton.setText(QtGui.QApplication.translate("MainWindow", "Black Theme", None, QtGui.QApplication.UnicodeUTF8))
  230.         self.blueThemeButton.setText(QtGui.QApplication.translate("MainWindow", "Blue Theme", None, QtGui.QApplication.UnicodeUTF8))
  231.         self.whiteThemeButton.setText(QtGui.QApplication.translate("MainWindow", "White Theme", None, QtGui.QApplication.UnicodeUTF8))
  232.         self.pinkThemeButton.setText(QtGui.QApplication.translate("MainWindow", "Pink Theme", None, QtGui.QApplication.UnicodeUTF8))
  233.  
  234. class BlackTheme():
  235.     def blackPlaylistWindowStyle():
  236.         return """
  237.         /*Playlist Window Style*/
  238.             QListView {
  239.                 background-color: #000000;
  240.                 color: #FFFFFF;
  241.                 font-size: 93%;
  242.             }
  243.            
  244.             QListView::item:selected:!active {
  245.                 background-color: #008000;
  246.                 color: #FFFFFF;
  247.                 font-size: 93%;
  248.             }
  249.            
  250.             QListView::item:selected:active {
  251.                 background-color: #3B9C9C;
  252.                 color: #FFFFFF;
  253.                 font-size: 93%;
  254.             }
  255.            
  256.             QListView::item:hover {
  257.                 background-color: #6698FF;
  258.                 color: #FFFFFF;
  259.                 font-size: 93%;
  260.             }
  261.         """
  262.        
  263.     def blackLyricsWindowStyle():
  264.         return """
  265.         /*Lyrics Window Style*/
  266.             QTextBrowser {
  267.                 background-color: #000000;
  268.                 color: #FFFFFF;
  269.                 font-size: 93%;
  270.             }
  271.         """
  272.        
  273.     def blackMediaButtonsStyle():
  274.         return """
  275.         /*Media Buttons Style*/
  276.             QPushButton {
  277.                 background-color: #25383C;
  278.             }
  279.            
  280.             QPushButton:hover {
  281.                 background-color: #504A4B;
  282.             }
  283.         """
  284.        
  285.     def blackMainWindowStyle():
  286.         return """
  287.         /*Main Window Style*/
  288.             QMainWindow {
  289.                 background-color: #000000;
  290.                 color: #FFFFFF;
  291.                 font-size: 93%;
  292.             }
  293.         """
  294.        
  295.     def blackLabelsStyle():
  296.         return """
  297.         /*Labels Style*/
  298.             QLabel {
  299.                 color: #FFFFFF;
  300.                 font-size: 93%;
  301.             }
  302.         """
  303.        
  304.     def blackThemeButtonsStyle():
  305.         return """
  306.         /*Theme Buttons Style*/
  307.             QPushButton {
  308.                 background-color: #FFFFFF;
  309.                 color: #000000;
  310.                 font-size: 93%;
  311.             }
  312.         """
  313.  
  314. class BlueTheme():
  315.     def bluePlaylistWindowStyle():
  316.         return """
  317.         /*Playlist Window Style*/
  318.             QListView {
  319.                 background-color: #0000A0;
  320.                 color: #FFFFFF;
  321.                 font-size: 93%;
  322.             }
  323.            
  324.             QListView::item:selected:!active {
  325.                 background-color: #FFA500;
  326.                 color: #000000;
  327.                 font-size: 93%;
  328.             }
  329.            
  330.             QListView::item:selected:active {
  331.                 background-color: #FF0000;
  332.                 color: #000000;
  333.                 font-size: 93%;
  334.             }
  335.            
  336.             QListView::item:hover {
  337.                 background-color: #00FFFF;
  338.                 color: #000000;
  339.                 font-size: 93%;
  340.             }
  341.         """
  342.        
  343.     def blueLyricsWindowStyle():
  344.         return """
  345.         /*Lyrics Window Style*/
  346.             QTextBrowser {
  347.                 background-color: #0000A0;
  348.                 color: #FFFFFF;
  349.                 font-size: 93%;
  350.             }
  351.         """
  352.        
  353.     def blueMediaButtonsStyle():
  354.         return """
  355.         /*Media Buttons Style*/
  356.             QPushButton {
  357.                 background-color: #000000;
  358.             }
  359.            
  360.             QPushButton:hover {
  361.                 background-color: #25383C;
  362.             }
  363.         """
  364.        
  365.     def blueMainWindowStyle():
  366.         return """
  367.         /*Main Window Style*/
  368.             QMainWindow {
  369.                 background-color: #2B65EC;
  370.                 color: #FFFFFF;
  371.                 font-size: 93%;
  372.             }
  373.         """
  374.        
  375.     def blueLabelsStyle():
  376.         return """
  377.         /*Labels Style*/
  378.             QLabel {
  379.                 color: #00FF00;
  380.                 font-size: 93%;
  381.             }
  382.         """
  383.        
  384.     def blueThemeButtonsStyle():
  385.         return """
  386.         /*Theme Buttons Style*/
  387.             QPushButton {
  388.                 background-color: #FFFFFF;
  389.                 color: #000000;
  390.                 font-size: 93%;
  391.             }
  392.         """
  393.  
  394. class PinkTheme():
  395.     def pinkPlaylistWindowStyle():
  396.         return """
  397.         /*Playlist Window Style*/
  398.             QListView {
  399.                 background-color: #C12283;
  400.                 color: #000000;
  401.                 font-size: 93%;
  402.             }
  403.            
  404.             QListView::item:selected:!active {
  405.                 background-color: #AF7817;
  406.                 color: #E5E4E2;
  407.                 font-size: 93%;
  408.             }
  409.            
  410.             QListView::item:selected:active {
  411.                 background-color: #C7A317;
  412.                 color: #FAEBD7;
  413.                 font-size: 93%;
  414.             }
  415.            
  416.             QListView::item:hover {
  417.                 background: #3EA99F;
  418.                 color: #FAEBD7;
  419.                 font-size: 93%;
  420.             }
  421.         """
  422.        
  423.     def pinkLyricsWindowStyle():
  424.         return """
  425.         /*Lyrics Window Style*/
  426.             QTextBrowser {
  427.                 background-color: #C12283;
  428.                 color: #000000;
  429.                 font-size: 93%;
  430.             }
  431.         """
  432.        
  433.     def pinkMediaButtonsStyle():
  434.         return """
  435.         /*Media Buttons Style*/
  436.             QPushButton {
  437.                 background-color: #79BAEC;
  438.             }
  439.            
  440.             QPushButton:hover {
  441.                 background-color: #56A5EC;
  442.             }
  443.         """
  444.        
  445.     def pinkMainWindowStyle():
  446.         return """
  447.         /*Main Window Style*/
  448.             QMainWindow {
  449.                 background-color: #F535AA;
  450.                 color: #000000;
  451.                 font-size: 93%;
  452.             }
  453.         """
  454.        
  455.     def pinkLabelsStyle():
  456.         return """
  457.         /*Labels Style*/
  458.             QLabel {
  459.                 color: #000000;
  460.                 font-size: 93%;
  461.             }
  462.         """
  463.        
  464.     def pinkThemeButtonsStyle():
  465.         return """
  466.         /*Theme Buttons Style*/
  467.             QPushButton {
  468.                 background-color: #FFFFFF;
  469.                 color: #000000;
  470.                 font-size: 93%;
  471.             }
  472.         """
  473.  
  474. class WhiteTheme():
  475.     def whitePlaylistWindowStyle():
  476.         return """
  477.         /*Playlist Window Style*/
  478.             QListView {
  479.                 background-color: None;
  480.                 color: None;
  481.                 font-size: 93%;
  482.             }
  483.            
  484.             QListView::item:selected:!active {
  485.                 background-color: None;
  486.                 color: None;
  487.                 font-size: 93%;
  488.             }
  489.            
  490.             QListView::item:selected:active {
  491.                 background-color: None;
  492.                 color: None;
  493.                 font-size: 93%;
  494.             }
  495.            
  496.             QListView::item:hover {
  497.                 background: None;
  498.                 color: None;
  499.                 font-size: 93%;
  500.             }
  501.         """
  502.        
  503.     def whiteLyricsWindowStyle():
  504.         return """
  505.         /*Lyrics Window Style*/
  506.             QTextBrowser {
  507.                 background-color: None;
  508.                 color: None;
  509.                 font-size: 93%;
  510.             }
  511.         """
  512.        
  513.     def whiteMediaButtonsStyle():
  514.         return """
  515.         /*Media Buttons Style*/
  516.             QPushButton {
  517.                 background-color: None;
  518.             }
  519.            
  520.             QPushButton:hover {
  521.                 background-color: None;
  522.             }
  523.         """
  524.        
  525.     def whiteMainWindowStyle():
  526.         return """
  527.         /*Main Window Style*/
  528.             QMainWindow {
  529.                 background-color: None;
  530.                 color: None;
  531.                 font-size: 93%;
  532.             }
  533.         """
  534.        
  535.     def whiteLabelsStyle():
  536.         return """
  537.         /*Labels Style*/
  538.             QLabel {
  539.                 color: None;
  540.                 font-size: 93%;
  541.             }
  542.         """
  543.        
  544.     def whiteThemeButtonsStyle():
  545.         return """
  546.         /*Theme Buttons Style*/
  547.             QPushButton {
  548.                 background-color: None;
  549.                 color: None;
  550.                 font-size: 93%;
  551.             }
  552.         """
  553.  
  554. class MusicPlayer(QMainWindow, Graphics):
  555.     def __init__(self, parent = None):
  556.         super(MusicPlayer, self).__init__(parent)
  557.         self.setupUi(self)
  558.         pygame.init()
  559.         pygame.mixer.init()
  560.         warnings.filterwarnings("ignore", category = UserWarning, module = "bs4")
  561.         self.openFileButton.clicked.connect(self.openFileSelectionDialog)
  562.         self.prevIcon = QtGui.QIcon()
  563.         self.prevIconImage = QtGui.QPixmap("icons/prevButton.png")
  564.         self.prevIcon.addPixmap(self.prevIconImage)
  565.         self.prevSongButton.setIcon(self.prevIcon)
  566.         self.playIcon = QtGui.QIcon()
  567.         self.playIconImage = QtGui.QPixmap("icons/playButton.png")
  568.         self.playIcon.addPixmap(self.playIconImage)
  569.         self.playPauseButton.setIcon(self.playIcon)
  570.         self.pauseIcon = QtGui.QIcon()
  571.         self.pauseIconImage = QtGui.QPixmap("icons/pauseButton.png")
  572.         self.pauseIcon.addPixmap(self.pauseIconImage)
  573.         self.nextIcon = QtGui.QIcon()
  574.         self.nextIconImage = QtGui.QPixmap("icons/nextButton.png")
  575.         self.nextIcon.addPixmap(self.nextIconImage)
  576.         self.nextSongButton.setIcon(self.nextIcon)
  577.         self.volumeSlider.setValue(100)
  578.         self.seekSlider.setValue(0)
  579.         self.prevSongButton.clicked.connect(self.previousSongAudioButton)
  580.         self.playPauseButton.clicked.connect(self.playPauseAudioButton)
  581.         self.nextSongButton.clicked.connect(self.nextSongAudioButton)
  582.         self.previousButtonPressed = False
  583.         self.nextButtonPressed = False
  584.         self.isPlaying = False
  585.         self.volumeSlider.setRange(0, 100)
  586.         self.playlistCurrentSongIndex = 0
  587.         self.playlistModel = QtGui.QStandardItemModel(self.playlistWindow)
  588.         self.playlistWindow.setEditTriggers(QAbstractItemView.NoEditTriggers)
  589.         self.playlistWindow.doubleClicked.connect(self.playlistItemDoubleClick)
  590.         self.volumeSlider.valueChanged.connect(self.setVolume)
  591.         self.seekSlider.sliderMoved.connect(self.seekMusic)
  592.         self.fileDialogFilePath = ""
  593.         self.lastVisitedDirectory = ""
  594.         self.workingDirectory = os.getcwd()
  595.         self.nextSongTimer = False
  596.         self.songFileToGetLengthFrom = False
  597.         self.songFileLength = 0
  598.         self.timerCounter = 0
  599.         self.nextSongTimer = QTimer()
  600.         self.nextSongTimer.timeout.connect(self.playNextSongInPlaylist)
  601.         self.nextSongTimer.start(1000)
  602.         self.playerWentToFirstSongAutomatically = False
  603.         self.updateSeekTimer = QTimer()
  604.         self.updateSeekTimer.timeout.connect(self.updateSeekSlider)
  605.         self.updateSeekTimer.start(1000)
  606.         self.curVolLabel.setAlignment(QtCore.Qt.AlignCenter)
  607.         self.playlistLabel.setAlignment(QtCore.Qt.AlignCenter)
  608.         self.lyricsLabel.setAlignment(QtCore.Qt.AlignCenter)
  609.         self.curSongTimeLabel.setAlignment(QtCore.Qt.AlignCenter)
  610.         self.totalSongTimeLabel.setAlignment(QtCore.Qt.AlignCenter)
  611.         self.seekSlider.setStyleSheet(self.seekStyle())
  612.         self.volumeSlider.setStyleSheet(self.volumeStyle())
  613.         self.blackThemeButton.clicked.connect(self.switchBlackTheme)
  614.         self.blueThemeButton.clicked.connect(self.switchBlueTheme)
  615.         self.pinkThemeButton.clicked.connect(self.switchPinkTheme)
  616.         self.whiteThemeButton.clicked.connect(self.switchWhiteTheme)
  617.         self.songHasCoverImage = False
  618.         self.putDefaultTheme()
  619.         self.pressCounter = 0
  620.         self.loadSettings()
  621.    
  622.     def openFileSelectionDialog(self):
  623.         root = tkinter.Tk()
  624.         root.withdraw()
  625.         if self.lastVisitedDirectory != "":
  626.             self.file_path = filedialog.askopenfilename(initialdir = self.lastVisitedDirectory, title = "Select a song or a playlist", filetypes = (("Media files","*.mp3 *.m3u"),("All files","*.*")))
  627.         else:
  628.             self.file_path = filedialog.askopenfilename(initialdir = self.workingDirectory, title = "Select a song or a playlist", filetypes = (("Media files","*.mp3 *.m3u"),("All files","*.*")))
  629.         self.playlistCurrentSongIndex = 0
  630.         if self.file_path != "":
  631.             self.fileDialogFilePath = self.file_path
  632.             self.lastVisitedDirectory = os.path.dirname(self.file_path)
  633.             self.saveSettings("LastVisitedDirectory", self.lastVisitedDirectory)
  634.             self.playAudioOnFileSelect(self.fileDialogFilePath)
  635.    
  636.     def playAudioOnFileSelect(self, path):
  637.         self.timerCounter = 0
  638.         self.seekSlider.setValue(0)
  639.         if path.endswith(".m3u"):
  640.             self.playlist = self.parseM3U(path)
  641.             if pygame.mixer.get_init() != None:
  642.                 pygame.mixer.music.stop()
  643.             pygame.mixer.quit()
  644.             if os.path.exists(self.playlist[self.playlistCurrentSongIndex].path):
  645.                 self.info = MPEGInfo(open(self.playlist[self.playlistCurrentSongIndex].path, "rb"))
  646.                 self.frequency = self.info.sample_rate
  647.                 self.channels = self.info.channels
  648.                 pygame.mixer.init(frequency = int(self.frequency), channels = int(self.channels))
  649.                 self.loadSettings()
  650.                 pygame.mixer.music.load(self.playlist[self.playlistCurrentSongIndex].path.encode("utf8"))
  651.                 pygame.mixer.music.play()
  652.                 self.songFileToGetLengthFrom = MP3(self.playlist[self.playlistCurrentSongIndex].path)
  653.                 self.songFileLength = self.songFileToGetLengthFrom.info.length
  654.                 self.seekSlider.setRange(0, self.songFileLength)
  655.                 self.showSongInfo(self.playlist[self.playlistCurrentSongIndex].path)
  656.                 self.addM3USongsToPlaylistWindow()
  657.                 self.setCurrentSongHighlighted()
  658.                 self.playPauseButton.setIcon(self.pauseIcon)
  659.             else:
  660.                 self.playlistModel.removeRows(0, self.playlistModel.rowCount())
  661.                 self.lyricsWindow.setText("The .m3u playlist file you chose appears to be invalid or broken. Please pick another one or play a .mp3 file instead.")
  662.                 self.fileDialogFilePath = ""
  663.                 self.playPauseButton.setIcon(self.playIcon)
  664.                 self.songHasCoverImage = False
  665.                 self.loadSettings()
  666.         elif path.endswith(".mp3"):
  667.             if pygame.mixer.get_init() != None:
  668.                 pygame.mixer.music.stop()
  669.             pygame.mixer.quit()
  670.             self.info = MPEGInfo(open(path, "rb"))
  671.             self.frequency = self.info.sample_rate
  672.             self.channels = self.info.channels
  673.             pygame.mixer.init(frequency = int(self.frequency), channels = int(self.channels))
  674.             self.loadSettings()
  675.             pygame.mixer.music.load(path.encode("utf8"))
  676.             pygame.mixer.music.play()
  677.             self.songFileToGetLengthFrom = MP3(path)
  678.             self.songFileLength = self.songFileToGetLengthFrom.info.length
  679.             self.seekSlider.setRange(0, self.songFileLength)
  680.             self.showSongInfo(path)
  681.             self.playlistModel.removeRows(0, self.playlistModel.rowCount())
  682.             if self.playlistModel.rowCount() == 0:
  683.                 self.songFile = EasyID3(path)
  684.                 if "title" in self.songFile:
  685.                     self.songFileTitle = self.songFile["title"][0]
  686.                 else:
  687.                     self.songFileTitle = self.fileDialogFilePath.split("/", -1)[-1].split(".mp3")[0]
  688.                 self.item = QtGui.QStandardItem("1: " + self.songFileTitle)
  689.                 self.playlistModel.appendRow(self.item)
  690.                 self.playlistWindow.setModel(self.playlistModel)
  691.                 self.setCurrentSongHighlighted()
  692.                 self.playPauseButton.setIcon(self.pauseIcon)
  693.         self.playerWentToFirstSongAutomatically = False
  694.         self.isPlaying = True
  695.        
  696.     def playAudioFromSelectedFile(self, path):
  697.         self.timerCounter = 0
  698.         self.seekSlider.setValue(0)
  699.         if pygame.mixer.get_init() != None:
  700.             pygame.mixer.music.stop()
  701.         #if not self.isMinimized():
  702.         #   pygame.mixer.quit()
  703.         self.info = MPEGInfo(open(path, "rb"))
  704.         self.frequency = self.info.sample_rate
  705.         self.channels = self.info.channels
  706.         pygame.mixer.init(frequency = int(self.frequency), channels = int(self.channels))
  707.         self.loadSettings()
  708.         pygame.mixer.music.load(path.encode("utf8"))
  709.         pygame.mixer.music.play()
  710.         self.songFileToGetLengthFrom = MP3(path)
  711.         self.songFileLength = self.songFileToGetLengthFrom.info.length
  712.         self.seekSlider.setRange(0, self.songFileLength)
  713.         self.showSongInfo(path)
  714.         self.setCurrentSongHighlighted()
  715.         self.playPauseButton.setIcon(self.pauseIcon)
  716.         self.playerWentToFirstSongAutomatically = False
  717.         self.isPlaying = True
  718.        
  719.     def playNextSongInPlaylist(self):
  720.         if self.fileDialogFilePath.endswith(".m3u"):
  721.             if self.isPlaying == True:
  722.                 if os.path.exists(self.playlist[self.playlistCurrentSongIndex].path):
  723.                     self.timerCounter += 1
  724.                     self.songFileToGetLengthFrom = MP3(self.playlist[self.playlistCurrentSongIndex].path)
  725.                     self.songFileLength = self.songFileToGetLengthFrom.info.length
  726.                     if int(self.timerCounter) > int(self.songFileLength):
  727.                         if self.playlistCurrentSongIndex + 1 <= (len(self.playlist) - 1):
  728.                             self.playlistCurrentSongIndex += 1
  729.                             self.playAudioFromSelectedFile(self.playlist[self.playlistCurrentSongIndex].path)
  730.                         elif self.playlistCurrentSongIndex + 1 > (len(self.playlist) - 1):
  731.                             self.playlistCurrentSongIndex = 0
  732.                             self.timerCounter = 0
  733.                             self.seekSlider.setValue(0)
  734.                             if pygame.mixer.get_init() != None:
  735.                                 pygame.mixer.music.stop()
  736.                             pygame.mixer.quit()
  737.                             self.info = MPEGInfo(open(self.playlist[self.playlistCurrentSongIndex].path, "rb"))
  738.                             self.frequency = self.info.sample_rate
  739.                             self.channels = self.info.channels
  740.                             pygame.mixer.init(frequency = int(self.frequency), channels = int(self.channels))
  741.                             self.loadSettings()
  742.                             pygame.mixer.music.load(self.playlist[self.playlistCurrentSongIndex].path.encode("utf8"))
  743.                             self.seekSlider.setRange(0, self.songFileLength)
  744.                             self.showSongInfo(self.playlist[self.playlistCurrentSongIndex].path)
  745.                             self.setCurrentSongHighlighted()
  746.                             self.playPauseButton.setIcon(self.playIcon)
  747.                             self.playerWentToFirstSongAutomatically = True
  748.                             self.isPlaying = False
  749.         elif self.fileDialogFilePath.endswith(".mp3"):
  750.             if self.isPlaying == True:
  751.                 self.timerCounter += 1
  752.                 self.songFileToGetLengthFrom = MP3(self.fileDialogFilePath)
  753.                 self.songFileLength = self.songFileToGetLengthFrom.info.length
  754.                 if int(self.timerCounter) > int(self.songFileLength):
  755.                     self.timerCounter = 0
  756.                     self.seekSlider.setValue(0)
  757.                     if pygame.mixer.get_init() != None:
  758.                         pygame.mixer.music.stop()
  759.                     pygame.mixer.quit()
  760.                     self.info = MPEGInfo(open(self.fileDialogFilePath, "rb"))
  761.                     self.frequency = self.info.sample_rate
  762.                     self.channels = self.info.channels
  763.                     pygame.mixer.init(frequency = int(self.frequency), channels = int(self.channels))
  764.                     self.loadSettings()
  765.                     pygame.mixer.music.load(self.fileDialogFilePath.encode("utf8"))
  766.                     self.seekSlider.setRange(0, self.songFileLength)
  767.                     self.showSongInfo(self.fileDialogFilePath)
  768.                     self.setCurrentSongHighlighted()
  769.                     self.playPauseButton.setIcon(self.playIcon)
  770.                     self.playerWentToFirstSongAutomatically = True
  771.                     self.isPlaying = False
  772.    
  773.     def playPauseAudioButton(self):
  774.         if self.fileDialogFilePath.endswith(".m3u") or self.fileDialogFilePath.endswith(".mp3"):
  775.             if self.isPlaying == True:
  776.                 if pygame.mixer.get_init() != None:
  777.                     pygame.mixer.music.pause()
  778.                 self.playPauseButton.setIcon(self.playIcon)
  779.                 self.previousButtonPressed = False
  780.                 self.nextButtonPressed = False
  781.                 self.isPlaying = False
  782.             elif self.isPlaying == False:
  783.                 if self.previousButtonPressed == True or self.nextButtonPressed == True or self.playerWentToFirstSongAutomatically == True:
  784.                     if pygame.mixer.get_init() != None:
  785.                         pygame.mixer.music.play()
  786.                     self.previousButtonPressed = False
  787.                     self.nextButtonPressed = False
  788.                     self.playerWentToFirstSongAutomatically = False
  789.                     self.playPauseButton.setIcon(self.pauseIcon)
  790.                     self.isPlaying = True
  791.                 elif self.previousButtonPressed == False or self.nextButtonPressed == False:
  792.                     if pygame.mixer.get_init() != None:
  793.                         pygame.mixer.music.unpause()
  794.                         self.playPauseButton.setIcon(self.pauseIcon)
  795.                         self.isPlaying = True
  796.        
  797.     def previousSongAudioButton(self):
  798.         if self.fileDialogFilePath.endswith(".m3u") and self.playlistCurrentSongIndex != 0:
  799.             self.pressCounter += 1
  800.             if self.pressCounter == 2:
  801.                 self.playlistCurrentSongIndex -= 1
  802.             self.doublePressTimer = QTimer()
  803.             self.doublePressTimer.timeout.connect(self.resetDoublePressPreviousButtonCounter)
  804.             self.doublePressTimer.setSingleShot(True)
  805.             self.doublePressTimer.start(30)
  806.             if os.path.exists(self.playlist[self.playlistCurrentSongIndex].path):
  807.                 self.playAudioFromSelectedFile(self.playlist[self.playlistCurrentSongIndex].path)
  808.                 self.previousButtonPressed = True
  809.         elif self.fileDialogFilePath.endswith(".m3u") and self.playlistCurrentSongIndex == 0:
  810.             if os.path.exists(self.playlist[self.playlistCurrentSongIndex].path):
  811.                 self.playAudioFromSelectedFile(self.playlist[self.playlistCurrentSongIndex].path)
  812.                 self.previousButtonPressed = True
  813.         elif self.fileDialogFilePath.endswith(".mp3"):
  814.             self.timerCounter = 0
  815.             self.seekSlider.setValue(0)
  816.             self.songFileToGetLengthFrom = MP3(self.fileDialogFilePath)
  817.             self.songFileLength = self.songFileToGetLengthFrom.info.length
  818.             self.seekSlider.setRange(0, self.songFileLength)
  819.             if self.isPlaying == True:
  820.                 if pygame.mixer.get_init() != None:
  821.                     pygame.mixer.music.stop()
  822.                 pygame.mixer.music.play()
  823.                 self.previousButtonPressed = True
  824.             elif self.isPlaying == False:
  825.                 if pygame.mixer.get_init() != None:
  826.                     pygame.mixer.music.stop()
  827.                 pygame.mixer.music.load(self.fileDialogFilePath.encode("utf8"))
  828.                 self.playPauseButton.setIcon(self.playIcon)
  829.                 self.previousButtonPressed = True
  830.        
  831.     def resetDoublePressPreviousButtonCounter(self):
  832.         self.pressCounter = 0
  833.        
  834.     def nextSongAudioButton(self):
  835.         if self.fileDialogFilePath.endswith(".m3u"):
  836.             if self.playlistCurrentSongIndex != (len(self.playlist) - 1):
  837.                 self.playlistCurrentSongIndex += 1
  838.             elif self.playlistCurrentSongIndex == (len(self.playlist) - 1):
  839.                 self.playlistCurrentSongIndex = 0
  840.             if os.path.exists(self.playlist[self.playlistCurrentSongIndex].path):
  841.                 self.playAudioFromSelectedFile(self.playlist[self.playlistCurrentSongIndex].path)
  842.                 self.nextButtonPressed = True
  843.         elif self.fileDialogFilePath.endswith(".mp3"):
  844.             self.timerCounter = 0
  845.             self.seekSlider.setValue(0)
  846.             self.songFileToGetLengthFrom = MP3(self.fileDialogFilePath)
  847.             self.songFileLength = self.songFileToGetLengthFrom.info.length
  848.             self.seekSlider.setRange(0, self.songFileLength)
  849.             if pygame.mixer.get_init() != None:
  850.                 pygame.mixer.music.stop()
  851.             pygame.mixer.music.load(self.fileDialogFilePath.encode("utf8"))
  852.             self.playPauseButton.setIcon(self.playIcon)
  853.             self.isPlaying = False
  854.             self.nextButtonPressed = True
  855.        
  856.     def showSongInfo(self, path):
  857.         self.filePath = File(path)
  858.         self.audioFrames = self.filePath.tags
  859.         if "APIC:" in self.audioFrames:
  860.             self.artworkFrame = self.audioFrames["APIC:"].data
  861.             with open("icons/albumArt.jpg", "wb") as img:
  862.                 img.write(self.artworkFrame)
  863.             self.albumArtCoverImage = "icons/albumArt.jpg"
  864.             self.songHasCoverImage = True
  865.         else:
  866.             self.albumArtCoverImage = self.defaultArtPicture
  867.             self.songHasCoverImage = False
  868.         self.albumArtImage = QImage(self.albumArtCoverImage)
  869.         self.pixmapItem = QGraphicsPixmapItem(QPixmap.fromImage(self.albumArtImage))
  870.         self.scene = QGraphicsScene()
  871.         self.scene.addItem(self.pixmapItem)
  872.         self.albumArt.setScene(self.scene)
  873.         self.albumArt.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)
  874.         self.audioFile = EasyID3(path)
  875.         if "title" in self.audioFile:
  876.             self.audioFileTitle = self.audioFile["title"][0]
  877.         else:
  878.             if self.fileDialogFilePath.endswith(".m3u"):
  879.                 self.audioFileTitle = self.playlist[self.playlistCurrentSongIndex].path.split("\\", -1)[-1].split(".mp3")[0]
  880.             else:
  881.                 self.audioFileTitle = self.fileDialogFilePath.split("/", -1)[-1].split(".mp3")[0]
  882.         self.songName.setText("Song:  " + self.audioFileTitle)
  883.         if "artist" in self.audioFile:
  884.             self.audioFileArtist = self.audioFile["artist"][0]
  885.         else:
  886.             self.audioFileArtist = "Unknown"
  887.         self.artistName.setText("Artist:  " + self.audioFileArtist)
  888.         if "album" in self.audioFile:
  889.             self.audioFileAlbum = self.audioFile["album"][0]
  890.         else:
  891.             self.audioFileAlbum = "Unknown"
  892.         self.albumName.setText("Album: " + self.audioFileAlbum)
  893.         if ("artist" in self.audioFile) and ("title" in self.audioFile):
  894.             try:
  895.                 self.lyricsWindow.setText(PyLyrics.getLyrics(self.audioFile["artist"][0], self.audioFile["title"][0]))
  896.             except ValueError:
  897.                 self.lyricsWindow.setText("Sorry, no lyrics found for this song and artist combination.")
  898.         else:
  899.             self.lyricsWindow.setText("Sorry, no lyrics found for this song and artist combination.")
  900.         if self.fileDialogFilePath.endswith(".m3u"):
  901.             self.realSongNumber = self.playlistCurrentSongIndex + 1
  902.             self.maxNumberOfSongs = len(self.playlist)
  903.             self.songsCount.setText(str(self.realSongNumber) + " / " + str(self.maxNumberOfSongs))
  904.         else:
  905.             self.songsCount.setText("1 / 1")
  906.         self.songFileToGetLengthFrom = MP3(path)
  907.         self.songFileLength = self.songFileToGetLengthFrom.info.length
  908.         self.totalSongTimeLabel.setText(time.strftime("%M:%S", time.gmtime(self.songFileLength)))
  909.        
  910.     def addM3USongsToPlaylistWindow(self):
  911.         self.playlistModel.removeRows(0, self.playlistModel.rowCount())
  912.         i = 1
  913.         for track in self.playlist:
  914.             self.playlistSongFile = EasyID3(track.path)
  915.             if "title" in self.playlistSongFile:
  916.                 self.playlistSongFileTitle = self.playlistSongFile["title"][0]
  917.             else:
  918.                 self.playlistSongFileTitle = track.path.split("\\", -1)[-1].split(".mp3")[0]
  919.             self.item = QtGui.QStandardItem(str(i) + ": " + self.playlistSongFileTitle)
  920.             i += 1
  921.             self.playlistModel.appendRow(self.item)
  922.             self.playlistWindow.setModel(self.playlistModel)
  923.        
  924.     def playlistItemDoubleClick(self):
  925.         if self.fileDialogFilePath.endswith(".m3u"):
  926.             self.selectedIndexes = self.playlistWindow.selectedIndexes()
  927.             for selected in self.selectedIndexes:
  928.                 for track in self.playlist:
  929.                     self.song = EasyID3(track.path)
  930.                     if "title" in self.song:
  931.                         self.songTitle = self.song["title"][0]
  932.                     else:
  933.                         self.songTitle = track.path.split("\\", -1)[-1].split(".mp3")[0]
  934.                     self.selectedSongTitleFromWindow = selected.data().split(": ", 1)[1]
  935.                     if self.songTitle == self.selectedSongTitleFromWindow:
  936.                         self.currentSelectionSongNumber = selected.data().split(": ", 1)[0]
  937.                         self.playlistCurrentSongIndex = int(self.currentSelectionSongNumber) - 1
  938.                         self.playAudioFromSelectedFile(track.path)
  939.                         break
  940.         else:
  941.             self.selectedIndexes = self.playlistWindow.selectedIndexes()
  942.             for selected in self.selectedIndexes:
  943.                 self.song = EasyID3(self.fileDialogFilePath)
  944.                 if "title" in self.song:
  945.                     self.songTitle = self.song["title"][0]
  946.                 else:
  947.                     self.songTitle = self.fileDialogFilePath.split("/", -1)[-1].split(".mp3")[0]
  948.                 self.selectedSongTitleFromWindow = selected.data().split(": ", 1)[1]
  949.                 if self.songTitle == self.selectedSongTitleFromWindow:
  950.                     self.currentSelectionSongNumber = selected.data().split(": ", 1)[0]
  951.                     self.playlistCurrentSongIndex = int(self.currentSelectionSongNumber) - 1
  952.                     self.playAudioFromSelectedFile(self.fileDialogFilePath)
  953.                     break
  954.                    
  955.     def setCurrentSongHighlighted(self):
  956.         if self.fileDialogFilePath.endswith(".m3u"):
  957.             for i in range(self.playlistModel.rowCount()):
  958.                 self.index = self.playlistModel.index(self.playlistCurrentSongIndex, 0, QModelIndex())
  959.                 self.selectionModel = self.playlistWindow.selectionModel()
  960.                 self.selectionModel.clear()
  961.                 self.selectionModel.select(self.index, self.selectionModel.Select)
  962.         else:
  963.             for i in range(self.playlistModel.rowCount()):
  964.                 self.index = self.playlistModel.index(0, 0, QModelIndex())
  965.                 self.selectionModel = self.playlistWindow.selectionModel()
  966.                 self.selectionModel.clear()
  967.                 self.selectionModel.select(self.index, self.selectionModel.Select)
  968.                
  969.     def setVolume(self, value):
  970.         if pygame.mixer.get_init() != None:
  971.             pygame.mixer.music.set_volume(value / 100)
  972.             self.audioLevel = self.volumeSlider.value()
  973.             self.curVolLabel.setText(str(value) + " %")
  974.             self.saveSettings("AudioLevel", value)
  975.        
  976.     def seekMusic(self, value):
  977.         if pygame.mixer.get_init() != None:
  978.             pygame.mixer.music.rewind()
  979.             pygame.mixer.music.set_pos(value)
  980.             self.timerCounter = value
  981.        
  982.     def updateSeekSlider(self):
  983.         self.seekSlider.setValue(self.timerCounter)
  984.         self.curSongTimeLabel.setText(time.strftime("%M:%S", time.gmtime(self.timerCounter)))
  985.        
  986.     def saveSettings(self, setting, value):
  987.         if setting == "LastVisitedDirectory":
  988.             with open("config/LastVisitedDirectory.conf", "w+") as config:
  989.                 config.write(str(setting) + " !=! " + str(value))
  990.         elif setting == "AudioLevel":
  991.             with open("config/AudioLevel.conf", "w+") as config:
  992.                 config.write(str(setting) + " !=! " + str(value))
  993.         elif setting == "Theme":
  994.             with open("config/Theme.conf", "w+") as config:
  995.                 config.write(str(setting) + " !=! " + str(value))
  996.    
  997.     def loadSettings(self):
  998.         if os.path.isfile("config/LastVisitedDirectory.conf"):
  999.             with open("config/LastVisitedDirectory.conf", "r") as config:
  1000.                 for line in config:
  1001.                     if "LastVisitedDirectory" in line:
  1002.                         self.savedLastDir = line.split(" !=! ", 1)[1]
  1003.                         if os.path.exists(self.savedLastDir):
  1004.                             self.lastVisitedDirectory = self.savedLastDir
  1005.                         else:
  1006.                             self.lastVisitedDirectory = self.workingDirectory
  1007.        
  1008.         if os.path.isfile("config/AudioLevel.conf"):
  1009.             with open("config/AudioLevel.conf", "r") as config:
  1010.                 for line in config:
  1011.                     if "AudioLevel" in line:
  1012.                         self.savedAudioLevel = line.split(" !=! ", 1)[1]
  1013.                         if self.savedAudioLevel != None:
  1014.                             self.setVolume(int(self.savedAudioLevel))
  1015.                             self.volumeSlider.setValue(int(self.savedAudioLevel))
  1016.                         else:
  1017.                             self.setVolume(100)
  1018.                             self.volumeSlider.setValue(100)
  1019.                            
  1020.         if os.path.isfile("config/Theme.conf"):
  1021.             with open("config/Theme.conf", "r") as config:
  1022.                 for line in config:
  1023.                     if "Theme" in line:
  1024.                         self.savedTheme = line.split(" !=! ", 1)[1]
  1025.                         if self.savedTheme != None:
  1026.                             if self.savedTheme == "Black":
  1027.                                 self.switchBlackTheme()
  1028.                             elif self.savedTheme == "Blue":
  1029.                                 self.switchBlueTheme()
  1030.                             elif self.savedTheme == "Pink":
  1031.                                 self.switchPinkTheme()
  1032.                             elif self.savedTheme == "White":
  1033.                                 self.switchWhiteTheme()
  1034.                         else:
  1035.                             self.switchWhiteTheme()
  1036.                            
  1037.     def parseM3U(self, m3u):
  1038.         self.locationOfM3UFile = os.path.dirname(m3u) # Folder in which the m3u file is located in
  1039.        
  1040.         try:
  1041.             assert(type(m3u) == "_io.TextIOWrapper")
  1042.         except AssertionError:
  1043.             m3u = open(m3u, "r")
  1044.  
  1045.         line = m3u.readline()
  1046.         if not line.startswith("#EXTM3U"):
  1047.            return
  1048.        
  1049.         playlist = []
  1050.         song = Track(None, None, None)
  1051.        
  1052.         for line in m3u:
  1053.             line = line.strip()
  1054.             if line.startswith("#EXTINF:"):
  1055.                 length,title = line.split("#EXTINF:")[1].split(",", 1)
  1056.                 song = Track(length, title, None)
  1057.             elif len(line) != 0:
  1058.                 self.songFileName = line.split("\\", -1)[-1] # Song file name + extention
  1059.                 self.newPath = self.locationOfM3UFile + "/" + self.songFileName # The new path to the files (current directory) if the m3u one does not exist
  1060.                 if os.path.exists(line):
  1061.                     song.path = line
  1062.                 elif os.path.exists(self.newPath):
  1063.                     song.path = self.newPath
  1064.                 else:
  1065.                     song.path = ""
  1066.                 playlist.append(song)
  1067.                 song = Track(None, None, None)
  1068.        
  1069.         m3u.close()
  1070.        
  1071.         return playlist
  1072.    
  1073.     def switchBlackTheme(self):
  1074.         self.playlistWindow.setStyleSheet(BlackTheme.blackPlaylistWindowStyle())
  1075.         self.lyricsWindow.setStyleSheet(BlackTheme.blackLyricsWindowStyle())
  1076.         self.prevSongButton.setStyleSheet(BlackTheme.blackMediaButtonsStyle())
  1077.         self.nextSongButton.setStyleSheet(BlackTheme.blackMediaButtonsStyle())
  1078.         self.playPauseButton.setStyleSheet(BlackTheme.blackMediaButtonsStyle())
  1079.         self.setStyleSheet(BlackTheme.blackMainWindowStyle())
  1080.         self.songName.setStyleSheet(BlackTheme.blackLabelsStyle())
  1081.         self.artistName.setStyleSheet(BlackTheme.blackLabelsStyle())
  1082.         self.albumName.setStyleSheet(BlackTheme.blackLabelsStyle())
  1083.         self.songsCount.setStyleSheet(BlackTheme.blackLabelsStyle())
  1084.         self.seekLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1085.         self.volumeLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1086.         self.minVolLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1087.         self.maxVolLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1088.         self.curVolLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1089.         self.playlistLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1090.         self.lyricsLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1091.         self.totalSongTimeLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1092.         self.curSongTimeLabel.setStyleSheet(BlackTheme.blackLabelsStyle())
  1093.         self.blackThemeButton.setStyleSheet(BlackTheme.blackThemeButtonsStyle())
  1094.         self.blueThemeButton.setStyleSheet(BlackTheme.blackThemeButtonsStyle())
  1095.         self.whiteThemeButton.setStyleSheet(BlackTheme.blackThemeButtonsStyle())
  1096.         self.pinkThemeButton.setStyleSheet(BlackTheme.blackThemeButtonsStyle())
  1097.         self.defaultArtPicture = "icons/defaultArtBlack.jpg"
  1098.         if self.songHasCoverImage == False:
  1099.             self.albumArtImage = QImage(self.defaultArtPicture)
  1100.             self.pixmapItem = QGraphicsPixmapItem(QPixmap.fromImage(self.albumArtImage))
  1101.             self.scene = QGraphicsScene()
  1102.             self.scene.addItem(self.pixmapItem)
  1103.             self.albumArt.setScene(self.scene)
  1104.             self.albumArt.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)
  1105.         self.saveSettings("Theme", "Black")
  1106.        
  1107.     def switchBlueTheme(self):
  1108.         self.playlistWindow.setStyleSheet(BlueTheme.bluePlaylistWindowStyle())
  1109.         self.lyricsWindow.setStyleSheet(BlueTheme.blueLyricsWindowStyle())
  1110.         self.prevSongButton.setStyleSheet(BlueTheme.blueMediaButtonsStyle())
  1111.         self.nextSongButton.setStyleSheet(BlueTheme.blueMediaButtonsStyle())
  1112.         self.playPauseButton.setStyleSheet(BlueTheme.blueMediaButtonsStyle())
  1113.         self.setStyleSheet(BlueTheme.blueMainWindowStyle())
  1114.         self.songName.setStyleSheet(BlueTheme.blueLabelsStyle())
  1115.         self.artistName.setStyleSheet(BlueTheme.blueLabelsStyle())
  1116.         self.albumName.setStyleSheet(BlueTheme.blueLabelsStyle())
  1117.         self.songsCount.setStyleSheet(BlueTheme.blueLabelsStyle())
  1118.         self.seekLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1119.         self.volumeLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1120.         self.minVolLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1121.         self.maxVolLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1122.         self.curVolLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1123.         self.playlistLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1124.         self.lyricsLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1125.         self.totalSongTimeLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1126.         self.curSongTimeLabel.setStyleSheet(BlueTheme.blueLabelsStyle())
  1127.         self.blackThemeButton.setStyleSheet(BlueTheme.blueThemeButtonsStyle())
  1128.         self.blueThemeButton.setStyleSheet(BlueTheme.blueThemeButtonsStyle())
  1129.         self.whiteThemeButton.setStyleSheet(BlueTheme.blueThemeButtonsStyle())
  1130.         self.pinkThemeButton.setStyleSheet(BlueTheme.blueThemeButtonsStyle())
  1131.         self.defaultArtPicture = "icons/defaultArtBlue.jpg"
  1132.         if self.songHasCoverImage == False:
  1133.             self.albumArtImage = QImage(self.defaultArtPicture)
  1134.             self.pixmapItem = QGraphicsPixmapItem(QPixmap.fromImage(self.albumArtImage))
  1135.             self.scene = QGraphicsScene()
  1136.             self.scene.addItem(self.pixmapItem)
  1137.             self.albumArt.setScene(self.scene)
  1138.             self.albumArt.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)
  1139.         self.saveSettings("Theme", "Blue")
  1140.        
  1141.     def switchPinkTheme(self):
  1142.         self.playlistWindow.setStyleSheet(PinkTheme.pinkPlaylistWindowStyle())
  1143.         self.lyricsWindow.setStyleSheet(PinkTheme.pinkLyricsWindowStyle())
  1144.         self.prevSongButton.setStyleSheet(PinkTheme.pinkMediaButtonsStyle())
  1145.         self.nextSongButton.setStyleSheet(PinkTheme.pinkMediaButtonsStyle())
  1146.         self.playPauseButton.setStyleSheet(PinkTheme.pinkMediaButtonsStyle())
  1147.         self.setStyleSheet(PinkTheme.pinkMainWindowStyle())
  1148.         self.songName.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1149.         self.artistName.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1150.         self.albumName.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1151.         self.songsCount.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1152.         self.seekLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1153.         self.volumeLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1154.         self.minVolLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1155.         self.maxVolLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1156.         self.curVolLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1157.         self.playlistLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1158.         self.lyricsLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1159.         self.totalSongTimeLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1160.         self.curSongTimeLabel.setStyleSheet(PinkTheme.pinkLabelsStyle())
  1161.         self.blackThemeButton.setStyleSheet(PinkTheme.pinkThemeButtonsStyle())
  1162.         self.blueThemeButton.setStyleSheet(PinkTheme.pinkThemeButtonsStyle())
  1163.         self.whiteThemeButton.setStyleSheet(PinkTheme.pinkThemeButtonsStyle())
  1164.         self.pinkThemeButton.setStyleSheet(PinkTheme.pinkThemeButtonsStyle())
  1165.         self.defaultArtPicture = "icons/defaultArtPink.jpg"
  1166.         if self.songHasCoverImage == False:
  1167.             self.albumArtImage = QImage(self.defaultArtPicture)
  1168.             self.pixmapItem = QGraphicsPixmapItem(QPixmap.fromImage(self.albumArtImage))
  1169.             self.scene = QGraphicsScene()
  1170.             self.scene.addItem(self.pixmapItem)
  1171.             self.albumArt.setScene(self.scene)
  1172.             self.albumArt.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)
  1173.         self.saveSettings("Theme", "Pink")
  1174.        
  1175.     def switchWhiteTheme(self):
  1176.         self.playlistWindow.setStyleSheet(WhiteTheme.whitePlaylistWindowStyle())
  1177.         self.lyricsWindow.setStyleSheet(WhiteTheme.whiteLyricsWindowStyle())
  1178.         self.prevSongButton.setStyleSheet(WhiteTheme.whiteMediaButtonsStyle())
  1179.         self.nextSongButton.setStyleSheet(WhiteTheme.whiteMediaButtonsStyle())
  1180.         self.playPauseButton.setStyleSheet(WhiteTheme.whiteMediaButtonsStyle())
  1181.         self.setStyleSheet(WhiteTheme.whiteMainWindowStyle())
  1182.         self.songName.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1183.         self.artistName.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1184.         self.albumName.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1185.         self.songsCount.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1186.         self.seekLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1187.         self.volumeLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1188.         self.minVolLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1189.         self.maxVolLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1190.         self.curVolLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1191.         self.playlistLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1192.         self.lyricsLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1193.         self.totalSongTimeLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1194.         self.curSongTimeLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1195.         self.blackThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1196.         self.blueThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1197.         self.whiteThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1198.         self.pinkThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1199.         self.defaultArtPicture = "icons/defaultArtWhite.jpg"
  1200.         if self.songHasCoverImage == False:
  1201.             self.albumArtImage = QImage(self.defaultArtPicture)
  1202.             self.pixmapItem = QGraphicsPixmapItem(QPixmap.fromImage(self.albumArtImage))
  1203.             self.scene = QGraphicsScene()
  1204.             self.scene.addItem(self.pixmapItem)
  1205.             self.albumArt.setScene(self.scene)
  1206.             self.albumArt.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)
  1207.         self.saveSettings("Theme", "White")
  1208.        
  1209.     def putDefaultTheme(self):
  1210.         self.playlistWindow.setStyleSheet(WhiteTheme.whitePlaylistWindowStyle())
  1211.         self.lyricsWindow.setStyleSheet(WhiteTheme.whiteLyricsWindowStyle())
  1212.         self.prevSongButton.setStyleSheet(WhiteTheme.whiteMediaButtonsStyle())
  1213.         self.nextSongButton.setStyleSheet(WhiteTheme.whiteMediaButtonsStyle())
  1214.         self.playPauseButton.setStyleSheet(WhiteTheme.whiteMediaButtonsStyle())
  1215.         self.setStyleSheet(WhiteTheme.whiteMainWindowStyle())
  1216.         self.songName.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1217.         self.artistName.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1218.         self.albumName.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1219.         self.songsCount.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1220.         self.seekLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1221.         self.volumeLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1222.         self.minVolLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1223.         self.maxVolLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1224.         self.curVolLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1225.         self.playlistLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1226.         self.lyricsLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1227.         self.totalSongTimeLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1228.         self.curSongTimeLabel.setStyleSheet(WhiteTheme.whiteLabelsStyle())
  1229.         self.blackThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1230.         self.blueThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1231.         self.whiteThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1232.         self.pinkThemeButton.setStyleSheet(WhiteTheme.whiteThemeButtonsStyle())
  1233.         self.defaultArtPicture = "icons/defaultArtWhite.jpg"
  1234.         if self.songHasCoverImage == False:
  1235.             self.albumArtImage = QImage(self.defaultArtPicture)
  1236.             self.pixmapItem = QGraphicsPixmapItem(QPixmap.fromImage(self.albumArtImage))
  1237.             self.scene = QGraphicsScene()
  1238.             self.scene.addItem(self.pixmapItem)
  1239.             self.albumArt.setScene(self.scene)
  1240.             self.albumArt.fitInView(self.scene.sceneRect(), Qt.IgnoreAspectRatio)
  1241.            
  1242.     def seekStyle(self):
  1243.         return """
  1244.             QSlider::groove:horizontal {
  1245.                 border: 1px solid #bbb;
  1246.                 background: white;
  1247.                 height: 10px;
  1248.                 border-radius: 4px;
  1249.             }
  1250.  
  1251.             QSlider::sub-page:horizontal {
  1252.                 background: qlineargradient(x1: 0, y1: 0,    x2: 0, y2: 1,
  1253.                     stop: 0 #66e, stop: 1 #bbf);
  1254.                 background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
  1255.                     stop: 0 #bbf, stop: 1 #55f);
  1256.                 border: 1px solid #777;
  1257.                 height: 10px;
  1258.                 border-radius: 4px;
  1259.             }
  1260.  
  1261.             QSlider::add-page:horizontal {
  1262.                 background: #fff;
  1263.                 border: 1px solid #777;
  1264.                 height: 10px;
  1265.                 border-radius: 4px;
  1266.             }
  1267.  
  1268.             QSlider::handle:horizontal {
  1269.                 background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
  1270.                     stop:0 #eee, stop:1 #ccc);
  1271.                 border: 1px solid #777;
  1272.                 width: 13px;
  1273.                 margin-top: -2px;
  1274.                 margin-bottom: -2px;
  1275.                 border-radius: 4px;
  1276.             }
  1277.  
  1278.             QSlider::handle:horizontal:hover {
  1279.                 background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
  1280.                     stop:0 #fff, stop:1 #ddd);
  1281.                 border: 1px solid #444;
  1282.                 border-radius: 4px;
  1283.             }
  1284.  
  1285.             QSlider::sub-page:horizontal:disabled {
  1286.                 background: #bbb;
  1287.                 border-color: #999;
  1288.             }
  1289.  
  1290.             QSlider::add-page:horizontal:disabled {
  1291.                 background: #eee;
  1292.                 border-color: #999;
  1293.             }
  1294.  
  1295.             QSlider::handle:horizontal:disabled {
  1296.                 background: #eee;
  1297.                 border: 1px solid #aaa;
  1298.                 border-radius: 4px;
  1299.             }
  1300.         """
  1301.        
  1302.     def volumeStyle(self):
  1303.         return """
  1304.             QSlider::groove {
  1305.                 border: 1px solid #999999;
  1306.                 background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #E6E6E6, stop:1 #EEEEEE);
  1307.             }
  1308.            
  1309.             QSlider::groove:disabled {
  1310.                 background: #efefef;
  1311.             }
  1312.            
  1313.             QSlider::handle {
  1314.                 background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f);
  1315.                 border: 1px solid #5c5c5c;
  1316.                 border-radius: 3px;
  1317.                 width: 15px;
  1318.                 height: 15px;
  1319.             }
  1320.            
  1321.             QSlider::handle:disabled {
  1322.                 background: #D3D0CD;
  1323.             }
  1324.         """
  1325.  
  1326. if __name__ == "__main__":
  1327.     app = QApplication(sys.argv)
  1328.     app.setWindowIcon(QIcon("icons/logo.png"))
  1329.     window = MusicPlayer()
  1330.     window.show()
  1331.     sys.exit(app.exec_())
Add Comment
Please, Sign In to add comment