From fc9b5f375ab9e4e33b3c558d1c414eb3ed740599 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Wed, 9 Jul 2025 22:06:24 -0700 Subject: [PATCH] basic downloads --- .../soulseek_client.cpython-312.pyc | Bin 31013 -> 32134 bytes core/soulseek_client.py | 118 +++-- logs/app.log | 481 ++++++++++++++++++ .../__pycache__/downloads.cpython-312.pyc | Bin 62228 -> 61965 bytes ui/pages/downloads.py | 427 +++++++++------- 5 files changed, 777 insertions(+), 249 deletions(-) diff --git a/core/__pycache__/soulseek_client.cpython-312.pyc b/core/__pycache__/soulseek_client.cpython-312.pyc index 60cff0df7c6cc59c79cc7b9b69861d795df11567..1e891a6e882caaeb92b1a8d115df746ad581aea7 100644 GIT binary patch delta 4637 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 Vcpnh{-U(llpg@{?6rs`K`G0xZ5#0a) delta 3610 zcmai0Yfu~472dnjN=RA>fdrBeLK2by@kTsMFf_)1csVfOS4?8C$_fl260GFd5Xs8J zlaQID#dF)lZtR3i(gxQ~O)5`I(?@M&uMQVkgb; zoKmMugJK2*jN}B>lgwl>H1bK&R~GXpIR!C)5|fPlaz>6kJZF+KCC2iZloR}()L5Q4 zLo%s|QEbF12l$Kv*=dYER#S<02hjF-QUQ~OlBT2W$^nu|M}ewXa>^-iiUvqrB36cE zRLG}BzAYZKLycI?#%>MLGnkAMM30uyBFr4mv>Kwa-R>hJ9;fq>hLIts%i9l7%HToq z>qeMw%aq8G^)&k4J|hfv*$T;QZ!)rCYZ&|PSw8YSfQ~)sBp~3s6?&o4N4-p(B_XIZ ziqn{MY%!{{uy;=eCGZJ6D(H~wfg0Xlp@GX4N}k56fGbr7IAM@rJCNZ`OBC=4yy*%3 zJQ>$mi5DL}wtRx~xO22zfYIWj2^$cDgkSi7GVy!@f0E1O-N;N3!xTY4w>*WHxzST= zg{fS(rCw4ZKRQy@Szf{dgfFR)m;wjQ1mPF?MDUO?Em_YP50-LujwD z>DZ{V-|J*zrolacvdZF>J%xrrw->cUm2|=bB|aFfc`_vn{Q*7re)zo^3(kw~1-3Ph4-ms}}Ro6G!@u|Z2nLPa^`XtTic17e5tf@3pqRmXDmz1-v za9I;qYUeb~5xV8Gc#Qz3wSAb+?d^{^hazpmm&#|4N6PKosE@PxInD719k{O3Pj;X# zAr-S+3&PZhk;KVyB}#aSw6 z`#5z|gtlKd=HDh%QrnbtO`Er>4HSm7g)=>KsbOvHRMMK-vZ}U*)Yh5YSzB0LHAQV4 z>C}|RaRijclyRbLa**M#-8s{wsONZ&Bu5Z1S#J^41Sswb4+ zbNVoMXlSbWhR(WXjD2**HG}m{>1)!Np|GKP&6xkD?ls-av9Pgv&5*m6zil;tdnkW9 zSNp)ySUA6H&0<@%RD~>6v;KKU*wS*ZeMceAN}sZ?rxR(zrd6diq_ocDe4;G7WkE+- zm!Rpa+X$(4mDY#Q$6Pn>ykCor_v=cLzE}i0()o+Ul}NvA0v#IuWi#IJ0fA#a06QhfSfa79B(+n> zxR#2IYYLp{T6zpMG0e^sb&7b`ESgR}@7i|&*6*iK=*N5t=^u-Doix0;qmaB#!Fu^F z=%{bxGlDZD4ApyJP^^Iacb36VA6CLMJ0lym1w7FDX&405p;w5kM) zB^IP#R+5OnoQ^{;t2CG?twYQQ#i}+Ld4&RPwBU-sg7pF%d8G(PUMbcfW=W_EAZp2s zsU-_Qb(Zo(txDcfnYuNZcU2@n-mA$JVy-HASXTj5;A)1bO+;NaY1{bJ)$ib#Wj=+N zWf6{9rU6R5EEBcWQOhcATQ#+8i^Wt^n5n}tD}<=MfVU!2w<~gZD@F>HU&)~`RlsX6 z4kmS0lY(dQRNsR3u780`u)KQ@cse-QeUk^Cg`@lG%)h|iUt+*N5{qBs*f|Wp!tf4; zU&GM8O7IF4?$-<6#l$Qu+}{n(1Oxlek>D+8?WqO7fdf4|!Mnk8J>TPjbFjKMHz$Zg zaZ;;r%R}WdBBH{?!vnDJ*X-6uvVW06&5?V+RDk$BsY3(_?1vIsDz27W@H5$9l+rgJ2c= zq5yQlkB&8glkmxLH7pp{g59ur{JxldU%`GfI1hUBMUU|7Ni5DVUwX-h0HvPxtP@zy_Q&P?hUB_? qxQBW}-F>%X?)3@y!^fAwi|~-|9QhRiCH|4*y-7fNi@+E=?tcN{h~%aK diff --git a/core/soulseek_client.py b/core/soulseek_client.py index e6f938c1..de5550a6 100644 --- a/core/soulseek_client.py +++ b/core/soulseek_client.py @@ -201,7 +201,40 @@ class SoulseekClient: except: pass - async def search(self, query: str, timeout: int = 10) -> List[SearchResult]: + def _process_search_responses(self, responses_data: List[Dict[str, Any]]) -> List[SearchResult]: + """Process search response data into SearchResult objects""" + search_results = [] + + logger.debug(f"Processing {len(responses_data)} user responses") + + for response_data in responses_data: + username = response_data.get('username', '') + files = response_data.get('files', []) + logger.debug(f"User {username} has {len(files)} files") + + for file_data in files: + filename = file_data.get('filename', '') + size = file_data.get('size', 0) + + file_ext = Path(filename).suffix.lower().lstrip('.') + quality = file_ext if file_ext in ['flac', 'mp3', 'ogg', 'aac', 'wma'] else 'unknown' + + result = SearchResult( + username=username, + filename=filename, + size=size, + bitrate=file_data.get('bitRate'), + duration=file_data.get('length'), + quality=quality, + free_upload_slots=response_data.get('freeUploadSlots', 0), + upload_speed=response_data.get('uploadSpeed', 0), + queue_length=response_data.get('queueLength', 0) + ) + search_results.append(result) + + return search_results + + async def search(self, query: str, timeout: int = 30) -> List[SearchResult]: if not self.base_url: logger.error("Soulseek client not configured") return [] @@ -233,59 +266,40 @@ class SoulseekClient: logger.info(f"Search initiated with ID: {search_id}") - # Wait for search to complete (reduced timeout for testing) - await asyncio.sleep(timeout) + # Poll for results instead of blocking sleep - like web interface does + all_results = [] + poll_interval = 1.5 # Check every 1.5 seconds for more responsive updates + max_polls = int(timeout / poll_interval) # 20 attempts over 30 seconds - logger.debug(f"Getting results for search ID: {search_id}") - - # Use the correct endpoint to get search responses (actual files) - responses_data = await self._make_request('GET', f'searches/{search_id}/responses') - if not responses_data: - logger.error("No response from search responses GET request") - return [] - - logger.debug(f"Responses data type: {type(responses_data)}") - logger.debug(f"Responses data length: {len(responses_data) if isinstance(responses_data, list) else 'Not a list'}") - - search_results = [] - - # responses_data should be a list of user responses - if isinstance(responses_data, list): - responses = responses_data - else: - logger.error(f"Expected list of responses, got: {type(responses_data)}") - return [] + for poll_count in range(max_polls): + logger.debug(f"Polling for results (attempt {poll_count + 1}/{max_polls}) - elapsed: {poll_count * poll_interval:.1f}s") - logger.info(f"Processing {len(responses)} user responses") - - for response_data in responses: - username = response_data.get('username', '') - files = response_data.get('files', []) - logger.debug(f"User {username} has {len(files)} files") + # Get current search responses + responses_data = await self._make_request('GET', f'searches/{search_id}/responses') + if responses_data and isinstance(responses_data, list): + current_results = self._process_search_responses(responses_data) + + # Add new unique results + existing_filenames = {r.filename for r in all_results} + new_results = [r for r in current_results if r.filename not in existing_filenames] + all_results.extend(new_results) + + if new_results: + logger.info(f"Found {len(new_results)} new results (total: {len(all_results)}) at {poll_count * poll_interval:.1f}s") + elif len(all_results) > 0: + logger.debug(f"No new results, total still: {len(all_results)}") + else: + logger.debug(f"Still waiting for results... ({poll_count * poll_interval:.1f}s elapsed)") - for file_data in files: - filename = file_data.get('filename', '') - size = file_data.get('size', 0) - - file_ext = Path(filename).suffix.lower().lstrip('.') - quality = file_ext if file_ext in ['flac', 'mp3', 'ogg', 'aac', 'wma'] else 'unknown' - - result = SearchResult( - username=username, - filename=filename, - size=size, - bitrate=file_data.get('bitRate'), - duration=file_data.get('length'), - quality=quality, - free_upload_slots=response_data.get('freeUploadSlots', 0), - upload_speed=response_data.get('uploadSpeed', 0), - queue_length=response_data.get('queueLength', 0) - ) - search_results.append(result) + # Wait before next poll (unless this is the last attempt) + if poll_count < max_polls - 1: + await asyncio.sleep(poll_interval) - search_results.sort(key=lambda x: x.quality_score, reverse=True) - logger.info(f"Found {len(search_results)} results for query: {query}") - return search_results + logger.info(f"Search completed. Found {len(all_results)} total results for query: {query}") + + # Sort by quality score and return + all_results.sort(key=lambda x: x.quality_score, reverse=True) + return all_results except Exception as e: logger.error(f"Error searching: {e}") @@ -301,10 +315,12 @@ class SoulseekClient: # Use the exact format observed in the web interface # Payload: [{filename: "...", size: 123}] - array of files + # Try adding path parameter to see if slskd supports custom download paths download_data = [ { "filename": filename, - "size": file_size + "size": file_size, + "path": str(self.download_path) # Try custom download path } ] diff --git a/logs/app.log b/logs/app.log index 2f61deac..0a82c805 100644 --- a/logs/app.log +++ b/logs/app.log @@ -3955,3 +3955,484 @@ 2025-07-09 21:44:16 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... 2025-07-09 21:44:16 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... 2025-07-09 21:44:16 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 21:44:40 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 21:44:40 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 21:44:40 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 21:44:40 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 21:44:40 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 21:44:40 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 21:44:41 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 21:44:41 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 21:44:41 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 21:44:42 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 21:44:43 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 21:44:44 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 21:44:46 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 21:44:47 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 21:44:52 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 21:44:59 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 21:51:01 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 21:51:01 - newmusic.main - INFO - closeEvent:157 - Cleaning up Downloads page threads... +2025-07-09 21:51:01 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... +2025-07-09 21:51:03 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... +2025-07-09 21:51:03 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 21:57:34 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 21:57:34 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 21:57:34 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 21:57:34 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 21:57:34 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 21:57:34 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 21:57:35 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 21:57:35 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 21:57:35 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 21:57:38 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 21:57:39 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 21:57:40 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 21:57:41 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 21:57:46 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 21:57:46 - newmusic.main - INFO - change_page:139 - Changed to page: sync +2025-07-09 21:57:53 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 21:57:57 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 21:58:03 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'Virtual Mage' +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'Virtual Mage', 'timeout': 15000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'Virtual Mage', 'timeout': 15000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"6ea08485-f94a-49cd-8fc1-bbd0813a7422","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"Virtual Mage","startedAt":"2025-07-10T04:58:03.4074246Z","state":"InProgress","token":92}... +2025-07-09 21:58:03 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: 6ea08485-f94a-49cd-8fc1-bbd0813a7422 +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/7) +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:03 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:05 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/7) +2025-07-09 21:58:05 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:05 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:05 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:05 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:07 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/7) +2025-07-09 21:58:07 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:07 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:08 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:08 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:10 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/7) +2025-07-09 21:58:10 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:10 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:10 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:10 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:12 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/7) +2025-07-09 21:58:12 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:12 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:12 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:12 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:14 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/7) +2025-07-09 21:58:14 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:14 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:15 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:15 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:17 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/7) +2025-07-09 21:58:17 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6ea08485-f94a-49cd-8fc1-bbd0813a7422/responses +2025-07-09 21:58:17 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:17 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:17 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:19 - newmusic.soulseek_client - INFO - search:293 - Search completed. Found 0 total results for query: Virtual Mage +2025-07-09 21:58:44 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'Virtual Mage - Aether' +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'Virtual Mage - Aether', 'timeout': 15000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'Virtual Mage - Aether', 'timeout': 15000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"6667776b-fbc6-4c69-8997-df5702cd4df0","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"Virtual Mage - Aether","startedAt":"2025-07-10T04:58:44.5710082Z","state":"InProgress","token":93}... +2025-07-09 21:58:44 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: 6667776b-fbc6-4c69-8997-df5702cd4df0 +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/7) +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:44 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:46 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/7) +2025-07-09 21:58:46 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:46 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:47 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:47 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:49 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/7) +2025-07-09 21:58:49 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:49 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:49 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:49 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:51 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/7) +2025-07-09 21:58:51 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:51 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:51 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:51 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:53 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/7) +2025-07-09 21:58:53 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:53 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:53 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:53 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:55 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/7) +2025-07-09 21:58:55 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:55 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:56 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:56 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:58:58 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/7) +2025-07-09 21:58:58 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/6667776b-fbc6-4c69-8997-df5702cd4df0/responses +2025-07-09 21:58:58 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 21:58:58 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 21:58:58 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 21:59:00 - newmusic.soulseek_client - INFO - search:293 - Search completed. Found 0 total results for query: Virtual Mage - Aether +2025-07-09 22:01:02 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 22:01:02 - newmusic.main - INFO - closeEvent:157 - Cleaning up Downloads page threads... +2025-07-09 22:01:02 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... +2025-07-09 22:01:02 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... +2025-07-09 22:01:02 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 22:02:15 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 22:02:15 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 22:02:15 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 22:02:45 - newmusic.plex_client - ERROR - _setup_client:87 - Failed to connect to Plex server: HTTPConnectionPool(host='192.168.86.36', port=32400): Read timed out. (read timeout=30) +2025-07-09 22:02:45 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 22:02:46 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 22:02:46 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 22:02:46 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 22:02:49 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 22:02:49 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 22:02:51 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 22:02:52 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 22:02:54 - newmusic.main - INFO - change_page:139 - Changed to page: settings +2025-07-09 22:02:57 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 22:03:04 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 22:03:26 - newmusic.plex_client - ERROR - _setup_client:87 - Failed to connect to Plex server: HTTPConnectionPool(host='192.168.86.36', port=32400): Read timed out. (read timeout=30) +2025-07-09 22:04:22 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 22:04:22 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 22:04:24 - newmusic.main - INFO - closeEvent:152 - Closing application... +2025-07-09 22:04:24 - newmusic.main - INFO - closeEvent:157 - Cleaning up Downloads page threads... +2025-07-09 22:04:24 - newmusic.main - INFO - closeEvent:162 - Stopping status monitoring thread... +2025-07-09 22:04:25 - newmusic.main - INFO - closeEvent:167 - Closing Soulseek client... +2025-07-09 22:04:25 - newmusic.main - INFO - closeEvent:173 - Application closed successfully +2025-07-09 22:04:28 - newmusic - INFO - setup_logging:57 - Logging initialized with level: DEBUG +2025-07-09 22:04:28 - newmusic.main - INFO - main:187 - Starting NewMusic application +2025-07-09 22:04:28 - newmusic.spotify_client - INFO - _setup_client:84 - Successfully authenticated with Spotify as broquethomas +2025-07-09 22:04:28 - newmusic.plex_client - INFO - _find_music_library:98 - Found music library: Music +2025-07-09 22:04:28 - newmusic.plex_client - INFO - _setup_client:84 - Successfully connected to Plex server: PLEX-MACHINE +2025-07-09 22:04:28 - newmusic.soulseek_client - INFO - _setup_client:87 - Soulseek client configured with slskd at http://localhost:5030 +2025-07-09 22:04:29 - newmusic.main - INFO - change_page:139 - Changed to page: dashboard +2025-07-09 22:04:29 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Aether +2025-07-09 22:04:29 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Favorite Artists +2025-07-09 22:04:32 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Brittnea +2025-07-09 22:04:33 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Baleigh +2025-07-09 22:04:34 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Extra Music +2025-07-09 22:04:35 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Maggi Main +2025-07-09 22:04:40 - newmusic.spotify_client - INFO - get_user_playlists:106 - Fetching tracks for playlist: Broque Main +2025-07-09 22:04:46 - newmusic.spotify_client - INFO - get_user_playlists:113 - Retrieved 7 playlists +2025-07-09 22:04:50 - newmusic.main - INFO - change_page:139 - Changed to page: downloads +2025-07-09 22:04:56 - newmusic.soulseek_client - INFO - search:243 - Starting search for: 'virtual mage' +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - search:253 - Search data: {'searchText': 'virtual mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - search:254 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/searches +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: {'searchText': 'virtual mage', 'timeout': 30000, 'filterResponses': True, 'minimumResponseFileCount': 1, 'minimumPeerUploadSpeed': 0} +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: {"fileCount":0,"id":"d3790420-d533-495a-8ae4-fa21a572eaaa","isComplete":false,"lockedFileCount":0,"responseCount":0,"responses":[],"searchText":"virtual mage","startedAt":"2025-07-10T05:04:56.4191321Z","state":"InProgress","token":94}... +2025-07-09 22:04:56 - newmusic.soulseek_client - INFO - search:267 - Search initiated with ID: d3790420-d533-495a-8ae4-fa21a572eaaa +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 1/20) - elapsed: 0.0s +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:04:56 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:04:58 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 2/20) - elapsed: 1.5s +2025-07-09 22:04:58 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:04:58 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:04:58 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:04:58 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:04:59 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 3/20) - elapsed: 3.0s +2025-07-09 22:04:59 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:04:59 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:00 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:00 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:01 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 4/20) - elapsed: 4.5s +2025-07-09 22:05:01 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:01 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:02 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:02 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:03 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 5/20) - elapsed: 6.0s +2025-07-09 22:05:03 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:03 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:03 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:03 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:05 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 6/20) - elapsed: 7.5s +2025-07-09 22:05:05 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:05 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:05 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:05 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:07 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 7/20) - elapsed: 9.0s +2025-07-09 22:05:07 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:07 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:07 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:07 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:08 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 8/20) - elapsed: 10.5s +2025-07-09 22:05:08 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:08 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:09 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:09 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:10 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 9/20) - elapsed: 12.0s +2025-07-09 22:05:10 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:10 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:10 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:10 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:12 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 10/20) - elapsed: 13.5s +2025-07-09 22:05:12 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:12 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:12 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:12 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: []... +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 11/20) - elapsed: 15.0s +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:14 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:14 - newmusic.soulseek_client - INFO - search:288 - Found 406 new results (total: 406) at 15.0s +2025-07-09 22:05:15 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 12/20) - elapsed: 16.5s +2025-07-09 22:05:15 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:15 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:16 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:17 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 13/20) - elapsed: 18.0s +2025-07-09 22:05:17 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:17 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:18 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 14/20) - elapsed: 19.5s +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:19 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 15/20) - elapsed: 21.0s +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:21 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 16/20) - elapsed: 22.5s +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:23 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:24 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 17/20) - elapsed: 24.0s +2025-07-09 22:05:24 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:24 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:25 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 18/20) - elapsed: 25.5s +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:26 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 19/20) - elapsed: 27.0s +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:28 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - search:275 - Polling for results (attempt 20/20) - elapsed: 28.5s +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making GET request to: http://localhost:5030/api/v0/searches/d3790420-d533-495a-8ae4-fa21a572eaaa/responses +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _make_request:121 - Response status: 200 +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _make_request:122 - Response text: [{"fileCount":2,"files":[{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\03 - Virtual Mage - Breaking the Dream (Lucid Dream Edit).ogg","isVariableBitRate":false,"length":256,"size":6269644,"isLocked":false},{"bitRate":160,"code":1,"extension":"","filename":"Music\\aofd3\\Mallsoft & Shopping Mall Ambience\\09 - Virtual Mage - Moondust.ogg","isVariableBitRate":false,"length":138,"size":4266916,"isLocked":false}],"hasFreeUploadSlot":true,"lockedF... +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:208 - Processing 17 user responses +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User zeroscan has 2 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User buk4 has 1 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Letham has 3 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User nightmare_dronemk12 has 3 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Ultravod has 9 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User RuuqoHoosk has 346 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User koalabeer has 3 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User raspberry2 has 10 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User KindaRatchet has 1 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User HomotopicCensorship has 3 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Kaya-Sem has 1 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User belthane has 3 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User leonardoclk has 3 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Dax_VR has 10 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User exsanguinidraculae has 2 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User ofoijacussa has 0 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - _process_search_responses:213 - User Shooby has 6 files +2025-07-09 22:05:30 - newmusic.soulseek_client - DEBUG - search:290 - No new results, total still: 406 +2025-07-09 22:05:30 - newmusic.soulseek_client - INFO - search:298 - Search completed. Found 406 total results for query: virtual mage +2025-07-09 22:05:45 - newmusic.soulseek_client - DEBUG - download:314 - Attempting to download: @@bmlwc\Soulseek Downloads\c34wkpcv\Relaxing Synthwave Top 105\083 - Virtual Mage - Aether.mp3 from buk4 (size: 8344437) +2025-07-09 22:05:45 - newmusic.soulseek_client - DEBUG - download:327 - Using web interface API format: [{'filename': '@@bmlwc\\Soulseek Downloads\\c34wkpcv\\Relaxing Synthwave Top 105\\083 - Virtual Mage - Aether.mp3', 'size': 8344437, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +2025-07-09 22:05:45 - newmusic.soulseek_client - DEBUG - download:331 - Trying web interface endpoint: transfers/downloads/buk4 +2025-07-09 22:05:45 - newmusic.soulseek_client - DEBUG - _make_request:109 - Making POST request to: http://localhost:5030/api/v0/transfers/downloads/buk4 +2025-07-09 22:05:45 - newmusic.soulseek_client - DEBUG - _make_request:110 - Headers: {'Content-Type': 'application/json', 'X-API-Key': '1234567891234567'} +2025-07-09 22:05:45 - newmusic.soulseek_client - DEBUG - _make_request:112 - JSON payload: [{'filename': '@@bmlwc\\Soulseek Downloads\\c34wkpcv\\Relaxing Synthwave Top 105\\083 - Virtual Mage - Aether.mp3', 'size': 8344437, 'path': 'E:\\Broque Projects\\newMusic\\downloads'}] +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 diff --git a/ui/pages/__pycache__/downloads.cpython-312.pyc b/ui/pages/__pycache__/downloads.cpython-312.pyc index f8091661f0aa4c01c557e40de70be2ebc6ff3a4b..de68df995cd67cca288ee0ee7a2fcaf4c94888cf 100644 GIT binary patch delta 10802 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 diff --git a/ui/pages/downloads.py b/ui/pages/downloads.py index 49701b2c..b758d31b 100644 --- a/ui/pages/downloads.py +++ b/ui/pages/downloads.py @@ -237,91 +237,267 @@ class SearchResultItem(QFrame): def __init__(self, search_result, parent=None): super().__init__(parent) self.search_result = search_result + self.is_downloading = False self.setup_ui() def setup_ui(self): - self.setFixedHeight(60) + self.setFixedHeight(120) # Increased height for better spacing self.setStyleSheet(""" SearchResultItem { - background: #282828; - border-radius: 6px; - border: 1px solid #404040; - margin: 2px; + 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)); + border-radius: 12px; + border: 1px solid rgba(64, 64, 64, 0.8); + margin: 8px; } SearchResultItem:hover { - background: #333333; - border: 1px solid #1db954; + 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); } """) layout = QHBoxLayout(self) - layout.setContentsMargins(15, 10, 15, 10) - layout.setSpacing(12) + layout.setContentsMargins(20, 15, 20, 15) + layout.setSpacing(20) - # File info - info_layout = QVBoxLayout() - info_layout.setSpacing(3) + # Album art placeholder + album_art = QLabel() + album_art.setFixedSize(80, 80) + 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); + } + """) + album_art.setAlignment(Qt.AlignmentFlag.AlignCenter) + album_art.setText("đŸŽĩ") + album_art.setFont(QFont("Arial", 24)) - # Filename - filename_label = QLabel(self.search_result.filename) - filename_label.setFont(QFont("Arial", 10, QFont.Weight.Medium)) - filename_label.setStyleSheet("color: #ffffff;") - filename_label.setWordWrap(True) + # Main content area + content_layout = QVBoxLayout() + content_layout.setSpacing(8) - # Details - details = [] - if self.search_result.bitrate: - details.append(f"{self.search_result.bitrate}kbps") - details.append(self.search_result.quality.upper()) - details.append(f"{self.search_result.size // (1024*1024)}MB") - details.append(f"User: {self.search_result.username}") + # Primary info (song/artist extracted from filename) + primary_info = self._extract_song_info() - details_label = QLabel(" â€ĸ ".join(details)) - details_label.setFont(QFont("Arial", 9)) - details_label.setStyleSheet("color: #b3b3b3;") + # Song title + 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) - info_layout.addWidget(filename_label) - info_layout.addWidget(details_label) + # 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;") - # Quality indicator - quality_label = QLabel(f"★ {self.search_result.quality_score:.1f}") - quality_label.setFixedWidth(50) - quality_label.setAlignment(Qt.AlignmentFlag.AlignCenter) - quality_label.setFont(QFont("Arial", 9, QFont.Weight.Bold)) + # Technical details + tech_layout = QHBoxLayout() + tech_layout.setSpacing(15) + + # Quality badge + quality_badge = self._create_quality_badge() + tech_layout.addWidget(quality_badge) + + # File size + 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) + + # 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) + + tech_layout.addStretch() + + # User info + user_layout = QHBoxLayout() + user_layout.setSpacing(10) + + # User avatar placeholder + user_avatar = QLabel("👤") + user_avatar.setFont(QFont("Arial", 14)) + user_avatar.setStyleSheet("color: #1db954;") + + # Username + username_label = QLabel(self.search_result.username) + username_label.setFont(QFont("Arial", 11, QFont.Weight.Medium)) + username_label.setStyleSheet("color: #1db954;") + + # Upload speed indicator + speed_indicator = self._create_speed_indicator() + + user_layout.addWidget(user_avatar) + user_layout.addWidget(username_label) + user_layout.addWidget(speed_indicator) + user_layout.addStretch() + + content_layout.addWidget(song_title) + content_layout.addWidget(artist_info) + content_layout.addLayout(tech_layout) + content_layout.addLayout(user_layout) + content_layout.addStretch() + + # Action area + action_layout = QVBoxLayout() + action_layout.setSpacing(10) + action_layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + + # 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)) if self.search_result.quality_score >= 0.9: - quality_label.setStyleSheet("color: #1db954;") + quality_score.setStyleSheet("color: #1db954; background: rgba(29, 185, 84, 0.1); padding: 4px 8px; border-radius: 6px;") elif self.search_result.quality_score >= 0.7: - quality_label.setStyleSheet("color: #ffa500;") + quality_score.setStyleSheet("color: #ffa500; background: rgba(255, 165, 0, 0.1); padding: 4px 8px; border-radius: 6px;") else: - quality_label.setStyleSheet("color: #e22134;") + quality_score.setStyleSheet("color: #e22134; background: rgba(226, 33, 52, 0.1); padding: 4px 8px; border-radius: 6px;") # Download button - download_btn = QPushButton("đŸ“Ĩ Download") - download_btn.setFixedSize(90, 30) - download_btn.clicked.connect(self.request_download) - download_btn.setStyleSheet(""" + self.download_btn = QPushButton("âŦ‡ī¸ Download") + self.download_btn.setFixedSize(120, 40) + self.download_btn.clicked.connect(self.request_download) + self.download_btn.setStyleSheet(""" QPushButton { - background: rgba(29, 185, 84, 0.2); - border: 1px solid #1db954; - border-radius: 15px; - color: #1db954; - font-size: 9px; + background: qlineargradient(x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(29, 185, 84, 0.9), + stop:1 rgba(24, 156, 71, 0.9)); + border: none; + border-radius: 20px; + color: #000000; + font-size: 12px; font-weight: bold; } QPushButton:hover { - background: #1db954; - color: #000000; + 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, + stop:0 rgba(24, 156, 71, 1.0), + stop:1 rgba(20, 130, 60, 1.0)); } """) - layout.addLayout(info_layout) - layout.addStretch() - layout.addWidget(quality_label) - layout.addWidget(download_btn) + action_layout.addWidget(quality_score) + action_layout.addWidget(self.download_btn) + action_layout.addStretch() + + layout.addWidget(album_art) + layout.addLayout(content_layout) + layout.addLayout(action_layout) + + def _extract_song_info(self): + """Extract song title and artist from filename""" + filename = self.search_result.filename + + # Remove file extension + name_without_ext = filename.rsplit('.', 1)[0] + + # Common patterns for artist - title separation + separators = [' - ', ' – ', ' — ', '_-_', ' | '] + + for sep in separators: + if sep in name_without_ext: + parts = name_without_ext.split(sep, 1) + return { + 'title': parts[1].strip(), + 'artist': parts[0].strip() + } + + # If no separator found, use filename as title + return { + 'title': name_without_ext, + 'artist': 'Unknown Artist' + } + + def _create_quality_badge(self): + """Create a quality indicator badge""" + quality = self.search_result.quality.upper() + bitrate = self.search_result.bitrate + + if quality == 'FLAC': + badge_text = "FLAC" + badge_color = "#1db954" + elif bitrate and bitrate >= 320: + badge_text = f"{bitrate}k" + badge_color = "#1db954" + elif bitrate and bitrate >= 256: + badge_text = f"{bitrate}k" + badge_color = "#ffa500" + elif bitrate and bitrate >= 192: + badge_text = f"{bitrate}k" + badge_color = "#ffaa00" + else: + badge_text = quality + badge_color = "#e22134" + + badge = QLabel(badge_text) + badge.setFont(QFont("Arial", 9, QFont.Weight.Bold)) + badge.setAlignment(Qt.AlignmentFlag.AlignCenter) + badge.setFixedSize(60, 24) + badge.setStyleSheet(f""" + QLabel {{ + background: {badge_color}; + color: #000000; + border-radius: 12px; + padding: 2px 8px; + }} + """) + + return badge + + def _create_speed_indicator(self): + """Create 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" + elif slots > 0: + indicator_color = "#ffa500" + speed_text = "⚡ Available" + else: + indicator_color = "#e22134" + speed_text = "âŗ Queued" + + indicator = QLabel(speed_text) + indicator.setFont(QFont("Arial", 9, QFont.Weight.Medium)) + indicator.setStyleSheet(f"color: {indicator_color};") + + return indicator def request_download(self): - self.download_requested.emit(self.search_result) + if not self.is_downloading: + self.is_downloading = True + self.download_btn.setText("âŗ Downloading...") + 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.setEnabled(True) class DownloadItem(QFrame): def __init__(self, title: str, artist: str, status: str, progress: int = 0, parent=None): @@ -881,113 +1057,6 @@ class DownloadsPage(QWidget): self.download_threads.remove(thread) thread.deleteLater() - def explore_slskd_api(self): - """Explore slskd API endpoints to find the correct download endpoint""" - if not self.soulseek_client: - QMessageBox.warning(self, "Error", "Soulseek client not available") - return - - # Stop any existing exploration thread - if self.explore_thread and self.explore_thread.isRunning(): - self.explore_thread.stop() - self.explore_thread.wait(1000) # Wait up to 1 second - if self.explore_thread.isRunning(): - self.explore_thread.terminate() - - # Create and track new exploration thread - self.explore_thread = ExploreApiThread(self.soulseek_client) - self.explore_thread.exploration_completed.connect(self.on_api_exploration_completed) - self.explore_thread.exploration_failed.connect(self.on_api_exploration_failed) - self.explore_thread.finished.connect(self.on_explore_thread_finished) - self.explore_thread.start() - - def on_api_exploration_completed(self, api_info): - """Handle API exploration results""" - message = "slskd API Exploration Results:\n\n" - - if api_info.get('swagger_available'): - message += "✓ Swagger Documentation Available\n\n" - download_endpoints = api_info.get('download_endpoints', {}) - if download_endpoints: - message += "Download/Transfer Endpoints Found:\n" - for path, methods in download_endpoints.items(): - message += f" {path}: {list(methods.keys())}\n" - else: - message += "No download/transfer endpoints found in Swagger docs\n" - else: - message += "✗ Swagger Documentation Not Available\n\n" - available_endpoints = api_info.get('available_endpoints', {}) - if available_endpoints: - message += "Available Endpoints Found:\n" - for endpoint, status in available_endpoints.items(): - message += f" {endpoint}: {status}\n" - else: - message += "No endpoints found\n" - - message += f"\nBase URL: {api_info.get('base_url', 'Unknown')}" - message += f"\n\nYou can also check: {api_info.get('base_url', 'http://localhost:5030')}/swagger" - - QMessageBox.information(self, "API Exploration Results", message) - - def on_api_exploration_failed(self, error_msg): - """Handle API exploration failure""" - QMessageBox.critical(self, "API Exploration Failed", f"Failed to explore API: {error_msg}") - - def on_explore_thread_finished(self): - """Clean up when explore thread finishes""" - if self.explore_thread: - self.explore_thread.deleteLater() - self.explore_thread = None - - def get_session_info(self): - """Get slskd session info including version""" - if not self.soulseek_client: - QMessageBox.warning(self, "Error", "Soulseek client not available") - return - - # Stop any existing session thread - if self.session_thread and self.session_thread.isRunning(): - self.session_thread.stop() - self.session_thread.wait(1000) # Wait up to 1 second - if self.session_thread.isRunning(): - self.session_thread.terminate() - - # Create and track new session thread - self.session_thread = SessionInfoThread(self.soulseek_client) - self.session_thread.session_info_completed.connect(self.on_session_info_completed) - self.session_thread.session_info_failed.connect(self.on_session_info_failed) - self.session_thread.finished.connect(self.on_session_thread_finished) - self.session_thread.start() - - def on_session_info_completed(self, session_info): - """Handle session info results""" - message = "slskd Session Information:\n\n" - - if session_info: - for key, value in session_info.items(): - message += f"{key}: {value}\n" - else: - message += "No session information available" - - message += f"\n\nManual Steps:\n" - message += f"1. Open: http://localhost:5030\n" - message += f"2. Press F12 → Network tab\n" - message += f"3. Search for a file\n" - message += f"4. Click Download\n" - message += f"5. Check the HTTP request in Network tab\n" - message += f"6. Note the endpoint, method, and payload" - - QMessageBox.information(self, "slskd Session Info", message) - - def on_session_info_failed(self, error_msg): - """Handle session info failure""" - QMessageBox.critical(self, "Session Info Failed", f"Failed to get session info: {error_msg}") - - def on_session_thread_finished(self): - """Clean up when session thread finishes""" - if self.session_thread: - self.session_thread.deleteLater() - self.session_thread = None def cleanup_all_threads(self): """Stop and cleanup all active threads""" @@ -1097,47 +1166,9 @@ class DownloadsPage(QWidget): } """) - # API Explorer button (for debugging) - explore_btn = QPushButton("🔍 Explore API") - explore_btn.setFixedHeight(35) - explore_btn.clicked.connect(self.explore_slskd_api) - explore_btn.setStyleSheet(""" - QPushButton { - background: transparent; - border: 1px solid #1db954; - border-radius: 17px; - color: #1db954; - font-size: 11px; - font-weight: bold; - } - QPushButton:hover { - background: rgba(29, 185, 84, 0.1); - } - """) - - # Session Info button (for debugging) - session_btn = QPushButton("â„šī¸ Session Info") - session_btn.setFixedHeight(35) - session_btn.clicked.connect(self.get_session_info) - session_btn.setStyleSheet(""" - QPushButton { - background: transparent; - border: 1px solid #ffa500; - border-radius: 17px; - color: #ffa500; - font-size: 11px; - font-weight: bold; - } - QPushButton:hover { - background: rgba(255, 165, 0, 0.1); - } - """) - controls_layout.addWidget(controls_title) controls_layout.addWidget(pause_btn) controls_layout.addWidget(clear_btn) - controls_layout.addWidget(explore_btn) - controls_layout.addWidget(session_btn) # Download stats stats_frame = QFrame()