diff --git a/.spotify_cache b/.spotify_cache index 83e294be..dfd03def 100644 --- a/.spotify_cache +++ b/.spotify_cache @@ -1 +1 @@ -{"access_token": "BQCcjOxkyprg68XG9wIW8-EXwIERyvvMQcswcfRmvL1HxzlhSRDYybTTBfJDqt6OvKy8gYkBn2nvJkhsu8uyFautsOx8aP9dIi2nIsksvQTMAzU5DSH5_jBmeL0GJpkZ7btqlMNkzcjryWUaNQpVSZFVkJmxBjpoQbRtviQ7YTjfS9NjTwjTuX8czrmqEVCV8-8YQjE6jnjkwO-wrTReY27KBn6_iLyAX5Vh9JLyYUG-mYQhNXGa6Mii2ZSkMb7s", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1753677220, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file +{"access_token": "BQAdyqwBcWjHXyNglSbWavYUmdxzOiQMWw57Cw-vulDpJHzqwR7GrNabHbXNRoRi17XxQ3aov7_FUiIlsBlJ2eQpRbaDMMvEld4Xo99eVnQKh3S6S6-ialTKQi6GaATUEEro2C0OQNpWml6xPLGXMZ6Oe5m48Neldipw7uE2P_3RQXMqjQurbbZ9ujGcJv6_MNOMfWhF0eZ7ix3Rj8P-lasEebj1G7uZ9YdWBgmgclApiFWQa1Z_moB0Zuomb9Ah", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1753682064, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file diff --git a/logs/app.log b/logs/app.log index 3c7c1ff4..450999be 100644 --- a/logs/app.log +++ b/logs/app.log @@ -176670,3 +176670,209 @@ 2025-07-27 21:32:37 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music 2025-07-27 21:32:37 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE 2025-07-27 21:32:52 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:34:37 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-27 21:34:37 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-27 21:34:37 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-27 21:34:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-27 21:34:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-27 21:34:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 50 searches from slskd +2025-07-27 21:34:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (50) within limit (200), no maintenance needed +2025-07-27 21:36:37 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-27 21:36:37 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-27 21:36:37 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-27 21:36:37 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-27 21:36:37 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-27 21:36:37 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 50 searches from slskd +2025-07-27 21:36:37 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (50) within limit (200), no maintenance needed +2025-07-27 21:36:44 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:36:44 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:36:44 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:36:47 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:36:47 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:36:47 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:37:15 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:37:15 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:37:15 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:37:15 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:37:15 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:37:16 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:37:16 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:37:16 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:37:16 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:37:16 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:37:16 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:37:16 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:37:16 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:37:19 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:39:04 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:39:04 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:39:04 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:39:05 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:39:05 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:39:05 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:39:10 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:39:10 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:39:10 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:39:10 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:39:10 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:39:10 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:39:10 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:39:10 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:39:10 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:39:10 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:39:10 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:39:11 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:39:11 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:39:12 - newmusic.main - INFO - change_page:233 - Changed to page: downloads +2025-07-27 21:39:13 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:41:10 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-27 21:41:10 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-27 21:41:10 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-27 21:41:11 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-27 21:41:11 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-27 21:41:11 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 50 searches from slskd +2025-07-27 21:41:11 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (50) within limit (200), no maintenance needed +2025-07-27 21:41:33 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:41:33 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:41:33 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:41:35 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:41:35 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:41:35 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:41:38 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:41:38 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:41:38 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:41:38 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:41:38 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:41:38 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:41:38 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:41:38 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:41:38 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:41:38 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:41:38 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:41:39 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:41:39 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:41:40 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:43:26 - newmusic.main - INFO - change_page:233 - Changed to page: artists +2025-07-27 21:43:26 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:43:28 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:43:28 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:43:28 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:43:30 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:43:30 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:43:30 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:44:07 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:44:07 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:44:07 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:44:07 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:44:07 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:44:07 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:44:07 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:44:07 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:44:07 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:44:07 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:44:07 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:44:07 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:44:07 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:44:08 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:46:07 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-27 21:46:07 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-27 21:46:07 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-27 21:46:08 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-27 21:46:08 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-27 21:46:08 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 50 searches from slskd +2025-07-27 21:46:08 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (50) within limit (200), no maintenance needed +2025-07-27 21:46:13 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:46:13 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:46:13 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:46:14 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:46:14 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:46:14 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:46:32 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:46:32 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:46:32 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:46:32 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:46:32 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:46:32 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:46:32 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:46:32 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:46:32 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:46:32 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:46:32 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:46:33 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:46:33 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:46:34 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:47:56 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:47:56 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:47:56 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:47:57 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:47:57 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:47:57 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:48:00 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:48:00 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:48:00 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:48:00 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:48:00 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:48:01 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:48:01 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:48:01 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:48:01 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:48:01 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:48:01 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:48:01 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:48:01 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:48:02 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:49:59 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:49:59 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:49:59 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:50:01 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:50:01 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:50:01 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:50:05 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:50:05 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:50:05 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:50:05 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:50:05 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:50:06 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:50:06 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:50:06 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:50:06 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:50:06 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:50:06 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:50:06 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:50:06 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:50:08 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:50:22 - newmusic.main - INFO - on_settings_changed:214 - Settings changed: soulseek.download_path = E:/Broque Projects/newMusic/downloads +2025-07-27 21:50:22 - newmusic.main - INFO - on_settings_changed:214 - Settings changed: soulseek.transfer_path = E:/Broque Projects/newMusic/Transfer +2025-07-27 21:52:06 - newmusic.soulseek_client - DEBUG - get_all_searches:952 - Getting all searches with endpoint: searches +2025-07-27 21:52:06 - newmusic.soulseek_client - DEBUG - _make_request:242 - Making GET request to: http://localhost:5030/api/v0/searches +2025-07-27 21:52:06 - newmusic.soulseek_client - DEBUG - _make_request:243 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-27 21:52:06 - newmusic.soulseek_client - DEBUG - _make_request:254 - Response status: 200 +2025-07-27 21:52:06 - newmusic.soulseek_client - DEBUG - _make_request:255 - Response text: [{"endedAt":"2025-07-27T21:28:19.7264233Z","fileCount":13,"id":"41b335b7-58a3-4201-8506-22e0954564eb","isComplete":true,"lockedFileCount":0,"responseCount":12,"responses":[],"searchText":"Tommy Cash Baba Yaga","startedAt":"2025-07-27T21:28:02.1709869Z","state":"Completed, TimedOut","token":80},{"endedAt":"2025-07-27T21:28:20.4645342Z","fileCount":5,"id":"7e66f9a9-00ac-451b-a199-5f6a7f18930c","isComplete":true,"lockedFileCount":0,"responseCount":5,"responses":[],"searchText":"Tommy Cash SugaSuga"... +2025-07-27 21:52:06 - newmusic.soulseek_client - INFO - get_all_searches:957 - Retrieved 50 searches from slskd +2025-07-27 21:52:06 - newmusic.soulseek_client - DEBUG - maintain_search_history:1058 - Search count (50) within limit (200), no maintenance needed +2025-07-27 21:53:16 - newmusic.main - INFO - closeEvent:246 - Closing application... +2025-07-27 21:53:16 - newmusic.main - INFO - closeEvent:251 - Cleaning up Downloads page threads... +2025-07-27 21:53:16 - newmusic.main - INFO - closeEvent:256 - Stopping status monitoring thread... +2025-07-27 21:53:19 - newmusic.main - INFO - closeEvent:261 - Stopping search maintenance timer... +2025-07-27 21:53:19 - newmusic.main - INFO - closeEvent:266 - Closing Soulseek client... +2025-07-27 21:53:19 - newmusic.main - INFO - closeEvent:272 - Application closed successfully +2025-07-27 21:54:05 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-27 21:54:05 - newmusic.main - INFO - main:286 - Starting NewMusic application +2025-07-27 21:54:05 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:54:05 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:54:05 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:54:07 - newmusic.spotify_client - INFO - _setup_client:179 - Spotify client initialized (user info will be fetched when needed) +2025-07-27 21:54:07 - newmusic.soulseek_client - INFO - _setup_client:220 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-27 21:54:07 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard +2025-07-27 21:54:07 - newmusic.main - INFO - setup_media_player_connections:205 - Media player connections established between sidebar and downloads page +2025-07-27 21:54:07 - newmusic.main - INFO - setup_settings_connections:210 - Settings change connections established +2025-07-27 21:54:07 - newmusic.main - INFO - setup_search_maintenance:86 - Search maintenance timer started (every 2 minutes, keeps 200 most recent searches) +2025-07-27 21:54:07 - newmusic.plex_client - INFO - _find_music_library:127 - Found music library: Music +2025-07-27 21:54:07 - newmusic.plex_client - INFO - _setup_client:113 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-27 21:54:08 - newmusic.main - INFO - change_page:233 - Changed to page: settings +2025-07-27 21:54:22 - newmusic.main - INFO - change_page:233 - Changed to page: artists +2025-07-27 21:54:23 - newmusic.main - INFO - change_page:233 - Changed to page: downloads +2025-07-27 21:54:24 - newmusic.main - INFO - change_page:233 - Changed to page: sync +2025-07-27 21:54:24 - newmusic.spotify_client - INFO - _ensure_user_id:195 - Successfully authenticated with Spotify as broquethomas +2025-07-27 21:54:24 - newmusic.spotify_client - INFO - get_user_playlists_metadata_only:256 - Retrieved 8 playlist metadata (first batch) +2025-07-27 21:54:25 - newmusic.main - INFO - change_page:233 - Changed to page: dashboard diff --git a/ui/pages/__pycache__/settings.cpython-312.pyc b/ui/pages/__pycache__/settings.cpython-312.pyc index 4e329cf7..46460427 100644 Binary files a/ui/pages/__pycache__/settings.cpython-312.pyc and b/ui/pages/__pycache__/settings.cpython-312.pyc differ diff --git a/ui/pages/settings.py b/ui/pages/settings.py index 52af91f5..ad21146c 100644 --- a/ui/pages/settings.py +++ b/ui/pages/settings.py @@ -5,6 +5,101 @@ from PyQt6.QtCore import Qt, QThread, pyqtSignal from PyQt6.QtGui import QFont from config.settings import config_manager +class SlskdDetectionThread(QThread): + progress_updated = pyqtSignal(int, str) # progress value, current url + detection_completed = pyqtSignal(str) # found_url (empty if not found) + + def __init__(self): + super().__init__() + self.cancelled = False + + def cancel(self): + self.cancelled = True + + def run(self): + import requests + import socket + from concurrent.futures import ThreadPoolExecutor, as_completed + + def get_local_network_range(): + """Get the local network IP range""" + try: + # Get local IP + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("8.8.8.8", 80)) + local_ip = s.getsockname()[0] + s.close() + + # Generate network range (assumes /24 subnet) + ip_parts = local_ip.split('.') + network_base = f"{ip_parts[0]}.{ip_parts[1]}.{ip_parts[2]}" + return network_base, local_ip + except: + return None, None + + def test_url(url): + """Test if slskd is running at the given URL""" + try: + response = requests.get(f"{url}/api/v0/session", timeout=1) + if response.status_code in [200, 401]: + return url + except: + pass + return None + + # Build candidate list + candidates = [] + + # Local candidates + local_candidates = [ + "http://localhost:5030", + "http://127.0.0.1:5030", + "http://localhost:5031", + "http://127.0.0.1:5031", + "http://localhost:8080", + "http://127.0.0.1:8080" + ] + candidates.extend(local_candidates) + + # Network candidates + network_base, local_ip = get_local_network_range() + if network_base and local_ip: + # Common network IPs to check (router, common static IPs) + priority_ips = [1, 2, 100, 101, 102, 150, 200] + ports = [5030, 5031, 8080] + + for ip_suffix in priority_ips: + test_ip = f"{network_base}.{ip_suffix}" + if test_ip != local_ip: # Skip local IP (already tested) + for port in ports: + candidates.append(f"http://{test_ip}:{port}") + + found_url = None + + # Test candidates sequentially for more predictable progress + for i, url in enumerate(candidates): + if self.cancelled: + break + + # Emit progress update before testing + progress_percent = int((i / len(candidates)) * 100) + self.progress_updated.emit(progress_percent, url) + + # Test the URL + result = test_url(url) + if result: + found_url = result + # Emit final progress + self.progress_updated.emit(100, f"Found: {result}") + break + + # Small delay to make progress visible + import time + time.sleep(0.05) + + # Emit completion signal + self.detection_completed.emit(found_url or "") + class ServiceTestThread(QThread): test_completed = pyqtSignal(str, bool, str) # service, success, message @@ -170,6 +265,8 @@ class SettingsPage(QWidget): self.form_inputs = {} self.test_thread = None self.test_buttons = {} + self.detection_thread = None + self.detection_dialog = None self.setup_ui() self.load_config_values() @@ -282,6 +379,14 @@ class SettingsPage(QWidget): self.download_path_input.setText(soulseek_config.get('download_path', './downloads')) self.transfer_path_input.setText(soulseek_config.get('transfer_path', './Transfer')) + # Load logging config (read-only display) + logging_config = config_manager.get_logging_config() + if hasattr(self, 'log_level_display'): + self.log_level_display.setText(logging_config.get('level', 'DEBUG')) + + if hasattr(self, 'log_path_display'): + self.log_path_display.setText(logging_config.get('path', 'logs/app.log')) + except Exception as e: QMessageBox.warning(self, "Error", f"Failed to load configuration: {e}") @@ -371,6 +476,290 @@ class SettingsPage(QWidget): } self.start_service_test('soulseek', test_config) + def auto_detect_slskd(self): + """Auto-detect slskd URL using background thread""" + # Don't start new detection if one is already running + if self.detection_thread and self.detection_thread.isRunning(): + return + + # Create animated loading dialog + from PyQt6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton + from PyQt6.QtCore import QTimer, QPropertyAnimation, QRect + from PyQt6.QtGui import QPainter, QColor + + self.detection_dialog = QDialog(self) + self.detection_dialog.setWindowTitle("Auto-detecting slskd") + self.detection_dialog.setModal(True) + self.detection_dialog.setFixedSize(350, 150) + self.detection_dialog.setWindowFlags(self.detection_dialog.windowFlags() & ~Qt.WindowType.WindowContextHelpButtonHint) + + # Apply dark theme styling + self.detection_dialog.setStyleSheet(""" + QDialog { + background-color: #282828; + color: #ffffff; + border: 1px solid #404040; + border-radius: 8px; + } + QLabel { + color: #ffffff; + font-size: 14px; + } + QPushButton { + background-color: #404040; + border: 1px solid #606060; + border-radius: 4px; + color: #ffffff; + padding: 8px 16px; + font-size: 11px; + } + QPushButton:hover { + background-color: #505050; + } + """) + + layout = QVBoxLayout(self.detection_dialog) + layout.setSpacing(20) + layout.setContentsMargins(20, 20, 20, 20) + + # Title label + title_label = QLabel("Searching for slskd instances...") + title_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(title_label) + + # Status label + self.status_label = QLabel("Checking local machine...") + self.status_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.status_label.setStyleSheet("color: #b3b3b3; font-size: 12px;") + layout.addWidget(self.status_label) + + # Animated loading bar container + loading_container = QLabel() + loading_container.setFixedHeight(8) + loading_container.setStyleSheet(""" + QLabel { + background-color: #404040; + border: 1px solid #606060; + border-radius: 4px; + } + """) + layout.addWidget(loading_container) + + # Animated green bar + self.loading_bar = QLabel(loading_container) + self.loading_bar.setFixedHeight(6) + self.loading_bar.setStyleSheet(""" + background-color: #1db954; + border-radius: 3px; + border: none; + """) + + # Start animation + self.loading_animation = QPropertyAnimation(self.loading_bar, b"geometry") + self.loading_animation.setDuration(1500) # 1.5 seconds + self.loading_animation.setStartValue(QRect(1, 1, 0, 6)) + self.loading_animation.setEndValue(QRect(1, 1, loading_container.width() - 2, 6)) + self.loading_animation.setLoopCount(-1) # Infinite loop + self.loading_animation.start() + + # Cancel button + button_layout = QHBoxLayout() + button_layout.addStretch() + + cancel_btn = QPushButton("Cancel") + cancel_btn.clicked.connect(self.cancel_detection) + button_layout.addWidget(cancel_btn) + + layout.addLayout(button_layout) + + # Start detection thread + self.detection_thread = SlskdDetectionThread() + self.detection_thread.progress_updated.connect(self.on_detection_progress, Qt.ConnectionType.QueuedConnection) + self.detection_thread.detection_completed.connect(self.on_detection_completed, Qt.ConnectionType.QueuedConnection) + self.detection_thread.start() + + self.detection_dialog.show() + + def cancel_detection(self): + """Cancel the ongoing detection""" + if self.detection_thread: + self.detection_thread.cancel() + + # Close dialog + if hasattr(self, 'detection_dialog') and self.detection_dialog: + if hasattr(self, 'loading_animation'): + self.loading_animation.stop() + self.detection_dialog.close() + self.detection_dialog = None + + def on_detection_progress(self, progress_value, current_url): + """Handle progress updates from detection thread""" + if hasattr(self, 'status_label') and self.status_label: + if "localhost" in current_url or "127.0.0.1" in current_url: + self.status_label.setText("Checking local machine...") + else: + self.status_label.setText("Checking network...") + + def on_detection_completed(self, found_url): + """Handle detection completion""" + # Stop animation and close dialog + if hasattr(self, 'loading_animation'): + self.loading_animation.stop() + + if hasattr(self, 'detection_dialog') and self.detection_dialog: + self.detection_dialog.close() + self.detection_dialog = None + + if self.detection_thread: + self.detection_thread.deleteLater() + self.detection_thread = None + + if found_url: + self.slskd_url_input.setText(found_url) + self.show_success_dialog(found_url) + else: + QMessageBox.warning(self, "Auto-detect Failed", + "Could not find slskd running on local machine or network.\n\n" + "Please ensure slskd is running and try:\n" + "• Check if slskd service is started\n" + "• Verify firewall allows access to slskd port\n" + "• Enter the URL manually if on a different network\n\n" + "Common URLs:\n" + "• http://localhost:5030 (local default)\n" + "• http://192.168.1.100:5030 (network example)") + + def show_success_dialog(self, found_url): + """Show custom success dialog with copy functionality""" + from PyQt6.QtWidgets import QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QTextEdit + from PyQt6.QtCore import Qt + from PyQt6.QtGui import QClipboard + + dialog = QDialog(self) + dialog.setWindowTitle("Auto-detect Success") + dialog.setModal(True) + dialog.setFixedSize(380, 160) + dialog.setWindowFlags(dialog.windowFlags() & ~Qt.WindowType.WindowContextHelpButtonHint) + + # Apply dark theme styling + dialog.setStyleSheet(""" + QDialog { + background-color: #282828; + color: #ffffff; + border: 1px solid #404040; + border-radius: 8px; + } + QLabel { + color: #ffffff; + font-size: 12px; + } + QTextEdit { + background-color: #404040; + border: 1px solid #606060; + border-radius: 4px; + color: #ffffff; + font-size: 11px; + font-family: 'Courier New', monospace; + padding: 8px; + } + QPushButton { + background-color: #404040; + border: 1px solid #606060; + border-radius: 4px; + color: #ffffff; + padding: 6px 12px; + font-size: 11px; + min-width: 50px; + min-height: 28px; + } + QPushButton:hover { + background-color: #505050; + } + #copyButton { + background-color: #1db954; + border: 1px solid #1db954; + color: #000000; + font-weight: bold; + min-height: 28px; + } + #copyButton:hover { + background-color: #1ed760; + } + """) + + layout = QVBoxLayout(dialog) + layout.setSpacing(8) + layout.setContentsMargins(15, 15, 15, 15) + + # Success message + location_type = "locally" if "localhost" in found_url or "127.0.0.1" in found_url else "on network" + success_label = QLabel(f"✓ Found slskd running {location_type}!") + success_label.setStyleSheet("color: #1db954; font-size: 13px; font-weight: bold;") + success_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(success_label) + + # URL display with copy functionality + url_label = QLabel("Detected URL:") + layout.addWidget(url_label) + + url_container = QHBoxLayout() + url_container.setSpacing(5) + + url_display = QTextEdit() + url_display.setPlainText(found_url) + url_display.setReadOnly(True) + url_display.setFixedHeight(30) + url_display.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + url_container.addWidget(url_display) + + copy_btn = QPushButton("Copy") + copy_btn.setObjectName("copyButton") + copy_btn.setFixedSize(55, 30) + copy_btn.clicked.connect(lambda: self.copy_to_clipboard(found_url, copy_btn)) + url_container.addWidget(copy_btn) + + layout.addLayout(url_container) + + # Info text + info_label = QLabel("URL automatically filled in settings above.") + info_label.setStyleSheet("color: #b3b3b3; font-size: 9px; font-style: italic;") + info_label.setAlignment(Qt.AlignmentFlag.AlignCenter) + layout.addWidget(info_label) + + # OK button + button_layout = QHBoxLayout() + button_layout.addStretch() + + ok_btn = QPushButton("OK") + ok_btn.setFixedSize(60, 28) + ok_btn.clicked.connect(dialog.accept) + ok_btn.setDefault(True) + button_layout.addWidget(ok_btn) + + layout.addLayout(button_layout) + + dialog.exec() + + def copy_to_clipboard(self, text, button): + """Copy text to clipboard and show feedback""" + from PyQt6.QtWidgets import QApplication + from PyQt6.QtCore import QTimer + + clipboard = QApplication.clipboard() + clipboard.setText(text) + + # Show feedback + original_text = button.text() + button.setText("Copied!") + button.setEnabled(False) + + # Reset button after 1 second + QTimer.singleShot(1000, lambda: self.reset_copy_button(button, original_text)) + + def reset_copy_button(self, button, original_text): + """Reset copy button to original state""" + button.setText(original_text) + button.setEnabled(True) + def browse_download_path(self): """Open a directory dialog to select download path""" from PyQt6.QtWidgets import QFileDialog @@ -539,11 +928,20 @@ class SettingsPage(QWidget): slskd_url_label.setStyleSheet("color: #ffffff; font-size: 11px;") soulseek_layout.addWidget(slskd_url_label) + url_input_layout = QHBoxLayout() self.slskd_url_input = QLineEdit() self.slskd_url_input.setStyleSheet(self.get_input_style()) self.slskd_url_input.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) self.form_inputs['soulseek.slskd_url'] = self.slskd_url_input - soulseek_layout.addWidget(self.slskd_url_input) + + detect_btn = QPushButton("Auto-detect") + detect_btn.setFixedSize(80, 30) + detect_btn.clicked.connect(self.auto_detect_slskd) + detect_btn.setStyleSheet(self.get_test_button_style()) + + url_input_layout.addWidget(self.slskd_url_input) + url_input_layout.addWidget(detect_btn) + soulseek_layout.addLayout(url_input_layout) # API Key api_key_label = QLabel("API Key:") @@ -670,30 +1068,43 @@ class SettingsPage(QWidget): logging_layout.setContentsMargins(16, 20, 16, 16) logging_layout.setSpacing(12) - # Log level + # Log level (read-only) log_level_layout = QHBoxLayout() log_level_label = QLabel("Log Level:") log_level_label.setStyleSheet("color: #ffffff; font-size: 12px;") - log_level_combo = QComboBox() - log_level_combo.addItems(["DEBUG", "INFO", "WARNING", "ERROR"]) - log_level_combo.setCurrentText("DEBUG") - log_level_combo.setStyleSheet(self.get_combo_style()) - log_level_combo.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + self.log_level_display = QLabel("DEBUG") + self.log_level_display.setStyleSheet(""" + color: #b3b3b3; + font-size: 11px; + background-color: #404040; + border: 1px solid #606060; + border-radius: 4px; + padding: 8px; + """) + self.log_level_display.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) log_level_layout.addWidget(log_level_label) - log_level_layout.addWidget(log_level_combo) + log_level_layout.addWidget(self.log_level_display) - # Log file path + # Log file path (read-only) log_path_container = QVBoxLayout() log_path_label = QLabel("Log File Path:") log_path_label.setStyleSheet("color: #ffffff; font-size: 12px;") log_path_container.addWidget(log_path_label) - log_path_input = QLineEdit("logs/app.log") - log_path_input.setStyleSheet(self.get_input_style()) - log_path_input.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) - log_path_container.addWidget(log_path_input) + self.log_path_display = QLabel("logs/app.log") + self.log_path_display.setStyleSheet(""" + color: #b3b3b3; + font-size: 11px; + background-color: #404040; + border: 1px solid #606060; + border-radius: 4px; + padding: 8px; + font-family: 'Courier New', monospace; + """) + self.log_path_display.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + log_path_container.addWidget(self.log_path_display) logging_layout.addLayout(log_level_layout) logging_layout.addLayout(log_path_container)