From d3ba4acdd758435324da4ca34d802892f57037f7 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Fri, 25 Jul 2025 09:07:05 -0700 Subject: [PATCH] good --- .spotify_cache | 2 +- logs/app.log | 638 ++++++++++++++++++++++ ui/pages/__pycache__/sync.cpython-312.pyc | Bin 201112 -> 212972 bytes ui/pages/sync.py | 289 +++++++++- 4 files changed, 898 insertions(+), 31 deletions(-) diff --git a/.spotify_cache b/.spotify_cache index 15edef04..f9447a57 100644 --- a/.spotify_cache +++ b/.spotify_cache @@ -1 +1 @@ -{"access_token": "BQDUg0cc7kwTub-qY1g6esi2lcHiuSUyhQtO83vQdapwxf1rBRwIfzP9TU52BRgoWNh3xm9Cg2gpcBS6Eu4yfJcOORnvkzNg1D6gzzwXuTYgHrVyBom2x2YTi3UqvGhtv646AKLZ-xiXmQ_iZKbr16seeY6dG9yrPhnc8DXTUSzEl-GPTq1hzjsWGAgZNZDrncc3fKtJkfWXTWgZyPEMEfZnfqrKXaK8QQbeySEM-lLNx7gFvbsmbi4oNPtFXzlY", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1753458834, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file +{"access_token": "BQBvbg3WwYrukruP6c8SrF_hNNq8RpE81IiDnj1pJB6smBlF5SVT7VO4Zd2jdurQtwk41A-6U8fBORnLO4_hfxYkMBfxnL4ifzsO9gQfvQLUR585hq4iL03Nrh30LhO8h9wnhWwSWDNPd9W-RakrqdfY8p23ZDMNAaGqGp0ZsvbkiKIDBMMP9Y91tye7QSSJxYRSlBr64yiJoWu2Ybwe-OA_xD9OqxZxSpTNgEKNyOuozqQ-TUWJNPSe7n_cSrPs", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1753462488, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file diff --git a/logs/app.log b/logs/app.log index 4327596d..eec3f29a 100644 --- a/logs/app.log +++ b/logs/app.log @@ -15537,3 +15537,641 @@ 2025-07-25 08:36:18 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... 2025-07-25 08:36:18 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 2025-07-25 08:36:18 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:19 - newmusic.soulseek_client - INFO - search:597 - Found 11 new responses (11 total) at 15.0s +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:345 - Processing 11 user responses +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User macro has 3 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User mon5termatt-dc has 2 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User Kyusetzu has 2 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User wargawrg has 3 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User s4mi has 3 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User TheHellaFella has 1 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User theoddhermit has 2 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User diamondcreeper has 1 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User soulshookt has 2 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User DJ's Private Club has 4 files +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:353 - User pixelmelt has 3 files +2025-07-25 08:36:19 - newmusic.soulseek_client - INFO - _process_search_responses:399 - Found 13 individual tracks and 1 albums +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:400 - Album detection details: 14 potential albums processed +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:402 - Album: macro/tidal rips/Albums/bbno$/1-800 (Explicit) -> 1 tracks +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:402 - Album: mon5termatt-dc/music/bbno$/2025 - 1-800 -> 1 tracks +2025-07-25 08:36:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:402 - Album: Kyusetzu/Music/Albums/bbno$ - 1-800 (Explicit) [2025] -> 1 tracks +2025-07-25 08:36:19 - newmusic.soulseek_client - INFO - search:617 - Processed results: 13 tracks, 1 albums +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:21 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:23 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:24 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-25 08:36:24 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:24 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:24 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-25 08:36:24 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:24 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:25 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:26 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:27 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:27 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:27 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:28 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:30 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:31 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-25 08:36:31 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:31 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:31 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-25 08:36:31 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:31 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:32 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:33 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:34 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:34 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"fileCount":3,"files":[{"bitDepth":16,"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).flac","length":209,"sampleRate":44100,"size":28351518,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\01. bbno$, Ironmouse - 1-800 (Explicit).lrc","size":3720,"isLocked":false},{"code":1,"extension":"","filename":"tidal rips\\Albums\\bbno$\\1-800 (Explicit)\\cover.jpg","size":742759,"is... +2025-07-25 08:36:34 - newmusic.soulseek_client - DEBUG - search:624 - No new responses, total still: 11 +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/001af632-70fa-49c1-9c2b-911b88550105/responses +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/1f53c469-d16f-4d47-987a-0d04ee1ac5b7/responses +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - search:585 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches/bf3c3a96-0979-4bcb-b5ad-0776df3493aa/responses +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-25 08:36:35 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: []... +2025-07-25 08:36:35 - newmusic.soulseek_client - INFO - search:632 - Search completed. Final results: 0 tracks and 0 albums for query: Kendrick Lamar Super Bowl LIX Halftime Show - Live +2025-07-25 08:38:11 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:38:11 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:38:11 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:38:11 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:38:11 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:38:12 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:38:12 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:38:12 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:38:12 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:38:15 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:38:15 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:38:15 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:45:28 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:45:28 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:45:28 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:45:28 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:45:28 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:45:31 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:45:31 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:45:31 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:45:31 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:45:31 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:45:32 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:45:32 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:45:32 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:45:32 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:45:37 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:45:38 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:45:38 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:45:50 - newmusic.sync_service - INFO - sync_playlist:94 - Starting sync for playlist: Failed test +2025-07-25 08:45:50 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:50 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:45:50 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage signalsfromspace' +2025-07-25 08:45:51 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signalsfromspace' +2025-07-25 08:45:52 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:52 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:45:52 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage signals from space' +2025-07-25 08:45:52 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signals from space' +2025-07-25 08:45:53 - 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 08:45:53 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'signalsfromspace' +2025-07-25 08:45:54 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signalsfromspace' +2025-07-25 08:45:54 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'signals from space' +2025-07-25 08:45:55 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signals from space' +2025-07-25 08:45:56 - newmusic.sync_service - DEBUG - _find_track_in_plex:290 - No Plex candidates found for 'Signals from Space' +2025-07-25 08:45:56 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:56 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:45:56 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage zztlyksyrnqryss' +2025-07-25 08:45:56 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'zztlyksyrnqryss' +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:45:57 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Zztlyk Syrn Qryss' (ratingKey: 539056) +2025-07-25 08:45:57 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Zztlyk Syrn Qryss' +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:45:57 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Jyxkra' (ratingKey: 539057) +2025-07-25 08:45:57 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Jyxkra' +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:45:57 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage ktalvysh' +2025-07-25 08:45:58 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'ktalvysh' +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:45:59 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Ktal Vysh' (ratingKey: 539058) +2025-07-25 08:45:59 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Ktal Vysh' +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:45:59 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Fluxx' (ratingKey: 539059) +2025-07-25 08:45:59 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Fluxx' +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:45:59 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage vwrntlyx' +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'vwrntlyx' +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:46:00 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Vwrn Tlyx' (ratingKey: 539060) +2025-07-25 08:46:00 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Vwrn Tlyx' +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'kendrick lamar' +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:46:00 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'kendrick lamar superbowllixhalftimeshowlive' +2025-07-25 08:46:01 - newmusic.sync_service - INFO - cancel_sync:57 - PlaylistSyncService.cancel_sync() called - setting cancellation flag +2025-07-25 08:46:01 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 08:46:02 - newmusic.sync_service - DEBUG - _find_track_in_plex:251 - Sync cancelled after search for 'Super Bowl LIX Halftime Show - Live' +2025-07-25 08:47:30 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:47:30 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:47:30 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:47:32 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:47:32 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:47:34 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:47:34 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:47:34 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:47:34 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:47:34 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:47:35 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:47:35 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:47:35 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:47:35 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:47:36 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:47:36 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:47:36 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:48:48 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:48:48 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:48:48 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:48:50 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:48:50 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:48:52 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:48:52 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:48:52 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:48:52 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:48:53 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:48:53 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:48:53 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:48:53 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:48:53 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:48:54 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:48:54 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:48:55 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:49:59 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:49:59 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:49:59 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:50:00 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:50:00 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:50:28 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:50:28 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:50:28 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:50:28 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:50:28 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:50:29 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:50:29 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:50:29 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:50:29 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:50:30 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:50:30 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:50:30 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:50:32 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:50:32 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:50:34 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:50:34 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:50:34 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:50:34 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:50:34 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:50:35 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:50:35 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:50:35 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:50:35 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:50:36 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:50:36 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:50:36 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:51:42 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:51:42 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:51:42 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:51:44 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:51:44 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:52:11 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:52:11 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:52:11 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:52:11 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:52:11 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:52:12 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:52:12 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:52:12 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:52:12 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:52:13 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:52:13 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:52:13 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:53:43 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 08:53:43 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 08:53:43 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 08:53:45 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 08:53:45 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 08:54:42 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 08:54:42 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 08:54:42 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:54:42 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 08:54:42 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 08:54:43 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 08:54:43 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 08:54:43 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 08:54:43 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 08:54:48 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 08:54:48 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 08:54:49 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:55:09 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 08:55:27 - newmusic.sync_service - INFO - sync_playlist:94 - Starting sync for playlist: Failed test +2025-07-25 08:55:27 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:27 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:27 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage signalsfromspace' +2025-07-25 08:55:27 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signalsfromspace' +2025-07-25 08:55:28 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:28 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:28 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage signals from space' +2025-07-25 08:55:29 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signals from space' +2025-07-25 08:55:29 - 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 08:55:29 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'signalsfromspace' +2025-07-25 08:55:30 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signalsfromspace' +2025-07-25 08:55:31 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'signals from space' +2025-07-25 08:55:31 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'signals from space' +2025-07-25 08:55:32 - newmusic.sync_service - DEBUG - _find_track_in_plex:290 - No Plex candidates found for 'Signals from Space' +2025-07-25 08:55:32 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:32 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:32 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage zztlyksyrnqryss' +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'zztlyksyrnqryss' +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:55:33 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Zztlyk Syrn Qryss' (ratingKey: 539056) +2025-07-25 08:55:33 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Zztlyk Syrn Qryss' +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:55:33 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Jyxkra' (ratingKey: 539057) +2025-07-25 08:55:33 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Jyxkra' +2025-07-25 08:55:33 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:34 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:34 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage ktalvysh' +2025-07-25 08:55:34 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'ktalvysh' +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:55:35 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Ktal Vysh' (ratingKey: 539058) +2025-07-25 08:55:35 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Ktal Vysh' +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:55:35 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Fluxx' (ratingKey: 539059) +2025-07-25 08:55:35 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Fluxx' +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:35 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'virtual mage vwrntlyx' +2025-07-25 08:55:36 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'vwrntlyx' +2025-07-25 08:55:36 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'virtual mage' +2025-07-25 08:55:36 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 1 candidates. +2025-07-25 08:55:36 - newmusic.plex_client - INFO - search_tracks:344 - Found 1 candidates in Stage 1. Exiting early. +2025-07-25 08:55:36 - newmusic.plex_client - DEBUG - search_tracks:350 - Stored original track reference for 'Vwrn Tlyx' (ratingKey: 539060) +2025-07-25 08:55:36 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'Vwrn Tlyx' +2025-07-25 08:55:36 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'kendrick lamar' +2025-07-25 08:55:37 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:37 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'kendrick lamar superbowllixhalftimeshowlive' +2025-07-25 08:55:37 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 08:55:38 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'kendrick lamar' +2025-07-25 08:55:38 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:38 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'kendrick lamar super bowl lix halftime show' +2025-07-25 08:55:39 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'super bowl lix halftime show' +2025-07-25 08:55:39 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'nfl' +2025-07-25 08:55:39 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'nfl superbowllixhalftimeshowlive' +2025-07-25 08:55:40 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 08:55:41 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'nfl' +2025-07-25 08:55:41 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'nfl super bowl lix halftime show' +2025-07-25 08:55:41 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'super bowl lix halftime show' +2025-07-25 08:55:42 - 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 08:55:42 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'superbowllixhalftimeshowlive' +2025-07-25 08:55:43 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'superbowllixhalftimeshowlive' +2025-07-25 08:55:43 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'super bowl lix halftime show' +2025-07-25 08:55:44 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'super bowl lix halftime show' +2025-07-25 08:55:45 - newmusic.sync_service - DEBUG - _find_track_in_plex:290 - No Plex candidates found for 'Super Bowl LIX Halftime Show - Live' +2025-07-25 08:55:45 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 08:55:45 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:45 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno 1800' +2025-07-25 08:55:46 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for '1800' +2025-07-25 08:55:47 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1800 Satan' (ratingKey: 488568) +2025-07-25 08:55:47 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1800' (ratingKey: 195875) +2025-07-25 08:55:47 - newmusic.plex_client - INFO - search_tracks:390 - Found 2 total potential matches for '1800' by 'bbno' after all stages. +2025-07-25 08:55:47 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 08:55:47 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:47 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno 1-800' +2025-07-25 08:55:47 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for '1-800' +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-DIRTY' (ratingKey: 342942) +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800MYLOVE' (ratingKey: 446003) +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-273-8255' (ratingKey: 487383) +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-273-8255' (ratingKey: 487532) +2025-07-25 08:55:48 - 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 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800-SMD' (ratingKey: 330399) +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for '1-800 Nothing' (ratingKey: 327017) +2025-07-25 08:55:48 - newmusic.plex_client - INFO - search_tracks:390 - Found 7 total potential matches for '1-800' by 'bbno' after all stages. +2025-07-25 08:55:48 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for '1-800' +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:48 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno marypoppins' +2025-07-25 08:55:49 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'marypoppins' +2025-07-25 08:55:50 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 08:55:50 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:50 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno mary poppins' +2025-07-25 08:55:51 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'mary poppins' +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Mary Poppins' (ratingKey: 325667) +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Introducing Mary Poppins' (ratingKey: 143885) +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'A Cover Is Not the Book' (ratingKey: 143886) +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Nowhere to Go But Up' (ratingKey: 143892) +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Theme from Mary Poppins Returns' (ratingKey: 143894) +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Mary Poppins Arrives' (ratingKey: 143896) +2025-07-25 08:55:52 - newmusic.plex_client - INFO - search_tracks:390 - Found 6 total potential matches for 'mary poppins' by 'bbno' after all stages. +2025-07-25 08:55:52 - newmusic.sync_service - DEBUG - _find_track_in_plex:263 - Early confident match found for 'mary poppins' +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'bbno' +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'bbno boom' +2025-07-25 08:55:52 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'boom' +2025-07-25 08:55:53 - newmusic.sync_service - INFO - cancel_sync:57 - PlaylistSyncService.cancel_sync() called - setting cancellation flag +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'BOOM' (ratingKey: 258903) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'BOOM (Rap remix)' (ratingKey: 258943) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Boom (Ricky Pedretti Remix)' (ratingKey: 285354) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Boom (Original Mix)' (ratingKey: 285339) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Here Comes The Boom (Original Mix)' (ratingKey: 285349) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'pop ur shit' (ratingKey: 291146) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'dangerous' (ratingKey: 291148) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'née-nah' (ratingKey: 291149) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'just like me' (ratingKey: 291153) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'pop ur shit (nightcore version)' (ratingKey: 291130) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'dangerous (nightcore version)' (ratingKey: 291132) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'née-nah (nightcore version)' (ratingKey: 291133) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'just like me (nightcore version)' (ratingKey: 291137) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'pop ur shit (slowed down)' (ratingKey: 291098) +2025-07-25 08:55:53 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'dangerous (slowed down)' (ratingKey: 291100) +2025-07-25 08:55:53 - newmusic.plex_client - INFO - search_tracks:390 - Found 15 total potential matches for 'boom' by 'bbno' after all stages. +2025-07-25 08:55:53 - newmusic.sync_service - DEBUG - _find_track_in_plex:251 - Sync cancelled after search for 'boom' +2025-07-25 08:55:53 - newmusic.sync_service - INFO - sync_playlist:141 - Found 7 matches out of 10 tracks +2025-07-25 09:00:18 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 09:00:18 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 09:00:18 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 09:00:20 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 09:00:20 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 09:00:22 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 09:00:22 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 09:00:22 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:00:22 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 09:00:22 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:00:23 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 09:00:23 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 09:00:23 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 09:00:23 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 09:00:24 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 09:00:24 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 09:00:24 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:00:54 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 09:00:54 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 09:00:54 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:00:54 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 09:00:54 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:00:55 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 09:00:55 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 09:00:55 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 09:00:55 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 09:00:56 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 09:00:56 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 09:00:56 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:03:17 - newmusic.main - INFO - closeEvent:176 - Closing application... +2025-07-25 09:03:17 - newmusic.main - INFO - closeEvent:181 - Cleaning up Downloads page threads... +2025-07-25 09:03:17 - newmusic.main - INFO - closeEvent:186 - Stopping status monitoring thread... +2025-07-25 09:03:20 - newmusic.main - INFO - closeEvent:191 - Closing Soulseek client... +2025-07-25 09:03:20 - newmusic.main - INFO - closeEvent:197 - Application closed successfully +2025-07-25 09:03:48 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-25 09:03:48 - newmusic.main - INFO - main:211 - Starting NewMusic application +2025-07-25 09:03:48 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:03:48 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-25 09:03:48 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-25 09:03:49 - newmusic.main - INFO - change_page:163 - Changed to page: dashboard +2025-07-25 09:03:49 - newmusic.main - INFO - setup_media_player_connections:150 - Media player connections established between sidebar and downloads page +2025-07-25 09:03:49 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-25 09:03:49 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-25 09:03:51 - newmusic.main - INFO - change_page:163 - Changed to page: sync +2025-07-25 09:03:51 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-25 09:03:51 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:03:54 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:04:11 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Cephas Azariah' +2025-07-25 09:04:11 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Cephas Azariah Contours' +2025-07-25 09:04:12 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Contours' +2025-07-25 09:04:13 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Contours' (ratingKey: 476024) +2025-07-25 09:04:13 - newmusic.plex_client - INFO - search_tracks:390 - Found 1 total potential matches for 'Contours' by 'Cephas Azariah' after all stages. +2025-07-25 09:04:13 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Jack Allenson' +2025-07-25 09:04:13 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Jack Allenson Hiking With Friends' +2025-07-25 09:04:13 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Hiking With Friends' +2025-07-25 09:04:14 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Hiking With Friends' +2025-07-25 09:04:15 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Hiking With Friends' +2025-07-25 09:04:15 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Jónsi' +2025-07-25 09:04:15 - newmusic.plex_client - DEBUG - search_tracks:340 - Stage 1 found 0 candidates. +2025-07-25 09:04:15 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Jónsi Forest Trill' +2025-07-25 09:04:16 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Forest Trill' +2025-07-25 09:04:17 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Forest Trill' +2025-07-25 09:04:17 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Forest Trill' +2025-07-25 09:04:18 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Alaskan Tapes' +2025-07-25 09:04:18 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Alaskan Tapes Light Divides' +2025-07-25 09:04:19 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Light Divides' +2025-07-25 09:04:19 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Light Divides' +2025-07-25 09:04:20 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Light Divides' +2025-07-25 09:04:21 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Center of Attention' +2025-07-25 09:04:21 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Center of Attention Meet Me By The Ocean' +2025-07-25 09:04:21 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Meet Me By The Ocean' +2025-07-25 09:04:22 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Natureland' +2025-07-25 09:04:22 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Natureland Meet Me By The Ocean' +2025-07-25 09:04:23 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Meet Me By The Ocean' +2025-07-25 09:04:23 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Meet Me By The Ocean' +2025-07-25 09:04:24 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Meet Me By The Ocean' +2025-07-25 09:04:25 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Little Symphony' +2025-07-25 09:04:25 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Little Symphony Gaia' +2025-07-25 09:04:25 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Gaia' +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 400009) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 400040) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'All Sleeping (Desert Dwellers Remix)' (ratingKey: 426333) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Shiva Nataraj (Banco de Gaia Remix)' (ratingKey: 426337) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 366182) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 452016) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia's Soul' (ratingKey: 385789) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 341556) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 392205) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaļa' (ratingKey: 146341) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 322797) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaļa' (ratingKey: 498005) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'GAIA!' (ratingKey: 445768) +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Gaia' (ratingKey: 200033) +2025-07-25 09:04:26 - newmusic.plex_client - INFO - search_tracks:390 - Found 14 total potential matches for 'Gaia' by 'Little Symphony' after all stages. +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Neighborhood Libraries' +2025-07-25 09:04:26 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Neighborhood Libraries Het Wed' +2025-07-25 09:04:27 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Het Wed' +2025-07-25 09:04:28 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Het Wed' +2025-07-25 09:04:28 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Het Wed' +2025-07-25 09:04:29 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Long Lake' +2025-07-25 09:04:29 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Long Lake Rebirth' +2025-07-25 09:04:30 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Rebirth' +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rite of Rebirth' (ratingKey: 290179) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 288164) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'rebirth' (ratingKey: 287081) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth (Gaudium Remix)' (ratingKey: 286274) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 373435) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 316596) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 270090) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 199405) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 389342) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 338225) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Rebirth' (ratingKey: 424474) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'United in Dance (Phoenix Lord Rebirth)' (ratingKey: 190049) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Hanami' (ratingKey: 200592) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Kodama' (ratingKey: 200598) +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Lotus Eater' (ratingKey: 200589) +2025-07-25 09:04:31 - newmusic.plex_client - INFO - search_tracks:390 - Found 15 total potential matches for 'Rebirth' by 'Long Lake' after all stages. +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Nairuz' +2025-07-25 09:04:31 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Nairuz Intentions' +2025-07-25 09:04:32 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'Intentions' +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Good Intentions' (ratingKey: 290602) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Good Intentions' (ratingKey: 290655) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Good Intentions' (ratingKey: 272089) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Good Intentions' (ratingKey: 272095) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Intentions' (ratingKey: 270360) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'intentions' (ratingKey: 421771) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Good Intentions' (ratingKey: 350916) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Clear Intentions (Extended Mix)' (ratingKey: 255971) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Clear Intentions (Radio Mix)' (ratingKey: 255972) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Anytime Is House (feat. Rowetta) (Mixed)' (ratingKey: 480106) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Good Intentions' (ratingKey: 434979) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Intentions' (ratingKey: 235912) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Intentions' (ratingKey: 349023) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Intentions' (ratingKey: 348861) +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:385 - Stored original track reference for 'Intentions (Acoustic)' (ratingKey: 348855) +2025-07-25 09:04:33 - newmusic.plex_client - INFO - search_tracks:390 - Found 15 total potential matches for 'Intentions' by 'Nairuz' after all stages. +2025-07-25 09:04:33 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Imaginary Softwoods' +2025-07-25 09:04:34 - newmusic.plex_client - DEBUG - search_tracks:332 - Stage 1: Searching for artist 'Imaginary Softwoods' +2025-07-25 09:04:34 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'Imaginary Softwoods enko-ji loop' +2025-07-25 09:04:35 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'enko-ji loop' +2025-07-25 09:04:37 - newmusic.plex_client - DEBUG - search_tracks:357 - Stage 2: Performing keyword search for 'enko-ji loop' +2025-07-25 09:04:37 - newmusic.plex_client - DEBUG - search_tracks:375 - Stage 3: Performing title-only search for 'enko-ji loop' +2025-07-25 09:04:42 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-25 09:05:35 - newmusic.sync_service - INFO - sync_playlist:94 - Starting sync for playlist: Failed test +2025-07-25 09:05:35 - newmusic.sync_service - INFO - sync_playlist:94 - Starting sync for playlist: Aether diff --git a/ui/pages/__pycache__/sync.cpython-312.pyc b/ui/pages/__pycache__/sync.cpython-312.pyc index b5a9e80518fa0c2bcd4d9ee0e16a3dde3cd28b67..a8160b9778c7b65decad391f80e29e4c5b1f1903 100644 GIT binary patch delta 25898 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 diff --git a/ui/pages/sync.py b/ui/pages/sync.py index 3c1185d8..652ca4c3 100644 --- a/ui/pages/sync.py +++ b/ui/pages/sync.py @@ -1464,8 +1464,43 @@ class PlaylistItem(QFrame): self.sync_failed_tracks = 0 self.sync_status_widget = None + # Selection state tracking + self._pending_click = False + self.setup_ui() + def on_checkbox_clicked(self): + """Handle direct checkbox click - use same debounced logic""" + print(f"Direct checkbox click for {self.name}") + self.toggle_selection() + + def update_selection_style(self): + """Update visual style based on selection state""" + if self.is_selected: + self.setStyleSheet(""" + PlaylistItem { + background: rgba(29, 185, 84, 0.1); + border-radius: 8px; + border: 2px solid #1db954; + } + PlaylistItem:hover { + background: rgba(29, 185, 84, 0.15); + border: 2px solid #1ed760; + } + """) + else: + self.setStyleSheet(""" + PlaylistItem { + background: #282828; + border-radius: 8px; + border: 1px solid #404040; + } + PlaylistItem:hover { + background: #333333; + border: 1px solid #1db954; + } + """) + def setup_ui(self): self.setFixedHeight(80) self.setStyleSheet(""" @@ -1480,12 +1515,18 @@ class PlaylistItem(QFrame): } """) + # Make the entire item clickable + self.setCursor(Qt.CursorShape.PointingHandCursor) + self.setFocusPolicy(Qt.FocusPolicy.ClickFocus) + self.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) # Enable styled background + layout = QHBoxLayout(self) layout.setContentsMargins(20, 15, 20, 15) layout.setSpacing(15) # Checkbox self.checkbox = QCheckBox() + self.checkbox.clicked.connect(self.on_checkbox_clicked) self.checkbox.setStyleSheet(""" QCheckBox::indicator { width: 18px; @@ -1589,6 +1630,95 @@ class PlaylistItem(QFrame): layout.addWidget(self.sync_status_widget) layout.addWidget(self.action_btn) layout.addWidget(self.status_label) + + # Install event filter to capture mouse events on child widgets + self.installEventFilter(self) + for child in self.findChildren(QWidget): + if child != self.action_btn and child != self.status_label: + child.installEventFilter(self) + + def eventFilter(self, source, event): + """Filter events to handle clicks anywhere on the item""" + if event.type() == event.Type.MouseButtonPress and event.button() == Qt.MouseButton.LeftButton: + # Don't handle if it's the action button or status label + if source == self.action_btn or source == self.status_label: + return False # Let the button handle its own click + + # Handle click as playlist selection toggle + print(f"Event filter caught click on {source} in playlist {self.name}") + self.toggle_selection() + return True # Event handled + + return super().eventFilter(source, event) + + def toggle_selection(self): + """Toggle the selection state of this playlist item immediately""" + # Skip if already processing to prevent double-clicks + if self._pending_click: + return + + self._pending_click = True + + # Get current state from SyncPage (source of truth) + sync_page = self + while sync_page and not isinstance(sync_page, SyncPage): + sync_page = sync_page.parent() + + if sync_page and self.playlist and self.playlist.id: + # Check actual selection state from parent + currently_selected = self.playlist.id in sync_page.selected_playlists + + # Toggle selection in parent + sync_page.toggle_playlist_selection(self.playlist.id) + + # Update our local state to match parent + new_state = self.playlist.id in sync_page.selected_playlists + self.is_selected = new_state + + # Update checkbox to match (without triggering signal) + self.checkbox.blockSignals(True) + self.checkbox.setChecked(new_state) + self.checkbox.blockSignals(False) + + # Update visual style + self.update_selection_style() + + print(f"Processed click for {self.name}: {currently_selected} -> {new_state}") + else: + print(f"Could not process click for {self.name} - missing sync page or playlist ID") + + # Clear pending flag after a short delay to prevent rapid double-clicks + QTimer.singleShot(25, lambda: setattr(self, '_pending_click', False)) + + def mousePressEvent(self, event): + """Handle direct clicks on the playlist item background""" + if event.button() == Qt.MouseButton.LeftButton: + print(f"Direct click on playlist item: {self.name}") + self.toggle_selection() + super().mousePressEvent(event) + + def sync_selection_state(self): + """Synchronize selection state with parent SyncPage (call when needed)""" + sync_page = self + while sync_page and not isinstance(sync_page, SyncPage): + sync_page = sync_page.parent() + + if sync_page and self.playlist and self.playlist.id: + # Get actual state from parent + actual_selected = self.playlist.id in sync_page.selected_playlists + + # Update our state to match + if self.is_selected != actual_selected: + print(f"Syncing state for {self.name}: {self.is_selected} -> {actual_selected}") + self.is_selected = actual_selected + + # Update checkbox (without triggering signal) + self.checkbox.blockSignals(True) + self.checkbox.setChecked(actual_selected) + self.checkbox.blockSignals(False) + + # Update visual style + self.update_selection_style() def create_compact_sync_status(self): """Create compact sync status display for playlist item""" @@ -1824,6 +1954,11 @@ class SyncPage(QWidget): # Sync worker management self.active_sync_workers = {} # playlist_id -> SyncWorker + # Selection tracking + self.selected_playlists = set() # Set of selected playlist IDs + self.sequential_sync_queue = [] # Queue for sequential syncing + self.is_sequential_syncing = False + # Thread pool for async operations (like downloads.py) self.thread_pool = QThreadPool() self.thread_pool.setMaxThreadCount(3) # Limit concurrent Spotify API calls @@ -1886,6 +2021,93 @@ class SyncPage(QWidget): return True + def toggle_playlist_selection(self, playlist_id): + """Toggle selection state of a playlist""" + if playlist_id in self.selected_playlists: + self.selected_playlists.remove(playlist_id) + print(f"Deselected playlist: {playlist_id}") + else: + self.selected_playlists.add(playlist_id) + print(f"Selected playlist: {playlist_id}") + + print(f"Total selected: {len(self.selected_playlists)}") + self.update_selection_ui() + + def update_selection_ui(self): + """Update the selection info label and button state""" + selected_count = len(self.selected_playlists) + + print(f"Updating UI with {selected_count} selected playlists") + + if selected_count == 0: + self.selection_info.setText("Select playlists to sync") + self.start_sync_btn.setEnabled(False) + print("Button disabled - no selection") + elif selected_count == 1: + self.selection_info.setText("1 playlist selected") + self.start_sync_btn.setEnabled(True) + print("Button enabled - 1 playlist") + else: + self.selection_info.setText(f"{selected_count} playlists selected") + self.start_sync_btn.setEnabled(True) + print(f"Button enabled - {selected_count} playlists") + + def start_selected_playlist_sync(self): + """Start syncing all selected playlists sequentially""" + if not self.selected_playlists or self.is_sequential_syncing: + return + + # Get selected playlist objects + selected_playlist_objects = [] + for playlist_item in self.get_all_playlist_items(): + if playlist_item.playlist.id in self.selected_playlists: + selected_playlist_objects.append(playlist_item.playlist) + + if not selected_playlist_objects: + return + + # Start sequential sync + self.sequential_sync_queue = selected_playlist_objects.copy() + self.is_sequential_syncing = True + self.start_sync_btn.setText("Syncing...") + self.start_sync_btn.setEnabled(False) + + # Start first sync + self.process_next_in_sync_queue() + + def process_next_in_sync_queue(self): + """Process the next playlist in the sequential sync queue""" + if not self.sequential_sync_queue or not self.is_sequential_syncing: + # Sync queue complete + self.on_sequential_sync_complete() + return + + # Get next playlist to sync + next_playlist = self.sequential_sync_queue.pop(0) + + # Start sync for this playlist + success = self.start_playlist_sync(next_playlist) + if not success: + # If sync failed to start, move to next + self.process_next_in_sync_queue() + + def on_sequential_sync_complete(self): + """Handle completion of sequential sync""" + self.is_sequential_syncing = False + self.sequential_sync_queue.clear() + self.start_sync_btn.setText("Start Sync") + self.update_selection_ui() # Re-enable if playlists still selected + + def get_all_playlist_items(self): + """Get all PlaylistItem widgets from the playlist layout""" + playlist_items = [] + for i in range(self.playlist_layout.count()): + item = self.playlist_layout.itemAt(i) + widget = item.widget() + if isinstance(widget, PlaylistItem): + playlist_items.append(widget) + return playlist_items + def cancel_playlist_sync(self, playlist_id): """Cancel sync for a playlist""" if playlist_id in self.active_sync_workers: @@ -1945,6 +2167,10 @@ class SyncPage(QWidget): # Update any open modals self.update_open_modals_completion(playlist_id, result) + # Continue sequential sync if in progress + if self.is_sequential_syncing: + self.process_next_in_sync_queue() + # Log completion if hasattr(self, 'log_area'): success_rate = result.success_rate @@ -1969,6 +2195,10 @@ class SyncPage(QWidget): # Update any open modals self.update_open_modals_error(playlist_id, error_msg) + # Continue sequential sync if in progress (even on error) + if self.is_sequential_syncing: + self.process_next_in_sync_queue() + # Log error if hasattr(self, 'log_area'): self.log_area.append(f"āŒ Sync failed: {error_msg}") @@ -2072,6 +2302,10 @@ class SyncPage(QWidget): # Clear the welcome state first self.clear_playlists() + # Clear selection state when auto-loading + self.selected_playlists.clear() + self.update_selection_ui() + # Start loading (this will set playlists_loaded = True) self.load_playlists_async() @@ -2241,10 +2475,6 @@ class SyncPage(QWidget): layout = QVBoxLayout(section) layout.setSpacing(20) - # Sync options - options_panel = SyncOptionsPanel() - layout.addWidget(options_panel) - # Action buttons actions_frame = QFrame() actions_frame.setStyleSheet(""" @@ -2259,10 +2489,18 @@ class SyncPage(QWidget): actions_layout.setContentsMargins(20, 20, 20, 20) actions_layout.setSpacing(15) - # Sync button - sync_btn = QPushButton("Start Sync") - sync_btn.setFixedHeight(45) - sync_btn.setStyleSheet(""" + # Selection info label + self.selection_info = QLabel("Select playlists to sync") + self.selection_info.setFont(QFont("Arial", 12)) + self.selection_info.setStyleSheet("color: #b3b3b3;") + self.selection_info.setAlignment(Qt.AlignmentFlag.AlignCenter) + + # Sync button (initially disabled) + self.start_sync_btn = QPushButton("Start Sync") + self.start_sync_btn.setFixedHeight(45) + self.start_sync_btn.setEnabled(False) # Disabled by default + self.start_sync_btn.clicked.connect(self.start_selected_playlist_sync) + self.start_sync_btn.setStyleSheet(""" QPushButton { background: #1db954; border: none; @@ -2271,33 +2509,20 @@ class SyncPage(QWidget): font-size: 14px; font-weight: bold; } - QPushButton:hover { + QPushButton:hover:enabled { background: #1ed760; } - QPushButton:pressed { + QPushButton:pressed:enabled { background: #1aa34a; } - """) - - # Preview button - preview_btn = QPushButton("Preview Changes") - preview_btn.setFixedHeight(35) - preview_btn.setStyleSheet(""" - QPushButton { - background: transparent; - border: 1px solid #1db954; - border-radius: 17px; - color: #1db954; - font-size: 12px; - font-weight: bold; - } - QPushButton:hover { - background: rgba(29, 185, 84, 0.1); + QPushButton:disabled { + background: #404040; + color: #666666; } """) - actions_layout.addWidget(sync_btn) - actions_layout.addWidget(preview_btn) + actions_layout.addWidget(self.selection_info) + actions_layout.addWidget(self.start_sync_btn) layout.addWidget(actions_frame) @@ -2397,6 +2622,10 @@ class SyncPage(QWidget): # Clear existing playlists self.clear_playlists() + # Clear selection state when refreshing + self.selected_playlists.clear() + self.update_selection_ui() + # Add loading placeholder loading_label = QLabel("šŸ”„ Loading playlists...") loading_label.setAlignment(Qt.AlignmentFlag.AlignCenter) @@ -2429,7 +2658,7 @@ class SyncPage(QWidget): """Add a single playlist to the UI as it's loaded""" # Simple sync status (placeholder for now) sync_status = "Never Synced" # TODO: Check actual sync status - item = PlaylistItem(playlist.name, playlist.total_tracks, sync_status, playlist) + item = PlaylistItem(playlist.name, playlist.total_tracks, sync_status, playlist, self) item.view_details_clicked.connect(self.show_playlist_details) # Add subtle fade-in animation @@ -2569,7 +2798,7 @@ class SyncPage(QWidget): ] for name, count, status in playlists: - item = PlaylistItem(name, count, status, None) # No playlist object for placeholders + item = PlaylistItem(name, count, status, None, self) # Set parent for placeholders too self.playlist_layout.addWidget(item) def refresh_playlists(self):