Commit graph

180 commits

Author SHA1 Message Date
Broque Thomas
fecd371b5e Add lazy loading for artist images across UI
Implements lazy loading of artist images in search results, artist pages, and similar artist bubbles to improve performance and user experience. Updates the iTunes client to prefer explicit album versions and deduplicate albums accordingly. Adds a new API endpoint to fetch artist images, and updates frontend logic to asynchronously fetch and display images where missing.
2026-01-23 07:38:03 -08:00
Broque Thomas
f12478ee70 Add iTunes fallback and improve artist/album handling
Adds iTunes fallback to SpotifyClient for search and metadata when Spotify is not authenticated. Updates album type logic to distinguish EPs, singles, and albums more accurately. Refactors watchlist database methods to support both Spotify and iTunes artist IDs. Improves deduplication and normalization of album names from iTunes. Updates web server and frontend to use new album type logic and support both ID types. Adds artist bubble snapshot example data.
2026-01-22 19:12:14 -08:00
Broque Thomas
b790c34657 Add support for scanning artists with iTunes provider
Refactored artist scanning logic to use the active metadata provider (Spotify or iTunes) for fetching artist data, discography, and album tracks. Introduced helper methods to select the correct client and artist ID based on the provider, and updated image and similar artist handling accordingly. This enables watchlist scanning to work with iTunes when Spotify is not authenticated, improving flexibility and provider support.
2026-01-22 18:14:23 -08:00
Broque Thomas
579124c477 Normalize iTunes API responses to Spotify format
Updated get_album, get_album_tracks, and get_artist methods to return data structures compatible with Spotify's API format. This includes normalizing image arrays, artist and album fields, and adding synthetic URIs and external URLs for better interoperability.
2026-01-22 17:32:23 -08:00
Broque Thomas
f126cf7118 Add cross-provider support for watchlist artists
Introduces iTunes artist ID support to WatchlistArtist and database schema, enabling proactive backfilling of missing provider IDs (Spotify/iTunes) for watchlist artists. Updates WatchlistScanner to use MetadataService for provider-agnostic scanning and ID matching, and modifies web_server to support scans with either provider. Includes new database migration and update methods for iTunes and Spotify artist IDs.
2026-01-22 17:04:23 -08:00
Broque Thomas
e7c1e44cf1 Add iTunes metadata client and fallback guide
Introduces core/itunes_client.py implementing an iTunes Search API client for music metadata, providing search and lookup for tracks, albums, and artists with rate limiting. Adds METADATA-FALLBACK-IMPLEMENTATION.md, a comprehensive guide comparing fallback strategies for music metadata, including anonymous Spotify access and iTunes, and outlines integration approaches for seamless user experience without requiring Spotify credentials.
2026-01-22 15:31:02 -08:00
Broque Thomas
05c2cd7320 Update tidal_client.py 2026-01-16 11:48:50 -08:00
Broque Thomas
fdb9435fbe Fix pagination cursor retrieval in TidalClient
Updates the method for obtaining the next cursor during track pagination to use the approach from PR #113, retrieving it from 'links.meta.nextCursor' instead of 'meta.nextCursor'. This ensures correct pagination behavior.
2026-01-16 10:15:18 -08:00
Broque Thomas
6e02aa03ac Remove redundant playlist ownership filtering
Eliminated unnecessary filtering of playlists by owner or collaboration status, as the Spotify API already returns all accessible playlists. This simplifies the code and ensures all relevant playlists are processed.
2026-01-15 07:16:59 -08:00
Broque Thomas
665281f184 Refactor playlist fetching to use Tidal JSON:API
Rewrites playlist and track fetching to use Tidal's JSON:API endpoints with cursor-based pagination and batch track hydration. Adds robust rate limiting with retry logic, and introduces ISO-8601 duration parsing. This improves reliability, performance, and compatibility with Tidal's latest API structure.
2026-01-15 06:44:35 -08:00
Broque Thomas
007640a37f Reload Soulseek client config on orchestrator init
Added a call to self.soulseek._setup_client() in DownloadOrchestrator to ensure the Soulseek client configuration is reloaded when the orchestrator is initialized. This helps keep the client settings in sync with the latest configuration.
2026-01-11 21:02:23 -08:00
Broque Thomas
a8766828d9 Add content type filters for watchlist artists
Introduces new filters for live versions, remixes, acoustic versions, and compilation albums to the watchlist artist configuration. Updates the database schema, backend API, and web UI to support these options, allowing users to customize which content types are included for each artist in their watchlist.
2026-01-11 01:33:39 -08:00
Broque Thomas
9d275488e2 Add config reload support and improve config loading
Introduces a reload_config method to SpotifyClient and refactors ConfigManager to support reloading configuration from a file. Updates web_server.py to use the new config loading mechanism, ensuring configuration is loaded into the existing singleton instance and SpotifyClient is properly re-initialized after settings changes.
2026-01-06 09:29:11 -08:00
Broque Thomas
a23b033d37 Add search_and_download_best method to orchestrator
Introduces an async method to search for a query and automatically download the best result based on quality preferences and source priority. The method handles empty results, filters by quality, and logs the download process.
2026-01-05 22:33:24 -08:00
Broque Thomas
304cc84ad5 Add clearing of completed YouTube downloads
Implemented clear_all_completed_downloads in YouTubeClient to remove completed, cancelled, errored, and aborted downloads from memory. Updated DownloadOrchestrator to call this method, ensuring both Soulseek and YouTube completed downloads are cleared.
2026-01-05 22:00:38 -08:00
Broque Thomas
9bf1948097 Add priority query for Artist + Album + Title in matching
Introduces a new priority 0 query that combines artist, album, and title for improved matching, especially for YouTube and hybrid download modes. This helps better match tracks where the album is significant, such as soundtracks, and only applies when the album is not a generic label like 'single' or 'greatest hits'.
2026-01-05 21:27:54 -08:00
Broque Thomas
ddd2ebdb13 Improve YouTube download handling and shutdown safety
Adjusts matching weights for YouTube sources to rely more on title and duration, adds a shutdown callback to the YouTube client to prevent new downloads during shutdown, and enhances post-processing to reliably resolve actual YouTube file paths. Improves error handling for file removal, ensures no new batch downloads start during shutdown, and refines download monitoring to trigger post-processing on completed YouTube downloads. Also increases YouTube download retries and improves logging for debugging.
2026-01-05 18:08:43 -08:00
Broque Thomas
381e43c76b Update youtube_client.py 2026-01-04 15:02:41 -08:00
Broque Thomas
58f7fdb005 style youtube cards 2026-01-04 14:56:05 -08:00
Broque Thomas
61e822bf6f Add robust YouTube streaming support and improve format checks
Enhances streaming logic to better support YouTube as a download source, including improved filename handling, fuzzy file matching, and search query generation. Updates format checks in the frontend to skip them for YouTube (always MP3). Refactors backend to use a unified download status API for both Soulseek and YouTube, and improves service test messaging based on the active download mode.
2026-01-04 12:30:35 -08:00
Broque Thomas
c94b1d2f5b Add hybrid Soulseek/YouTube download orchestration - TESTING
Introduces a DownloadOrchestrator class to route downloads between Soulseek and YouTube based on user-configurable modes (Soulseek only, YouTube only, Hybrid with fallback). Updates web server and UI to support new download source settings, including hybrid mode options and YouTube confidence threshold. Refactors YouTube client for thread-safe download management and bot detection bypass. Ensures quality filtering is skipped for YouTube results and improves file matching and post-processing logic for YouTube downloads.
2026-01-03 22:20:36 -08:00
Broque Thomas
ce67e64ff7 Update youtube_client.py 2026-01-03 14:57:43 -08:00
Broque Thomas
eaf33f6f6d just testing things 2026-01-03 13:10:37 -08:00
Broque Thomas
8f15dc039d Convert track duration to milliseconds in search results
Updated the duration field in TrackResult to store duration in milliseconds instead of seconds, matching Spotify's expected format. This ensures consistency when integrating with services that use millisecond-based durations.
2025-12-29 14:54:28 -08:00
Broque Thomas
a167a00a0a Add enhanced search with categorized dropdown UI
Implements an enhanced search endpoint in the backend that unifies Spotify and local database results, returning categorized artists, albums, and tracks. Updates the frontend with a new dropdown overlay for live search, debounced input, categorized result rendering, and direct integration with the main results area for album/track selection. Adds new CSS for the dropdown and result cards, and updates the Track dataclass to include image URLs for richer UI display.
2025-12-29 09:56:32 -08:00
Broque Thomas
5d29131530 Add configurable Soulseek search timeout and buffer
Introduces 'search_timeout' and 'search_timeout_buffer' options to Soulseek settings in the config, backend, and web UI. The backend now uses these values to control search duration and polling, allowing users to fine-tune how long searches run and how long to wait for late results.
2025-12-28 21:02:01 -08:00
Broque Thomas
a2bdb93498 Improve matching logic and wishlist album display
Enhanced the music matching engine to use stricter version handling, rebalance title/artist/duration weights, and raise confidence thresholds to reduce false positives. Updated string normalization to better handle separators and special characters. In the web UI, improved album ID sanitization and added a placeholder for missing album images in the wishlist view.
2025-12-28 19:23:50 -08:00
Broque Thomas
3c7659feac Improve wishlist track sorting robustness
Refactored the sorting logic to handle cases where 'spotify_data' may be a JSON string or have varying structures. This ensures consistent sorting by artist and track name, even with malformed or unexpected data formats.
2025-12-14 12:21:36 -08:00
Broque Thomas
b42d0252a1 Add Jellyfin music library selection support
Introduces backend and frontend functionality to list and select Jellyfin music libraries. Adds API endpoints, updates the client logic, and provides a UI selector for users to choose their preferred Jellyfin music library.
2025-12-08 10:20:15 -08:00
Broque Thomas
44b1050dca wishlist auto restart timer check 2025-12-01 10:26:46 -08:00
Broque Thomas
ab58b64a17 cap listenbrainz playlist memory 2025-11-25 09:44:41 -08:00
Broque Thomas
27f115d719 connect watchlist settings to scan 2025-11-24 21:43:11 -08:00
Broque Thomas
4684408439 Revert "user selected watchlist settings now connected to backend."
This reverts commit 2c12759dbb.
2025-11-24 19:30:30 -08:00
Broque Thomas
353580bd2d Revert "Update watchlist_scanner.py"
This reverts commit 4c8fa45337.
2025-11-24 19:29:53 -08:00
Broque Thomas
4c8fa45337 Update watchlist_scanner.py 2025-11-24 19:14:32 -08:00
Broque Thomas
2c12759dbb user selected watchlist settings now connected to backend. 2025-11-24 17:27:50 -08:00
Broque Thomas
c46e2c527e search bar for watchlist 2025-11-23 20:23:30 -08:00
Broque Thomas
4804a995f7 further progress on wishlist rebuild 2025-11-23 19:14:13 -08:00
Broque Thomas
0b2322f225 Wishlist overhaul near complete 2025-11-23 18:22:09 -08:00
Broque Thomas
b7b76b378d Fix: Emby sync issue 2025-11-23 11:34:38 -08:00
Broque Thomas
ec6a9163a8 Fix: Jellyfin multiple users could break functionality. 2025-11-22 14:41:44 -08:00
Broque Thomas
8712209bb9 emby support? 2025-11-21 16:19:58 -08:00
Broque Thomas
aef53f7b4d grab paginated albums 2025-11-18 22:46:24 -08:00
Broque Thomas
52c27ce2a9 cache listenbrainz and update with watchlist 2025-11-18 13:41:45 -08:00
Broque Thomas
333d984527 listenbrainz update 2025-11-18 09:57:47 -08:00
Broque Thomas
bc54f2c1a3 listenbrainz playlist support 2025-11-17 22:38:38 -08:00
Broque Thomas
a3f98f29d3 utilize quality profile over preferred. 2025-11-17 14:11:14 -08:00
Broque Thomas
08eb014da8 fix genre discovery 2025-11-17 12:22:49 -08:00
Broque Thomas
cc62b3b48e discover page progress 2025-11-17 10:09:08 -08:00
Broque Thomas
ee266920a9 discover progress 2025-11-17 08:49:49 -08:00