ui font editing, artist album title selectable
This commit is contained in:
parent
e78fb918b5
commit
8684db497f
@ -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
44
main.py
@ -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
33
ui.py
@ -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
88
ui.ui
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user