ui font editing, artist album title selectable

This commit is contained in:
billypom on debian 2025-04-06 13:44:01 -04:00
parent e78fb918b5
commit 8684db497f
5 changed files with 95 additions and 78 deletions

View File

@ -64,5 +64,4 @@ config.ini db/
- allow spectrum analyzer to fall when playback stops or song is paused - allow spectrum analyzer to fall when playback stops or song is paused
- ability to delete playlist - ability to delete playlist
- automatic "radio" based on artist or genre - automatic "radio" based on artist or genre
- "installer" - put files in /opt? script to install and uninstall... eh - jump to currently playing song
- .deb package?

44
main.py
View File

@ -1,6 +1,7 @@
import os import os
import sys import sys
import logging import logging
from PyQt5 import QtCore
import qdarktheme import qdarktheme
import typing import typing
import traceback import traceback
@ -36,7 +37,7 @@ from PyQt5.QtCore import (
QRunnable, QRunnable,
) )
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QAudioProbe from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QAudioProbe
from PyQt5.QtGui import QClipboard, QCloseEvent, QPixmap, QResizeEvent from PyQt5.QtGui import QClipboard, QCloseEvent, QFont, QPixmap, QResizeEvent
from utils import ( from utils import (
delete_album_art, delete_album_art,
scan_for_music, scan_for_music,
@ -138,35 +139,45 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
def __init__(self, clipboard): def __init__(self, clipboard):
super(ApplicationWindow, self).__init__() super(ApplicationWindow, self).__init__()
global stopped
stopped = False # clipboard good
self.clipboard = clipboard
# Config # Config
self.config: ConfigParser = ConfigParser() self.config: ConfigParser = ConfigParser()
self.cfg_file = ( self.cfg_file = (
Path(user_config_dir(appname="musicpom", appauthor="billypom")) Path(user_config_dir(appname="musicpom", appauthor="billypom"))
/ "config.ini" / "config.ini"
) )
self.config.read(self.cfg_file)
# Multithreading stuff... # Multithreading stuff...
self.threadpool = QThreadPool() self.threadpool = QThreadPool()
# UI # UI
self.setupUi(self) self.setupUi(self)
self.setWindowTitle("musicpom") self.setWindowTitle("musicpom")
self.setup_fonts()
# self.vLayoutAlbumArt.SetFixedSize() # self.vLayoutAlbumArt.SetFixedSize()
self.status_bar = QStatusBar() self.status_bar = QStatusBar()
self.permanent_status_label = QLabel("Status...") self.permanent_status_label = QLabel("Status...")
self.status_bar.addPermanentWidget(self.permanent_status_label) self.status_bar.addPermanentWidget(self.permanent_status_label)
self.setStatusBar(self.status_bar) self.setStatusBar(self.status_bar)
self.selected_song_filepath: str | None = None self.selected_song_filepath: str | None = None
self.current_song_filepath: str | None = None self.current_song_filepath: str | None = None
self.current_song_metadata: ID3 | dict | None = None self.current_song_metadata: ID3 | dict | None = None
self.current_song_album_art: bytes | None = None self.current_song_album_art: bytes | None = None
# widget bits
self.album_art_scene: QGraphicsScene = QGraphicsScene() self.album_art_scene: QGraphicsScene = QGraphicsScene()
self.config.read(self.cfg_file)
self.player: QMediaPlayer = QMediaPlayer() # Audio player object self.player: QMediaPlayer = QMediaPlayer() # Audio player object
self.probe: QAudioProbe = QAudioProbe() # Gets audio data self.probe: QAudioProbe = QAudioProbe() # Gets audio data
self.audio_visualizer: AudioVisualizer = AudioVisualizer(self.player) self.audio_visualizer: AudioVisualizer = AudioVisualizer(self.player)
self.timer = QTimer(self) # Audio timing things self.timer = QTimer(self) # Audio timing things
self.clipboard = clipboard
# sharing functions with other classes and that
self.tableView.load_qapp(self) self.tableView.load_qapp(self)
self.albumGraphicsView.load_qapp(self) self.albumGraphicsView.load_qapp(self)
@ -356,6 +367,27 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
# | | # | |
# |____________________| # |____________________|
def setup_fonts(self):
"""Initializes font sizes and behaviors for various UI components"""
font: QFont = QFont()
font.setPointSize(16)
font.setBold(True)
self.artistLabel: QLabel
self.artistLabel.setFont(font)
self.artistLabel.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
font: QFont = QFont()
font.setPointSize(16)
font.setBold(False)
self.titleLabel.setFont(font)
self.titleLabel.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
font: QFont = QFont()
font.setPointSize(16)
font.setItalic(True)
self.albumLabel.setFont(font)
self.albumLabel.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
def load_config(self) -> None: def load_config(self) -> None:
"""does what it says""" """does what it says"""
cfg_file = ( cfg_file = (
@ -479,7 +511,7 @@ class ApplicationWindow(QMainWindow, Ui_MainWindow):
def move_slider(self) -> None: def move_slider(self) -> None:
"""Handles moving the playback slider""" """Handles moving the playback slider"""
if stopped: if self.player.state() == QMediaPlayer.State.StoppedState:
return return
else: else:
if self.playbackSlider.isSliderDown(): if self.playbackSlider.isSliderDown():

33
ui.py
View File

@ -160,6 +160,11 @@ class Ui_MainWindow(object):
self.hLayoutControls2 = QtWidgets.QHBoxLayout() self.hLayoutControls2 = QtWidgets.QHBoxLayout()
self.hLayoutControls2.setSpacing(6) self.hLayoutControls2.setSpacing(6)
self.hLayoutControls2.setObjectName("hLayoutControls2") self.hLayoutControls2.setObjectName("hLayoutControls2")
self.hLayoutVolume = QtWidgets.QHBoxLayout()
self.hLayoutVolume.setObjectName("hLayoutVolume")
self.volumeLabel = QtWidgets.QLabel(self.centralwidget)
self.volumeLabel.setObjectName("volumeLabel")
self.hLayoutVolume.addWidget(self.volumeLabel)
self.volumeSlider = QtWidgets.QSlider(self.centralwidget) self.volumeSlider = QtWidgets.QSlider(self.centralwidget)
self.volumeSlider.setMinimum(-1) self.volumeSlider.setMinimum(-1)
self.volumeSlider.setMaximum(101) self.volumeSlider.setMaximum(101)
@ -167,43 +172,29 @@ class Ui_MainWindow(object):
self.volumeSlider.setOrientation(QtCore.Qt.Horizontal) self.volumeSlider.setOrientation(QtCore.Qt.Horizontal)
self.volumeSlider.setTickPosition(QtWidgets.QSlider.TicksAbove) self.volumeSlider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.volumeSlider.setObjectName("volumeSlider") self.volumeSlider.setObjectName("volumeSlider")
self.hLayoutControls2.addWidget(self.volumeSlider) self.hLayoutVolume.addWidget(self.volumeSlider)
self.volumeLabel = QtWidgets.QLabel(self.centralwidget) self.hLayoutControls2.addLayout(self.hLayoutVolume)
self.volumeLabel.setObjectName("volumeLabel") spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.hLayoutControls2.addWidget(self.volumeLabel) self.hLayoutControls2.addItem(spacerItem2)
self.hLayoutSongDetails = QtWidgets.QHBoxLayout() self.hLayoutSongDetails = QtWidgets.QHBoxLayout()
self.hLayoutSongDetails.setObjectName("hLayoutSongDetails") self.hLayoutSongDetails.setObjectName("hLayoutSongDetails")
self.artistLabel = QtWidgets.QLabel(self.centralwidget) self.artistLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(24)
font.setBold(True)
font.setWeight(75)
self.artistLabel.setFont(font)
self.artistLabel.setObjectName("artistLabel") self.artistLabel.setObjectName("artistLabel")
self.hLayoutSongDetails.addWidget(self.artistLabel) self.hLayoutSongDetails.addWidget(self.artistLabel)
self.titleLabel = QtWidgets.QLabel(self.centralwidget) self.titleLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(18)
self.titleLabel.setFont(font)
self.titleLabel.setObjectName("titleLabel") self.titleLabel.setObjectName("titleLabel")
self.hLayoutSongDetails.addWidget(self.titleLabel) self.hLayoutSongDetails.addWidget(self.titleLabel)
self.albumLabel = QtWidgets.QLabel(self.centralwidget) self.albumLabel = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(16)
font.setBold(False)
font.setItalic(True)
font.setWeight(50)
self.albumLabel.setFont(font)
self.albumLabel.setObjectName("albumLabel") self.albumLabel.setObjectName("albumLabel")
self.hLayoutSongDetails.addWidget(self.albumLabel) self.hLayoutSongDetails.addWidget(self.albumLabel)
self.hLayoutControls2.addLayout(self.hLayoutSongDetails) self.hLayoutControls2.addLayout(self.hLayoutSongDetails)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.hLayoutControls2.addItem(spacerItem2) self.hLayoutControls2.addItem(spacerItem3)
self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton") self.pushButton.setObjectName("pushButton")
self.hLayoutControls2.addWidget(self.pushButton) self.hLayoutControls2.addWidget(self.pushButton)
self.hLayoutControls2.setStretch(0, 1) self.hLayoutControls2.setStretch(0, 1)
self.hLayoutControls2.setStretch(3, 4) self.hLayoutControls2.setStretch(2, 5)
self.hLayoutControls2.setStretch(4, 1) self.hLayoutControls2.setStretch(4, 1)
self.verticalLayout.addLayout(self.hLayoutControls2) self.verticalLayout.addLayout(self.hLayoutControls2)
self.verticalLayout_3.addLayout(self.verticalLayout) self.verticalLayout_3.addLayout(self.verticalLayout)

88
ui.ui
View File

@ -273,69 +273,63 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="hLayoutControls2" stretch="1,0,0,4,1"> <layout class="QHBoxLayout" name="hLayoutControls2" stretch="1,0,5,0,1">
<property name="spacing"> <property name="spacing">
<number>6</number> <number>6</number>
</property> </property>
<item> <item>
<widget class="QSlider" name="volumeSlider"> <layout class="QHBoxLayout" name="hLayoutVolume">
<property name="minimum"> <item>
<number>-1</number> <widget class="QLabel" name="volumeLabel">
</property> <property name="text">
<property name="maximum"> <string>50</string>
<number>101</number> </property>
</property> </widget>
<property name="value"> </item>
<number>50</number> <item>
</property> <widget class="QSlider" name="volumeSlider">
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>101</number>
</property>
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksAbove</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="tickPosition"> <property name="sizeHint" stdset="0">
<enum>QSlider::TicksAbove</enum> <size>
<width>40</width>
<height>20</height>
</size>
</property> </property>
</widget> </spacer>
</item>
<item>
<widget class="QLabel" name="volumeLabel">
<property name="text">
<string>50</string>
</property>
</widget>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="hLayoutSongDetails"> <layout class="QHBoxLayout" name="hLayoutSongDetails">
<item> <item>
<widget class="QLabel" name="artistLabel"> <widget class="QLabel" name="artistLabel"/>
<property name="font">
<font>
<pointsize>24</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="titleLabel"> <widget class="QLabel" name="titleLabel"/>
<property name="font">
<font>
<pointsize>18</pointsize>
</font>
</property>
</widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="albumLabel"> <widget class="QLabel" name="albumLabel"/>
<property name="font">
<font>
<pointsize>16</pointsize>
<weight>50</weight>
<italic>true</italic>
<bold>false</bold>
</font>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>

View File

@ -7,6 +7,7 @@ from pydub import AudioSegment
import numpy as np import numpy as np
from scipy.ndimage.filters import gaussian_filter1d from scipy.ndimage.filters import gaussian_filter1d
from logging import debug, info from logging import debug, info
from PyQt5.QtMultimedia import QMediaPlayer
class FFTAnalyser(QtCore.QThread): class FFTAnalyser(QtCore.QThread):
@ -117,8 +118,8 @@ class FFTAnalyser(QtCore.QThread):
for n, amp in enumerate(point_samples): for n, amp in enumerate(point_samples):
# amp *= 2 # amp *= 2
if self.player.state() in ( if self.player.state() in (
self.player.PausedState, QMediaPlayer.State.PausedState,
self.player.StoppedState, QMediaPlayer.State.StoppedState
): ):
# More aggressive decay when no audio is playing # More aggressive decay when no audio is playing
self.points[n] *= 0.7 # Faster fade out when paused/stopped self.points[n] *= 0.7 # Faster fade out when paused/stopped