From 8e52afe57dded4f969435f46b19a48ca22252b79 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Wed, 9 Jul 2025 12:29:26 -0700 Subject: [PATCH] fix --- logs/app.log | 43 +++++++ ui/__pycache__/sidebar.cpython-312.pyc | Bin 13611 -> 15440 bytes .../__pycache__/downloads.cpython-312.pyc | Bin 18608 -> 22125 bytes ui/pages/__pycache__/sync.cpython-312.pyc | Bin 18912 -> 18520 bytes ui/pages/downloads.py | 110 +++++++++++++++-- ui/pages/sync.py | 6 - ui/sidebar.py | 116 +++++++++++++----- 7 files changed, 228 insertions(+), 47 deletions(-) diff --git a/logs/app.log b/logs/app.log index 4be0660c..d1df26ad 100644 --- a/logs/app.log +++ b/logs/app.log @@ -61,3 +61,46 @@ 2025-07-09 12:06:29 - newmusic.main - INFO - change_page:139 - Changed to page: downloads 2025-07-09 12:06:30 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard 2025-07-09 12:06:56 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:11:30 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:11:33 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 12:11:38 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:11:40 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 12:11:44 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:11:48 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:11:49 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 12:12:47 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:15:18 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:16:35 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:20:05 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 12:25:43 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 12:25:43 - newmusic.main - INFO - main:173 - Starting NewMusic application +2025-07-09 12:25:43 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 12:25:43 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 12:25:43 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 12:25:43 - newmusic.soulseek_client - INFO - _setup_client:88 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 12:25:44 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 12:25:50 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:25:51 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:25:52 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:25:52 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:25:54 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:25:54 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:25:55 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:25:55 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 12:26:03 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:26:06 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:26:09 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:26:56 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:26:56 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:27:16 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:27:16 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 12:28:06 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:28:07 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:28:08 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 12:28:09 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:28:09 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:28:40 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 12:28:42 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:28:42 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 12:28:43 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 12:28:44 - newmusic.main - INFO - change_page:139 - Changed to page: settings diff --git a/ui/__pycache__/sidebar.cpython-312.pyc b/ui/__pycache__/sidebar.cpython-312.pyc index 5e4f3d82f115db80b7d76048af74f14e01db8ea4..b90eedaba3af8855e26a914a6e69d7689012c5d5 100644 GIT binary patch delta 2832 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 delta 1383 zcmai!O>7%Q6vubgS$pHnI*wwTIBDWdNvOBB>X0^RKrM;QrXiszN!x@dlvtbWCb8If z)mf)aOd&;lw1@Ihy#psc4#0tM0IfKI#DNPE2fiv5`NY)-L>1Jk2PBxcn}Ad`Vh%sg z%p1>}`Tytb@1KxQuan5PvK;1Ed*{p2O502rhN`?`>V`=RmcC)HmFbv! zrRQmWa}wiIh|`ERL_1;{F~i^xhGCk-@$4?Xz(9oI?kn7Fo)=p0h$BQeK$YDEi>&i+ z3+(j%#M@lq-sVhhju_k=Z;&9&r}l@ha_eMHJj1CWcsJz)=h!m(46Jt~VL)vr=iG61 zp4a-=Y%PI6m1=k_Rl1*4Re6z`df6=aH}rdqGr z7fY6{8xHkM^i<2h2iYT&hx{~ng?k;@(+tl(bVL<=12*vA=mH&sRPTfA-JI;b6_PL) zy^P4Xql1?M&la%nWo)AVW%TS1VaVIqdlGx*7IEDG!g~_lwMTHMfpRQHPC);$AA=Xz zM5PC&dLMwh>8RUx{3g%W1zc(PJb_z(;}lu_EKz$^ zVegnKla{%zSj7dZ(+x#08H#>EFIxHnE3YM+D#nhnG>v=jNb70oY4ksZwuyhbr_wxu zAH{$tu&*r}sv+O&H!$RRy^OsvhH7;87zN$33Jc{@wPEKbg|fL`cJM%o-~2+m$R;Xj z4NmvQAfAbbK4&UBX9;A---Ex#ABTx26Jl%U_npf>wXDG3i4=65jBoC{AwKl87`Z7X zeh?Ek#P(kr<5weoNw%{6)OxySwXd-_#aBTw^Zkq8#t0&Whr#c`Zt-u6Ng=!4nkUUd weEZ;eBDCCD3LF+%{MgL6*63{xf4znO0IC-&82|tP diff --git a/ui/pages/__pycache__/sync.cpython-312.pyc b/ui/pages/__pycache__/sync.cpython-312.pyc index 7c2d5e381017bd2b256d3873b303db0d22ef27da..aecfe7a5cb194e4e794483d0031283b6099c0b66 100644 GIT binary patch delta 380 zcmaDbneoO1M!wU$yj%=Gu>3$?M!V%kzAK_kTbL)`VOHDBB__f=IYdf)@_QBT$$um* z8Pz8{Y6(w1ugc9*$)G8)xlf9fl}S@%@?KZH$q(ftCWk2$GIno1p%BM7Iaf)S`6`FT zMLp-O0(AH~Ef#tEBexSe4%2H94W z2O{!8L;;8h1`#1ZqL>j#I20*?_~|g>;ND_SzS-qTURhmlcpLfIDv5d9^F$&-aqqoe#Q1BeFe0sx2!ZwLSY delta 576 zcmcaHf$_m)M!wU$yj%=GaCui=#xkpod{;!7ma$B}!>l&>f>OffEU_(2DkZ`o1t5?j zu$mFVs$qzSi`Fn?sZDOQ7oO}WuEYpom5U2c4wDpP%F>*?QAld?4Gx9L*Ep1bLduNV zlMgz`PkziH$^zE6QAl{QJ}dj=dPi19!Oe3dSy>gTWI_v45=&AQa#KqZfs90jw4(f6 zh2VnxlFYP9O|i+QE_#zM%0s5>K8fGR{+Iyk;Jqva%inExvuSSQQP6V zw)aJC@5|c0S2+A8|5VTwzrvw$gM;rnhr~q=i5Vi-C3P=K>R#p0o2;oA&h5*{s$ZlG z456a1$#X;`CofTaz<6SFt5Ov+ ze(54UIm?)ziHUJ@wefBi#-_;*daaxHSXePK)^7f8xs#Exb@E2*1jfS2LN+RFLBN;`n5KcN50U$u92Gf#e-`DaK`!zq>ms1Tiw|PbmAs0HVKSFnO{tYIKx;WdPA& GF9HAp*0Wat diff --git a/ui/pages/downloads.py b/ui/pages/downloads.py index 26f0e876..0ff5cfd3 100644 --- a/ui/pages/downloads.py +++ b/ui/pages/downloads.py @@ -436,7 +436,7 @@ class DownloadsPage(QWidget): def create_missing_tracks_section(self): section = QFrame() - section.setFixedHeight(200) + section.setFixedHeight(250) section.setStyleSheet(""" QFrame { background: #282828; @@ -456,6 +456,10 @@ class DownloadsPage(QWidget): title_label.setFont(QFont("Arial", 16, QFont.Weight.Bold)) title_label.setStyleSheet("color: #ffffff;") + count_label = QLabel("23 tracks") + count_label.setFont(QFont("Arial", 11)) + count_label.setStyleSheet("color: #b3b3b3;") + download_all_btn = QPushButton("📥 Download All") download_all_btn.setFixedSize(120, 35) download_all_btn.setStyleSheet(""" @@ -473,16 +477,108 @@ class DownloadsPage(QWidget): """) header_layout.addWidget(title_label) + header_layout.addWidget(count_label) header_layout.addStretch() header_layout.addWidget(download_all_btn) - # Missing tracks list (simplified) - missing_text = QLabel("23 tracks are missing from your Plex library and available for download") - missing_text.setFont(QFont("Arial", 12)) - missing_text.setStyleSheet("color: #b3b3b3;") + # Missing tracks scroll area + missing_scroll = QScrollArea() + missing_scroll.setWidgetResizable(True) + missing_scroll.setStyleSheet(""" + QScrollArea { + border: none; + background: transparent; + } + QScrollBar:vertical { + background: #404040; + width: 6px; + border-radius: 3px; + } + QScrollBar::handle:vertical { + background: #1db954; + border-radius: 3px; + } + """) + + missing_widget = QWidget() + missing_layout = QVBoxLayout(missing_widget) + missing_layout.setSpacing(8) + missing_layout.setContentsMargins(0, 0, 0, 0) + + # Sample missing tracks with playlist info + missing_tracks = [ + ("Song Title 1", "Artist Name 1", "Liked Songs"), + ("Another Track", "Different Artist", "Road Trip Mix"), + ("Cool Song", "Band Name", "Workout Playlist"), + ("Missing Hit", "Popular Artist", "Discover Weekly"), + ("Rare Track", "Indie Artist", "Chill Vibes") + ] + + for track_title, artist, playlist in missing_tracks: + track_item = self.create_missing_track_item(track_title, artist, playlist) + missing_layout.addWidget(track_item) + + missing_layout.addStretch() + missing_scroll.setWidget(missing_widget) layout.addLayout(header_layout) - layout.addWidget(missing_text) + layout.addWidget(missing_scroll) + + return section + + def create_missing_track_item(self, track_title: str, artist: str, playlist: str): + item = QFrame() + item.setFixedHeight(45) + item.setStyleSheet(""" + QFrame { + background: #333333; + border-radius: 6px; + border: 1px solid #404040; + } + QFrame:hover { + background: #3a3a3a; + border: 1px solid #1db954; + } + """) + + layout = QHBoxLayout(item) + layout.setContentsMargins(12, 8, 12, 8) + layout.setSpacing(10) + + # Track info + info_layout = QVBoxLayout() + info_layout.setSpacing(2) + + track_label = QLabel(f"{track_title} - {artist}") + track_label.setFont(QFont("Arial", 10, QFont.Weight.Medium)) + track_label.setStyleSheet("color: #ffffff;") + + playlist_label = QLabel(f"from: {playlist}") + playlist_label.setFont(QFont("Arial", 9)) + playlist_label.setStyleSheet("color: #1db954;") + + info_layout.addWidget(track_label) + info_layout.addWidget(playlist_label) + + # Download button + download_btn = QPushButton("📥") + download_btn.setFixedSize(30, 30) + download_btn.setStyleSheet(""" + QPushButton { + background: rgba(29, 185, 84, 0.2); + border: 1px solid #1db954; + border-radius: 15px; + color: #1db954; + font-size: 12px; + } + QPushButton:hover { + background: #1db954; + color: #000000; + } + """) + + layout.addLayout(info_layout) layout.addStretch() + layout.addWidget(download_btn) - return section \ No newline at end of file + return item \ No newline at end of file diff --git a/ui/pages/sync.py b/ui/pages/sync.py index 26dec7de..380c5c53 100644 --- a/ui/pages/sync.py +++ b/ui/pages/sync.py @@ -186,15 +186,9 @@ class SyncOptionsPanel(QFrame): quality_layout.addWidget(self.quality_combo) quality_layout.addStretch() - # Update metadata option - self.update_metadata = QCheckBox("Update metadata from Spotify") - self.update_metadata.setChecked(True) - self.update_metadata.setStyleSheet(self.download_missing.styleSheet()) - layout.addWidget(title_label) layout.addWidget(self.download_missing) layout.addLayout(quality_layout) - layout.addWidget(self.update_metadata) class SyncPage(QWidget): def __init__(self, parent=None): diff --git a/ui/sidebar.py b/ui/sidebar.py index c45bbff1..9cc8e876 100644 --- a/ui/sidebar.py +++ b/ui/sidebar.py @@ -52,14 +52,15 @@ class SidebarButton(QPushButton): if self.is_active: self.setStyleSheet(""" SidebarButton { - background: rgba(29, 185, 84, 0.2); - border-left: 3px solid #1db954; - border-radius: 0px; + background: rgba(29, 185, 84, 0.15); + border-left: 4px solid #1db954; + border-radius: 12px; text-align: left; padding: 0px; } SidebarButton:hover { - background: rgba(29, 185, 84, 0.3); + background: rgba(29, 185, 84, 0.25); + transform: scale(1.02); } """) self.text_label.setStyleSheet("color: #1db954; font-weight: bold;") @@ -68,8 +69,8 @@ class SidebarButton(QPushButton): color: #1db954; font-size: 16px; font-weight: bold; - border-radius: 12px; - background: rgba(29, 185, 84, 0.2); + border-radius: 14px; + background: rgba(29, 185, 84, 0.25); } """) else: @@ -77,12 +78,13 @@ class SidebarButton(QPushButton): SidebarButton { background: transparent; border: none; - border-radius: 0px; + border-radius: 12px; text-align: left; padding: 0px; } SidebarButton:hover { - background: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.08); + border-left: 2px solid rgba(255, 255, 255, 0.3); } """) self.text_label.setStyleSheet("color: #b3b3b3;") @@ -91,8 +93,8 @@ class SidebarButton(QPushButton): color: #b3b3b3; font-size: 16px; font-weight: bold; - border-radius: 12px; - background: rgba(255, 255, 255, 0.1); + border-radius: 14px; + background: rgba(255, 255, 255, 0.08); } """) @@ -104,18 +106,27 @@ class StatusIndicator(QWidget): self.setup_ui() def setup_ui(self): + self.setFixedHeight(35) # Ensure enough height layout = QHBoxLayout(self) - layout.setContentsMargins(15, 5, 15, 5) - layout.setSpacing(10) + layout.setContentsMargins(15, 8, 15, 8) + layout.setSpacing(12) - # Status dot + # Status dot with rounded background self.status_dot = QLabel("●") - self.status_dot.setFixedSize(12, 12) + self.status_dot.setFixedSize(16, 16) self.status_dot.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.status_dot.setStyleSheet(""" + QLabel { + border-radius: 8px; + font-size: 12px; + font-weight: bold; + } + """) # Service name self.service_label = QLabel(self.service_name) - self.service_label.setFont(QFont("Arial", 9)) + self.service_label.setFont(QFont("Arial", 10, QFont.Weight.Medium)) + self.service_label.setMinimumWidth(80) # Ensure text doesn't get cut off layout.addWidget(self.status_dot) layout.addWidget(self.service_label) @@ -126,11 +137,27 @@ class StatusIndicator(QWidget): def update_status(self, connected: bool): self.is_connected = connected if connected: - self.status_dot.setStyleSheet("color: #1db954;") - self.service_label.setStyleSheet("color: #ffffff;") + self.status_dot.setStyleSheet(""" + QLabel { + color: #1db954; + background: rgba(29, 185, 84, 0.15); + border-radius: 8px; + font-size: 12px; + font-weight: bold; + } + """) + self.service_label.setStyleSheet("color: #ffffff; font-weight: 500;") else: - self.status_dot.setStyleSheet("color: #e22134;") - self.service_label.setStyleSheet("color: #b3b3b3;") + self.status_dot.setStyleSheet(""" + QLabel { + color: #e22134; + background: rgba(226, 33, 52, 0.15); + border-radius: 8px; + font-size: 12px; + font-weight: bold; + } + """) + self.service_label.setStyleSheet("color: #b3b3b3; font-weight: 400;") class ModernSidebar(QWidget): page_changed = pyqtSignal(str) @@ -171,21 +198,29 @@ class ModernSidebar(QWidget): def create_header(self): header = QWidget() - header.setFixedHeight(80) - header.setStyleSheet("background: #121212; border-bottom: 1px solid #282828;") + header.setFixedHeight(85) + header.setStyleSheet(""" + QWidget { + background: #121212; + border-bottom: 1px solid #282828; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + } + """) layout = QVBoxLayout(header) - layout.setContentsMargins(20, 20, 20, 20) + layout.setContentsMargins(20, 22, 20, 22) + layout.setSpacing(3) # App name app_name = QLabel("NewMusic") - app_name.setFont(QFont("Arial", 18, QFont.Weight.Bold)) - app_name.setStyleSheet("color: #ffffff;") + app_name.setFont(QFont("Arial", 19, QFont.Weight.Bold)) + app_name.setStyleSheet("color: #ffffff; letter-spacing: -0.5px;") # Subtitle subtitle = QLabel("Music Sync & Manager") - subtitle.setFont(QFont("Arial", 9)) - subtitle.setStyleSheet("color: #b3b3b3;") + subtitle.setFont(QFont("Arial", 10)) + subtitle.setStyleSheet("color: #b3b3b3; opacity: 0.8;") layout.addWidget(app_name) layout.addWidget(subtitle) @@ -194,9 +229,15 @@ class ModernSidebar(QWidget): def create_navigation(self): nav_widget = QWidget() + nav_widget.setStyleSheet(""" + QWidget { + background: #121212; + border-radius: 8px; + } + """) layout = QVBoxLayout(nav_widget) - layout.setContentsMargins(0, 20, 0, 20) - layout.setSpacing(5) + layout.setContentsMargins(8, 20, 8, 20) + layout.setSpacing(6) # Navigation buttons nav_items = [ @@ -220,17 +261,24 @@ class ModernSidebar(QWidget): def create_status_section(self): status_widget = QWidget() - status_widget.setFixedHeight(120) - status_widget.setStyleSheet("background: #181818; border-top: 1px solid #282828;") + status_widget.setFixedHeight(140) # Increased height + status_widget.setStyleSheet(""" + QWidget { + background: #181818; + border-top: 1px solid #282828; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + } + """) layout = QVBoxLayout(status_widget) - layout.setContentsMargins(0, 15, 0, 15) - layout.setSpacing(8) + layout.setContentsMargins(0, 18, 0, 18) # Better margins + layout.setSpacing(6) # Tighter spacing between items # Status title status_title = QLabel("Connection Status") - status_title.setFont(QFont("Arial", 10, QFont.Weight.Bold)) - status_title.setStyleSheet("color: #ffffff; padding: 0 15px;") + status_title.setFont(QFont("Arial", 11, QFont.Weight.Bold)) + status_title.setStyleSheet("color: #ffffff; padding: 0 15px; margin-bottom: 5px;") layout.addWidget(status_title) # Status indicators