refactor for proper layout usage

This commit is contained in:
billypom on debian 2024-02-25 18:30:52 -05:00
parent a982a025fe
commit 20636cd081
7 changed files with 296 additions and 360 deletions

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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>

View File

@ -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

View File

@ -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
View 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 {}