refactor for proper layout usage
This commit is contained in:
parent
a982a025fe
commit
20636cd081
@ -4,6 +4,8 @@ from PyQt5.QtWidgets import QTableView
|
|||||||
from PyQt5.QtCore import QTimer
|
from PyQt5.QtCore import QTimer
|
||||||
from tinytag import TinyTag
|
from tinytag import TinyTag
|
||||||
from utils import add_files_to_library
|
from utils import add_files_to_library
|
||||||
|
from utils import get_id3_tags
|
||||||
|
from utils import get_album_art
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
@ -68,7 +70,7 @@ class MusicTable(QTableView):
|
|||||||
|
|
||||||
def get_selected_song_metadata(self):
|
def get_selected_song_metadata(self):
|
||||||
"""Returns the current/chosen song's ID3 tags"""
|
"""Returns the current/chosen song's ID3 tags"""
|
||||||
return TinyTag.get(self.selected_song_filepath)
|
return get_id3_tags(self.selected_song_filepath)
|
||||||
|
|
||||||
def get_current_song_filepath(self):
|
def get_current_song_filepath(self):
|
||||||
"""Returns the current/chosen song filepath"""
|
"""Returns the current/chosen song filepath"""
|
||||||
@ -76,7 +78,11 @@ class MusicTable(QTableView):
|
|||||||
|
|
||||||
def get_current_song_metadata(self):
|
def get_current_song_metadata(self):
|
||||||
"""Returns the current/chosen song's ID3 tags"""
|
"""Returns the current/chosen song's ID3 tags"""
|
||||||
return TinyTag.get(self.current_song_filepath)
|
return get_id3_tags(self.current_song_filepath)
|
||||||
|
|
||||||
|
def get_current_song_album_art(self):
|
||||||
|
"""Returns the APIC data for the currently playing song"""
|
||||||
|
return get_album_art(self.current_song_filepath)
|
||||||
|
|
||||||
|
|
||||||
def fetch_library(self):
|
def fetch_library(self):
|
||||||
@ -92,7 +98,8 @@ class MusicTable(QTableView):
|
|||||||
self.model.appendRow(items)
|
self.model.appendRow(items)
|
||||||
# Set the model to the tableView (we are the tableview)
|
# Set the model to the tableView (we are the tableview)
|
||||||
self.setModel(self.model)
|
self.setModel(self.model)
|
||||||
self.update()
|
# self.update()
|
||||||
|
self.viewport().update()
|
||||||
|
|
||||||
def add_files(self, files):
|
def add_files(self, files):
|
||||||
"""When song(s) added to the library, update the tableview model
|
"""When song(s) added to the library, update the tableview model
|
||||||
@ -100,11 +107,9 @@ class MusicTable(QTableView):
|
|||||||
- File > Open > List of song(s)
|
- File > Open > List of song(s)
|
||||||
"""
|
"""
|
||||||
print(f'tableView - adding files: {files}')
|
print(f'tableView - adding files: {files}')
|
||||||
response = add_files_to_library(files)
|
number_of_files_added = add_files_to_library(files)
|
||||||
if response:
|
if number_of_files_added:
|
||||||
self.fetch_library()
|
self.fetch_library()
|
||||||
else:
|
|
||||||
logging.warning('MusicTable.add_files | failed to add files to library')
|
|
||||||
|
|
||||||
|
|
||||||
def load_qapp(self, qapp):
|
def load_qapp(self, qapp):
|
||||||
|
|||||||
32
main.py
32
main.py
@ -1,9 +1,10 @@
|
|||||||
import DBA
|
import DBA
|
||||||
from ui import Ui_MainWindow
|
from ui import Ui_MainWindow
|
||||||
from PyQt5.QtWidgets import QMainWindow, QApplication
|
from PyQt5.QtWidgets import QMainWindow, QApplication, QGraphicsScene
|
||||||
import qdarktheme
|
import qdarktheme
|
||||||
from PyQt5.QtCore import QUrl, QTimer, QEvent
|
from PyQt5.QtCore import QUrl, QTimer, QEvent, Qt, QRect
|
||||||
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QAudioProbe
|
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QAudioProbe
|
||||||
|
from PyQt5.QtGui import QPixmap
|
||||||
from utils import scan_for_music
|
from utils import scan_for_music
|
||||||
from utils import initialize_library_database
|
from utils import initialize_library_database
|
||||||
from components import AudioVisualizer
|
from components import AudioVisualizer
|
||||||
@ -21,6 +22,8 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
|
|||||||
self.selected_song_filepath = None
|
self.selected_song_filepath = None
|
||||||
self.current_song_filepath = None
|
self.current_song_filepath = None
|
||||||
self.current_song_metadata = None
|
self.current_song_metadata = None
|
||||||
|
self.current_song_album_art = None
|
||||||
|
self.album_art_scene = QGraphicsScene()
|
||||||
self.qapp = qapp
|
self.qapp = qapp
|
||||||
print(f'ApplicationWindow self.qapp: {self.qapp}')
|
print(f'ApplicationWindow self.qapp: {self.qapp}')
|
||||||
self.tableView.load_qapp(self.qapp)
|
self.tableView.load_qapp(self.qapp)
|
||||||
@ -116,6 +119,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
|
|||||||
def play_audio_file(self):
|
def play_audio_file(self):
|
||||||
"""Start playback of selected track & moves playback slider"""
|
"""Start playback of selected track & moves playback slider"""
|
||||||
self.current_song_metadata = self.tableView.get_current_song_metadata() # get metadata
|
self.current_song_metadata = self.tableView.get_current_song_metadata() # get metadata
|
||||||
|
self.current_song_album_art = self.tableView.get_current_song_album_art()
|
||||||
url = QUrl.fromLocalFile(self.tableView.get_current_song_filepath()) # read the file
|
url = QUrl.fromLocalFile(self.tableView.get_current_song_filepath()) # read the file
|
||||||
content = QMediaContent(url) # load the audio content
|
content = QMediaContent(url) # load the audio content
|
||||||
self.player.setMedia(content) # what content to play
|
self.player.setMedia(content) # what content to play
|
||||||
@ -124,13 +128,31 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
# assign metadata
|
# assign metadata
|
||||||
# FIXME when i change tinytag to something else
|
# FIXME when i change tinytag to something else
|
||||||
artist = self.current_song_metadata.artist
|
artist = self.current_song_metadata["artist"][0] if "artist" in self.current_song_metadata else None
|
||||||
album = self.current_song_metadata.album
|
album = self.current_song_metadata["album"][0] if "album" in self.current_song_metadata else None
|
||||||
title = self.current_song_metadata.title
|
title = self.current_song_metadata["title"][0]
|
||||||
# edit labels
|
# edit labels
|
||||||
self.artistLabel.setText(artist)
|
self.artistLabel.setText(artist)
|
||||||
self.albumLabel.setText(album)
|
self.albumLabel.setText(album)
|
||||||
self.titleLabel.setText(title)
|
self.titleLabel.setText(title)
|
||||||
|
# set album artwork
|
||||||
|
self.load_album_art(self.current_song_album_art)
|
||||||
|
|
||||||
|
|
||||||
|
def load_album_art(self, album_art_data):
|
||||||
|
"""Sets the album art for the currently playing track"""
|
||||||
|
if self.current_song_album_art:
|
||||||
|
# Create pixmap for album art
|
||||||
|
pixmap = QPixmap()
|
||||||
|
pixmap.loadFromData(self.current_song_album_art)
|
||||||
|
self.album_art_scene.addPixmap(pixmap)
|
||||||
|
# Reset the scene
|
||||||
|
self.albumGraphicsView.setScene(None)
|
||||||
|
# Set the scene
|
||||||
|
self.albumGraphicsView.setScene(self.album_art_scene)
|
||||||
|
# Put artwork in the scene, fit to graphics view widget
|
||||||
|
self.albumGraphicsView.fitInView(self.album_art_scene.sceneRect(), Qt.KeepAspectRatio)
|
||||||
|
|
||||||
|
|
||||||
def update_audio_visualization(self):
|
def update_audio_visualization(self):
|
||||||
"""Handles upading points on the pyqtgraph visual"""
|
"""Handles upading points on the pyqtgraph visual"""
|
||||||
|
|||||||
140
ui.py
140
ui.py
@ -14,58 +14,47 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
|||||||
class Ui_MainWindow(object):
|
class Ui_MainWindow(object):
|
||||||
def setupUi(self, MainWindow):
|
def setupUi(self, MainWindow):
|
||||||
MainWindow.setObjectName("MainWindow")
|
MainWindow.setObjectName("MainWindow")
|
||||||
MainWindow.resize(1062, 795)
|
MainWindow.resize(1152, 894)
|
||||||
MainWindow.setStatusTip("")
|
MainWindow.setStatusTip("")
|
||||||
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||||
self.centralwidget.setObjectName("centralwidget")
|
self.centralwidget.setObjectName("centralwidget")
|
||||||
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget)
|
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget)
|
||||||
self.verticalLayout_3.setObjectName("verticalLayout_3")
|
self.verticalLayout_3.setObjectName("verticalLayout_3")
|
||||||
self.frame_6 = QtWidgets.QFrame(self.centralwidget)
|
self.hLayoutHead = QtWidgets.QHBoxLayout()
|
||||||
self.frame_6.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
self.hLayoutHead.setObjectName("hLayoutHead")
|
||||||
self.frame_6.setFrameShadow(QtWidgets.QFrame.Raised)
|
self.vlayoutAlbumArt = QtWidgets.QVBoxLayout()
|
||||||
self.frame_6.setObjectName("frame_6")
|
self.vlayoutAlbumArt.setObjectName("vlayoutAlbumArt")
|
||||||
self.frame_2 = QtWidgets.QFrame(self.frame_6)
|
self.albumGraphicsView = QtWidgets.QGraphicsView(self.centralwidget)
|
||||||
self.frame_2.setGeometry(QtCore.QRect(0, 0, 161, 161))
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
|
||||||
self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
sizePolicy.setHorizontalStretch(0)
|
||||||
self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
|
sizePolicy.setVerticalStretch(0)
|
||||||
self.frame_2.setObjectName("frame_2")
|
sizePolicy.setHeightForWidth(self.albumGraphicsView.sizePolicy().hasHeightForWidth())
|
||||||
self.albumGraphicsView = QtWidgets.QGraphicsView(self.frame_2)
|
self.albumGraphicsView.setSizePolicy(sizePolicy)
|
||||||
self.albumGraphicsView.setGeometry(QtCore.QRect(0, 0, 161, 161))
|
self.albumGraphicsView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||||
|
self.albumGraphicsView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||||
|
self.albumGraphicsView.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
|
||||||
|
self.albumGraphicsView.setInteractive(False)
|
||||||
|
self.albumGraphicsView.setViewportUpdateMode(QtWidgets.QGraphicsView.FullViewportUpdate)
|
||||||
self.albumGraphicsView.setObjectName("albumGraphicsView")
|
self.albumGraphicsView.setObjectName("albumGraphicsView")
|
||||||
self.frame_4 = QtWidgets.QFrame(self.frame_6)
|
self.vlayoutAlbumArt.addWidget(self.albumGraphicsView)
|
||||||
self.frame_4.setGeometry(QtCore.QRect(540, 40, 521, 121))
|
self.hLayoutHead.addLayout(self.vlayoutAlbumArt)
|
||||||
self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
self.vLayoutSongDetails = QtWidgets.QVBoxLayout()
|
||||||
self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised)
|
self.vLayoutSongDetails.setObjectName("vLayoutSongDetails")
|
||||||
self.frame_4.setObjectName("frame_4")
|
self.artistLabel = QtWidgets.QLabel(self.centralwidget)
|
||||||
self.PlotWidget = PlotWidget(self.frame_4)
|
|
||||||
self.PlotWidget.setGeometry(QtCore.QRect(0, 0, 521, 121))
|
|
||||||
self.PlotWidget.setObjectName("PlotWidget")
|
|
||||||
self.frame_5 = QtWidgets.QFrame(self.frame_6)
|
|
||||||
self.frame_5.setGeometry(QtCore.QRect(160, 0, 381, 161))
|
|
||||||
self.frame_5.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
|
||||||
self.frame_5.setFrameShadow(QtWidgets.QFrame.Raised)
|
|
||||||
self.frame_5.setObjectName("frame_5")
|
|
||||||
self.verticalLayoutWidget = QtWidgets.QWidget(self.frame_5)
|
|
||||||
self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 381, 161))
|
|
||||||
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
|
|
||||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
|
|
||||||
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self.verticalLayout.setObjectName("verticalLayout")
|
|
||||||
self.artistLabel = QtWidgets.QLabel(self.verticalLayoutWidget)
|
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(24)
|
font.setPointSize(24)
|
||||||
font.setBold(True)
|
font.setBold(True)
|
||||||
font.setWeight(75)
|
font.setWeight(75)
|
||||||
self.artistLabel.setFont(font)
|
self.artistLabel.setFont(font)
|
||||||
self.artistLabel.setObjectName("artistLabel")
|
self.artistLabel.setObjectName("artistLabel")
|
||||||
self.verticalLayout.addWidget(self.artistLabel)
|
self.vLayoutSongDetails.addWidget(self.artistLabel)
|
||||||
self.titleLabel = QtWidgets.QLabel(self.verticalLayoutWidget)
|
self.titleLabel = QtWidgets.QLabel(self.centralwidget)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(18)
|
font.setPointSize(18)
|
||||||
self.titleLabel.setFont(font)
|
self.titleLabel.setFont(font)
|
||||||
self.titleLabel.setObjectName("titleLabel")
|
self.titleLabel.setObjectName("titleLabel")
|
||||||
self.verticalLayout.addWidget(self.titleLabel)
|
self.vLayoutSongDetails.addWidget(self.titleLabel)
|
||||||
self.albumLabel = QtWidgets.QLabel(self.verticalLayoutWidget)
|
self.albumLabel = QtWidgets.QLabel(self.centralwidget)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(16)
|
font.setPointSize(16)
|
||||||
font.setBold(False)
|
font.setBold(False)
|
||||||
@ -73,44 +62,37 @@ class Ui_MainWindow(object):
|
|||||||
font.setWeight(50)
|
font.setWeight(50)
|
||||||
self.albumLabel.setFont(font)
|
self.albumLabel.setFont(font)
|
||||||
self.albumLabel.setObjectName("albumLabel")
|
self.albumLabel.setObjectName("albumLabel")
|
||||||
self.verticalLayout.addWidget(self.albumLabel)
|
self.vLayoutSongDetails.addWidget(self.albumLabel)
|
||||||
self.horizontalLayoutWidget = QtWidgets.QWidget(self.frame_6)
|
self.hLayoutHead.addLayout(self.vLayoutSongDetails)
|
||||||
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(540, 0, 521, 41))
|
self.vLayoutPlaybackVisuals = QtWidgets.QVBoxLayout()
|
||||||
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
|
self.vLayoutPlaybackVisuals.setObjectName("vLayoutPlaybackVisuals")
|
||||||
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||||
self.playbackSlider = QtWidgets.QSlider(self.horizontalLayoutWidget)
|
self.playbackSlider = QtWidgets.QSlider(self.centralwidget)
|
||||||
self.playbackSlider.setOrientation(QtCore.Qt.Horizontal)
|
self.playbackSlider.setOrientation(QtCore.Qt.Horizontal)
|
||||||
self.playbackSlider.setObjectName("playbackSlider")
|
self.playbackSlider.setObjectName("playbackSlider")
|
||||||
self.horizontalLayout.addWidget(self.playbackSlider)
|
self.horizontalLayout.addWidget(self.playbackSlider)
|
||||||
self.startTimeLabel = QtWidgets.QLabel(self.horizontalLayoutWidget)
|
self.startTimeLabel = QtWidgets.QLabel(self.centralwidget)
|
||||||
self.startTimeLabel.setObjectName("startTimeLabel")
|
self.startTimeLabel.setObjectName("startTimeLabel")
|
||||||
self.horizontalLayout.addWidget(self.startTimeLabel)
|
self.horizontalLayout.addWidget(self.startTimeLabel)
|
||||||
self.slashLabel = QtWidgets.QLabel(self.horizontalLayoutWidget)
|
self.slashLabel = QtWidgets.QLabel(self.centralwidget)
|
||||||
self.slashLabel.setObjectName("slashLabel")
|
self.slashLabel.setObjectName("slashLabel")
|
||||||
self.horizontalLayout.addWidget(self.slashLabel)
|
self.horizontalLayout.addWidget(self.slashLabel)
|
||||||
self.endTimeLabel = QtWidgets.QLabel(self.horizontalLayoutWidget)
|
self.endTimeLabel = QtWidgets.QLabel(self.centralwidget)
|
||||||
self.endTimeLabel.setObjectName("endTimeLabel")
|
self.endTimeLabel.setObjectName("endTimeLabel")
|
||||||
self.horizontalLayout.addWidget(self.endTimeLabel)
|
self.horizontalLayout.addWidget(self.endTimeLabel)
|
||||||
self.verticalLayout_3.addWidget(self.frame_6)
|
self.vLayoutPlaybackVisuals.addLayout(self.horizontalLayout)
|
||||||
self.frame = QtWidgets.QFrame(self.centralwidget)
|
self.PlotWidget = PlotWidget(self.centralwidget)
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
|
self.PlotWidget.setObjectName("PlotWidget")
|
||||||
sizePolicy.setHorizontalStretch(0)
|
self.vLayoutPlaybackVisuals.addWidget(self.PlotWidget)
|
||||||
sizePolicy.setVerticalStretch(0)
|
self.hLayoutHead.addLayout(self.vLayoutPlaybackVisuals)
|
||||||
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
|
self.hLayoutHead.setStretch(0, 2)
|
||||||
self.frame.setSizePolicy(sizePolicy)
|
self.hLayoutHead.setStretch(1, 4)
|
||||||
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
self.hLayoutHead.setStretch(2, 6)
|
||||||
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
|
self.verticalLayout_3.addLayout(self.hLayoutHead)
|
||||||
self.frame.setObjectName("frame")
|
self.hLayoutMusicTable = QtWidgets.QHBoxLayout()
|
||||||
self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.frame)
|
self.hLayoutMusicTable.setObjectName("hLayoutMusicTable")
|
||||||
self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 1061, 461))
|
self.tableView = MusicTable(self.centralwidget)
|
||||||
self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
|
|
||||||
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
|
|
||||||
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint)
|
|
||||||
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
|
|
||||||
self.verticalLayout_2.setObjectName("verticalLayout_2")
|
|
||||||
self.tableView = MusicTable(self.verticalLayoutWidget_2)
|
|
||||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
|
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
|
||||||
sizePolicy.setHorizontalStretch(1)
|
sizePolicy.setHorizontalStretch(1)
|
||||||
sizePolicy.setVerticalStretch(1)
|
sizePolicy.setVerticalStretch(1)
|
||||||
@ -129,47 +111,45 @@ class Ui_MainWindow(object):
|
|||||||
self.tableView.horizontalHeader().setCascadingSectionResizes(True)
|
self.tableView.horizontalHeader().setCascadingSectionResizes(True)
|
||||||
self.tableView.horizontalHeader().setStretchLastSection(True)
|
self.tableView.horizontalHeader().setStretchLastSection(True)
|
||||||
self.tableView.verticalHeader().setVisible(False)
|
self.tableView.verticalHeader().setVisible(False)
|
||||||
self.verticalLayout_2.addWidget(self.tableView)
|
self.hLayoutMusicTable.addWidget(self.tableView)
|
||||||
self.verticalLayout_3.addWidget(self.frame)
|
self.verticalLayout_3.addLayout(self.hLayoutMusicTable)
|
||||||
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
|
self.hLayoutControls = QtWidgets.QHBoxLayout()
|
||||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
self.hLayoutControls.setObjectName("hLayoutControls")
|
||||||
self.previousButton = QtWidgets.QPushButton(self.centralwidget)
|
self.previousButton = QtWidgets.QPushButton(self.centralwidget)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(28)
|
font.setPointSize(28)
|
||||||
self.previousButton.setFont(font)
|
self.previousButton.setFont(font)
|
||||||
self.previousButton.setObjectName("previousButton")
|
self.previousButton.setObjectName("previousButton")
|
||||||
self.horizontalLayout_2.addWidget(self.previousButton)
|
self.hLayoutControls.addWidget(self.previousButton)
|
||||||
self.playButton = QtWidgets.QPushButton(self.centralwidget)
|
self.playButton = QtWidgets.QPushButton(self.centralwidget)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(28)
|
font.setPointSize(28)
|
||||||
self.playButton.setFont(font)
|
self.playButton.setFont(font)
|
||||||
self.playButton.setObjectName("playButton")
|
self.playButton.setObjectName("playButton")
|
||||||
self.horizontalLayout_2.addWidget(self.playButton)
|
self.hLayoutControls.addWidget(self.playButton)
|
||||||
self.nextButton = QtWidgets.QPushButton(self.centralwidget)
|
self.nextButton = QtWidgets.QPushButton(self.centralwidget)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(28)
|
font.setPointSize(28)
|
||||||
self.nextButton.setFont(font)
|
self.nextButton.setFont(font)
|
||||||
self.nextButton.setObjectName("nextButton")
|
self.nextButton.setObjectName("nextButton")
|
||||||
self.horizontalLayout_2.addWidget(self.nextButton)
|
self.hLayoutControls.addWidget(self.nextButton)
|
||||||
self.verticalLayout_3.addLayout(self.horizontalLayout_2)
|
self.verticalLayout_3.addLayout(self.hLayoutControls)
|
||||||
self.frame_3 = QtWidgets.QFrame(self.centralwidget)
|
self.hLayoutControls2 = QtWidgets.QHBoxLayout()
|
||||||
self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
|
self.hLayoutControls2.setObjectName("hLayoutControls2")
|
||||||
self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
|
self.volumeSlider = QtWidgets.QSlider(self.centralwidget)
|
||||||
self.frame_3.setObjectName("frame_3")
|
|
||||||
self.volumeSlider = QtWidgets.QSlider(self.frame_3)
|
|
||||||
self.volumeSlider.setGeometry(QtCore.QRect(10, 10, 181, 31))
|
|
||||||
self.volumeSlider.setMaximum(100)
|
self.volumeSlider.setMaximum(100)
|
||||||
self.volumeSlider.setProperty("value", 50)
|
self.volumeSlider.setProperty("value", 50)
|
||||||
self.volumeSlider.setOrientation(QtCore.Qt.Horizontal)
|
self.volumeSlider.setOrientation(QtCore.Qt.Horizontal)
|
||||||
self.volumeSlider.setObjectName("volumeSlider")
|
self.volumeSlider.setObjectName("volumeSlider")
|
||||||
self.verticalLayout_3.addWidget(self.frame_3)
|
self.hLayoutControls2.addWidget(self.volumeSlider)
|
||||||
|
self.verticalLayout_3.addLayout(self.hLayoutControls2)
|
||||||
self.verticalLayout_3.setStretch(0, 3)
|
self.verticalLayout_3.setStretch(0, 3)
|
||||||
self.verticalLayout_3.setStretch(1, 8)
|
self.verticalLayout_3.setStretch(1, 8)
|
||||||
self.verticalLayout_3.setStretch(2, 1)
|
self.verticalLayout_3.setStretch(2, 1)
|
||||||
self.verticalLayout_3.setStretch(3, 1)
|
self.verticalLayout_3.setStretch(3, 1)
|
||||||
MainWindow.setCentralWidget(self.centralwidget)
|
MainWindow.setCentralWidget(self.centralwidget)
|
||||||
self.menubar = QtWidgets.QMenuBar(MainWindow)
|
self.menubar = QtWidgets.QMenuBar(MainWindow)
|
||||||
self.menubar.setGeometry(QtCore.QRect(0, 0, 1062, 24))
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 1152, 24))
|
||||||
self.menubar.setObjectName("menubar")
|
self.menubar.setObjectName("menubar")
|
||||||
self.menuFile = QtWidgets.QMenu(self.menubar)
|
self.menuFile = QtWidgets.QMenu(self.menubar)
|
||||||
self.menuFile.setObjectName("menuFile")
|
self.menuFile.setObjectName("menuFile")
|
||||||
|
|||||||
191
ui.ui
191
ui.ui
@ -6,8 +6,8 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1062</width>
|
<width>1152</width>
|
||||||
<height>795</height>
|
<height>894</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@ -19,90 +19,38 @@
|
|||||||
<widget class="QWidget" name="centralwidget">
|
<widget class="QWidget" name="centralwidget">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="3,8,1,1">
|
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="3,8,1,1">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame_6">
|
<layout class="QHBoxLayout" name="hLayoutHead" stretch="2,4,6">
|
||||||
<property name="frameShape">
|
<item>
|
||||||
<enum>QFrame::StyledPanel</enum>
|
<layout class="QVBoxLayout" name="vlayoutAlbumArt">
|
||||||
</property>
|
<item>
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="QFrame" name="frame_2">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>161</width>
|
|
||||||
<height>161</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="frameShape">
|
|
||||||
<enum>QFrame::StyledPanel</enum>
|
|
||||||
</property>
|
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="QGraphicsView" name="albumGraphicsView">
|
<widget class="QGraphicsView" name="albumGraphicsView">
|
||||||
<property name="geometry">
|
<property name="sizePolicy">
|
||||||
<rect>
|
<sizepolicy hsizetype="Maximum" vsizetype="Maximum">
|
||||||
<x>0</x>
|
<horstretch>0</horstretch>
|
||||||
<y>0</y>
|
<verstretch>0</verstretch>
|
||||||
<width>161</width>
|
</sizepolicy>
|
||||||
<height>161</height>
|
</property>
|
||||||
</rect>
|
<property name="verticalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeAdjustPolicy">
|
||||||
|
<enum>QAbstractScrollArea::AdjustIgnored</enum>
|
||||||
|
</property>
|
||||||
|
<property name="interactive">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="viewportUpdateMode">
|
||||||
|
<enum>QGraphicsView::FullViewportUpdate</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</item>
|
||||||
<widget class="QFrame" name="frame_4">
|
</layout>
|
||||||
<property name="geometry">
|
</item>
|
||||||
<rect>
|
<item>
|
||||||
<x>540</x>
|
<layout class="QVBoxLayout" name="vLayoutSongDetails">
|
||||||
<y>40</y>
|
|
||||||
<width>521</width>
|
|
||||||
<height>121</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="frameShape">
|
|
||||||
<enum>QFrame::StyledPanel</enum>
|
|
||||||
</property>
|
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="PlotWidget" name="PlotWidget" native="true">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>521</width>
|
|
||||||
<height>121</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
<widget class="QFrame" name="frame_5">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>160</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>381</width>
|
|
||||||
<height>161</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="frameShape">
|
|
||||||
<enum>QFrame::StyledPanel</enum>
|
|
||||||
</property>
|
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="verticalLayoutWidget">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>381</width>
|
|
||||||
<height>161</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="artistLabel">
|
<widget class="QLabel" name="artistLabel">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -145,17 +93,10 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</item>
|
||||||
</widget>
|
<item>
|
||||||
<widget class="QWidget" name="horizontalLayoutWidget">
|
<layout class="QVBoxLayout" name="vLayoutPlaybackVisuals">
|
||||||
<property name="geometry">
|
<item>
|
||||||
<rect>
|
|
||||||
<x>540</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>521</width>
|
|
||||||
<height>41</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSlider" name="playbackSlider">
|
<widget class="QSlider" name="playbackSlider">
|
||||||
@ -186,36 +127,16 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame">
|
<widget class="PlotWidget" name="PlotWidget" native="true"/>
|
||||||
<property name="sizePolicy">
|
</item>
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
</layout>
|
||||||
<horstretch>0</horstretch>
|
</item>
|
||||||
<verstretch>0</verstretch>
|
</layout>
|
||||||
</sizepolicy>
|
</item>
|
||||||
</property>
|
<item>
|
||||||
<property name="frameShape">
|
<layout class="QHBoxLayout" name="hLayoutMusicTable">
|
||||||
<enum>QFrame::StyledPanel</enum>
|
|
||||||
</property>
|
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="verticalLayoutWidget_2">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>1061</width>
|
|
||||||
<height>461</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0">
|
|
||||||
<property name="sizeConstraint">
|
|
||||||
<enum>QLayout::SetNoConstraint</enum>
|
|
||||||
</property>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="MusicTable" name="tableView">
|
<widget class="MusicTable" name="tableView">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -266,11 +187,9 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="hLayoutControls">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="previousButton">
|
<widget class="QPushButton" name="previousButton">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
@ -310,22 +229,9 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="frame_3">
|
<layout class="QHBoxLayout" name="hLayoutControls2">
|
||||||
<property name="frameShape">
|
<item>
|
||||||
<enum>QFrame::StyledPanel</enum>
|
|
||||||
</property>
|
|
||||||
<property name="frameShadow">
|
|
||||||
<enum>QFrame::Raised</enum>
|
|
||||||
</property>
|
|
||||||
<widget class="QSlider" name="volumeSlider">
|
<widget class="QSlider" name="volumeSlider">
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>10</x>
|
|
||||||
<y>10</y>
|
|
||||||
<width>181</width>
|
|
||||||
<height>31</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>100</number>
|
<number>100</number>
|
||||||
</property>
|
</property>
|
||||||
@ -336,7 +242,8 @@
|
|||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</item>
|
||||||
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
@ -345,7 +252,7 @@
|
|||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1062</width>
|
<width>1152</width>
|
||||||
<height>24</height>
|
<height>24</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
from .safe_get import safe_get
|
from .safe_get import safe_get
|
||||||
|
from .get_album_art import get_album_art
|
||||||
from .get_id3_tags import get_id3_tags
|
from .get_id3_tags import get_id3_tags
|
||||||
from .initialize_library_database import initialize_library_database
|
from .initialize_library_database import initialize_library_database
|
||||||
from .scan_for_music import scan_for_music
|
from .scan_for_music import scan_for_music
|
||||||
|
|||||||
@ -9,9 +9,13 @@ config.read("config.ini")
|
|||||||
|
|
||||||
def add_files_to_library(files):
|
def add_files_to_library(files):
|
||||||
"""Adds audio file(s) to the sqllite db
|
"""Adds audio file(s) to the sqllite db
|
||||||
`files` | list() | List of fully qualified paths to audio file(s)
|
|
||||||
Returns a count of records added
|
files | list() of fully qualified paths to audio file(s)
|
||||||
|
|
||||||
|
Returns true if any files were added
|
||||||
"""
|
"""
|
||||||
|
if not files:
|
||||||
|
return False
|
||||||
print(f"utils | adding files to library: {files}")
|
print(f"utils | adding files to library: {files}")
|
||||||
extensions = config.get("settings", "extensions").split(",")
|
extensions = config.get("settings", "extensions").split(",")
|
||||||
insert_data = [] # To store data for batch insert
|
insert_data = [] # To store data for batch insert
|
||||||
@ -20,7 +24,7 @@ def add_files_to_library(files):
|
|||||||
filename = filepath.split("/")[-1]
|
filename = filepath.split("/")[-1]
|
||||||
audio = get_id3_tags(filepath)
|
audio = get_id3_tags(filepath)
|
||||||
if "title" not in audio:
|
if "title" not in audio:
|
||||||
return
|
return False
|
||||||
# Append data tuple to insert_data list
|
# Append data tuple to insert_data list
|
||||||
insert_data.append(
|
insert_data.append(
|
||||||
(
|
(
|
||||||
|
|||||||
17
utils/get_album_art.py
Normal file
17
utils/get_album_art.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
from mutagen.id3 import ID3, APIC
|
||||||
|
|
||||||
|
def get_album_art(file):
|
||||||
|
"""Get the album art for an audio file
|
||||||
|
# Parameters
|
||||||
|
`file` | str | Fully qualified path to file
|
||||||
|
|
||||||
|
# Returns
|
||||||
|
dict of all id3 tags
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
audio = ID3(file)
|
||||||
|
album_art = audio.get('APIC:').data if 'APIC:' in audio else None
|
||||||
|
return album_art
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error: {e}")
|
||||||
|
return {}
|
||||||
Loading…
x
Reference in New Issue
Block a user