From 96a0bc4b43f6d0b3e09b8f041d1b1a7067ef1a8f Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Thu, 10 Jul 2025 08:10:40 -0700 Subject: [PATCH] fix --- .claude/settings.local.json | 3 +- .spotify_cache | 2 +- .../soulseek_client.cpython-312.pyc | Bin 32134 -> 32643 bytes core/soulseek_client.py | 13 +- logs/app.log | 1132 ++++++++++++++++ .../__pycache__/downloads.cpython-312.pyc | Bin 61965 -> 98823 bytes ui/pages/downloads.py | 1164 ++++++++++++++--- 7 files changed, 2107 insertions(+), 207 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 122fc7b8..0a90916a 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -2,7 +2,8 @@ "permissions": { "allow": [ "Bash(mkdir:*)", - "Bash(rm:*)" + "Bash(rm:*)", + "Bash(rg:*)" ], "deny": [] } diff --git a/.spotify_cache b/.spotify_cache index 066ff0d6..25bdac14 100644 --- a/.spotify_cache +++ b/.spotify_cache @@ -1 +1 @@ -{"access_token": "BQCXjLyK_OHaggFHfb5wR0JXJv3sWABpjx_UDSIHBXYZRaoQCZmWRaa1QMoNYt2UWMzISQoM91ei1TYyLuT9p0a8XV0NhmctOTQX1sGAnw-wCI2LYTnH5ZVj0DFSrosUqca14vTVLTTlhBZP3gjdgCXfoXpymZUMpHWHMf_aFYr27NfhwQyRQffze3bPzuHTmln2BAEM0BlpHBQl97pI8XoHhOtyvLq95RCZrZZcYHcKPL4dSHG6Bn_gQJLjiv2y", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1752125167, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file +{"access_token": "BQBptSDFOmuCrdFhAT3o2Rd85vMSh-8wxQyZoJf5dhDjTkGaEapSscCO81D_9wW5tsFONfbZaRFPDEmwgLxU5mlPGf5BO19Ngeu7qfwjeSvIsPDgyXTZqpFSTmCcmIQ9nW75V6ixzC48Soc4JG-YZXAZLQN2OCgkSje-L2gHHwuHtJmAnD-3_Lq0CBUJPzP3QR01XFyxXaRWqTg6o3EuqBYOCmNBhKmFGVWTD59-RWOKhsLhcYy3siXcAAYYJtzb", "token_type": "Bearer", "expires_in": 3600, "scope": "user-library-read user-read-private playlist-read-private playlist-read-collaborative user-read-email", "expires_at": 1752163323, "refresh_token": "AQDmfQkPCGObfJeTUIbW1hAAwhSqkuHRA3Qh2dqVYMRh0eCkFMQgPNJDDzF8y-BiaVbj80zePkK_XSfYH1aJutMtNbnsqRKWuxP31BTrMc7pdUdbE7Fma4oH8wpDUKdG3MM"} \ No newline at end of file diff --git a/core/__pycache__/soulseek_client.cpython-312.pyc b/core/__pycache__/soulseek_client.cpython-312.pyc index 1e891a6e882caaeb92b1a8d115df746ad581aea7..139aac2b8dc00497e583bee1f4c70daab35f9b4c 100644 GIT binary patch delta 2245 zcmZux3rrkU6n$@YX7&U7VZUryU>3I2Eg)JxML;Q~t+53x1ynYQt~&#zrMt`QA}-Ea z(-PAdv^38|o2F{js7-5vZv1~*`x9F*^rz{jF&blyi6&@k(x{2vx68EEILVxM-#z!9 zd*5f~$v^S-zp?3*(P%*Moa>EjJSDwl>e6q`m3Yx8nMIA1D;eFu_4A@>oC{b)K{Nwr zfj2M1>m)wI>qIN?d7=#%jii&T880i^$Ju}_qm%V8q60kkg*Zn)D>`BB6uly?>B?qr zT@dBPd=Pa(x}%>F-4K|c5$7ac()Tm8M5YWQE&|RC+zkw56o7ZpLbeC&0ya_m9V0SyUuyEsnaVlMKQO(1_) z>Nt!BP#2l%&nMqj8#rF!V^t(*DJG_x3e1tln(9uTY8}Y-glKqDE83H~xLNH(VHDk1 z4nk^7QXkK|#_3h>Dl~~7cnzVX0ebX03?e@UL3@zsRP=x@#h~cO?=`pbP*3#iC4JqC z%5#*QNi5gKZP(;-;&#JZdTp7V9fI~V_}J%tQhZPrMppFq~Y{I0~p*r6^vcHsV8aY0^SES9`IAv^Z^*md7oS zw@5@uutxDHdQ{VkM)7hq@x*`fe2@qCzqVYl{P*66m|m1s=vo-BE4`^1#r}#^qW(L4 zpJ%l!M`U3zEJWqVfGovgLMS*i^l&h=xj~TW{*Ad;2j!uJ5SQdFgW+I&FcNMM)WF9XsxtXV;}nw`(x=66+l?L)zwjb<6Yp0xyrl07S^8;*8e%Lq3j>?9%5Kgwe>4l$2MPw z7Qfz7*X}|`3UQm0JyPVMb^`|gk;WDblcP;^a`g6=dYBxq#cgi>cwHsfCrWK?9{xlf zPwggKo0tFG!cw%i$V#juzDJ3ZNMW6`pa@A~Ws` zdJNPq)3;l>nX3GDBR8w1>a#`;JhN7o+Ae(utCk3S@9I)BEWk?IZI_=VJt4U1XdQF_qFC|D@aU!Z)P!U+nW zQ-v?JS_yX~ZtqjYg!eWU5e?WGHyKy5zH(G%!fU9MaXmY?~Fe&HSDd?MKT4pll#p^m~y3SR=G*@q*MA^9|& ze@!7x;Ub006n>`=rf`)c#=Q6-*)z6(@p{ZTUn-qPbez&;$GM)~xj_Hvo`K65_pf4V X;IWr6W{4rV#T?aP<8O#!rnP?n-6AqA delta 1894 zcmZ8heN0nV6uIG%xktRhGcUl#_1AGHPda04!?zEnrzFgnVF0G%09x>X^hF-xh+p|P2TUE`}^H< z&b{Z}+ntZ_8xOI0++;E!_|0Dx-E?omQFBN?lqK?lQM3rGXcSE@&?3BG8rHN}1&?3` z%>th_t?NWSt?Ptr(6facP*_nX=A>Cpunlu9wsf8h!w7a@>{Ig`5l(QxI9Korv}SH5 zdT1&sFXTbeJP3D07{Lh>o$2Hnkr(w5hL%W|VFVXwF3_ea5HSPT8B@{u;O7ek!>FY| zC=1{b+OBTh=4P6~#cPxx)BT#a^;d0rml%}^&lm=4TSjQGI+7}D6X)yz| zV>{uyx#dNY4T<`L{x^!)PN4At2hk4&t7x z=i?ehBUh4kh__UiV~*5SSFO?PMWf82%t8I$Q12eS}T=frif?8ll; zWmljPyzW(m;(Az>*P$2qL721`3Au_6Fi+7dT5_*?z82~U1*0q(dBs&~Pz=&vG27#8 zhL~OT4>1`}x?w>eC&VHqcK6yw`W!U40*pz-7jyTf8uD`KRWr5bXjp{ThqR;cDz9_z3l z_cWeYCbNdiNHV zDVG1=xiHg=1QfTtZV64*1=(M>r#z)?mj}AT z9nq9V?h?hG6emZenA8IW{Z?rv7-<)U5dhM^bcC}~$N20b93*uvH}80J)g-q(+4(Gs zaW3gzCL6BVy!$(kxX;?ZCciH`%>M(geKkXFE$`qfa!s{&=aIF6@bBGj()u zW@+FV7@S*(gW3GKnmOQ~_u7JX{(Lo0{l&JRi@#vzDCX3AfVx!e1iWm-K{tQd6hJT- zH_=q%W}3EgJe!(vdlp5HzR|>v`(2GXc7nm+Pp}%8I-%20-^4arlRwrM>hba2jXU^i z_zRHRpfyFw1C8(T_#_F0{=lcn+@>Z>k~^D9Io}xV=NSsLmlA!U(pd`UD4eHoflR!- zmLI3?=cKIpMSM6p*nE(IY`)eye37)b*5j{|`&-{)@i9`>R#tk7PNnJm+G&S&6^N8p z66Lr$|ok zFPSAwkVm~A+CHHrKBe#(z;k|9xRqDnB|wVX5RG<8 zSLpa#3fCxHr*NCXT?*Y4?vt3}#UGJ(l!GNJu_pKZl1W7E5jJB_G@UNLy7YxRY4Y#Y XNg=)uUINh$ZLx?tY`TporWf`fkUqt} diff --git a/core/soulseek_client.py b/core/soulseek_client.py index de5550a6..05a0b09b 100644 --- a/core/soulseek_client.py +++ b/core/soulseek_client.py @@ -234,7 +234,7 @@ class SoulseekClient: return search_results - async def search(self, query: str, timeout: int = 30) -> List[SearchResult]: + async def search(self, query: str, timeout: int = 30, progress_callback=None) -> List[SearchResult]: if not self.base_url: logger.error("Soulseek client not configured") return [] @@ -286,6 +286,17 @@ class SoulseekClient: if new_results: logger.info(f"Found {len(new_results)} new results (total: {len(all_results)}) at {poll_count * poll_interval:.1f}s") + # Call progress callback with new results + if progress_callback: + try: + progress_callback(new_results, len(all_results)) + except Exception as e: + logger.error(f"Error in progress callback: {e}") + + # Early termination if we have enough results + if len(all_results) >= 100: # Stop after 100 results for better performance + logger.info(f"Early termination: Found {len(all_results)} results, stopping search") + break elif len(all_results) > 0: logger.debug(f"No new results, total still: {len(all_results)}") else: diff --git a/logs/app.log b/logs/app.log index 0a82c805..3b53eea3 100644 --- a/logs/app.log +++ b/logs/app.log @@ -4436,3 +4436,1135 @@ 2025-07-09 22:05:46 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 201 2025-07-09 22:05:46 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: ... 2025-07-09 22:05:46 - newmusic.soulseek_client - INFO - download:336 - [SUCCESS] Started download: @@bmlwc\Soulseek Downloads\c34wkpcv\Relaxing Synthwave Top 105\083 - Virtual Mage - Aether.mp3 from buk4 +2025-07-09 22:09:06 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 22:09:09 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 22:11:39 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 22:11:54 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 22:12:02 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 22:12:09 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 22:18:35 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 22:18:35 - newmusic.main - INFO - closeEvent:157 - Cleaning up Downloads page threads... +2025-07-09 22:18:35 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... +2025-07-09 22:18:37 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... +2025-07-09 22:18:37 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 22:19:05 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 22:19:05 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 22:19:05 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 22:19:05 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 22:19:05 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 22:19:05 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 22:23:24 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 22:23:24 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 22:23:25 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 22:23:25 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 22:23:25 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 22:23:25 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 22:23:25 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 22:23:26 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 22:23:26 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 22:23:28 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 22:23:29 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 22:23:31 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 22:23:31 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 22:23:32 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 22:23:36 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 22:23:43 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 22:23:57 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'Virtual Mage' +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'Virtual Mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'Virtual Mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"23787f13-2d27-4634-b452-33727c635042","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"Virtual Mage","startedAt":"2025-07-10T05:23:57.7791838Z","state":"InProgress","token":100}... +2025-07-09 22:23:57 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: 23787f13-2d27-4634-b452-33727c635042 +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/20) - elapsed: 0.0s +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:23:57 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:23:58 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:23:58 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:23:59 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/20) - elapsed: 1.5s +2025-07-09 22:23:59 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:23:59 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:23:59 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:23:59 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:01 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/20) - elapsed: 3.0s +2025-07-09 22:24:01 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:01 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:01 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:01 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:03 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/20) - elapsed: 4.5s +2025-07-09 22:24:03 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:03 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:03 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:03 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:04 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/20) - elapsed: 6.0s +2025-07-09 22:24:04 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:04 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:05 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:05 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:06 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/20) - elapsed: 7.5s +2025-07-09 22:24:06 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:06 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:06 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:06 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:08 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/20) - elapsed: 9.0s +2025-07-09 22:24:08 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:08 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:08 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:08 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:10 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 8/20) - elapsed: 10.5s +2025-07-09 22:24:10 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:10 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:10 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:10 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:11 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 9/20) - elapsed: 12.0s +2025-07-09 22:24:11 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:11 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:12 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:12 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:13 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 10/20) - elapsed: 13.5s +2025-07-09 22:24:13 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:13 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:14 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:14 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:15 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-09 22:24:15 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:15 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:15 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:15 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:17 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:17 - newmusic.soulseek_client - INFO - search:288 - Found 407 new results (total: 407) at 16.5s +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:19 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:20 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-09 22:24:20 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:20 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:21 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:22 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:24 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:26 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:28 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:29 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-09 22:24:29 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:29 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:30 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/23787f13-2d27-4634-b452-33727c635042/responses +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 18 user responses +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:24:31 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 407 +2025-07-09 22:24:31 - newmusic.soulseek_client - INFO - search:298 - Search completed. Found 407 total results for query: Virtual Mage +2025-07-09 22:26:06 - newmusic.soulseek_client - DEBUG - download:314 - Attempting to download: Unsynced music\Techno\1717 - Virtual Mage - Aether.flac from Dax_VR (size: 22189939) +2025-07-09 22:26:06 - newmusic.soulseek_client - DEBUG - download:327 - Using web interface API format: [{'filename': 'Unsynced music\\Techno\\1717 - Virtual Mage - Aether.flac', 'size': 22189939, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:26:06 - newmusic.soulseek_client - DEBUG - download:331 - Trying web interface endpoint: transfers/downloads/Dax_VR +2025-07-09 22:26:06 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/transfers/downloads/Dax_VR +2025-07-09 22:26:06 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:26:06 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: [{'filename': 'Unsynced music\\Techno\\1717 - Virtual Mage - Aether.flac', 'size': 22189939, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:26:07 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 201 +2025-07-09 22:26:07 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: ... +2025-07-09 22:26:07 - newmusic.soulseek_client - INFO - download:336 - [SUCCESS] Started download: Unsynced music\Techno\1717 - Virtual Mage - Aether.flac from Dax_VR +2025-07-09 22:28:51 - newmusic.soulseek_client - DEBUG - download:314 - Attempting to download: Unsynced music\Techno\1736 - Virtual Mage - Astral Chill.flac from Dax_VR (size: 16437947) +2025-07-09 22:28:51 - newmusic.soulseek_client - DEBUG - download:327 - Using web interface API format: [{'filename': 'Unsynced music\\Techno\\1736 - Virtual Mage - Astral Chill.flac', 'size': 16437947, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:28:51 - newmusic.soulseek_client - DEBUG - download:331 - Trying web interface endpoint: transfers/downloads/Dax_VR +2025-07-09 22:28:51 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/transfers/downloads/Dax_VR +2025-07-09 22:28:51 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:28:51 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: [{'filename': 'Unsynced music\\Techno\\1736 - Virtual Mage - Astral Chill.flac', 'size': 16437947, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:28:52 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 201 +2025-07-09 22:28:52 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: ... +2025-07-09 22:28:52 - newmusic.soulseek_client - INFO - download:336 - [SUCCESS] Started download: Unsynced music\Techno\1736 - Virtual Mage - Astral Chill.flac from Dax_VR +2025-07-09 22:33:32 - newmusic.main - INFO - change_page:139 - Changed to page: artists +2025-07-09 22:33:35 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 22:40:31 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 22:40:31 - newmusic.main - INFO - closeEvent:157 - Cleaning up Downloads page threads... +2025-07-09 22:40:31 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... +2025-07-09 22:40:31 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... +2025-07-09 22:40:31 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 22:40:36 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 22:40:36 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 22:40:36 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 22:40:36 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 22:40:36 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 22:40:36 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 22:40:37 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 22:40:37 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 22:40:37 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 22:40:40 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 22:40:41 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 22:40:42 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 22:40:43 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 22:40:48 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 22:40:55 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 22:40:56 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 22:41:26 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'virtual mage' +2025-07-09 22:41:26 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'virtual mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 22:41:26 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 22:41:26 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 22:41:26 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:26 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'virtual mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"virtual mage","startedAt":"2025-07-10T05:41:27.1598849Z","state":"InProgress","token":111}... +2025-07-09 22:41:27 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: 9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/20) - elapsed: 0.0s +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:27 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:28 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/20) - elapsed: 1.5s +2025-07-09 22:41:28 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:28 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:29 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:29 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:30 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/20) - elapsed: 3.0s +2025-07-09 22:41:30 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:30 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:31 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:31 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:32 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/20) - elapsed: 4.5s +2025-07-09 22:41:32 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:32 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:32 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:32 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:34 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/20) - elapsed: 6.0s +2025-07-09 22:41:34 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:34 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:34 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:34 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:36 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/20) - elapsed: 7.5s +2025-07-09 22:41:36 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:36 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:36 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:36 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:37 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/20) - elapsed: 9.0s +2025-07-09 22:41:37 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:37 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:38 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:38 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:39 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 8/20) - elapsed: 10.5s +2025-07-09 22:41:39 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:39 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:39 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:39 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:41 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 9/20) - elapsed: 12.0s +2025-07-09 22:41:41 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:41 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:41 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:41 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:43 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 10/20) - elapsed: 13.5s +2025-07-09 22:41:43 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:43 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:43 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:43 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:44 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-09 22:41:44 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:44 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:45 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:45 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:46 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:46 - newmusic.soulseek_client - INFO - search:288 - Found 416 new results (total: 416) at 16.5s +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:48 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:50 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:52 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:41:53 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-09 22:41:53 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:53 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:54 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:55 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:57 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:41:59 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:42:00 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-09 22:42:00 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/9f4fa4a3-16fb-4ab6-a46f-6083103b5a8e/responses +2025-07-09 22:42:00 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Info.txt","size":36361,"isLocked":false},{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\\Virtual World- Close Combat Mage [MD-30107]\\Virtual World- Close Combat Mage [MD-30107][A06DFFA7].zip","size":209388535,"isLocked":false},{"code":1,"extension":"","file... +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 19 user responses +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:42:01 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 416 +2025-07-09 22:42:01 - newmusic.soulseek_client - INFO - search:298 - Search completed. Found 416 total results for query: virtual mage +2025-07-09 22:42:28 - newmusic.soulseek_client - DEBUG - download:314 - Attempting to download: @@giymx\complete\City Pop\Virtual Mage - Sleepy.flac from XTheWeatherX (size: 16523330) +2025-07-09 22:42:28 - newmusic.soulseek_client - DEBUG - download:327 - Using web interface API format: [{'filename': '@@giymx\\complete\\City Pop\\Virtual Mage - Sleepy.flac', 'size': 16523330, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:42:28 - newmusic.soulseek_client - DEBUG - download:331 - Trying web interface endpoint: transfers/downloads/XTheWeatherX +2025-07-09 22:42:28 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/transfers/downloads/XTheWeatherX +2025-07-09 22:42:28 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:42:28 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: [{'filename': '@@giymx\\complete\\City Pop\\Virtual Mage - Sleepy.flac', 'size': 16523330, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:42:29 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 201 +2025-07-09 22:42:29 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: ... +2025-07-09 22:42:29 - newmusic.soulseek_client - INFO - download:336 - [SUCCESS] Started download: @@giymx\complete\City Pop\Virtual Mage - Sleepy.flac from XTheWeatherX +2025-07-09 22:48:57 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 22:50:52 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 22:50:52 - newmusic.main - INFO - closeEvent:157 - Cleaning up Downloads page threads... +2025-07-09 22:50:52 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... +2025-07-09 22:50:54 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... +2025-07-09 22:50:54 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 23:03:03 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 23:03:03 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 23:03:03 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 23:03:03 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 23:03:03 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 23:03:03 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 23:03:04 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 23:03:04 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 23:03:05 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 23:03:07 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 23:03:08 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 23:03:09 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 23:03:10 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 23:03:15 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 23:03:22 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 23:03:59 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 23:04:25 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'Virtual Mage' +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'Virtual Mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'Virtual Mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"866fd983-8183-48f9-a447-51b492f5a599","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"Virtual Mage","startedAt":"2025-07-10T06:04:25.7570859Z","state":"InProgress","token":117}... +2025-07-09 23:04:25 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: 866fd983-8183-48f9-a447-51b492f5a599 +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/20) - elapsed: 0.0s +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:25 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:26 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:26 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:27 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/20) - elapsed: 1.5s +2025-07-09 23:04:27 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:27 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:27 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:27 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:29 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/20) - elapsed: 3.0s +2025-07-09 23:04:29 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:29 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:29 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:29 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:31 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/20) - elapsed: 4.5s +2025-07-09 23:04:31 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:31 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:31 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:31 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:32 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/20) - elapsed: 6.0s +2025-07-09 23:04:32 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:32 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:33 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:33 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:34 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/20) - elapsed: 7.5s +2025-07-09 23:04:34 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:34 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:34 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:34 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:36 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/20) - elapsed: 9.0s +2025-07-09 23:04:36 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:36 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:36 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:36 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:38 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 8/20) - elapsed: 10.5s +2025-07-09 23:04:38 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:38 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:38 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:38 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:39 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 9/20) - elapsed: 12.0s +2025-07-09 23:04:39 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:39 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:40 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:40 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:41 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 10/20) - elapsed: 13.5s +2025-07-09 23:04:41 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:41 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:41 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:41 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:43 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:43 - newmusic.soulseek_client - INFO - search:288 - Found 417 new results (total: 417) at 15.0s +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:45 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:47 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:48 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-09 23:04:48 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:48 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:49 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:50 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:52 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:54 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:55 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-09 23:04:55 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:55 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:56 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:57 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-09 23:04:57 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:57 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:58 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/866fd983-8183-48f9-a447-51b492f5a599/responses +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":3,"files":[{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (1994).pdf","size":33530594,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition Book - Virtual Adepts (Revised) (2003).pdf","size":115110029,"isLocked":false},{"code":1,"extension":"","filename":"@@fedfm\\RPGs\\oldworldofdarkness\\Mage the Ascension\\Tradition book - Virtual Adepts,... +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 20 user responses +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User XTheWeatherX has 2 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Seyti has 10 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 23:04:59 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 417 +2025-07-09 23:04:59 - newmusic.soulseek_client - INFO - search:298 - Search completed. Found 417 total results for query: Virtual Mage +2025-07-10 08:02:02 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-10 08:02:02 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-10 08:02:03 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-10 08:02:03 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-10 08:02:03 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-10 08:02:03 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-10 08:02:04 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-10 08:02:04 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-10 08:02:04 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-10 08:02:07 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-10 08:02:08 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-10 08:02:10 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-10 08:02:10 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-10 08:02:16 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-10 08:02:24 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-10 08:02:26 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-10 08:02:34 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'Virtual Mage' +2025-07-10 08:02:34 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'Virtual Mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-10 08:02:34 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-10 08:02:34 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-10 08:02:34 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:34 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'Virtual Mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"e1a58018-8e05-461b-86eb-269dfffdd7ce","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"Virtual Mage","startedAt":"2025-07-10T15:02:34.9884591Z","state":"InProgress","token":135}... +2025-07-10 08:02:35 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: e1a58018-8e05-461b-86eb-269dfffdd7ce +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/20) - elapsed: 0.0s +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:35 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:36 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/20) - elapsed: 1.5s +2025-07-10 08:02:36 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:36 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:37 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:37 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:38 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/20) - elapsed: 3.0s +2025-07-10 08:02:38 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:38 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:38 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:38 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:40 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/20) - elapsed: 4.5s +2025-07-10 08:02:40 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:40 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:40 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:40 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:42 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/20) - elapsed: 6.0s +2025-07-10 08:02:42 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:42 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:42 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:42 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:44 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/20) - elapsed: 7.5s +2025-07-10 08:02:44 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:44 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:44 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:44 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:45 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/20) - elapsed: 9.0s +2025-07-10 08:02:45 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:45 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:46 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:46 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:47 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 8/20) - elapsed: 10.5s +2025-07-10 08:02:47 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:47 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:48 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:48 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:49 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 9/20) - elapsed: 12.0s +2025-07-10 08:02:49 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:49 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:49 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:49 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:51 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 10/20) - elapsed: 13.5s +2025-07-10 08:02:51 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:51 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:51 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:51 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/e1a58018-8e05-461b-86eb-269dfffdd7ce/responses +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":1,"files":[{"bitRate":128,"code":1,"extension":"","filename":"Shared\\Virtual Mage\\Refraction 1191940288\\Virtual Mage - Virtual Mage.mp3","isVariableBitRate":false,"length":154,"size":2476160,"isLocked":false}],"hasFreeUploadSlot":true,"lockedFileCount":0,"lockedFiles":[],"queueLength":21,"token":135,"uploadSpeed":518299,"username":"KindaRatchet"},{"fileCount":346,"files":[{"code":1,"extension":"","filename":"Downloads (Private)\\Seedbox 1\\Manga\\Dekai Manga Archive [Fall 2020]\... +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 24 user responses +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User soulshookt has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User aajzugikamlzcr has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ruszok has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User thinkibettergo has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Satani-Vitales has 3 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User FixxAlish has 1 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User wonko1987 has 2 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-10 08:02:53 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-10 08:02:53 - newmusic.soulseek_client - INFO - search:288 - Found 418 new results (total: 418) at 15.0s +2025-07-10 08:02:53 - newmusic.soulseek_client - INFO - search:298 - Early termination: Found 418 results, stopping search +2025-07-10 08:02:53 - newmusic.soulseek_client - INFO - search:309 - Search completed. Found 418 total results for query: Virtual Mage diff --git a/ui/pages/__pycache__/downloads.cpython-312.pyc b/ui/pages/__pycache__/downloads.cpython-312.pyc index de68df995cd67cca288ee0ee7a2fcaf4c94888cf..1df5ab399e662bec3f7d599285156257534c3128 100644 GIT binary patch literal 98823 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 delta 15698 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 I%dCq30`SR~`Tzg` diff --git a/ui/pages/downloads.py b/ui/pages/downloads.py index b758d31b..0764aa6f 100644 --- a/ui/pages/downloads.py +++ b/ui/pages/downloads.py @@ -1,6 +1,7 @@ from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QFrame, QPushButton, QProgressBar, QListWidget, - QListWidgetItem, QComboBox, QLineEdit, QScrollArea, QMessageBox) + QListWidgetItem, QComboBox, QLineEdit, QScrollArea, QMessageBox, + QSplitter, QSizePolicy, QSpacerItem) from PyQt6.QtCore import Qt, QThread, pyqtSignal, QTimer from PyQt6.QtGui import QFont @@ -181,12 +182,20 @@ class SearchThread(QThread): search_completed = pyqtSignal(list) # List of search results search_failed = pyqtSignal(str) # Error message search_progress = pyqtSignal(str) # Progress message + search_results_partial = pyqtSignal(list, int) # Partial results, total count def __init__(self, soulseek_client, query): super().__init__() self.soulseek_client = soulseek_client self.query = query self._stop_requested = False + self.all_results = [] # Track all results for final emit + + def progress_callback(self, new_results, total_count): + """Callback function for progressive search results""" + if not self._stop_requested: + self.all_results.extend(new_results) + self.search_results_partial.emit(new_results, total_count) def run(self): loop = None @@ -198,11 +207,12 @@ class SearchThread(QThread): loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) - # Perform search with proper error handling + # Perform search with progressive callback results = loop.run_until_complete(self._do_search()) if not self._stop_requested: - self.search_completed.emit(results) + # Emit final completion with all results + self.search_completed.emit(self.all_results if self.all_results else results) except Exception as e: if not self._stop_requested: @@ -224,8 +234,8 @@ class SearchThread(QThread): print(f"Error cleaning up event loop: {e}") async def _do_search(self): - """Perform the actual search with proper async handling""" - return await self.soulseek_client.search(self.query) + """Perform the actual search with progressive callback""" + return await self.soulseek_client.search(self.query, progress_callback=self.progress_callback) def stop(self): """Stop the search gracefully""" @@ -241,137 +251,132 @@ class SearchResultItem(QFrame): self.setup_ui() def setup_ui(self): - self.setFixedHeight(120) # Increased height for better spacing + self.setFixedHeight(90) # Professional height to prevent overflow self.setStyleSheet(""" SearchResultItem { background: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 rgba(40, 40, 40, 0.95), - stop:1 rgba(30, 30, 30, 0.95)); + stop:0 rgba(42, 42, 42, 0.9), + stop:1 rgba(32, 32, 32, 0.95)); border-radius: 12px; - border: 1px solid rgba(64, 64, 64, 0.8); - margin: 8px; + border: 1px solid rgba(64, 64, 64, 0.4); + margin: 6px 4px; } SearchResultItem:hover { background: qlineargradient(x1:0, y1:0, x2:0, y2:1, - stop:0 rgba(51, 51, 51, 0.95), - stop:1 rgba(40, 40, 40, 0.95)); - border: 1px solid rgba(29, 185, 84, 0.6); - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); + stop:0 rgba(50, 50, 50, 0.95), + stop:1 rgba(40, 40, 40, 0.98)); + border: 1px solid rgba(29, 185, 84, 0.7); } """) layout = QHBoxLayout(self) - layout.setContentsMargins(20, 15, 20, 15) - layout.setSpacing(20) + layout.setContentsMargins(16, 12, 16, 12) # Professional padding + layout.setSpacing(16) # Consistent spacing - # Album art placeholder + # Compact album art album_art = QLabel() - album_art.setFixedSize(80, 80) + album_art.setFixedSize(56, 56) album_art.setStyleSheet(""" QLabel { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, - stop:0 rgba(29, 185, 84, 0.3), - stop:1 rgba(29, 185, 84, 0.1)); - border-radius: 8px; - border: 2px solid rgba(29, 185, 84, 0.2); + stop:0 rgba(29, 185, 84, 0.25), + stop:1 rgba(29, 185, 84, 0.08)); + border-radius: 6px; + border: 1px solid rgba(29, 185, 84, 0.3); } """) album_art.setAlignment(Qt.AlignmentFlag.AlignCenter) album_art.setText("🎡") - album_art.setFont(QFont("Arial", 24)) + album_art.setFont(QFont("Arial", 18)) - # Main content area + # Efficient content layout - single column content_layout = QVBoxLayout() - content_layout.setSpacing(8) + content_layout.setSpacing(2) + content_layout.setContentsMargins(0, 0, 0, 0) - # Primary info (song/artist extracted from filename) + # Extract song info primary_info = self._extract_song_info() - # Song title + # Top row: Song title + quality badge + top_row = QHBoxLayout() + top_row.setSpacing(8) + song_title = QLabel(primary_info['title']) - song_title.setFont(QFont("Arial", 14, QFont.Weight.Bold)) - song_title.setStyleSheet("color: #ffffff; margin-bottom: 2px;") - song_title.setWordWrap(True) + song_title.setFont(QFont("Arial", 12, QFont.Weight.Bold)) + song_title.setStyleSheet("color: #ffffff;") + song_title.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) + + quality_badge = self._create_compact_quality_badge() + + top_row.addWidget(song_title) + top_row.addWidget(quality_badge) + + # Middle row: Artist + file size + duration + middle_row = QHBoxLayout() + middle_row.setSpacing(12) - # Artist/Album info artist_info = QLabel(primary_info['artist']) - artist_info.setFont(QFont("Arial", 12, QFont.Weight.Normal)) - artist_info.setStyleSheet("color: #b3b3b3; margin-bottom: 6px;") + artist_info.setFont(QFont("Arial", 10, QFont.Weight.Normal)) + artist_info.setStyleSheet("color: rgba(179, 179, 179, 0.9);") + artist_info.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred) - # Technical details - tech_layout = QHBoxLayout() - tech_layout.setSpacing(15) - - # Quality badge - quality_badge = self._create_quality_badge() - tech_layout.addWidget(quality_badge) - - # File size + # File details (compact) + details = [] size_mb = self.search_result.size // (1024*1024) - size_label = QLabel(f"{size_mb} MB") - size_label.setFont(QFont("Arial", 10, QFont.Weight.Medium)) - size_label.setStyleSheet("color: #888888;") - tech_layout.addWidget(size_label) + details.append(f"{size_mb}MB") - # Duration if available if self.search_result.duration: duration_mins = self.search_result.duration // 60 duration_secs = self.search_result.duration % 60 - duration_label = QLabel(f"{duration_mins}:{duration_secs:02d}") - duration_label.setFont(QFont("Arial", 10, QFont.Weight.Medium)) - duration_label.setStyleSheet("color: #888888;") - tech_layout.addWidget(duration_label) + details.append(f"{duration_mins}:{duration_secs:02d}") - tech_layout.addStretch() + file_details = QLabel(" β€’ ".join(details)) + file_details.setFont(QFont("Arial", 9)) + file_details.setStyleSheet("color: rgba(136, 136, 136, 0.8);") - # User info - user_layout = QHBoxLayout() - user_layout.setSpacing(10) + middle_row.addWidget(artist_info) + middle_row.addWidget(file_details) - # User avatar placeholder - user_avatar = QLabel("πŸ‘€") - user_avatar.setFont(QFont("Arial", 14)) - user_avatar.setStyleSheet("color: #1db954;") + # Bottom row: User info + speed indicator + bottom_row = QHBoxLayout() + bottom_row.setSpacing(8) - # Username - username_label = QLabel(self.search_result.username) - username_label.setFont(QFont("Arial", 11, QFont.Weight.Medium)) - username_label.setStyleSheet("color: #1db954;") + user_info = QLabel(f"πŸ‘€ {self.search_result.username}") + user_info.setFont(QFont("Arial", 9, QFont.Weight.Medium)) + user_info.setStyleSheet("color: rgba(29, 185, 84, 0.8);") - # Upload speed indicator - speed_indicator = self._create_speed_indicator() + speed_indicator = self._create_compact_speed_indicator() - user_layout.addWidget(user_avatar) - user_layout.addWidget(username_label) - user_layout.addWidget(speed_indicator) - user_layout.addStretch() + bottom_row.addWidget(user_info) + bottom_row.addWidget(speed_indicator) + bottom_row.addStretch() - content_layout.addWidget(song_title) - content_layout.addWidget(artist_info) - content_layout.addLayout(tech_layout) - content_layout.addLayout(user_layout) - content_layout.addStretch() + content_layout.addLayout(top_row) + content_layout.addLayout(middle_row) + content_layout.addLayout(bottom_row) - # Action area + # Compact action area action_layout = QVBoxLayout() - action_layout.setSpacing(10) + action_layout.setSpacing(4) action_layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + action_layout.setContentsMargins(0, 0, 0, 0) - # Quality score - quality_score = QLabel(f"β˜… {self.search_result.quality_score:.1f}") + # Compact quality score + quality_score = QLabel(f"β˜…{self.search_result.quality_score:.1f}") quality_score.setAlignment(Qt.AlignmentFlag.AlignCenter) - quality_score.setFont(QFont("Arial", 12, QFont.Weight.Bold)) + quality_score.setFont(QFont("Arial", 9, QFont.Weight.Bold)) + quality_score.setFixedSize(36, 18) if self.search_result.quality_score >= 0.9: - quality_score.setStyleSheet("color: #1db954; background: rgba(29, 185, 84, 0.1); padding: 4px 8px; border-radius: 6px;") + quality_score.setStyleSheet("color: #1db954; background: rgba(29, 185, 84, 0.15); border-radius: 9px;") elif self.search_result.quality_score >= 0.7: - quality_score.setStyleSheet("color: #ffa500; background: rgba(255, 165, 0, 0.1); padding: 4px 8px; border-radius: 6px;") + quality_score.setStyleSheet("color: #ffa500; background: rgba(255, 165, 0, 0.15); border-radius: 9px;") else: - quality_score.setStyleSheet("color: #e22134; background: rgba(226, 33, 52, 0.1); padding: 4px 8px; border-radius: 6px;") + quality_score.setStyleSheet("color: #e22134; background: rgba(226, 33, 52, 0.15); border-radius: 9px;") - # Download button - self.download_btn = QPushButton("⬇️ Download") - self.download_btn.setFixedSize(120, 40) + # Compact download button + self.download_btn = QPushButton("⬇️") + self.download_btn.setFixedSize(36, 36) self.download_btn.clicked.connect(self.request_download) self.download_btn.setStyleSheet(""" QPushButton { @@ -379,16 +384,15 @@ class SearchResultItem(QFrame): stop:0 rgba(29, 185, 84, 0.9), stop:1 rgba(24, 156, 71, 0.9)); border: none; - border-radius: 20px; + border-radius: 18px; color: #000000; - font-size: 12px; + font-size: 14px; font-weight: bold; } QPushButton:hover { background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(30, 215, 96, 1.0), stop:1 rgba(25, 180, 80, 1.0)); - transform: translateY(-1px); } QPushButton:pressed { background: qlineargradient(x1:0, y1:0, x2:0, y2:1, @@ -399,10 +403,9 @@ class SearchResultItem(QFrame): action_layout.addWidget(quality_score) action_layout.addWidget(self.download_btn) - action_layout.addStretch() layout.addWidget(album_art) - layout.addLayout(content_layout) + layout.addLayout(content_layout, 1) # Take most space layout.addLayout(action_layout) def _extract_song_info(self): @@ -429,8 +432,8 @@ class SearchResultItem(QFrame): 'artist': 'Unknown Artist' } - def _create_quality_badge(self): - """Create a quality indicator badge""" + def _create_compact_quality_badge(self): + """Create a compact quality indicator badge""" quality = self.search_result.quality.upper() bitrate = self.search_result.bitrate @@ -447,84 +450,102 @@ class SearchResultItem(QFrame): badge_text = f"{bitrate}k" badge_color = "#ffaa00" else: - badge_text = quality + badge_text = quality[:3] # Truncate for compact display badge_color = "#e22134" badge = QLabel(badge_text) - badge.setFont(QFont("Arial", 9, QFont.Weight.Bold)) + badge.setFont(QFont("Arial", 8, QFont.Weight.Bold)) badge.setAlignment(Qt.AlignmentFlag.AlignCenter) - badge.setFixedSize(60, 24) + badge.setFixedSize(40, 16) badge.setStyleSheet(f""" QLabel {{ background: {badge_color}; color: #000000; - border-radius: 12px; - padding: 2px 8px; + border-radius: 8px; + padding: 1px 4px; }} """) return badge - def _create_speed_indicator(self): - """Create upload speed indicator""" + def _create_compact_speed_indicator(self): + """Create compact upload speed indicator""" speed = self.search_result.upload_speed slots = self.search_result.free_upload_slots if slots > 0 and speed > 100: indicator_color = "#1db954" - speed_text = "πŸš€ Fast" + speed_text = "πŸš€" elif slots > 0: indicator_color = "#ffa500" - speed_text = "⚑ Available" + speed_text = "⚑" else: indicator_color = "#e22134" - speed_text = "⏳ Queued" + speed_text = "⏳" indicator = QLabel(speed_text) - indicator.setFont(QFont("Arial", 9, QFont.Weight.Medium)) + indicator.setFont(QFont("Arial", 10)) indicator.setStyleSheet(f"color: {indicator_color};") + indicator.setFixedSize(16, 16) return indicator + def _create_quality_badge(self): + """Create a quality indicator badge (legacy - kept for compatibility)""" + return self._create_compact_quality_badge() + + def _create_speed_indicator(self): + """Create upload speed indicator (legacy - kept for compatibility)""" + return self._create_compact_speed_indicator() + def request_download(self): if not self.is_downloading: self.is_downloading = True - self.download_btn.setText("⏳ Downloading...") + self.download_btn.setText("⏳") self.download_btn.setEnabled(False) self.download_requested.emit(self.search_result) def reset_download_state(self): """Reset the download button state""" self.is_downloading = False - self.download_btn.setText("⬇️ Download") + self.download_btn.setText("⬇️") self.download_btn.setEnabled(True) class DownloadItem(QFrame): - def __init__(self, title: str, artist: str, status: str, progress: int = 0, parent=None): + def __init__(self, title: str, artist: str, status: str, progress: int = 0, + file_size: int = 0, download_speed: int = 0, file_path: str = "", parent=None): super().__init__(parent) self.title = title self.artist = artist self.status = status self.progress = progress + self.file_size = file_size + self.download_speed = download_speed + self.file_path = file_path self.setup_ui() def setup_ui(self): - self.setFixedHeight(80) + self.setFixedHeight(90) # Consistent with search results self.setStyleSheet(""" DownloadItem { - background: #282828; - border-radius: 8px; - border: 1px solid #404040; - margin: 2px; + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(42, 42, 42, 0.9), + stop:1 rgba(32, 32, 32, 0.95)); + border-radius: 12px; + border: 1px solid rgba(64, 64, 64, 0.4); + margin: 6px 4px; } DownloadItem:hover { - background: #333333; + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(50, 50, 50, 0.95), + stop:1 rgba(40, 40, 40, 0.98)); + border: 1px solid rgba(29, 185, 84, 0.7); } """) layout = QHBoxLayout(self) - layout.setContentsMargins(20, 15, 20, 15) - layout.setSpacing(15) + layout.setContentsMargins(16, 12, 16, 12) # Consistent with search items + layout.setSpacing(16) # Professional spacing # Status icon status_icon = QLabel() @@ -620,9 +641,13 @@ class DownloadItem(QFrame): progress_layout.addWidget(progress_bar) progress_layout.addWidget(status_label) - # Action button + # Action buttons section + actions_layout = QVBoxLayout() + actions_layout.setSpacing(4) + + # Primary action button action_btn = QPushButton() - action_btn.setFixedSize(80, 30) + action_btn.setFixedSize(80, 28) if self.status == "downloading": action_btn.setText("Cancel") @@ -630,7 +655,7 @@ class DownloadItem(QFrame): QPushButton { background: transparent; border: 1px solid #e22134; - border-radius: 15px; + border-radius: 14px; color: #e22134; font-size: 10px; font-weight: bold; @@ -646,7 +671,7 @@ class DownloadItem(QFrame): QPushButton { background: transparent; border: 1px solid #1db954; - border-radius: 15px; + border-radius: 14px; color: #1db954; font-size: 10px; font-weight: bold; @@ -662,7 +687,7 @@ class DownloadItem(QFrame): QPushButton { background: transparent; border: 1px solid #b3b3b3; - border-radius: 15px; + border-radius: 14px; color: #b3b3b3; font-size: 10px; font-weight: bold; @@ -673,11 +698,92 @@ class DownloadItem(QFrame): } """) + # Open Location button (for completed downloads) + location_btn = QPushButton("πŸ“‚ Open") + location_btn.setFixedSize(80, 28) + location_btn.clicked.connect(self.open_download_location) + location_btn.setStyleSheet(""" + QPushButton { + background: transparent; + border: 1px solid rgba(29, 185, 84, 0.6); + border-radius: 14px; + color: rgba(29, 185, 84, 0.9); + font-size: 10px; + font-weight: bold; + } + QPushButton:hover { + background: rgba(29, 185, 84, 0.1); + border: 1px solid rgba(29, 185, 84, 0.8); + } + """) + + actions_layout.addWidget(action_btn) + if self.status == "completed" and self.file_path: + actions_layout.addWidget(location_btn) + layout.addWidget(status_icon) layout.addLayout(content_layout) layout.addStretch() layout.addLayout(progress_layout) - layout.addWidget(action_btn) + layout.addLayout(actions_layout) + + def open_download_location(self): + """Open the download location in file explorer""" + import os + import platform + from pathlib import Path + + if not self.file_path: + return + + try: + file_path = Path(self.file_path) + if file_path.exists(): + # Open the folder containing the file + folder_path = file_path.parent + + system = platform.system() + if system == "Windows": + os.startfile(str(folder_path)) + elif system == "Darwin": # macOS + os.system(f'open "{folder_path}"') + else: # Linux + os.system(f'xdg-open "{folder_path}"') + else: + # If file doesn't exist, try to open the download directory from config + from config.settings import config_manager + download_path = config_manager.get('soulseek.download_path', './downloads') + + system = platform.system() + if system == "Windows": + os.startfile(download_path) + elif system == "Darwin": # macOS + os.system(f'open "{download_path}"') + else: # Linux + os.system(f'xdg-open "{download_path}"') + + except Exception as e: + print(f"Error opening download location: {e}") + + def update_status(self, status: str, progress: int = None, download_speed: int = None, file_path: str = None): + """Update download item status and refresh UI""" + self.status = status + if progress is not None: + self.progress = progress + if download_speed is not None: + self.download_speed = download_speed + if file_path: + self.file_path = file_path + + # Refresh the UI by recreating it + # Clear current layout + while self.layout().count(): + child = self.layout().takeAt(0) + if child.widget(): + child.widget().deleteLater() + + # Recreate UI with updated values + self.setup_ui() class DownloadQueue(QFrame): def __init__(self, parent=None): @@ -694,19 +800,26 @@ class DownloadQueue(QFrame): """) layout = QVBoxLayout(self) - layout.setContentsMargins(20, 20, 20, 20) - layout.setSpacing(15) + layout.setContentsMargins(16, 12, 16, 16) # Professional spacing - less top padding + layout.setSpacing(12) # Reduced spacing for tighter layout # Header header_layout = QHBoxLayout() title_label = QLabel("Download Queue") - title_label.setFont(QFont("Arial", 16, QFont.Weight.Bold)) - title_label.setStyleSheet("color: #ffffff;") + title_label.setFont(QFont("Segoe UI", 14, QFont.Weight.Bold)) + title_label.setStyleSheet(""" + color: rgba(255, 255, 255, 0.95); + font-weight: 600; + padding: 4px 0; + """) - queue_count = QLabel("5 items") - queue_count.setFont(QFont("Arial", 11)) - queue_count.setStyleSheet("color: #b3b3b3;") + queue_count = QLabel("Empty") + queue_count.setFont(QFont("Segoe UI", 10)) + queue_count.setStyleSheet(""" + color: rgba(255, 255, 255, 0.6); + padding: 4px 0; + """) header_layout.addWidget(title_label) header_layout.addStretch() @@ -736,24 +849,71 @@ class DownloadQueue(QFrame): queue_layout = QVBoxLayout(queue_widget) queue_layout.setSpacing(8) - # Sample download items - downloads = [ - ("Song Title 1", "Artist Name 1", "downloading", 75), - ("Song Title 2", "Artist Name 2", "downloading", 45), - ("Song Title 3", "Artist Name 3", "queued", 0), - ("Song Title 4", "Artist Name 4", "completed", 100), - ("Song Title 5", "Artist Name 5", "failed", 0) - ] + # Dynamic download items - initially empty + self.queue_layout = queue_layout + self.queue_count_label = queue_count + self.download_items = [] - for title, artist, status, progress in downloads: - item = DownloadItem(title, artist, status, progress) - queue_layout.addWidget(item) + # Add initial message when queue is empty + self.empty_message = QLabel("No downloads yet. Start downloading music to see them here!") + self.empty_message.setFont(QFont("Arial", 11)) + self.empty_message.setStyleSheet("color: rgba(255, 255, 255, 0.5); padding: 20px; text-align: center;") + self.empty_message.setAlignment(Qt.AlignmentFlag.AlignCenter) + queue_layout.addWidget(self.empty_message) queue_layout.addStretch() queue_scroll.setWidget(queue_widget) layout.addLayout(header_layout) layout.addWidget(queue_scroll) + + def add_download_item(self, title: str, artist: str, status: str = "queued", + progress: int = 0, file_size: int = 0, download_speed: int = 0, file_path: str = ""): + """Add a new download item to the queue""" + # Hide empty message if this is the first item + if len(self.download_items) == 0: + self.empty_message.hide() + + # Create new download item + item = DownloadItem(title, artist, status, progress, file_size, download_speed, file_path) + self.download_items.append(item) + + # Insert before the stretch (which is always last) + insert_index = self.queue_layout.count() - 1 + self.queue_layout.insertWidget(insert_index, item) + + # Update count + self.update_queue_count() + + return item + + def update_queue_count(self): + """Update the queue count label""" + count = len(self.download_items) + if count == 0: + self.queue_count_label.setText("Empty") + if not self.empty_message.isHidden(): + self.empty_message.show() + else: + self.queue_count_label.setText(f"{count} item{'s' if count != 1 else ''}") + + def remove_download_item(self, item): + """Remove a download item from the queue""" + if item in self.download_items: + self.download_items.remove(item) + self.queue_layout.removeWidget(item) + item.deleteLater() + self.update_queue_count() + + def clear_completed_downloads(self): + """Remove all completed download items""" + items_to_remove = [] + for item in self.download_items: + if item.status == "completed": + items_to_remove.append(item) + + for item in items_to_remove: + self.remove_download_item(item) class DownloadsPage(QWidget): def __init__(self, soulseek_client=None, parent=None): @@ -764,66 +924,407 @@ class DownloadsPage(QWidget): self.session_thread = None # Track session info thread self.download_threads = [] # Track active download threads self.search_results = [] + self.download_items = [] # Track download items for the queue + self.displayed_results = 0 # Track how many results are currently displayed + self.results_per_page = 20 # Show 20 results at a time + + # Download status polling timer + self.download_status_timer = QTimer() + self.download_status_timer.timeout.connect(self.update_download_status) + self.download_status_timer.start(2000) # Poll every 2 seconds + + # Initialize load more button (will be added to layout in setup_ui) + self.load_more_btn = None + self.setup_ui() def setup_ui(self): self.setStyleSheet(""" DownloadsPage { - background: #191414; + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(25, 20, 20, 1.0), + stop:1 rgba(15, 15, 15, 1.0)); } """) main_layout = QVBoxLayout(self) - main_layout.setContentsMargins(30, 30, 30, 30) - main_layout.setSpacing(25) + main_layout.setContentsMargins(24, 16, 24, 20) # Professional spacing using 8px grid + main_layout.setSpacing(16) - # Header - header = self.create_header() + # Elegant Header + header = self.create_elegant_header() main_layout.addWidget(header) - # Search section - search_section = self.create_search_section() - main_layout.addWidget(search_section) + # Main Content Area - Prioritize Search Results + content_splitter = QHBoxLayout() + content_splitter.setSpacing(16) - # Content area - content_layout = QHBoxLayout() - content_layout.setSpacing(25) + # LEFT: Search & Results (70% of space) + search_and_results = self.create_search_and_results_section() + content_splitter.addWidget(search_and_results, 7) - # Left side - Download queue - queue_section = DownloadQueue() - content_layout.addWidget(queue_section, 2) + # RIGHT: Collapsible Controls Panel (30% of space) + controls_panel = self.create_collapsible_controls_panel() + content_splitter.addWidget(controls_panel, 3) - # Right side - Controls and stats - controls_section = self.create_controls_section() - content_layout.addWidget(controls_section, 1) + main_layout.addLayout(content_splitter) - main_layout.addLayout(content_layout) - - # Bottom section - Missing tracks - missing_section = self.create_missing_tracks_section() - main_layout.addWidget(missing_section) + # Optional: Compact status bar at bottom + status_bar = self.create_compact_status_bar() + main_layout.addWidget(status_bar) - def create_header(self): - header = QWidget() - layout = QVBoxLayout(header) - layout.setContentsMargins(0, 0, 0, 0) - layout.setSpacing(5) + def create_elegant_header(self): + """Create an elegant, minimal header""" + header = QFrame() + header.setFixedHeight(100) # Increased height to prevent text clipping + header.setStyleSheet(""" + QFrame { + background: transparent; + border: none; + } + """) - # Title - title_label = QLabel("Downloads") - title_label.setFont(QFont("Arial", 28, QFont.Weight.Bold)) - title_label.setStyleSheet("color: #ffffff;") + layout = QHBoxLayout(header) + layout.setContentsMargins(24, 20, 24, 20) # More balanced padding + layout.setSpacing(16) - # Subtitle - subtitle_label = QLabel("Manage your music downloads from Soulseek") - subtitle_label.setFont(QFont("Arial", 14)) - subtitle_label.setStyleSheet("color: #b3b3b3;") + # Icon and Title + title_section = QVBoxLayout() + title_section.setSpacing(4) - layout.addWidget(title_label) - layout.addWidget(subtitle_label) + title_label = QLabel("🎡 Music Downloads") + title_label.setFont(QFont("Segoe UI", 26, QFont.Weight.Bold)) + title_label.setStyleSheet(""" + color: #ffffff; + font-weight: 700; + letter-spacing: 1px; + """) + + subtitle_label = QLabel("Search, discover, and download high-quality music") + subtitle_label.setFont(QFont("Segoe UI", 13)) + subtitle_label.setStyleSheet(""" + color: rgba(255, 255, 255, 0.85); + font-weight: 300; + letter-spacing: 0.5px; + margin-top: 4px; + """) + + title_section.addWidget(title_label) + title_section.addWidget(subtitle_label) + + layout.addLayout(title_section) + layout.addStretch() return header + def create_search_and_results_section(self): + """Create the main search and results area - the star of the show""" + section = QFrame() + section.setStyleSheet(""" + QFrame { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(40, 40, 40, 0.4), + stop:1 rgba(30, 30, 30, 0.6)); + border-radius: 16px; + border: 1px solid rgba(64, 64, 64, 0.3); + } + """) + + layout = QVBoxLayout(section) + layout.setContentsMargins(24, 20, 24, 20) # Professional spacing consistent with main layout + layout.setSpacing(16) + + # Elegant Search Bar + search_container = self.create_elegant_search_bar() + layout.addWidget(search_container) + + # Search Status with better visual feedback + self.search_status = QLabel("Ready to search β€’ Enter artist, song, or album name") + self.search_status.setFont(QFont("Arial", 11)) + self.search_status.setStyleSheet(""" + color: rgba(255, 255, 255, 0.7); + padding: 10px 18px; + background: qlineargradient(x1:0, y1:0, x2:1, y2:0, + stop:0 rgba(29, 185, 84, 0.12), + stop:1 rgba(29, 185, 84, 0.08)); + border-radius: 10px; + border: 1px solid rgba(29, 185, 84, 0.25); + """) + layout.addWidget(self.search_status) + + # Search Results - The main attraction + results_container = QFrame() + results_container.setStyleSheet(""" + QFrame { + background: rgba(20, 20, 20, 0.3); + border-radius: 12px; + border: 1px solid rgba(64, 64, 64, 0.2); + } + """) + + results_layout = QVBoxLayout(results_container) + results_layout.setContentsMargins(16, 12, 16, 16) # Consistent with card padding + results_layout.setSpacing(8) + + # Results header + results_header = QLabel("Search Results") + results_header.setFont(QFont("Segoe UI", 14, QFont.Weight.Bold)) + results_header.setStyleSheet(""" + color: rgba(255, 255, 255, 0.95); + font-weight: 600; + padding: 4px 8px; + """) + results_layout.addWidget(results_header) + + # Scrollable results area - this gets ALL remaining space + self.search_results_scroll = QScrollArea() + self.search_results_scroll.setWidgetResizable(True) + self.search_results_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded) + self.search_results_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) + self.search_results_scroll.setStyleSheet(""" + QScrollArea { + border: none; + background: transparent; + border-radius: 8px; + } + QScrollBar:vertical { + background: rgba(64, 64, 64, 0.3); + width: 8px; + border-radius: 4px; + margin: 0; + } + QScrollBar::handle:vertical { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(29, 185, 84, 0.8), + stop:1 rgba(29, 185, 84, 0.6)); + border-radius: 4px; + min-height: 20px; + } + QScrollBar::handle:vertical:hover { + background: rgba(29, 185, 84, 1.0); + } + """) + + self.search_results_widget = QWidget() + self.search_results_layout = QVBoxLayout(self.search_results_widget) + self.search_results_layout.setSpacing(8) + self.search_results_layout.setContentsMargins(4, 4, 4, 4) + self.search_results_layout.addStretch() + self.search_results_scroll.setWidget(self.search_results_widget) + + results_layout.addWidget(self.search_results_scroll) + layout.addWidget(results_container, 1) # This takes all remaining space + + return section + + def create_elegant_search_bar(self): + """Create a beautiful, modern search bar""" + container = QFrame() + container.setFixedHeight(70) + container.setStyleSheet(""" + QFrame { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(50, 50, 50, 0.8), + stop:1 rgba(40, 40, 40, 0.9)); + border-radius: 12px; + border: 1px solid rgba(29, 185, 84, 0.3); + } + """) + + layout = QHBoxLayout(container) + layout.setContentsMargins(24, 16, 24, 16) # Professional spacing using 8px grid + layout.setSpacing(12) + + # Search input with enhanced styling + self.search_input = QLineEdit() + self.search_input.setPlaceholderText("Search for music... (e.g., 'Virtual Mage', 'Queen Bohemian Rhapsody')") + self.search_input.setFixedHeight(40) + self.search_input.returnPressed.connect(self.perform_search) + self.search_input.setStyleSheet(""" + QLineEdit { + background: rgba(60, 60, 60, 0.7); + border: 2px solid rgba(100, 100, 100, 0.3); + border-radius: 20px; + padding: 0 20px; + color: #ffffff; + font-size: 14px; + font-weight: 500; + } + QLineEdit:focus { + border: 2px solid rgba(29, 185, 84, 0.8); + background: rgba(70, 70, 70, 0.9); + } + QLineEdit::placeholder { + color: rgba(255, 255, 255, 0.5); + } + """) + + # Enhanced search button + self.search_btn = QPushButton("πŸ” Search") + self.search_btn.setFixedSize(120, 40) + self.search_btn.clicked.connect(self.perform_search) + self.search_btn.setStyleSheet(""" + QPushButton { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(29, 185, 84, 1.0), + stop:1 rgba(24, 156, 71, 1.0)); + border: none; + border-radius: 20px; + color: #000000; + font-size: 13px; + font-weight: bold; + } + QPushButton:hover { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(30, 215, 96, 1.0), + stop:1 rgba(25, 180, 80, 1.0)); + } + QPushButton:pressed { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(24, 156, 71, 1.0), + stop:1 rgba(20, 130, 60, 1.0)); + } + QPushButton:disabled { + background: rgba(100, 100, 100, 0.3); + color: rgba(255, 255, 255, 0.3); + } + """) + + layout.addWidget(self.search_input) + layout.addWidget(self.search_btn) + + return container + + def create_collapsible_controls_panel(self): + """Create a compact, elegant controls panel""" + panel = QFrame() + panel.setStyleSheet(""" + QFrame { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(35, 35, 35, 0.8), + stop:1 rgba(25, 25, 25, 0.9)); + border-radius: 16px; + border: 1px solid rgba(64, 64, 64, 0.3); + } + """) + + layout = QVBoxLayout(panel) + layout.setContentsMargins(16, 16, 16, 16) + layout.setSpacing(12) + + # Panel header + header = QLabel("Download Manager") + header.setFont(QFont("Arial", 14, QFont.Weight.Bold)) + header.setStyleSheet("color: rgba(255, 255, 255, 0.9); padding: 8px 0;") + layout.addWidget(header) + + # Quick stats + stats_frame = QFrame() + stats_frame.setStyleSheet(""" + QFrame { + background: rgba(45, 45, 45, 0.6); + border-radius: 8px; + border: 1px solid rgba(64, 64, 64, 0.4); + } + """) + stats_layout = QVBoxLayout(stats_frame) + stats_layout.setContentsMargins(12, 10, 12, 10) + stats_layout.setSpacing(6) + + active_downloads = QLabel("β€’ Active Downloads: 0") + active_downloads.setFont(QFont("Arial", 10)) + active_downloads.setStyleSheet("color: rgba(255, 255, 255, 0.8);") + + queue_length = QLabel("β€’ Queue Length: 0") + queue_length.setFont(QFont("Arial", 10)) + queue_length.setStyleSheet("color: rgba(255, 255, 255, 0.8);") + + stats_layout.addWidget(active_downloads) + stats_layout.addWidget(queue_length) + layout.addWidget(stats_frame) + + # Control buttons + controls_frame = QFrame() + controls_frame.setStyleSheet(""" + QFrame { + background: rgba(40, 40, 40, 0.5); + border-radius: 8px; + border: 1px solid rgba(64, 64, 64, 0.3); + } + """) + controls_layout = QVBoxLayout(controls_frame) + controls_layout.setContentsMargins(12, 12, 12, 12) + controls_layout.setSpacing(8) + + pause_btn = QPushButton("⏸️ Pause All") + pause_btn.setFixedHeight(32) + pause_btn.setStyleSheet(self._get_control_button_style("#ffa500")) + + clear_btn = QPushButton("πŸ—‘οΈ Clear Completed") + clear_btn.setFixedHeight(32) + clear_btn.clicked.connect(self.clear_completed_downloads) + clear_btn.setStyleSheet(self._get_control_button_style("#e22134")) + + controls_layout.addWidget(pause_btn) + controls_layout.addWidget(clear_btn) + layout.addWidget(controls_frame) + + # Download Queue Section + self.download_queue = DownloadQueue() + layout.addWidget(self.download_queue) + + # Add stretch to push everything to top + layout.addStretch() + + return panel + + def create_compact_status_bar(self): + """Create a minimal status bar""" + status_bar = QFrame() + status_bar.setFixedHeight(40) + status_bar.setStyleSheet(""" + QFrame { + background: rgba(20, 20, 20, 0.8); + border-radius: 8px; + border: 1px solid rgba(64, 64, 64, 0.2); + } + """) + + layout = QHBoxLayout(status_bar) + layout.setContentsMargins(16, 8, 16, 8) + layout.setSpacing(12) + + connection_status = QLabel("🟒 slskd Connected") + connection_status.setFont(QFont("Arial", 10)) + connection_status.setStyleSheet("color: rgba(29, 185, 84, 0.9);") + + layout.addWidget(connection_status) + layout.addStretch() + + download_path_info = QLabel(f"πŸ“ Downloads: {self.soulseek_client.download_path if self.soulseek_client else './downloads'}") + download_path_info.setFont(QFont("Arial", 9)) + download_path_info.setStyleSheet("color: rgba(255, 255, 255, 0.6);") + layout.addWidget(download_path_info) + + return status_bar + + def _get_control_button_style(self, color): + """Get consistent button styling""" + return f""" + QPushButton {{ + background: rgba{tuple(int(color[i:i+2], 16) for i in (1, 3, 5)) + (51,)}; + border: 1px solid {color}; + border-radius: 16px; + color: {color}; + font-size: 11px; + font-weight: bold; + padding: 6px 12px; + }} + QPushButton:hover {{ + background: rgba{tuple(int(color[i:i+2], 16) for i in (1, 3, 5)) + (77,)}; + }} + """ + def create_search_section(self): section = QFrame() section.setFixedHeight(350) @@ -916,6 +1417,32 @@ class DownloadsPage(QWidget): self.search_results_widget = QWidget() self.search_results_layout = QVBoxLayout(self.search_results_widget) self.search_results_layout.setSpacing(5) + + # Create Load More button and add to search results layout + self.load_more_btn = QPushButton("πŸ“š Load More Results") + self.load_more_btn.setFixedHeight(40) + self.load_more_btn.clicked.connect(self.show_more_results) + self.load_more_btn.setStyleSheet(""" + QPushButton { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(29, 185, 84, 0.8), + stop:1 rgba(25, 160, 75, 0.9)); + border: none; + border-radius: 20px; + color: #000000; + font-size: 12px; + font-weight: bold; + margin: 8px; + } + QPushButton:hover { + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(30, 215, 96, 0.9), + stop:1 rgba(25, 180, 80, 1.0)); + } + """) + self.load_more_btn.hide() # Initially hidden + + self.search_results_layout.addWidget(self.load_more_btn) self.search_results_layout.addStretch() self.search_results_scroll.setWidget(self.search_results_widget) @@ -929,11 +1456,11 @@ class DownloadsPage(QWidget): def perform_search(self): query = self.search_input.text().strip() if not query: - QMessageBox.warning(self, "Search Error", "Please enter a search term") + self.update_search_status("⚠️ Please enter a search term", "#ffa500") return if not self.soulseek_client: - QMessageBox.warning(self, "Connection Error", "Soulseek client not available") + self.update_search_status("❌ Soulseek client not available", "#e22134") return # Stop any existing search @@ -943,22 +1470,53 @@ class DownloadsPage(QWidget): if self.search_thread.isRunning(): self.search_thread.terminate() - # Clear previous results + # Clear previous results and reset state self.clear_search_results() + self.displayed_results = 0 + if self.load_more_btn: + self.load_more_btn.hide() - # Update UI - self.search_btn.setText("πŸ”„ Searching...") + # Enhanced searching state with animation + self.search_btn.setText("πŸ” Searching...") self.search_btn.setEnabled(False) - self.search_status.setText(f"Searching for: {query}") + self.update_search_status(f"πŸ” Searching for '{query}'... Results will appear as they are found", "#1db954") # Start new search thread self.search_thread = SearchThread(self.soulseek_client, query) self.search_thread.search_completed.connect(self.on_search_completed) self.search_thread.search_failed.connect(self.on_search_failed) self.search_thread.search_progress.connect(self.on_search_progress) + self.search_thread.search_results_partial.connect(self.on_search_results_partial) self.search_thread.finished.connect(self.on_search_thread_finished) self.search_thread.start() + def update_search_status(self, message, color="#ffffff"): + """Update search status with enhanced styling""" + self.search_status.setText(message) + + if color == "#1db954": # Success/searching + bg_color = "rgba(29, 185, 84, 0.15)" + border_color = "rgba(29, 185, 84, 0.3)" + elif color == "#ffa500": # Warning + bg_color = "rgba(255, 165, 0, 0.15)" + border_color = "rgba(255, 165, 0, 0.3)" + elif color == "#e22134": # Error + bg_color = "rgba(226, 33, 52, 0.15)" + border_color = "rgba(226, 33, 52, 0.3)" + else: # Default + bg_color = "rgba(100, 100, 100, 0.1)" + border_color = "rgba(100, 100, 100, 0.2)" + + self.search_status.setStyleSheet(f""" + color: {color}; + padding: 12px 20px; + background: qlineargradient(x1:0, y1:0, x2:1, y2:0, + stop:0 {bg_color}, + stop:1 rgba(255, 255, 255, 0.02)); + border-radius: 12px; + border: 1px solid {border_color}; + """) + def on_search_thread_finished(self): """Clean up when search thread finishes""" if self.search_thread: @@ -976,46 +1534,176 @@ class DownloadsPage(QWidget): else: self.search_results_layout.removeItem(item) + def on_search_results_partial(self, new_results, total_count): + """Handle progressive search results as they come in""" + # Sort new results by quality score + new_results.sort(key=lambda x: x.quality_score, reverse=True) + + # Add new result items to UI immediately + for result in new_results: + result_item = SearchResultItem(result) + result_item.download_requested.connect(self.start_download) + # Insert before the Load More button (which is before the stretch) + insert_position = self.search_results_layout.count() - 2 + self.search_results_layout.insertWidget(insert_position, result_item) + + # Update displayed count + self.displayed_results += len(new_results) + + # Update status message with real-time feedback + self.update_search_status(f"✨ Found {total_count} results so far β€’ Still searching...", "#1db954") + + # If we have enough results, show the Load More button + if total_count >= self.results_per_page and self.load_more_btn: + # Don't show Load More yet during live search - wait for completion + pass + def on_search_completed(self, results): self.search_btn.setText("πŸ” Search") self.search_btn.setEnabled(True) if not results: - self.search_status.setText("No results found. Try a different search term.") + # Only show no results if we haven't already displayed some via progressive loading + if self.displayed_results == 0: + self.update_search_status("πŸ˜” No results found β€’ Try a different search term or artist name", "#ffa500") + else: + # Search completed with some results already shown + self.update_search_status(f"✨ Search completed β€’ Found {self.displayed_results} total results", "#1db954") return - # Sort results by quality score (best first) - results.sort(key=lambda x: x.quality_score, reverse=True) + # Store all results for pagination + self.search_results = results - # Take top 10 results to avoid overwhelming the UI - top_results = results[:10] + # If we already have results from progressive loading, just finalize the status + if self.displayed_results > 0: + total_results = len(results) + remaining = total_results - self.displayed_results + + if remaining > 0: + # Show Load More button for remaining results + self.update_search_status(f"✨ Showing {self.displayed_results} of {total_results} results β€’ {remaining} more available", "#1db954") + if self.load_more_btn: + self.load_more_btn.show() + self.load_more_btn.setText(f"πŸ“š Load {min(remaining, self.results_per_page)} More Results") + else: + # All results already displayed + self.update_search_status(f"✨ Showing all {total_results} results", "#1db954") + if self.load_more_btn: + self.load_more_btn.hide() + else: + # Fallback: No progressive results, show first page normally + self.search_results.sort(key=lambda x: x.quality_score, reverse=True) + self.clear_search_results() + self.displayed_results = 0 + self.show_more_results() + + def clear_search_results(self): + """Clear all search result items from the layout""" + # Remove all SearchResultItem widgets (but keep Load More button and stretch) + items_to_remove = [] + for i in range(self.search_results_layout.count()): + item = self.search_results_layout.itemAt(i) + if item and item.widget() and isinstance(item.widget(), SearchResultItem): + items_to_remove.append(item.widget()) - self.search_status.setText(f"Found {len(results)} results (showing top {len(top_results)})") + for widget in items_to_remove: + self.search_results_layout.removeWidget(widget) + widget.deleteLater() + + def show_more_results(self): + """Show the next batch of search results""" + if not self.search_results: + return + + # Calculate how many more results to show + start_index = self.displayed_results + end_index = min(start_index + self.results_per_page, len(self.search_results)) + + # Only add results that haven't been displayed yet + # (Progressive loading may have already shown some results) + currently_displayed = self.count_displayed_results() # Add result items to UI - for result in top_results: - result_item = SearchResultItem(result) - result_item.download_requested.connect(self.start_download) - # Insert before the stretch item - self.search_results_layout.insertWidget(self.search_results_layout.count() - 1, result_item) + for i in range(max(start_index, currently_displayed), end_index): + if i < len(self.search_results): + result = self.search_results[i] + result_item = SearchResultItem(result) + result_item.download_requested.connect(self.start_download) + # Insert before the Load More button (which is before the stretch) + insert_position = self.search_results_layout.count() - 2 + self.search_results_layout.insertWidget(insert_position, result_item) + + # Update displayed count + self.displayed_results = end_index + + # Update status and Load More button + self.update_load_more_status() + + def count_displayed_results(self): + """Count how many SearchResultItem widgets are currently displayed""" + count = 0 + for i in range(self.search_results_layout.count()): + item = self.search_results_layout.itemAt(i) + if item and item.widget() and isinstance(item.widget(), SearchResultItem): + count += 1 + return count + + def update_load_more_status(self): + """Update status message and Load More button based on current state""" + if not self.search_results: + return + + total_results = len(self.search_results) + if self.displayed_results >= total_results: + self.update_search_status(f"✨ Showing all {total_results} results by quality", "#1db954") + if self.load_more_btn: + self.load_more_btn.hide() + else: + remaining = total_results - self.displayed_results + self.update_search_status(f"✨ Showing {self.displayed_results} of {total_results} results β€’ {remaining} more available", "#1db954") + if self.load_more_btn: + self.load_more_btn.show() + self.load_more_btn.setText(f"πŸ“š Load {min(remaining, self.results_per_page)} More Results") def on_search_failed(self, error_msg): self.search_btn.setText("πŸ” Search") self.search_btn.setEnabled(True) - self.search_status.setText(f"Search failed: {error_msg}") - QMessageBox.critical(self, "Search Error", f"Search failed: {error_msg}") + self.update_search_status(f"❌ Search failed: {error_msg}", "#e22134") def on_search_progress(self, message): - self.search_status.setText(message) + self.update_search_status(f"πŸ” {message}", "#1db954") def start_download(self, search_result): """Start downloading a search result using threaded approach""" try: + # Extract track info for queue display + filename = search_result.filename + parts = filename.split(' - ') + if len(parts) >= 2: + artist = parts[0].strip() + title = ' - '.join(parts[1:]).strip() + # Remove file extension + if '.' in title: + title = '.'.join(title.split('.')[:-1]) + else: + title = filename + artist = search_result.username + + # Add to download queue immediately as "downloading" + download_item = self.download_queue.add_download_item( + title=title, + artist=artist, + status="downloading", + progress=0, + file_size=search_result.size + ) + # Create and start download thread download_thread = DownloadThread(self.soulseek_client, search_result) - download_thread.download_completed.connect(self.on_download_completed) - download_thread.download_failed.connect(self.on_download_failed) - download_thread.download_progress.connect(self.on_download_progress) + download_thread.download_item = download_item # Store reference + download_thread.download_completed.connect(lambda msg, item=download_item: self.on_download_completed(msg, item)) + download_thread.download_failed.connect(lambda msg, item=download_item: self.on_download_failed(msg, item)) + download_thread.download_progress.connect(lambda msg, item=download_item: self.on_download_progress(msg, item)) download_thread.finished.connect(lambda: self.on_download_thread_finished(download_thread)) # Track the thread @@ -1037,19 +1725,28 @@ class DownloadsPage(QWidget): except Exception as e: QMessageBox.critical(self, "Download Error", f"Failed to start download: {str(e)}") - def on_download_completed(self, message): + def on_download_completed(self, message, download_item): """Handle successful download start""" - # Could update download queue UI here print(f"Download success: {message}") - - def on_download_failed(self, error_msg): + # Update download item status to completed + download_item.status = "completed" + download_item.progress = 100 + # TODO: Add actual file path from download result + + def on_download_failed(self, error_msg, download_item): """Handle download failure""" + print(f"Download failed: {error_msg}") + # Update download item status to failed + download_item.status = "failed" + download_item.progress = 0 QMessageBox.critical(self, "Download Failed", f"Download failed: {error_msg}") - def on_download_progress(self, message): + def on_download_progress(self, message, download_item): """Handle download progress updates""" - # Could update status or progress UI here print(f"Download progress: {message}") + # Extract progress percentage if available from message + # For now just show as downloading + download_item.status = "downloading" def on_download_thread_finished(self, thread): """Clean up when download thread finishes""" @@ -1057,6 +1754,65 @@ class DownloadsPage(QWidget): self.download_threads.remove(thread) thread.deleteLater() + def clear_completed_downloads(self): + """Clear completed downloads from the queue""" + self.download_queue.clear_completed_downloads() + + def update_download_status(self): + """Poll slskd API for download status updates (QTimer callback)""" + if not self.soulseek_client or not self.download_queue.download_items: + return + + # Create a thread to handle the async operation + from PyQt6.QtCore import QThread, pyqtSignal + + class StatusUpdateThread(QThread): + status_updated = pyqtSignal(list) + + def __init__(self, soulseek_client): + super().__init__() + self.soulseek_client = soulseek_client + + def run(self): + import asyncio + try: + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + downloads = loop.run_until_complete(self.soulseek_client.get_all_downloads()) + self.status_updated.emit(downloads or []) + except Exception as e: + print(f"Error fetching download status: {e}") + self.status_updated.emit([]) + finally: + if 'loop' in locals(): + loop.close() + + def handle_status_update(downloads): + """Handle the download status update in the main thread""" + try: + for download_item in self.download_queue.download_items: + # Find matching download by filename + filename = f"{download_item.artist} - {download_item.title}" + + for download in downloads: + if filename.lower() in download.filename.lower(): + # Update the UI item with real data + download_item.update_status( + status=download.state, + progress=int(download.progress), + download_speed=download.speed, + file_path=download.filename + ) + break + except Exception as e: + print(f"Error updating download UI: {e}") + + # Start the status update thread + status_thread = StatusUpdateThread(self.soulseek_client) + status_thread.status_updated.connect(handle_status_update) + status_thread.finished.connect(status_thread.deleteLater) + status_thread.start() + def cleanup_all_threads(self): """Stop and cleanup all active threads"""