From 7bfb38e16cf005431f85ef8b8aa38ffe1c3f81f1 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Fri, 25 Jul 2025 09:38:06 -0700 Subject: [PATCH] better --- logs/app.log | 176 ++++++++++++++++++++++ ui/pages/__pycache__/sync.cpython-312.pyc | Bin 215330 -> 220521 bytes ui/pages/sync.py | 126 ++++++++++++++-- 3 files changed, 293 insertions(+), 9 deletions(-) diff --git a/logs/app.log b/logs/app.log index 00c6e631..e7ff6c13 100644 --- a/logs/app.log +++ b/logs/app.log @@ -19415,3 +19415,179 @@ 2025-07-25 09:31:36 - newmusic.main - INFO - change_page:163 - Changed to page: sync 2025-07-25 09:31:36 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas 2025-07-25 09:31:36 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:36:37 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 09:36:37 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 09:36:37 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 09:36:37 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 09:36:37 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 09:36:43 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 09:36:43 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 09:36:43 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:36:43 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 09:36:43 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:36:43 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 09:36:43 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 09:36:44 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 09:36:44 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 09:37:00 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 09:37:00 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 09:37:00 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:37:08 - newmusic.sync_service - INFO - sync_playlist:94 - Starting sync for playlist: Failed test +2025-07-25 09:37:08 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:08 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:08 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage signalsfromspace' +2025-07-25 09:37:08 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signalsfromspace' +2025-07-25 09:37:09 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:09 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:09 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage signals from space' +2025-07-25 09:37:10 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signals from space' +2025-07-25 09:37:11 - newmusic.sync_service - DEBUG - _find_track_in_plex:272 - No artist-based matches found. Using title-only fallback for 'Signals from Space' +2025-07-25 09:37:11 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'signalsfromspace' +2025-07-25 09:37:11 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signalsfromspace' +2025-07-25 09:37:12 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'signals from space' +2025-07-25 09:37:13 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signals from space' +2025-07-25 09:37:13 - newmusic.sync_service - DEBUG - _find_track_in_plex:290 - No Plex candidates found for 'Signals from Space' +2025-07-25 09:37:13 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:13 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:13 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage zztlyksyrnqryss' +2025-07-25 09:37:14 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'zztlyksyrnqryss' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 09:37:15 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Zztlyk Syrn Qryss' (ratingKey: 539056) +2025-07-25 09:37:15 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Zztlyk Syrn Qryss' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 09:37:15 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Jyxkra' (ratingKey: 539057) +2025-07-25 09:37:15 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Jyxkra' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage ktalvysh' +2025-07-25 09:37:15 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'ktalvysh' +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 09:37:16 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Ktal Vysh' (ratingKey: 539058) +2025-07-25 09:37:16 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Ktal Vysh' +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 09:37:16 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Fluxx' (ratingKey: 539059) +2025-07-25 09:37:16 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Fluxx' +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:16 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage vwrntlyx' +2025-07-25 09:37:17 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'vwrntlyx' +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 09:37:18 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Vwrn Tlyx' (ratingKey: 539060) +2025-07-25 09:37:18 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Vwrn Tlyx' +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'kendrick lamar' +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'kendrick lamar superbowllixhalftimeshowlive' +2025-07-25 09:37:18 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 09:37:19 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'kendrick lamar' +2025-07-25 09:37:19 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:19 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'kendrick lamar super bowl lix halftime show' +2025-07-25 09:37:20 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'super bowl lix halftime show' +2025-07-25 09:37:21 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'nfl' +2025-07-25 09:37:21 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'nfl superbowllixhalftimeshowlive' +2025-07-25 09:37:21 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 09:37:22 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'nfl' +2025-07-25 09:37:22 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'nfl super bowl lix halftime show' +2025-07-25 09:37:23 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'super bowl lix halftime show' +2025-07-25 09:37:23 - newmusic.sync_service - DEBUG - _find_track_in_plex:272 - No artist-based matches found. Using title-only fallback for 'Super Bowl LIX Halftime Show - Live' +2025-07-25 09:37:23 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'superbowllixhalftimeshowlive' +2025-07-25 09:37:24 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 09:37:25 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'super bowl lix halftime show' +2025-07-25 09:37:25 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'super bowl lix halftime show' +2025-07-25 09:37:26 - newmusic.sync_service - DEBUG - _find_track_in_plex:290 - No Plex candidates found for 'Super Bowl LIX Halftime Show - Live' +2025-07-25 09:37:26 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 09:37:26 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:26 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno 1800' +2025-07-25 09:37:27 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for '1800' +2025-07-25 09:37:28 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1800 Satan' (ratingKey: 488568) +2025-07-25 09:37:28 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1800' (ratingKey: 195875) +2025-07-25 09:37:28 - newmusic.plex_client - INFO - search_tracks:390 - Found 2 total potential matches for '1800' by 'bbno' after all stages. +2025-07-25 09:37:28 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 09:37:28 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:28 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno 1-800' +2025-07-25 09:37:28 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for '1-800' +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-DIRTY' (ratingKey: 342942) +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800MYLOVE' (ratingKey: 446003) +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-273-8255' (ratingKey: 487383) +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-273-8255' (ratingKey: 487532) +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Captain Save a Hoe (feat. 1-800-lost)' (ratingKey: 330364) +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-SMD' (ratingKey: 330399) +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800 Nothing' (ratingKey: 327017) +2025-07-25 09:37:29 - newmusic.plex_client - INFO - search_tracks:390 - Found 7 total potential matches for '1-800' by 'bbno' after all stages. +2025-07-25 09:37:29 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for '1-800' +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:29 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno marypoppins' +2025-07-25 09:37:30 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'marypoppins' +2025-07-25 09:37:31 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 09:37:31 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:31 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno mary poppins' +2025-07-25 09:37:31 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'mary poppins' +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Mary Poppins' (ratingKey: 325667) +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Introducing Mary Poppins' (ratingKey: 143885) +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'A Cover Is Not the Book' (ratingKey: 143886) +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Nowhere to Go But Up' (ratingKey: 143892) +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Theme from Mary Poppins Returns' (ratingKey: 143894) +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Mary Poppins Arrives' (ratingKey: 143896) +2025-07-25 09:37:32 - newmusic.plex_client - INFO - search_tracks:390 - Found 6 total potential matches for 'mary poppins' by 'bbno' after all stages. +2025-07-25 09:37:32 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'mary poppins' +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:37:32 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno boom' +2025-07-25 09:37:33 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'boom' +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'BOOM' (ratingKey: 258903) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'BOOM (Rap remix)' (ratingKey: 258943) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Boom (Ricky Pedretti Remix)' (ratingKey: 285354) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Boom (Original Mix)' (ratingKey: 285339) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Here Comes The Boom (Original Mix)' (ratingKey: 285349) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'pop ur shit' (ratingKey: 291146) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'dangerous' (ratingKey: 291148) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'née-nah' (ratingKey: 291149) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'just like me' (ratingKey: 291153) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'pop ur shit (nightcore version)' (ratingKey: 291130) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'dangerous (nightcore version)' (ratingKey: 291132) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'née-nah (nightcore version)' (ratingKey: 291133) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'just like me (nightcore version)' (ratingKey: 291137) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'pop ur shit (slowed down)' (ratingKey: 291098) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'dangerous (slowed down)' (ratingKey: 291100) +2025-07-25 09:37:34 - newmusic.plex_client - INFO - search_tracks:390 - Found 15 total potential matches for 'boom' by 'bbno' after all stages. +2025-07-25 09:37:34 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'boom' +2025-07-25 09:37:34 - newmusic.sync_service - INFO - sync_playlist:141 - Found 8 matches out of 10 tracks +2025-07-25 09:37:34 - newmusic.sync_service - INFO - sync_playlist:173 - Creating playlist with 8 matched tracks +2025-07-25 09:37:34 - newmusic.plex_client - INFO - update_playlist:277 - Playlist 'Failed test' not found, creating new one +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: Zztlyk Syrn Qryss by Virtual Mage (ratingKey: 539056) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: Jyxkra by Virtual Mage (ratingKey: 539057) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: Ktal Vysh by Virtual Mage (ratingKey: 539058) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: Fluxx by Virtual Mage (ratingKey: 539059) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: Vwrn Tlyx by Virtual Mage (ratingKey: 539060) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: 1800 by Snoop Dogg (ratingKey: 195875) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: Mary Poppins by Elènne (ratingKey: 325667) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:198 - Using stored track reference for: BOOM by $ebu (ratingKey: 258903) +2025-07-25 09:37:34 - newmusic.plex_client - INFO - create_playlist:209 - Processed 8 input tracks, resulting in 8 valid Plex tracks for playlist 'Failed test' +2025-07-25 09:37:34 - newmusic.plex_client - INFO - create_playlist:214 - Final validation: 8 valid tracks with ratingKeys +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:218 - About to create playlist with tracks: +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 1: Zztlyk Syrn Qryss (type: , ratingKey: 539056) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 2: Jyxkra (type: , ratingKey: 539057) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 3: Ktal Vysh (type: , ratingKey: 539058) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 4: Fluxx (type: , ratingKey: 539059) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 5: Vwrn Tlyx (type: , ratingKey: 539060) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 6: 1800 (type: , ratingKey: 195875) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 7: Mary Poppins (type: , ratingKey: 325667) +2025-07-25 09:37:34 - newmusic.plex_client - DEBUG - create_playlist:220 - Track 8: BOOM (type: , ratingKey: 258903) +2025-07-25 09:37:34 - newmusic.plex_client - ERROR - create_playlist:227 - CreatePlaylist failed: Must include items to add when creating new playlist. +2025-07-25 09:37:34 - newmusic.plex_client - INFO - create_playlist:231 - Created playlist 'Failed test' with 8 tracks (using items parameter) +2025-07-25 09:37:34 - newmusic.sync_service - INFO - sync_playlist:196 - Sync completed: 80.0% success rate +2025-07-25 09:37:48 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 09:37:48 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 09:37:48 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 09:37:50 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 09:37:50 - newmusic.main - INFO - closeEvent:197 - Application closed successfully diff --git a/ui/pages/__pycache__/sync.cpython-312.pyc b/ui/pages/__pycache__/sync.cpython-312.pyc index 5f2486c466d0fd79746f6ac01ae8e33c1ade961e..91c4b8f602aac8833652f1a7837bc4ecd671942a 100644 GIT binary patch delta 9715 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 iFD9we=@WT tracks # Sync worker management - self.active_sync_workers = {} # playlist_id -> SyncWorker + self.active_sync_workers = {} # playlist_id -> SyncWorker (for individual modal syncs) + self.sequential_sync_worker = None # Current sequential sync worker # Selection tracking self.selected_playlists = set() # Set of selected playlist IDs @@ -2024,6 +2025,46 @@ class SyncPage(QWidget): return True + def start_sequential_playlist_sync(self, playlist): + """Start sync for a playlist as part of sequential sync (separate from individual syncs)""" + # Create sync service if not available + if not hasattr(self, 'sync_service'): + from services.sync_service import PlaylistSyncService + self.sync_service = PlaylistSyncService( + self.spotify_client, + self.plex_client, + self.soulseek_client + ) + + # Create sync worker for sequential sync + sync_worker = SyncWorker( + playlist=playlist, + sync_service=self.sync_service + ) + + # Connect worker signals for sequential sync + sync_worker.signals.finished.connect(lambda result: self.on_sequential_sync_finished(playlist.id, result)) + sync_worker.signals.error.connect(lambda error: self.on_sequential_sync_error(playlist.id, error)) + sync_worker.signals.progress.connect(lambda progress: self.on_sync_progress(playlist.id, progress)) + + # Store the sequential sync worker + self.sequential_sync_worker = sync_worker + + # Start the worker + self.thread_pool.start(sync_worker) + + # Update playlist item status + playlist_item = self.find_playlist_item_widget(playlist.id) + if playlist_item: + playlist_item.is_syncing = True + playlist_item.update_sync_status(len(playlist.tracks), 0, 0) + + # Log start + if hasattr(self, 'log_area'): + self.log_area.append(f"🔄 Starting sequential sync for playlist: {playlist.name}") + + return True + def toggle_playlist_selection(self, playlist_id): """Toggle selection state of a playlist""" if playlist_id in self.selected_playlists: @@ -2040,15 +2081,15 @@ class SyncPage(QWidget): """Update the selection info label and button state""" selected_count = len(self.selected_playlists) - print(f"Updating UI with {selected_count} selected playlists, sequential syncing: {self.is_sequential_syncing}") + print(f"Updating UI with {selected_count} selected playlists, sequential syncing: {self.is_sequential_syncing}, individual syncs: {len(self.active_sync_workers)}") if selected_count == 0: self.selection_info.setText("Select playlists to sync") self.start_sync_btn.setEnabled(False) print("Button disabled - no selection") - elif self.is_sequential_syncing: - # Don't change button state during sequential sync - print(f"Sequential sync in progress - keeping button as is") + elif self.has_active_operations(): + # Don't change button state during any active operations + print(f"Active operations in progress - keeping button as is") elif selected_count == 1: self.selection_info.setText("1 playlist selected") self.start_sync_btn.setEnabled(True) @@ -2063,6 +2104,11 @@ class SyncPage(QWidget): if not self.selected_playlists or self.is_sequential_syncing: return + # Don't allow sequential sync if individual syncs are already running + if self.active_sync_workers: + print(f"DEBUG: Cannot start sequential sync - {len(self.active_sync_workers)} individual syncs are running") + return + # Get selected playlist objects selected_playlist_objects = [] for playlist_item in self.get_all_playlist_items(): @@ -2098,9 +2144,9 @@ class SyncPage(QWidget): next_playlist = self.sequential_sync_queue.pop(0) print(f"DEBUG: Starting sync for next playlist: {next_playlist.name}") - # Start sync for this playlist - success = self.start_playlist_sync(next_playlist) - print(f"DEBUG: start_playlist_sync returned: {success}") + # Start sync for this playlist using dedicated sequential sync method + success = self.start_sequential_playlist_sync(next_playlist) + print(f"DEBUG: start_sequential_playlist_sync returned: {success}") if not success: # If sync failed to start, move to next print("DEBUG: Sync failed to start, moving to next playlist") @@ -2117,6 +2163,68 @@ class SyncPage(QWidget): # Update refresh button state since sequential sync is complete self.update_refresh_button_state() + def on_sequential_sync_finished(self, playlist_id, result): + """Handle completion of individual playlist in sequential sync""" + print(f"DEBUG: Sequential sync finished for playlist {playlist_id}") + + # Clear sequential sync worker + self.sequential_sync_worker = None + + # Update playlist item status + playlist_item = self.find_playlist_item_widget(playlist_id) + if playlist_item: + playlist_item.is_syncing = False + playlist_item.update_sync_status( + result.total_tracks, + result.matched_tracks, + result.failed_tracks + ) + + # Hide status widget after completion with delay + QTimer.singleShot(3000, lambda: playlist_item.sync_status_widget.hide() if playlist_item.sync_status_widget else None) + + # Update any open modals + self.update_open_modals_completion(playlist_id, result) + + # Continue sequential sync to next playlist + if self.is_sequential_syncing: + print(f"DEBUG: Sequential sync continuing to next playlist") + self.process_next_in_sync_queue() + + # Log completion + if hasattr(self, 'log_area'): + success_rate = result.success_rate + msg = f"✅ Sequential sync complete: {result.synced_tracks}/{result.total_tracks} tracks synced ({success_rate:.1f}%)" + if result.failed_tracks > 0: + msg += f", {result.failed_tracks} failed" + self.log_area.append(msg) + + def on_sequential_sync_error(self, playlist_id, error_msg): + """Handle error in individual playlist during sequential sync""" + print(f"DEBUG: Sequential sync error for playlist {playlist_id}: {error_msg}") + + # Clear sequential sync worker + self.sequential_sync_worker = None + + # Update playlist item status + playlist_item = self.find_playlist_item_widget(playlist_id) + if playlist_item: + playlist_item.is_syncing = False + if playlist_item.sync_status_widget: + playlist_item.sync_status_widget.hide() + + # Update any open modals + self.update_open_modals_error(playlist_id, error_msg) + + # Continue sequential sync even on error + if self.is_sequential_syncing: + print(f"DEBUG: Sequential sync continuing to next playlist despite error") + self.process_next_in_sync_queue() + + # Log error + if hasattr(self, 'log_area'): + self.log_area.append(f"⌠Sequential sync failed: {error_msg}") + def get_all_playlist_items(self): """Get all PlaylistItem widgets from the playlist layout""" playlist_items = [] @@ -2815,7 +2923,7 @@ class SyncPage(QWidget): """Check if any sync or download operations are currently active""" has_downloads = bool(self.active_download_processes) has_individual_syncs = bool(self.active_sync_workers) - has_sequential_sync = self.is_sequential_syncing + has_sequential_sync = self.is_sequential_syncing or self.sequential_sync_worker is not None print(f"DEBUG: Active operations check - downloads: {has_downloads}, individual syncs: {has_individual_syncs}, sequential: {has_sequential_sync}") return has_downloads or has_individual_syncs or has_sequential_sync