Commit graph

2005 commits

Author SHA1 Message Date
Broque Thomas
b2fa222228 fix hydrabse album.tracks 2026-03-04 15:12:03 -08:00
Broque Thomas
6bbd52fda7 update notification 2026-03-04 15:01:54 -08:00
Broque Thomas
114af496c7 Track version 2026-03-04 11:32:40 -08:00
Broque Thomas
2d6c55e294 Fix chromaprint crash on surround audio and Spotify worker status display 2026-03-04 11:00:34 -08:00
Broque Thomas
4fee005dee Add multi-profile support with Netflix-style profile picker
Allow multiple users to share a single SoulSync instance with isolated personal data. Each profile gets its own watchlist, wishlist, discovery pool, similar artists, and bubble snapshots — while sharing the same music library, database, and service credentials.

  - Netflix-style profile picker on startup when multiple profiles exist
  - Optional PIN protection per profile; admin PIN required when >1 profiles
  - Admin-only profile management (create, edit, rename, delete)
  - Profile avatar images via URL with colored-initial fallback
  - Zero-downtime SQLite migration — all existing data maps to auto-created
    admin profile
  - Single-user installs see no changes — profile system is invisible until
    a second profile is created
  - WebSocket count emitters scoped to profile rooms (watchlist/wishlist)
  - Background scanners (watchlist, wishlist, discovery) iterate all profiles
2026-03-04 10:46:08 -08:00
Broque Thomas
84de4ad16b Redesign watchlist modal with enriched artist detail view 2026-03-03 20:26:21 -08:00
Broque Thomas
d06b7e5a25 Update style.css 2026-03-03 19:00:50 -08:00
Broque Thomas
0f428dc45c Add WebSocket real-time updates with automatic HTTP polling fallback
Migrates 38 HTTP polling loops to WebSocket push events across 6 phases: service status, dashboard stats, enrichment workers, tool progress, sync/discovery progress, and scan status. All original HTTP polling is preserved as automatic fallback — if WebSocket is unavailable or disconnects, the app seamlessly reverts to its previous behavior. Includes 162 tests verifying event delivery, data shape, and HTTP parity. Also fixes a copy-paste bug in Beatport sync error cleanup.
2026-03-03 18:26:29 -08:00
Broque Thomas
53d841c3dc Update style.css 2026-03-03 12:43:02 -08:00
Broque Thomas
d9aa8303a7 Add SoulSync REST API (v1) with API key authentication
Adds a full public REST API at /api/v1/ with 32 endpoints covering library, search, downloads, wishlist, watchlist, playlists, system status, and settings. Includes API key authentication (Bearer token), per-endpoint rate limiting, and consistent JSON response format. API keys can be generated and managed from the Settings page. No changes to existing functionality — the API delegates to the same backend services the web UI uses.
2026-03-03 09:49:00 -08:00
Broque Thomas
df33adf6a7 include 'add to watchlist' button to each artist in library. 2026-03-02 10:04:10 -08:00
Broque Thomas
b558dff138 add all recommended to watchlist. 2026-03-02 09:24:37 -08:00
Broque Thomas
1f73ba4f94 view recommended artists. 2026-03-02 09:12:35 -08:00
Broque Thomas
8f2dd66aee add a 'watch all' button on hero slider to quickly add all artists in slider. 2026-03-02 08:40:22 -08:00
Broque Thomas
c279f2e4fa Design retag layout 2026-03-01 22:52:27 -08:00
Broque Thomas
3dad2eae38 watchlist redesign 2026-03-01 20:35:49 -08:00
Broque Thomas
046233817d Update style.css 2026-03-01 19:47:56 -08:00
Broque Thomas
6d3f43a385 Update style.css 2026-03-01 19:30:50 -08:00
Broque Thomas
71fe5b83eb css changes 2026-03-01 15:34:51 -08:00
Broque Thomas
4fba18b25e Feat: Custom accent colors. 2026-03-01 15:29:37 -08:00
Broque Thomas
1964659c8b css changes 2026-03-01 14:55:45 -08:00
Broque Thomas
1aa6cdc9b6 Rebuild the import feature and move it to its own page. 2026-03-01 14:18:55 -08:00
Broque Thomas
c2119d4ecf Update style.css 2026-03-01 11:16:47 -08:00
Broque Thomas
afa495756f Version 1.7 update 2026-02-28 21:58:13 -08:00
Broque Thomas
acfc26a4bd Add Tidal as a download source with full pipeline integration
Adds Tidal as a third download source alongside Soulseek and YouTube. Uses the tidalapi library with device-flow authentication to search and download tracks in configurable quality (Low/High/Lossless/HiRes) with automatic fallback. Integrates into the download orchestrator for all modes (Tidal Only, Hybrid with fallback chain), the transfer monitor, post-processing pipeline, and file finder. Frontend includes download settings with quality selector, device auth flow, and dynamic sidebar/dashboard labels that reflect the active download source. No breaking changes for existing users.
2026-02-28 21:47:19 -08:00
Broque Thomas
49c769ff5c Fix Hydrabase endpoint gaps, M3U default, and soul_id mapping
Filled all missing Hydrabase fallthrough gates across 6 endpoints (artist album tracks, iTunes album, discover album, Spotify track, both similar artists), added     track_number/disc_number to Track dataclass, fixed get_album_tracks to send soul_id instead of text query, mapped soul_id field from Hydrabase responses across all search methods, updated 7 frontend call sites to pass album name/artist params, and fixed M3U export defaulting to enabled when users never turned it on.
2026-02-28 18:25:55 -08:00
Broque Thomas
698b1fa4f3 clear current downloads 2026-02-27 11:18:13 -08:00
Broque Thomas
2dc72a39b7 Add music library selection for Navidrome
SoulSync was importing from all Navidrome libraries regardless of user access restrictions. Added a "Music Library"   dropdown in Navidrome settings that lets users scope imports to a specific music folder. Uses the Subsonic musicFolderId       parameter on artist, album, and search API calls. Selecting "All Libraries" reverts to the previous behavior.
2026-02-27 09:37:58 -08:00
Broque Thomas
e14a317a56 Add wishlist batch remove API and UI
Introduce batch removal support for wishlist tracks. Adds a new POST endpoint /api/wishlist/remove-batch that validates input, removes multiple tracks via the wishlist service, logs the result and returns a removed count. Updates the frontend (webui/static/script.js) to provide per-track and per-album checkboxes, a Select All button, a batch action bar with selection count and a Remove Selected action (with confirmation), and logic to refresh the view and wishlist count after removal. Styles (webui/static/style.css) are extended to support unified watchlist/wishlist batch bars, checkbox styling, and a Select All button. Preserves existing single-item removal behavior.
2026-02-26 17:19:34 -08:00
Broque Thomas
e3a5608c95 Add manual candidate download API and UI
Add server endpoint to trigger a manual download for a user-selected candidate from the candidates modal (/api/downloads/task/<id>/download-candidate). The endpoint validates input, resets task and batch state (status, error, used_sources, active_count, permanently_failed_tracks), reconstructs Track/TrackResult objects and dispatches a background download attempt via missing_download_executor. Update the frontend candidates modal to show a download button per candidate, wire it to POST the candidate to the new API, and add CSS for table layout and download button styling. Enables restarting failed/not_found tasks by choosing a specific source without blocking the UI.
2026-02-26 13:45:38 -08:00
Broque Thomas
2852e2b39f Add candidates review modal & API
Expose cached search results for failed downloads and add a UI to review them. Implements a new GET /api/downloads/task/<task_id>/candidates endpoint that serializes any cached_candidates and track_info for a task and returns an error message and candidate count. The download worker now collects top raw search results (all_raw_results) and stores them in download_tasks[task_id]['cached_candidates'] when no match is found so users can inspect what Soulseek returned. The batch status payload includes has_candidates to mark "not_found" tasks as reviewable. On the frontend, new script functions (_ensureCandidatesClickListener, showCandidatesModal, _renderCandidatesModal, closeCandidatesModal) fetch and render a modal table of candidates; existing status rendering is updated to attach click handlers and error tooltips. Styles for the modal and a clickable .has-candidates state are added to style.css.
2026-02-26 13:09:51 -08:00
Broque Thomas
b814ae17ce Add quarantine clear API and folder sweeper
Add a POST /api/quarantine/clear endpoint to delete all files and folders inside the ss_quarantine directory (uses docker_resolve_path and reports removed item count). Implement _sweep_empty_download_directories() to walk the downloads folder bottom-up and remove empty directories (preserves root download dir, skips hidden entries, robust against locked/non-empty dirs). Wire the sweeper into existing cleanup flows: clear_finished_downloads(), the periodic _simple_monitor_task(), and the failed-tracks post-cleanup path so leftover empty folders are removed. Also add a Clear Quarantine button in the web UI and a clearQuarantine() client function to call the new API and show feedback.
2026-02-26 11:40:13 -08:00
Broque Thomas
44b5032f17 Add discography filters to artist detail page
Introduce interactive discography filters on the artist detail page. Adds filter UI markup (category, content, ownership) in index.html and styles in style.css. Implements filter state, initialization, reset and apply logic in script.js; tags release cards with data attributes (live/compilation/featured) using regex heuristics, updates visibility and per-section owned/missing counts, and re-applies filters when releases are updated. Integrates filter setup into page init and resets filters when loading artist data.
2026-02-26 10:17:53 -08:00
Broque Thomas
477615593e Increase Jellyfin API timeout default to 120
Raise the default Jellyfin API timeout for bulk operations from 30s to 120s to better handle slow servers and large database syncs. Updated core/jellyfin_client.py to set bulk_timeout to 120, webui/index.html to show 120s in the settings input, and webui/static/script.js to use 120 as the fallback when loading settings. Aligns UI and client behavior to reduce timeout errors during heavy syncs.
2026-02-26 08:28:08 -08:00
Broque Thomas
70156bdb98 Configurable Jellyfin API timeout and retries
Add a configurable API timeout for Jellyfin bulk requests and improve fetch retry behavior. UI: adds an "API Timeout (seconds)" field (15–300s, default 30) in webui/index.html and persists it via webui/static/script.js (load/save). Client: jellyfin_client.py now reads api_timeout from config_manager, uses it as the bulk timeout and computes a sensible non-bulk timeout (max(5, bulk_timeout//6)). Fetch loops for tracks and albums were hardened: reducing batch size now resets consecutive failure counters, log messages were clarified, and the stopping/retry thresholds were adjusted to avoid premature aborts at minimum batch sizes.
2026-02-26 08:21:20 -08:00
Broque Thomas
f3a397fc74 Chain Jellyfin loads
Ensure Jellyfin music libraries are loaded after users by chaining loadJellyfinUsers() with .then(loadJellyfinMusicLibraries()) at three call sites (settings load, server toggle, and connection test) to avoid race conditions. Also add database write-ahead log and shared-memory files (database/music_library.db-wal and database/music_library.db-shm).
2026-02-25 16:54:50 -08:00
Broque Thomas
35a03d6839 Add global watchlist override and UI
Introduce a global watchlist override feature and UI to control release/content filters across all watchlist artists. Backend: add /api/watchlist/global-config (GET/POST) for reading/updating global settings, validation to require at least one release type when override is enabled, and _apply_watchlist_global_overrides() to apply settings to WatchlistArtist objects. Scanners (manual and automatic) now call _apply_watchlist_global_overrides() and perform additional checks (_should_include_release, _should_include_track) to skip releases/tracks according to config. Frontend: add a Global Watchlist Settings modal, controls (release types, content filters, include-all shortcut), save/validation logic, banners/notices when global override is active, and integration into the watchlist modal and per-artist config. Styles: add supporting CSS for the modal and banners. Small cleanup/whitespace adjustments included.
2026-02-24 22:09:08 -08:00
Broque Thomas
f90d6567f7 Hydrabase: improve parsing add discography/tracks
Improve Hydrabase response handling and add discography/album track helpers. core/hydrabase_client.py: extract peer counts from stats.connectedPeers, handle new "response" key and stats-only or unexpected response shapes (return empty instead of wrapping), and add search_discography() and get_album_tracks() to map Hydrabase results into Album/Track objects. web_server.py: avoid redundant Hydrabase round-trips by passing precomputed hydrabase_counts into the background comparison worker; prefer Hydrabase for artist discography and album track import when active (with Spotify fallback); and route album-context searches to Hydrabase when configured. These changes reduce duplicate network calls and improve robustness against varied Hydrabase payloads.
2026-02-24 18:42:48 -08:00
Broque Thomas
1283041836 Integrate Hydrabase P2P metadata client
Add Hydrabase support as an optional/dev metadata source and comparison tool.

- Add core/hydrabase_client.py: synchronous Hydrabase WebSocket client that normalizes results to Track/Artist/Album types and exposes raw access.
- Update config/settings.py: add hydrabase settings (url, api_key, auto_connect) and getter.
- Update web_server.py: integrate HydrabaseClient, initialize client alongside the existing HydrabaseWorker, add auto-reconnect using saved config, persist credentials on connect/disconnect, add endpoints for status and stored comparisons, background comparison runner (Hydrabase vs Spotify vs iTunes), and adapt multiple search endpoints to optionally use Hydrabase as the primary metadata source with fallbacks.
- Update web UI (webui/index.html, webui/static/script.js, webui/static/style.css): add network stats and source comparison UI, pre-fill saved credentials, show peer count, load/display comparisons, update disconnect behavior to disable dev mode, and add Hydrabase badge styling.

Behavioral notes: when dev mode + Hydrabase are active, searches can be served from Hydrabase and comparisons to Spotify/iTunes are run in background; when Hydrabase fails the code falls back to Spotify/iTunes. Saved Hydrabase credentials are persisted for auto-reconnect; disconnect disables dev mode and auto_connect.

Files touched: config/settings.py, core/hydrabase_client.py, web_server.py, webui/index.html, webui/static/script.js, webui/static/style.css.
2026-02-24 08:11:48 -08:00
Broque Thomas
1c34967fd3 Raise Spotify API interval; pause enrichments
Increase Spotify client rate limit and reduce API contention during watchlist scans. Changes:

- core/spotify_client.py: Bumped MIN_API_INTERVAL from 0.2s to 0.35s (~171 calls/min) to stay safely under Spotify's ~180/min limit.
- web_server.py: In start_watchlist_scan and automatic scan flow, pause spotify_enrichment_worker and itunes_enrichment_worker before scanning (tracking with _enrichment_was_running/_itunes_enrichment_was_running) and resume them in finally blocks; added console prints for pause/resume. This prevents enrichment workers from contending for API quota during long scans.
- webui/static/script.js: Improved enrichment status tooltip logic to prioritize explicit currentType and then fall back to completion-based inference with explicit branches for artists, albums, and tracks for clearer progress text.

These changes aim to avoid API rate violations and make scan progress display more predictable.
2026-02-23 21:22:27 -08:00
Broque Thomas
317d5c1770 Add Retag tool (DB, backend, frontend)
Introduce a new Retag tool to track and re-tag previously downloaded albums/singles. Changes include:

- Database: add migration hook and create retag_groups and retag_tracks tables, indexes, and many helper methods (add/find/update/delete groups & tracks, stats, trimming).
- Backend (web_server): capture completed album/single downloads into the retag tables, implement retag execution logic (_execute_retag) to fetch album metadata, match tracks, update tags, move files, download cover art, and update DB. Add thread-safe globals, executor, and REST endpoints for stats, listing groups, group tracks, album search, execute, status, and delete.
- Frontend (webui): add Retag Tool card, modals, search UI, JS to list groups/tracks, search albums, start retag operations, poll status, and update UI; include help content. Add CSS for modals and components.

The migration is invoked during DB init to ensure existing installations create the new tables. The tool caps stored groups (default 100) and avoids duplicate track entries.
2026-02-23 20:39:04 -08:00
Broque Thomas
7eee2be38c Add release_date to Track and UI
Add a release_date field to the Track dataclass for both iTunes and Spotify clients (iTunes: parsed from releaseDate, Spotify: from album.release_date). Propagate release_date into enhanced search results in web_server and into the client-side script so album objects include release_date when available. Also broaden playlistId matching in the missing-tracks process to include 'enhanced_search_track_'. Removed SQLite SHM/WAL files from the repo (cleanup of DB temporary files). These changes enable showing and using track release dates across the app.
2026-02-23 16:25:23 -08:00
Broque Thomas
f1fe72ceb2 Add track selection UI and backend mapping
Add per-track selection checkboxes, select-all control and a selection count to download modals (missing/YouTube/Tidal/artist-album). Implement JS helpers (toggleAllTrackSelections, updateTrackSelectionCount) to manage checkbox state, row dimming, button disabling, and to filter/stamp selected tracks with _original_index before sending to the backend. Update start/add-to-wishlist flows to use only selectedTracks and disable controls once analysis starts. Backend _run_full_missing_tracks_process now reads _original_index to preserve original table indices in analysis results. CSS updates (mobile.css and style.css) add styling for checkbox columns, responsive hiding logic for headers/columns, selection visuals (.track-deselected), and small layout/width tweaks.
2026-02-23 15:54:58 -08:00
Broque Thomas
2e6550ec53 Disable M3U export by default
Set m3u_export.enabled default to false and update the UI so the M3U auto-save checkbox is unchecked unless explicitly enabled. Changes: config/settings.py flips the default to false, webui/index.html removes the checked attribute from the checkbox, and webui/static/script.js adjusts the logic to only check the box when settings.m3u_export.enabled === true. This prevents automatic M3U exports for users who don't explicitly opt in.
2026-02-23 12:14:53 -08:00
Broque Thomas
2ba48f917d Add server-side M3U export and UI setting
Introduce M3U export feature with UI control and server-side saving. Adds a new m3u_export config option (enabled flag) and a checkbox in the settings UI. The web endpoint /api/save-playlist-m3u now checks the m3u_export setting (unless force=true), builds the target folder using a new _compute_m3u_folder() helper (leveraging existing template logic with sensible fallbacks), sanitizes filenames, and writes .m3u files into the computed folder. Frontend JS loads/saves the new setting, supplies album/artist metadata when auto-saving, and both autoSave and manual export now POST M3U data to the server (manual export uses force=true). Also changed browser download filename extension to .m3u and added minor logging/response behavior.
2026-02-23 11:59:16 -08:00
Broque Thomas
1ad7bda880
Merge pull request #154 from snuffomega/advanced_settings
feat(settings): lock container path fields with unlock toggle
2026-02-23 10:51:17 -08:00
Broque Thomas
666e65ed3b Add repair scanning, tracklist fallbacks, UI polling
Introduce deferred album repair scanning and robust tracklist resolution plus UI/presentation tweaks.

- core/repair_worker.py: Add lazy MusicBrainz and AudioDB client accessors, per-batch folder queues, and register_folder/process_batch to defer folder scans until a batch completes. Implement cascading tracklist resolution (_resolve_album_tracklist) using Spotify/iTunes IDs, Spotify track→album lookup, album search, MusicBrainz release lookup, and AudioDB→MusicBrainz fallback. Add helpers to read Spotify track IDs, MusicBrainz album IDs, album/artist tags from files, MB/AudioDB fetchers, placeholder-ID filtering, and rename associated .lrc files when renaming audio files. Cache/locking and background-threaded scanning included. Improves resilience to missing/placeholder IDs and avoids circular imports.

- web_server.py: Register album folders for repair in post-processing and trigger repair_worker.process_batch when batches complete (multiple completion paths) so scans run after downloads finish.

- webui/static/script.js: Reduce unnecessary background work by skipping many fetches when the tab is hidden, and refresh dashboard-specific data on visibility change to ensure UI updates after OAuth or tab switch.

- webui/static/style.css: Replace glassmorphic backdrop-filters with opaque dark gradients for sidebar and main content to improve GPU rendering and visual consistency.

Overall: Adds reliable post-download album repair scanning using multiple metadata sources and reduces unnecessary client polling and heavy CSS effects for better performance and robustness.
2026-02-23 10:18:31 -08:00
snuffomega
e7ff1b2081 feat(settings): lock container path fields with unlock toggle
Prevent accidental misconfiguration of Docker container-internal paths
(Slskd Download Dir, Matched Transfer Dir, Import Staging Dir) by making
them read-only by default.

Repurposes the non-functional Browse button into a per-field Unlock/Lock
toggle. Adds a warning blurb below the Download Settings header so users
understand these are container paths, not host paths.
2026-02-23 13:11:13 -05:00
Broque Thomas
129f69fce9 Add Blasphemy Mode to delete FLAC after MP3
Introduce an optional "Blasphemy Mode" that deletes the original FLAC after a verified MP3 copy is created.

- config: add lossy_copy.delete_original (default: false).
- webui/index.html & static script: add checkbox and warning in settings UI and persist the setting.
- web_server.py: make _create_lossy_copy return the MP3 path when it deletes the FLAC (otherwise None); validate the MP3 using mutagen before removing the FLAC; rename associated .lrc files if present; update post-processing to use the final processed path in logs and wishlist checks and to consider .mp3 variants when FLAC may have been removed.

Behavior is off by default and includes safety checks and logging to avoid accidental deletion of originals.
2026-02-22 23:23:52 -08:00
Broque Thomas
24bfc2462d Add Spotify & iTunes workers; update repair worker
Add full-featured SpotifyWorker and iTunesWorker background workers to enrich artists, albums, and tracks with external metadata using batch cascading searches, fuzzy name matching, ID validation, and DB backfills. Update RepairWorker to re-read the transfer path from the database each scan, resolve host paths when running in Docker, and trigger immediate rescans when the transfer path changes; remove the static config_manager dependency. Also include supporting changes to the database layer and web UI/server (stats, controls, and styles) to integrate the new workers and reflect updated worker status.
2026-02-22 22:29:10 -08:00
Broque Thomas
ce474749d5 Add library repair worker and UI
Introduce a RepairWorker to scan the transfer folder and automatically detect/repair broken album track numbers (e.g. the "all tracks = 01" bug). The worker uses mutagen to read/write tags, fuzzy-matches titles against an album tracklist (Spotify/iTunes via a SpotifyClient), updates filenames and the tracks DB file_path when renamed, and caches album tracklists. It also adds DB schema support (repair_status, repair_last_checked, and an index).

Integrates the worker into the web server: initializes and starts the worker, and exposes /api/repair/status, /api/repair/pause and /api/repair/resume endpoints. Adds UI elements (button, tooltip), client-side JS to poll and control the worker, CSS for visuals/animations, and a new image asset (whisoul.png).
2026-02-21 15:00:23 -08:00
Broque Thomas
e80b4894bb Update style.css 2026-02-21 08:57:03 -08:00
Broque Thomas
d4d3f1ec3d Update style.css 2026-02-21 08:53:50 -08:00
Broque Thomas
e7dfb423dc Add Active Downloads dashboard and UI fixes
Introduce an "Active Downloads" section to the dashboard and wire up client-side plumbing to populate and update it. Adds escapeForInlineJs to safely embed values into inline JS attributes and replaces several inline onclick usages (search/genre/listenbrainz/artist buttons) to prevent quoting issues. Implements updateDashboardDownloads, createDashboardDiscoverBubble, and integrates dashboard updates into artist/search/discover flows (including register/discover download persistence and monitor hooks). Adds dashboard-specific CSS for discover/artist bubbles and minor style fixes (artist image sizing, keyframe formatting) plus a mobile CSS tweak for artist images.
2026-02-21 08:51:51 -08:00
Broque Thomas
49a6c58ea8 Add Hydrabase P2P mirror worker
Introduce a Hydrabase P2P mirror worker and integrate it into the web UI and server flows. Adds core/hydrabase_worker.py: a background thread with a capped queue (1000), enqueue API, rate limiting, basic stats (sent/dropped/errors), and logic to send JSON requests over a provided WebSocket (responses received and discarded). Integrates the worker into web_server.py (import, startup init, status/pause/resume endpoints, and enqueues queries from multiple search endpoints when dev mode is enabled). Adds UI elements, JavaScript polling/toggle logic, and CSS styling for a Hydrabase status button in webui (index.html, static/script.js, static/style.css) to display and control worker state.
2026-02-21 02:15:43 -08:00
Broque Thomas
35fd7bb294 Add Hydrabase dev UI and WebSocket support
Introduce a developer-only Hydrabase testing UI and backend WebSocket integration. Adds a simple dev-mode toggle (password 'hydratest') and new API endpoints (/api/dev-mode, /api/hydrabase/connect, /api/hydrabase/disconnect, /api/hydrabase/status, /api/hydrabase/send) that use websocket-client to connect/send raw JSON to a Hydrabase instance. Frontend changes include a Hydrabase nav/page, payload editors, response panel, dev-mode UI in Settings, associated JS handlers, CSS styling, and an icon asset. Also add websocket-client to requirements.
2026-02-21 00:32:04 -08:00
Broque Thomas
cfa4a0c59f Add $artistletter and multi-disc support
Introduce $artistletter and $disc template variables across config, UI, and backend to support artist-first-letter tokens and multi-disc albums. Update web_server.py to include disc_number in template context, prefer user-controlled $disc in templates, and create configurable disc subfolders using a new file_organization.disc_label setting. Update example and active config, web UI to expose the new variable and disc label selector, and script.js to validate, load, and save the new settings and substitutions.
2026-02-20 22:53:15 -08:00
Broque Thomas
d2adf17ca5 Add lossy MP3 copy of downloaded FLACs
Introduce a configurable "lossy_copy" feature that creates an MP3 copy alongside downloaded FLAC files. Adds default config (example and runtime) and UI controls for enabling the feature and selecting an MP3 bitrate. Implements _create_lossy_copy in web_server.py which checks the FLAC extension, respects the configured bitrate (default 320 kbps), locates ffmpeg (including a local tools/ffmpeg fallback), performs conversion, and attempts to update the QUALITY tag via mutagen. The feature is invoked after post-processing/moving downloads. Logs and graceful failures (missing ffmpeg, timeouts, tag errors) are included.
2026-02-20 22:16:00 -08:00
Broque Thomas
d858a7c85f Add $quality template var (filename only)
Introduce a new $quality template variable that is only substituted into filenames to avoid splitting album folders when tracks of mixed qualities are present. Updates include:

- web_server.py: populate template contexts with 'quality' (from context['_audio_quality']), strip $quality from folder components, substitute it only in the filename, and clean up empty brackets/parentheses/dashes when the variable is empty.
- config/config.example.json and config/config.json: document the new variable in the file_organization template variables string.
- webui/index.html and webui/static/script.js: update UI help text and client-side template validation to include $quality.

This prevents folder fragmentation for albums with mixed-quality files while still allowing quality information in filenames.
2026-02-20 20:18:01 -08:00
Broque Thomas
3644422ab8 Add FLAC bit depth filter to post-download quality gate 2026-02-20 15:05:45 -08:00
Broque Thomas
2c56b23c27 Progressive track list rendering for large playlists 2026-02-20 09:15:15 -08:00
Broque Thomas
ed184f9bb8 rearrange the download modal 2026-02-19 23:15:33 -08:00
Broque Thomas
1a29073d4e Fix quality profile priorities being reset to default order on save 2026-02-19 17:24:06 -08:00
Broque Thomas
d73f91ea1c Combine MP3 format and bitrate into single quality badge 2026-02-19 12:55:03 -08:00
Broque Thomas
c018c5fd98 Differentiate "not found" from download errors with distinct status and UI 2026-02-19 12:05:20 -08:00
Broque Thomas
c70cfd335a Fix missing formats key in error path and clean up format query 2026-02-19 10:50:53 -08:00
Broque Thomas
6c6651b879 Add format summary tags to library release cards, wishlist modal, and artist hero 2026-02-19 10:20:30 -08:00
Broque Thomas
3663a75769 Show track ownership indicators and file metadata in wishlist modal for all releases 2026-02-19 09:39:56 -08:00
Broque Thomas
2ca410fadd css fixes 2026-02-19 09:05:58 -08:00
Broque Thomas
1d50ece62c debounced saving on settings page for all drop-down, tick boxes, input boxes and sliders. 2026-02-19 08:37:27 -08:00
Broque Thomas
8cf0950d3b Quality filter: use bitrate density instead of file size, cache Library/Discover pages, extend Beatport cache to 24h 2026-02-19 07:40:49 -08:00
Broque Thomas
acb26777ca fix images 2026-02-18 22:06:08 -08:00
Broque Thomas
ae5d77810d Add Deezer & AudioDB source badges to library artist cards and detail page 2026-02-18 21:30:15 -08:00
Broque Thomas
8f9851c50f add image fallback to library artists 2026-02-18 21:13:03 -08:00
Broque Thomas
a7cc558fb3 update ui when metadata worker finishes. 2026-02-18 18:57:00 -08:00
Broque Thomas
e2351eaa5c backup image for library artists 2026-02-18 17:27:01 -08:00
Broque Thomas
2ab52a340b Add Deezer enrichment for artists, albums, and track
Add Deezer as a third metadata enrichment source. Enriches tracks with BPM and explicit flags, albums with
   record labels, explicit flags, and type classification (album/single/EP), and backfills artwork and genres across
  all entities. Includes background worker with priority queue, rate-limited API client, database migration, server
  endpoints, and UI button with purple-themed status tooltip.
2026-02-18 16:41:24 -08:00
Broque Thomas
1a4395cc95 Add AudioDB enrichment for artists, albums, and tracks
Integrated TheAudioDB as a metadata enrichment source. A background worker scans the library in priority order (artists → albums → tracks), matching entities via fuzzy name comparison and storing style, mood, and AudioDB IDs. Includes rate limiting, 30-day retry for not-found items, and a UI tooltip showing phase-based scan progress.
2026-02-18 14:08:01 -08:00
Broque Thomas
9457235080 clean up artist bubbles from past downloads 2026-02-18 12:03:59 -08:00
Broque Thomas
5e61a15f7f Add Spotify disconnect button and cache auth checks
Add a UI button to disconnect Spotify and fall back to iTunes/Apple Music without restarting.    Cache is_spotify_authenticated() with a 60s TTL to reduce redundant API calls (~46 call sites were each
  triggering a live sp.current_user() call). Fix status endpoint calling the auth check twice per poll,
  and ensure both OAuth callback handlers (port 8008 Flask route and port 8888 dedicated server)
  invalidate the status cache so the UI updates immediately after authentication.
2026-02-18 11:40:07 -08:00
Broque Thomas
0c40a922e6 Add batch remove to watchlist modal 2026-02-17 11:28:44 -08:00
Broque Thomas
139b8530f4 Add watchlist filter to library page 2026-02-17 11:21:41 -08:00
Broque Thomas
93d65b1ad3 add watchlist indicator to artists listed on the library page that are in the user watchlist 2026-02-17 11:08:33 -08:00
Broque Thomas
e9c405559d Move the buttons on discover page so sidebar doesn't hide them 2026-02-17 10:41:59 -08:00
Broque Thomas
801274deb3 Add error reason tooltips to failed downloads in missing tracks modal
When a download fails in the Download Missing Tracks modal, hovering over the "Failed" status now shows a   tooltip explaining why. The backend already tracked error_message on tasks internally but never sent it to the frontend. This surfaces those reasons and enriches them with detailed context — search diagnostics break down what happened per query (no results, filtered out, search error), retry failures include source counts and likely cause, and timeout/stuck messages name the state and duration. The tooltip uses a fixed-position popup to avoid clipping by the modal's scroll container, with scroll and visibility-aware dismissal.
2026-02-17 10:28:12 -08:00
Broque Thomas
1ed66c120e Fix Soulseek connection status showing false positive on test
The Soulseek "Test Connection" button could report success while the dashboard status remained              "Disconnected" because the status endpoint only checked if slskd was configured (is_configured()), not actually
reachable (check_connection()). Switched to a real connection check with TTL caching (matching the existing
Spotify/media server pattern), update the status cache after successful tests, and refresh the UI immediately on success.
2026-02-16 14:42:17 -08:00
Broque Thomas
96f991a833 multi cd post processing is now possible. No longer treated as single cd. 2026-02-16 11:49:26 -08:00
Broque Thomas
08e34c31b5 allow user to open download modal on completed items 2026-02-16 10:17:21 -08:00
Broque Thomas
1fd8e59a17 css changes and lazyload changes to increase site speed.
Also fixed a docker path bug, well a potential bug.
2026-02-16 09:08:32 -08:00
Broque Thomas
5f12634f61 fix seasonal discovery showing "Various Artists" and using wrong download mode 2026-02-15 19:29:20 -08:00
Broque Thomas
0d66f884e6 fix - jellyfin servers can not select a user when determing which library to scan. 2026-02-15 14:09:44 -08:00
Broque Thomas
e66ed32463 fix the 'fix' modal on discovery modal if track is incorrect 2026-02-14 21:32:10 -08:00
Broque Thomas
6a8c32329b enlarge favicon 2026-02-13 16:11:32 -08:00
Broque Thomas
5c6c51061a css changes on settings page 2026-02-13 13:57:18 -08:00
Broque Thomas
a91c10bee5 css changes for enhanced search results for desktop and mobile 2026-02-13 10:24:20 -08:00
Broque Thomas
40be502a98 Enhanced search: separate albums from singles/EPs and improve UX
Split the enhanced search dropdown into distinct Albums and Singles & EPs sections using the album_type field. Changed the zero-tracks error from a cryptic red error toast to a clear warning message. Fixed the loading text to show the actual music source name instead of hardcoded "Spotify".
2026-02-13 08:53:19 -08:00
Broque Thomas
0caef23eda add favicon 2026-02-12 14:03:44 -08:00
Broque Thomas
20c7aa33a3 Add per-track ownership indicators to Library wishlist modal
When clicking a partially-complete album on the Library page, the wishlist modal now shows which tracks are owned (dimmed with checkmark) and which are missing (orange border). Ownership data lazy-loads after the modal opens to avoid blocking the UI, using a batch DB query for speed. Also fixes albums like DAMN. showing "14/15" when all available tracks are owned — the frontend now trusts the backend's "completed" status instead of doing raw track count math against potentially inaccurate Spotify metadata.
2026-02-12 13:09:42 -08:00
Broque Thomas
f7c929abec Library page: lazy-load artist discography with SSE streaming
Replace blocking DB matching in the Library artist detail view with a two-phase render pattern. The page now renders album cards instantly from Spotify/Itunes data , then streams per-release ownership results via SSE that update cards one-by-one.
2026-02-12 10:54:42 -08:00
Broque Thomas
51ffae4385 bump v1.6, update changelog, fix Spotify API deprecation
Update version to 1.6 in sidebar and API. Add changelog for local import, enhanced tagging, mobile layout, and performance improvements. Fix track popularity field access for upcoming Spotify API changes (February 2026).
2026-02-07 16:26:14 -08:00
Broque Thomas
0642bc194b Update mobile.css 2026-02-07 16:16:46 -08:00
Broque Thomas
64b601fa5e mobile css fixes 2026-02-07 16:14:13 -08:00
Broque Thomas
cac3cfab92 redesign import button 2026-02-07 09:59:40 -08:00
Broque Thomas
d674b999e5 feat: Import Music from local staging folder
Added an Import feature that lets users process local audio files through the existing post-processing pipeline (metadata enrichment, cover art, lyrics, library organization). Files are placed in a configurable Staging folder and imported via two modes: Album mode (search/match files to a Spotify tracklist) and Singles mode (select individual files for processing). Includes auto-suggested albums based on staging folder contents and real-time per-track progress tracking.
2026-02-06 23:29:05 -08:00
Broque Thomas
48b188446b feat: discovery match cache, mobile sync layout fixes
- Add global discovery_match_cache table to cache successful track matches
    (title+artist+provider -> matched result) across all discovery sources
  - Cache check before API search in YouTube, ListenBrainz, Tidal, and Beatport
    discovery workers; cache write after high-confidence matches
  - Re-discovering playlists or overlapping tracks across sources skips API lookups
  - Fix Spotify tab sidebar forcing 2-column grid on mobile via inline JS styles
  - Add mobile responsive styles for Spotify playlist cards (stack layout vertically)
2026-02-06 09:24:50 -08:00
Broque Thomas
4f56cdf365 mobile responsive layout 2026-02-06 08:18:40 -08:00
Broque Thomas
d9efcbdf99 feat: AcoustID audio verification, MusicBrainz enrichment UI, v1.5
Add optional post-download audio fingerprint verification using AcoustID.
  Downloads are verified against expected track/artist using fuzzy string
  matching on AcoustID results. Mismatched files are quarantined and
  automatically added to the wishlist for retry.

  - AcoustID verification with title/artist fuzzy matching (not MBID comparison)
  - Quarantine system with JSON metadata sidecars for failed verifications
  - fpcalc binary auto-download for Windows, macOS (universal), and Linux
  - MusicBrainz enrichment worker with live status UI and track badges
  - Settings page AcoustID section with real-fingerprint connection test
  - Source reuse for album downloads to keep tracks from same Soulseek user
  - Enhanced search queries for better track matching
  - Bug fixes: wishlist tracking, album splitting, regex & handling, log rotation
2026-02-05 16:33:07 -08:00
Broque Thomas
2d97d5c7d2 refactor musicbrainz badge 2026-02-05 07:34:47 -08:00
Broque Thomas
22eb62bb77 add musicbrainz icon for items where matched 2026-02-04 21:37:15 -08:00
Broque Thomas
2a4cab3f96 fix polling for musicbrainz worker 2026-02-03 19:47:31 -08:00
Broque Thomas
fa808e5bba include acoustID in settings page. foundation for verification flow 2026-02-03 16:57:53 -08:00
Broque Thomas
cee5590718 feat(ui): add MusicBrainz enrichment status UI with real-time monitoring
MusicBrainz library enrichment with real-time
status monitoring and manual control.
Features:
- Status icon button in dashboard header with glassmorphic design
- Animated loading spinner during active enrichment
- Hover tooltip showing:
  - Worker status (Running/Paused/Idle)
  - Currently processing item
  - Artist matching progress with percentage
- Click-to-toggle pause/resume functionality
- Auto-polling every 2 seconds for live updates
Backend Changes:
- Added GET /api/musicbrainz/status endpoint
- Added POST /api/musicbrainz/pause endpoint
- Added POST /api/musicbrainz/resume endpoint
- Worker tracks current_item for UI display
- get_stats() returns enhanced status data
Frontend Changes:
- New MusicBrainz button component with tooltip
- Premium CSS styling with animations
- JavaScript polling and state management
- Positioned tooltip below button with centered arrow
Files Modified:
- web_server.py: API endpoints and worker initialization
- core/musicbrainz_worker.py: current_item tracking
- webui/index.html: Button and tooltip structure
- webui/static/style.css: Complete styling (240 lines)
- webui/static/script.js: Polling and interaction logic (115 lines)
2026-02-03 15:20:04 -08:00
Broque Thomas
5d779e7c81 fix issue where anything after '&' was scrubbed by regex. 2026-02-02 15:59:03 -08:00
Broque Thomas
6750c20dc4 display all listenbrainz playlsts in unique categories. 2026-01-29 08:55:19 -08:00
Broque Thomas
8248fab16e Fix iTunes wishlist and remove Single suffix
iTunes tracks now include album field for proper wishlist support.
  Strip " - Single" and " - EP" suffixes from iTunes album names.
2026-01-26 17:00:51 -08:00
Broque Thomas
375dcb8a19 Revert "Fix race condition preventing failed tracks from being added to wishlist"
This reverts commit c0c05c7b89.
2026-01-26 16:51:19 -08:00
Broque Thomas
c0c05c7b89 Fix race condition preventing failed tracks from being added to wishlist
Root cause: When album downloads completed, the frontend immediately closed
the modal and called /api/playlists/cleanup_batch, which deleted the batch
from memory. The wishlist processing thread (submitted to executor) would
then try to access the batch and fail silently because it was already deleted.

This explains why:
- Wishlist auto-processing worked (different timing/3-second delay)
- Manual "Add to Wishlist" button worked (different code path, before downloads)
- Album modal failed tracks didn't get added (race condition)

The fix prevents batch cleanup until wishlist processing completes:

Backend (web_server.py):
1. Mark wishlist_processing_started=True when submitting processing job
2. Mark wishlist_processing_complete=True when processing finishes
3. Block cleanup endpoint if processing in progress (return 202)

Frontend (script.js):
4. Handle 202 response and retry cleanup after 2-second delay

This eliminates the race condition while maintaining async processing and
ensuring all failed/cancelled tracks are properly added to the wishlist.
2026-01-26 16:44:31 -08:00
Broque Thomas
66e906fece fix: enable album folder organization for Discover page downloads
Updated startMissingTracksProcess in script.js to recognize discover_album_ IDs as album downloads. This ensures that albums downloaded from the Discover page (e.g., Recent Releases) are correctly organized into "Artist/Album" folders instead of being treated as flat playlists.
2026-01-26 11:42:45 -08:00
Broque Thomas
6096049c50 Fix album tracks added as singles from Library page with iTunes source
Library page was using album data from discography listing while Artists page used track.album from API. With iTunes, these could have different track counts, causing different album_type classifications.

  - Updated handleAddToWishlist to use track.album data like Artists page does
  - Added album_type copying to owned releases in merge_discography_data
2026-01-25 17:44:17 -08:00
Broque Thomas
f4365fa836 Fix artist image not appearing for artist bubble, artist bubble modal or when an artist is selected in search. 2026-01-25 10:51:02 -08:00
Broque Thomas
d7542b20c9 update version modal and readme 2026-01-25 10:33:32 -08:00
Broque Thomas
905e98016f Fix watchlist artist config and add image at insert when Itunes source. 2026-01-25 09:24:28 -08:00
Broque Thomas
47c45ddea7 feat: dynamic music source labels in discovery modals
- Added global currentMusicSourceName variable to track active source
- Updated discovery modal to show "Apple Music" when iTunes is active
- Replaced hardcoded "Spotify" in modal titles, headers, and descriptions
- Discovery modals now automatically reflect the correct music source (Spotify/Apple Music)
2026-01-25 00:35:16 -08:00
Broque Thomas
59848acaf3 feat: dynamic source labels and enhanced connection testing
- Display "Apple Music" instead of "Spotify" in UI when iTunes is active source
- Enhanced connection test messages to indicate Spotify config/auth status
- Fixed similar artists requiring Spotify re-scan when Spotify becomes available
- Fixed hero slider buttons failing for iTunes-only artists
- Updated activity feed items to show correct source name dynamically
2026-01-25 00:29:33 -08:00
Broque Thomas
4cbb3c952b Fix 'view discog' button on discover hero slider when itunes is primary source. 2026-01-24 23:58:08 -08:00
Broque Thomas
3cb88669e3 Fix iTunes-only Discover page not loading data
- Add similar artists fetching to web UI scan loop
  - Add database migration for UNIQUE constraint on similar_artists table                                          - Add source-agnostic /api/discover/album endpoint for iTunes support
  - Fix NOT NULL constraint on discovery_recent_albums blocking iTunes albums
  - Add fallback to watchlist artists when no similar artists exist
  - Add /api/discover/refresh and /api/discover/diagnose endpoints
  - Add retry logic with exponential backoff for iTunes API calls
  - Ensure cache_discovery_recent_albums runs even when pool population skips
2026-01-24 21:48:17 -08:00
Broque Thomas
2170ffa99e Fix discovery modal fix button for iTunes source and ListenBrainz playlists
- Fix platform detection to include is_listenbrainz_playlist check when generating fix buttons
  - Update openDiscoveryFixModal to check both listenbrainzPlaylistStates and youtubePlaylistStates
  - Update searchDiscoveryFix to detect discovery_source and use appropriate search API
  - Add /api/itunes/search_tracks endpoint for manual track search when using iTunes source
  - Update selectDiscoveryFixTrack state lookup to include ListenBrainz

  Fix button now works correctly for all platforms (YouTube, ListenBrainz, Tidal, Beatport) with both Spotify
  and iTunes discovery sources.
2026-01-24 14:25:27 -08:00
Broque Thomas
1560726bbc rebuild discovery pool flow to allow multiprocessing of itunes and spotfiy. each getting their own pool. 2026-01-23 14:25:26 -08:00
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
fb56fbca5f Enhance wishlist auto-processing detection and UI feedback
Added backend support for reporting current auto-processing state and cycle in the wishlist stats API. Updated frontend to detect and handle auto-processing start, close modals, and notify users, as well as improved countdown timer updates and conflict handling when starting manual processing.
2026-01-13 10:00:17 -08:00
Broque Thomas
030757fe12 Improve wishlist deduplication and timer reset logic
Enhanced wishlist and watchlist processing to deduplicate tracks during both sanitization and filtering, preventing duplicate downloads and processing. Added explicit resets of next run timer variables to ensure accurate scheduling after each cycle. Updated countdown timer display in the UI to show '0s' when timer reaches zero instead of hiding it.
2026-01-11 15:46:47 -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
c7f2f95450 Update to SoulSync v1.3 with YouTube engine and fixes
Bump version to 1.3 and update the version info modal to highlight the new YouTube download engine, Docker and system reliability fixes, and general improvements. Update the web UI to display v1.3 and apply minor formatting and accessibility improvements throughout index.html.
2026-01-06 22:53:21 -08:00
Broque Thomas
c251edc709 Improve stuck flag recovery and album classification
Adds critical fixes to reschedule timers after stuck flag recovery for wishlist and watchlist processes, preventing deadlocks and ensuring continuity. Refines album classification by prioritizing Spotify's album_type over track count heuristics, and ensures album_type is included in API responses. Updates frontend logic to pass and use fresh album/artist context for discover_album modals, improving metadata accuracy and display.
2026-01-06 16:04:05 -08:00
Broque Thomas
7d22671628 Revert "Improve album classification and modal data handling"
This reverts commit b32871cf28.
2026-01-06 15:20:30 -08:00
Broque Thomas
b32871cf28 Improve album classification and modal data handling
Refines album/single classification in get_wishlist_stats by considering explicit 'album' type for short multi-track releases. Also updates openDownloadModalForRecentAlbum to include total_tracks and album_type in album data for more accurate processing.
2026-01-06 14:27:14 -08:00
Broque Thomas
af2265a68a Improve YouTube download handling and add Spotify search API
Enhanced download status and post-processing logic to properly handle YouTube downloads alongside Soulseek transfers. Improved file organization for simple downloads, moving singles without album info directly to the Transfer root. Added a new generic Spotify search API endpoint. Updated frontend logic to correctly display YouTube download titles and results, and improved filename parsing for YouTube tracks.
2026-01-04 20:16:08 -08:00
Broque Thomas
c9939ac418 Update script.js 2026-01-04 15:14:49 -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
a62f2c34b9 Add Discover page help button and guide
Introduces a help button to the Discover page UI, styled for visibility and accessibility. Adds comprehensive help content explaining all Discover page features, including MusicMap integration, playlist types, seasonal content, and sync/download options.
2026-01-02 21:16:53 -08:00
Broque Thomas
e9a1797687 Add toggle button for download manager panel
Introduces a toggle button in the downloads header to show or hide the download manager side panel. The toggle state is persisted in localStorage, and responsive styles are added for better usability on small screens. Updates HTML structure, JavaScript initialization, and CSS for the new toggle functionality and improved mobile experience.
2026-01-02 11:20:22 -08:00
Broque Thomas
a8935ae8f5 Add $year variable support to file path templates
Introduces the $year variable for album, single, and playlist path templates, allowing users to include the release year in file organization. Updates the backend to extract and provide the year, adjusts the web UI to document the new variable, and updates validation logic to recognize $year as valid in templates.
2026-01-02 08:24:43 -08:00
Broque Thomas
b426d9d1e4 Enhance search UI with dynamic glow and premium design
Increases Spotify search result limits for artists and albums. Adds dynamic glow effects to artist, album, and track cards in the UI using image-based colors. Significantly upgrades the CSS for enhanced dropdowns, cards, and lists with a premium, vibrant, and responsive design.
2025-12-30 22:29:50 -08:00
Broque Thomas
2d61b0d076 Update to v1.2 with enhanced search and matching
Bumps SoulSync version to 1.2, introducing a unified multi-source search system, a major overhaul of the matching engine for improved accuracy, and significant wishlist and quality-of-life improvements. Updates version info and UI elements to reflect the new release and its features.
2025-12-30 19:47:54 -08:00
Broque Thomas
ca130e5000 Update script.js 2025-12-30 11:43:43 -08:00
Broque Thomas
420044387e Add streaming for enhanced search tracks
Introduces a backend API endpoint and frontend logic to allow users to stream individual tracks directly from enhanced search results. Updates the UI to include a play button for each track, adjusts the search mode toggle to default to enhanced search, and refines related styles for improved user experience.
2025-12-29 18:13:50 -08:00
Broque Thomas
0bd1cab9e2 Improve enhanced search results toggle UX
Updated the enhanced search button to toggle showing/hiding previous results, with dynamic icon and text changes. Prevented duplicate event listeners by ensuring single initialization. Improved dropdown visibility logic and user feedback when no results are available.
2025-12-29 15:54:47 -08:00
Broque Thomas
0743070c84 Update style.css 2025-12-29 15:07:52 -08:00
Broque Thomas
d20609c33b Add search bubble snapshot and download tracking system
Implements a persistent search bubble system for tracking album and track downloads in enhanced search. Adds backend API endpoints for saving and hydrating search bubble snapshots, frontend state management for search download bubbles, UI for displaying and managing active/completed downloads, and associated styles for search bubble cards. This enables users to resume and manage search downloads across page refreshes.
2025-12-29 14:33:59 -08:00
Broque Thomas
a431ec0bd6 Improve enhanced search UI and increase track results
Increased the number of tracks returned by enhanced search from 10 to 20. Updated CSS for enhanced search sections and artist cards to improve visual appearance, spacing, and responsiveness, including larger artist images, new backgrounds, and better layout for various screen sizes.
2025-12-29 12:37:05 -08:00
Broque Thomas
926de6d833 Update style.css 2025-12-29 12:14:21 -08:00
Broque Thomas
1d4fc3b96e include duration in unified search single results. 2025-12-29 11:02:37 -08:00
Broque Thomas
7272860696 Improve artist detail navigation and logging
Updated artist selection actions to log navigation events and use more direct navigation functions. Navigating to library artist details now uses navigateToArtistDetail, and Spotify artist details use selectArtistForDetail after a short delay, improving consistency and user experience.
2025-12-29 10:17:41 -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
14a5944ae1 Add enhanced search mode UI and retry logic for downloads
Introduces a search mode toggle in the downloads UI, allowing users to switch between basic and enhanced search modes. Adds new HTML structure, JavaScript logic, and CSS styles for the enhanced search interface (currently placeholder functionality). In the backend, implements a retry system for file discovery after download completion to handle race conditions, with cleanup of stale retry attempts to prevent memory leaks.
2025-12-28 22:24:23 -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
b4e4d6f07a Update style.css 2025-12-15 21:39:40 -08:00
Broque Thomas
4c9f7f3b58 Fix wishlist modal overlay and enable vertical scrolling
Ensures the loading overlay is always hidden when opening the wishlist modal, including on error or early return. Updates CSS to allow vertical scrolling in the modal while keeping horizontal overflow hidden.
2025-12-15 11:21:17 -08:00
Broque Thomas
b50f6c8d9f Add limit parameter to wishlist tracks API
Introduces an optional 'limit' query parameter to the /api/wishlist/tracks endpoint for improved performance when fetching tracks. Updates the frontend to use this parameter, limiting requests to 50 tracks per category when fetching album and single covers.
2025-12-13 08:32:42 -08:00
Broque Thomas
e9c9021db0 Add animated mosaic backgrounds to wishlist categories
Introduces a dynamic mosaic grid background with scrolling album covers for the wishlist category cards in the overview modal. Adds supporting JavaScript functions to extract unique cover images and generate the mosaic HTML, and updates CSS to style and animate the mosaic, including fallbacks and hover effects for improved visual appeal.
2025-12-12 23:02:28 -08:00
Broque Thomas
fca3e641dc Improve artist name extraction in wishlist selection
Enhanced the logic for extracting artist name and ID to handle both object and string formats from Spotify API and sanitized data. Added fallbacks to ensure artist information is correctly retrieved from multiple possible data structures.
2025-12-12 21:19:29 -08:00
Broque Thomas
4587022877 Remove source prefixes from playlist names
Eliminates hardcoded source prefixes (e.g., [Tidal], [YouTube], [Beatport], [ListenBrainz]) from playlist names in both backend and frontend code. Source detection is now handled via virtualPlaylistId prefixes, improving consistency and simplifying playlist name handling throughout the application.
2025-12-12 12:36:45 -08:00
Broque Thomas
8f30f0ab91 Enhance matched downloads with full Spotify metadata
Adds robust track-to-track matching for album and single downloads, enabling enhanced metadata enrichment using Spotify data. Updates both backend and frontend to support matching Soulseek tracks to Spotify tracks, sending full Spotify track objects for improved organization and post-processing. Simplifies context handling for simple downloads and removes legacy flags, ensuring more accurate and consistent metadata for matched downloads.
2025-12-12 07:13:53 -08:00
Broque Thomas
c7e943034d Add customizable file organization templates
Introduces a template-based file organization system for downloads, allowing users to define custom folder and filename structures for albums, singles, and playlists. Updates the backend, config example, web UI, and client-side validation to support template editing, resetting, and error checking. Improves consistency in file placement and metadata handling across all download modes.
2025-12-10 09:46:22 -08:00
Broque Thomas
5e866463ea Prevent duplicate playlist syncs and update UI
Added checks to prevent starting multiple syncs for the same playlist and updated the sync button state immediately for better user feedback. The sync button is now disabled and shows a loading state while syncing is in progress.
2025-12-09 11:36:59 -08:00
Broque Thomas
bab31218bb Improve artist handling and preserve album data in sync
Enhanced handling of artist data to support both string and object formats across the database, sync service, and web server. The sync process now preserves full album and artist objects for tracks, enabling wishlist additions with album cover art. The frontend and API were updated to use the full artist objects, and the UI now formats artist names correctly.
2025-12-09 10:44:54 -08:00
Broque Thomas
c1561b15ab Add dynamic log level control via Web UI
Introduces API endpoints and UI elements to view and change the application's log level from the web interface. Log level changes are applied immediately and persisted in the database. Updates backend logic, logging utilities, and frontend scripts to support this feature.
2025-12-08 12:53:44 -08:00
Broque Thomas
25a8117733 Add wishlist track and album removal with confirmation
Introduces backend API endpoints to remove individual tracks or all tracks from an album in the wishlist. Updates the frontend to display delete buttons for tracks and albums, with confirmation modals before removal, and styles these new UI elements for clarity and usability.
2025-12-08 11:11:08 -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
349d653ca0 Prevent race conditions in wishlist downloads
Adds support for sending specific track IDs from the frontend to the backend when starting wishlist missing downloads. This ensures only the tracks currently visible to the user are processed, preventing race conditions if the wishlist changes between modal open and analysis start. Category filtering remains for backward compatibility.
2025-12-07 14:43:43 -08:00
Broque Thomas
9575d8983c add timer to watchlist/wishlist 2025-11-26 12:14:08 -08:00
Broque Thomas
aba4129193 adjust auto watchlist scan ui 2025-11-26 11:58:29 -08:00
Broque Thomas
14548ec640 watchlist stuck fix 2025-11-26 11:11:28 -08:00
Broque Thomas
28d8dbf5e0 fix listenbrainz wishlist comp 2025-11-25 23:34:56 -08:00
Broque Thomas
e8f9803bd5 Update script.js 2025-11-25 22:07:26 -08:00
Broque Thomas
94fd39cf34 listenbrainz persistence bug 2025-11-25 18:36:59 -08:00
Broque Thomas
a61c581c25 listenbrainz fully connected to discovery modal 2025-11-25 17:41:22 -08:00
Broque Thomas
ffe02d5330 listenbrainz discovery fix 2025-11-25 15:13:41 -08:00
Broque Thomas
6db4409d08 better watchlist live status display for auto and manual scan 2025-11-25 09:21:33 -08:00
Broque Thomas
1749bb62a5 foundation for allowing user to decide which releases to grab per watchlist artist 2025-11-24 17:16:12 -08:00
Broque Thomas
bb816be280 update discoveyr modal to grab album data 2025-11-24 14:51:24 -08:00
Broque Thomas
3be1dc9ace update discovery modal to collect album info 2025-11-24 14:22:32 -08:00
Broque Thomas
178bb7696d update liked songs to include album info 2025-11-24 07:19:15 -08:00
Broque Thomas
c46e2c527e search bar for watchlist 2025-11-23 20:23:30 -08:00
Broque Thomas
8798522854 v1.1 modal udpated 2025-11-23 19:53:45 -08:00
Broque Thomas
cb87496857 clear/clean wishlist button in overview 2025-11-23 19:43:21 -08:00
Broque Thomas
0b2322f225 Wishlist overhaul near complete 2025-11-23 18:22:09 -08:00
Broque Thomas
573bd6080c Feat: Added 'add to wishlist' button on all download missing track modals. 2025-11-23 13:25:35 -08:00
Broque Thomas
3b936d6fdb Update script.js 2025-11-21 18:56:09 -08:00
Broque Thomas
b1391b9466 add failed scan items to wishlist. 2025-11-21 15:29:25 -08:00
Broque Thomas
08e3f6c900 fix liked songs 2025-11-21 13:31:26 -08:00
Broque Thomas
69ea705f5d fix wishlist duplicates 2025-11-19 09:47:56 -08:00
Broque Thomas
357214c7d7 Update script.js 2025-11-18 21:08:28 -08:00
Broque Thomas
12c37fa61c download bubbles for discoverp age 2025-11-18 18:58:37 -08:00
Broque Thomas
52c27ce2a9 cache listenbrainz and update with watchlist 2025-11-18 13:41:45 -08:00
Broque Thomas
c281382a3b fix sync for listenbrainz 2025-11-18 10:30:53 -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
a50e5a59d9 include listenbrainz on settings page 2025-11-17 22:20:30 -08:00
Broque Thomas
c28d7ff407 fix sync functionality on discover page for genre playlists 2025-11-17 22:09:40 -08:00
Broque Thomas
c08df3041e fix sync on discovery page 2025-11-17 19:10:15 -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
Broque Thomas
5a13b5fe94 discover progress 2025-11-17 08:30:38 -08:00
Broque Thomas
08a4decda8 discover progress 2025-11-16 20:56:08 -08:00
Broque Thomas
86fe7dde1f discover progress 2025-11-16 20:26:19 -08:00
Broque Thomas
f75ffdf6cb discover progress 2025-11-16 16:27:44 -08:00
Broque Thomas
68a15071f1 discover page 2025-11-16 15:33:08 -08:00
Broque Thomas
bd4e0d131e discover page updates 2025-11-16 15:11:42 -08:00
Broque Thomas
eaa27038d9 wishlist modal bug fix 2025-11-12 19:29:41 -08:00
Broque Thomas
abbb93f053 scan tool 2025-11-12 18:35:07 -08:00
Broque Thomas
97d3af5ec6 save setting toggle 2025-11-12 11:15:36 -08:00
Broque Thomas
605afc0695 auto m3u download for playlists 2025-11-11 21:04:33 -08:00
Broque Thomas
d19029cfc6 Update script.js 2025-11-11 20:54:43 -08:00
Broque Thomas
77ae6b737a export as m3u 2025-11-11 20:42:09 -08:00
Broque Thomas
5349ae3871 hero design 2025-11-11 20:19:34 -08:00
Broque Thomas
ab6056e35f Update index.html 2025-11-11 20:03:53 -08:00
Broque Thomas
91bb767faa add to watchlist button 2025-11-11 19:59:49 -08:00
Broque Thomas
42faf2ad31 Update script.js 2025-11-11 19:37:10 -08:00
Broque Thomas
b0cfdf5271 progress 2025-11-11 17:05:44 -08:00
Broque Thomas
65cbf6ce28 discover progress 2025-11-11 16:00:37 -08:00
Broque Thomas
d399a612ef progress on discover page 2025-11-11 11:38:27 -08:00
Broque Thomas
47f8862fc4 discovery page progress 2025-11-11 10:39:46 -08:00
Broque Thomas
0b7b88e892 duplicate cleaner 2025-11-10 19:47:26 -08:00
Broque Thomas
aa09b0ba5b duplicate cleaner tool 2025-11-10 19:36:36 -08:00
Broque Thomas
37c9de0007 detect lower quality files for watchlist / all artists. 2025-11-10 18:27:53 -08:00
Broque Thomas
06a3328b65 Added new 'Save as playlist' functionality for sync page. 2025-11-10 09:42:38 -08:00
Broque Thomas
208b233497 similar artist duplicate fix 2025-11-09 20:36:41 -08:00
Broque Thomas
5ffce6bb59 optimize album and cover art data 2025-11-09 20:33:25 -08:00
Broque Thomas
62ad5a9cd9 adjust settings page flow 2025-11-09 15:07:04 -08:00
Broque Thomas
576f151c5c preferred quality updates. 2025-11-09 14:16:38 -08:00
Broque Thomas
bb15cf8f9f fix polling issue for services 2025-11-09 09:30:56 -08:00
Broque Thomas
6f59dfd0f4 sidebar styling 2025-11-09 09:11:29 -08:00
Broque Thomas
8c7cb6d448 manual library selection for plex servers 2025-10-15 15:04:05 -07:00
Broque Thomas
c5c884f01f Update script.js 2025-10-04 22:23:34 -07:00
Broque Thomas
dead8da5ee similar artist functionality for artists page. 2025-10-04 17:53:17 -07:00
Broque Thomas
9fe0b5a7ff Update script.js 2025-10-04 17:45:54 -07:00
Broque Thomas
e62800f4b5 Update script.js 2025-10-04 17:37:01 -07:00
Broque Thomas
3dba6f97c4 Update script.js 2025-10-04 17:28:03 -07:00
Broque Thomas
ea9f351bdb similar artists start 2025-10-04 16:09:11 -07:00
Broque Thomas
2f8bad23a8 Add manual track matching and Docker permission docs
Implements manual track matching (discovery fix modal) for YouTube, Tidal, and Beatport platforms, allowing users to search and select Spotify tracks for unmatched results. Adds backend endpoints and frontend logic for updating matches, improves conversion of discovery results for sync/download, and updates Dockerfile/entrypoint for dynamic PUID/PGID/UMASK support. Includes a new DOCKER_PERMISSIONS.md guide.
2025-10-03 10:48:25 -07:00
Broque Thomas
26b9c18b02 Update style.css 2025-10-02 06:45:11 -07:00
Broque Thomas
5834177f82 beatport progress 2025-10-01 19:52:22 -07:00
Broque Thomas
7716ed400f Update script.js 2025-10-01 19:32:05 -07:00
Broque Thomas
1be978823f Update script.js 2025-10-01 19:24:54 -07:00
Broque Thomas
06f3d219b4 Add Beatport genre Top 10 lists API and UI integration
Introduces backend scraping and API endpoint for Beatport genre Top 10 and Hype Top 10 tracks, with 1-hour caching. Updates frontend to load and display these lists in the genre browser modal, matching main page structure and click handling for chart discovery.
2025-10-01 19:21:11 -07:00
Broque Thomas
fcd48793e0 Add Beatport Top 100 button to genre page
Introduces a 'Beatport Top 100' button to each genre page, allowing users to fetch and view the top 100 tracks for a selected genre. Includes new event handling logic in script.js and corresponding styles in style.css for the button and its container.
2025-10-01 17:59:38 -07:00
Broque Thomas
fd92deb5c8 beatport progress 2025-10-01 17:40:37 -07:00
Broque Thomas
c7377e4ac7 beatport progress 2025-10-01 14:50:03 -07:00
Broque Thomas
c421a3b02c fix tidal discovery modal header 2025-10-01 12:34:39 -07:00
Broque Thomas
a59d3122d7 allow individual release downloads for hero slider 2025-10-01 12:26:48 -07:00
Broque Thomas
0e2a2200b6 beatport main page complete 2025-10-01 11:20:19 -07:00
Broque Thomas
36f5f48a47 Update script.js 2025-10-01 09:52:10 -07:00
Broque Thomas
0ac58add26 Update script.js 2025-10-01 09:49:41 -07:00
Broque Thomas
3056f9637f beatport progress 2025-10-01 09:34:28 -07:00
Broque Thomas
02f171646c Update script.js 2025-10-01 09:26:13 -07:00
Broque Thomas
16e786586e Improve sync polling resumption for playlists
Refactored polling logic for YouTube, Beatport, and Tidal playlists to immediately fetch current status before starting interval polling. Enhanced modal and state restoration to resume both discovery and sync polling as appropriate, ensuring consistent behavior across all supported platforms.
2025-10-01 08:45:41 -07:00
Broque Thomas
299d320d8c Update script.js 2025-10-01 07:47:59 -07:00
Broque Thomas
ed5328e6c7 Add Beatport hero slider releases scraping support
Introduces a new API endpoint to scrape tracks from multiple Beatport release URLs and integrates hero slider click handling on the rebuild page. The frontend now extracts release URLs from the hero slider and fetches track data using the new backend endpoint, improving rebuild page functionality.
2025-09-30 20:50:16 -07:00
Broque Thomas
3395d697c2 Update Beatport slider layout and remove track meta
Removed genre and year metadata from Beatport slider track cards in script.js. Increased slider height and track info max-width in style.css to improve layout and visual presentation.
2025-09-30 19:43:05 -07:00
Broque Thomas
bdb087f8d5 Update script.js 2025-09-30 19:07:38 -07:00
Broque Thomas
65cc0e517d Normalize track text and add rebuild Top 10 logic
Introduces text cleaning for track, artist, and label fields in both Python and JS to ensure proper spacing and formatting. Adds logic to the frontend for handling Beatport Top 10 and Hype Top 10 containers on the rebuild page, including DOM extraction and card creation, following the Browse Charts pattern.
2025-09-30 18:31:35 -07:00
Broque Thomas
74f7cb1e81 baetport progress 2025-09-30 15:51:45 -07:00
Broque Thomas
6afc26be6f Update style.css 2025-09-30 14:47:24 -07:00
Broque Thomas
42e9a3b68f Update style.css 2025-09-30 14:20:21 -07:00
Broque Thomas
7821d4cba5 beatport progress 2025-09-30 13:58:02 -07:00
Broque Thomas
69c8622588 beatport progress 2025-09-30 13:23:01 -07:00
Broque Thomas
5e73b53a0f beatport progress 2025-09-30 12:36:25 -07:00
Broque Thomas
4f33ac82ba Update style.css 2025-09-30 11:21:29 -07:00
Broque Thomas
4569b804b0 Update style.css 2025-09-30 10:47:19 -07:00
Broque Thomas
e9b9e8d50b Update style.css 2025-09-30 10:31:05 -07:00
Broque Thomas
df11474951 beatport progress 2025-09-30 09:32:52 -07:00
Broque Thomas
d885316077 beatport update 2025-09-29 23:52:04 -07:00
Broque Thomas
bc2be55455 beatport progress 2025-09-29 23:35:55 -07:00
Broque Thomas
6e169056d3 rebuild beatport section 2025-09-29 23:05:18 -07:00
Broque Thomas
bf454e63eb Update script.js 2025-09-29 07:46:41 -07:00
Broque Thomas
d6dc30f9e4 style changes 2025-09-28 23:03:07 -07:00
Broque Thomas
61dd721b67 Update script.js 2025-09-28 22:49:39 -07:00
Broque Thomas
5071dbc642 Update index.html 2025-09-28 22:40:55 -07:00
Broque Thomas
005178a252 Update style.css 2025-09-28 22:39:31 -07:00
Broque Thomas
6112d73d52 Update style.css 2025-09-28 22:27:42 -07:00
Broque Thomas
ddc2d54856 Update style.css 2025-09-28 22:20:15 -07:00
Broque Thomas
11d91a2ebb Update script.js 2025-09-28 22:09:57 -07:00
Broque Thomas
0d74634983 beatport progress 2025-09-28 20:27:29 -07:00
Broque Thomas
589250dc6f Update script.js 2025-09-28 19:56:47 -07:00
Broque Thomas
4167c361a7 beatport progress 2025-09-28 19:51:29 -07:00
Broque Thomas
6df2759e22 beatport progress 2025-09-28 18:43:49 -07:00
Broque Thomas
526aeb0bda beatport progress 2025-09-28 18:37:07 -07:00
Broque Thomas
5981bd772f beatport progress 2025-09-28 18:16:28 -07:00
Broque Thomas
dc8e3c1033 beatport progress 2025-09-28 07:59:36 -07:00
Broque Thomas
27b1e57d97 beatport progress 2025-09-27 22:21:20 -07:00
Broque Thomas
7e42e20887 beatport progress 2025-09-27 20:16:18 -07:00
Broque Thomas
6aa936103c Update script.js 2025-09-27 17:36:48 -07:00
Broque Thomas
d6b83586a5 Update script.js 2025-09-27 16:58:50 -07:00
Broque Thomas
94bb897869 Update script.js 2025-09-27 13:53:40 -07:00
Broque Thomas
a993a972fd beatport progress 2025-09-27 12:57:24 -07:00
Broque Thomas
ef69eb698b beatport progress 2025-09-27 00:10:58 -07:00
Broque Thomas
ce21cf0126 beatport progress 2025-09-26 23:25:23 -07:00
Broque Thomas
b553e2ef41 beatport progress 2025-09-26 23:07:03 -07:00
Broque Thomas
6ef839ab89 beatport progress 2025-09-26 22:15:44 -07:00
Broque Thomas
f5ae3d611c beatport progress 2025-09-26 22:04:46 -07:00
Broque Thomas
0ba4b6a079 pull genres with imges. 2025-09-26 16:11:50 -07:00
Broque Thomas
ccc686a892 placeholder beatport playlist functionality 2025-09-26 15:12:25 -07:00
Broque Thomas
90c6af078d add watchlist functionality to library page 2025-09-26 07:43:12 -07:00
Broque Thomas
c90d5e11ae style fix 2025-09-25 21:41:37 -07:00
Broque Thomas
909e5e59de Update script.js 2025-09-25 21:28:52 -07:00
Broque Thomas
961156d628 Update script.js 2025-09-25 21:20:11 -07:00
Broque Thomas
5b834f5135 hide details until ready 2025-09-25 18:25:03 -07:00
Broque Thomas
3d55c690a1 Update style.css 2025-09-25 08:09:00 -07:00
Broque Thomas
0247f324ee fix year not displaying 2025-09-24 22:52:33 -07:00
Broque Thomas
09d633f80b add to wishlist functionality for library page 2025-09-24 22:30:38 -07:00
Broque Thomas
ffdee23cb0 fix library page 2025-09-24 12:38:00 -07:00
Broque Thomas
3e8b469adb library page updates 2025-09-23 23:47:58 -07:00
Broque Thomas
96043ef530 library page updates 2025-09-23 15:15:29 -07:00
Broque Thomas
03b0b8c6c5 library page update 2025-09-23 14:19:11 -07:00
Broque Thomas
9485dfb03b start of library page 2025-09-23 11:42:58 -07:00
Broque Thomas
180413677c toggle to force the download of all tracks in modal 2025-09-23 10:42:10 -07:00
Broque Thomas
688aa6581f fixed multiple artist metadata update. style updates 2025-09-23 09:55:26 -07:00
Broque Thomas
35f4b25bad fix wishlist modal not auto restarting after initial run. 2025-09-23 08:44:47 -07:00
Broque Thomas
a053ed22a3 artist bubble modal design update 2025-09-22 18:01:56 -07:00
Broque Thomas
c3dd91d676 update design for download missing track modal 2025-09-22 17:52:55 -07:00
Broque Thomas
e06f0ea372 auto scan after download completion and follow with auto incremental update for active server 2025-09-22 15:01:28 -07:00
Broque Thomas
8cceef0610 m4a support on search page stream 2025-09-22 12:41:05 -07:00
Broque Thomas
85d7dce943 status updates and album card download status 2025-09-22 11:34:39 -07:00
Broque Thomas
ba37225e1b gui navidrome support 2025-09-22 09:46:30 -07:00
Broque Thomas
fcee0194e7 navidrome functionality start 2025-09-21 21:02:12 -07:00
Broque Thomas
0f64d17bf6 add navidrome to settings 2025-09-21 14:10:17 -07:00
Broque Thomas
325828a5bf fix modal cleanup 2025-09-20 18:48:07 -07:00
Broque Thomas
fd071eb4a3 Update script.js 2025-09-13 21:40:33 -07:00
Broque Thomas
7d5d2bf30b fix multiple searches on enter press 2025-09-13 20:05:01 -07:00
Broque Thomas
21d016fcbd Add configurable redirect URI for Spotify and Tidal
Redirect URIs for Spotify and Tidal OAuth are now configurable via the web UI and settings. Updated backend clients to use the configured redirect URI if provided, improving flexibility for deployments with custom callback URLs.
2025-09-12 21:56:26 -07:00
Broque Thomas
c4b4adf7fb Add web-based Spotify and Tidal OAuth flows
Introduces web server routes and UI buttons for initiating Spotify and Tidal OAuth authentication flows, with dedicated callback servers for token exchange. Updates Docker ports for OAuth callbacks and refines PKCE handling for Tidal. Improves user experience by allowing authentication directly from the web UI.
2025-09-11 13:24:15 -07:00
Broque Thomas
4e30e90777 Update to SoulSync v1.0 with complete WebUI rebuild
Bumped version to 1.0 and updated all version references and changelog details to reflect the major release. SoulSync now features a fully rebuilt web-based UI, Docker container support, enhanced music management, and significant performance improvements.
2025-09-11 07:47:42 -07:00
Broque Thomas
041b6c4d31 Update style.css 2025-09-11 07:20:38 -07:00
Broque Thomas
196a1eb3ac Update style.css 2025-09-10 21:08:14 -07:00
Broque Thomas
f4e56da245 Update style.css 2025-09-10 21:03:32 -07:00
Broque Thomas
433ee160e9 Update index.html 2025-09-10 19:42:04 -07:00
Broque Thomas
6b8505d840 Revamp dashboard and card glassmorphic styles
Enhanced glassmorphic effects across dashboard, service, stat, and tool cards for improved visual consistency. Updated gradients, border radii, shadow effects, and hover states to match modal styling. Adjusted padding, font sizes, and section spacing for a more polished and premium UI appearance.
2025-09-10 19:36:05 -07:00
Broque Thomas
ac7a8f1513 Add metadata updater system for artists
Introduces a metadata updater backend in web_server.py, including API endpoints for starting, stopping, and checking status, and a threaded worker for updating artist metadata from Spotify. Updates script.js to add UI controls, polling, and progress display for the metadata updater, with logic to hide the tool when Jellyfin is the active server.
2025-09-10 19:19:29 -07:00
Broque Thomas
1dd4f8d7a3 Update style.css 2025-09-10 17:22:26 -07:00
Broque Thomas
ae9f426361 Add activity logging for key user actions
Introduces activity item logging for settings saves, connection tests, auto-detects, authentication flows, searches, batch cancellations, and discovery operations in web_server.py. Updates dashboard connection test API and UI to use a new endpoint and function, ensuring user actions are tracked and surfaced in the activity feed.
2025-09-10 17:16:01 -07:00
Broque Thomas
94d1c82674 Add activity feed and toasts to dashboard
Introduces a global activity feed system with API endpoints for recent activities and toasts, and integrates activity tracking for key backend events (downloads, syncs, database updates, etc.). Updates the dashboard frontend to periodically fetch and display activity feed items and show toasts for recent actions. Improves error logging and reduces noise for expected 404s in Soulseek client. Adds related CSS for activity feed separators.
2025-09-10 17:04:12 -07:00
Broque Thomas
7a7480ba60 Update script.js 2025-09-10 15:45:39 -07:00
Broque Thomas
135728ce89 Add system stats API and dashboard service status updates
Introduces a new /api/system/stats endpoint in web_server.py to provide system statistics such as uptime, memory usage, download speed, and sync counts. Enhances the dashboard in script.js to periodically fetch and display service connection status and system stats, including response times for Spotify, media server, and Soulseek.
2025-09-10 15:22:31 -07:00
Broque Thomas
8336109661 Update script.js 2025-09-10 14:31:34 -07:00
Broque Thomas
579674cb33 Update script.js 2025-09-10 14:26:02 -07:00
Broque Thomas
6011c50304 Add artist watchlist feature with UI and API endpoints
Introduces a watchlist system for tracking artists, including backend API endpoints for managing the watchlist and scanning for new releases. Updates the frontend to allow users to add/remove artists to/from the watchlist from both artist cards and detail pages, view and scan their watchlist via a modal, and see real-time scan progress. Adds related styles for watchlist UI components.
2025-09-10 14:18:54 -07:00
Broque Thomas
42002d1b45 Add automatic and manual wishlist cleanup features
Introduces backend logic to automatically remove tracks from the wishlist if they already exist in the database after downloads or database updates. Adds a new API endpoint and frontend button for manual wishlist cleanup, allowing users to remove already-owned tracks from the wishlist. Enhances reliability and user experience by keeping the wishlist up-to-date.
2025-09-10 07:37:46 -07:00
Broque Thomas
219a36c05b Improve wishlist processing and modal sync logic
Sanitizes wishlist track data for consistent backend/frontend handling, enhances wishlist process state reporting for better UI sync, and refactors frontend modal logic to prevent auto-show conflicts and ensure user-driven visibility. Also improves polling and rehydration to keep frontend state in sync with server-side auto-processing.
2025-09-09 18:28:29 -07:00
Broque Thomas
db26ab8b15 Implement atomic cancel system V2 for downloads
Introduces a new atomic cancel system (V2) for download tasks, ensuring single-step cancellation with proper worker slot management and backend-driven state. Updates both backend (web_server.py) and frontend (script.js) to support V2 cancel API, persistent cancel state, and improved UI handling for cancelling tasks, eliminating race conditions and dual state management.
2025-09-09 16:39:01 -07:00
Broque Thomas
184c38bbb7 Add artist bubble snapshot and hydration system
Introduces backend API endpoints and frontend logic to persist and restore artist download bubble state across page refreshes. Snapshots are saved and hydrated with live download status, ensuring continuity of user progress and UI state. Includes debounce logic for efficient snapshot saving and automatic cleanup of outdated or invalid snapshots.
2025-09-08 13:53:48 -07:00
Broque Thomas
8bb020840e Update script.js 2025-09-08 09:21:14 -07:00
Broque Thomas
83c4921cdd Unify download retry logic and improve batch completion checks
Refactored download monitor to handle error and timeout retries directly and consistently, removing legacy retry methods. Improved batch completion logic to ensure batches are only marked complete when all tasks are truly finished, preventing premature completion. Updated client-side polling to never stop automatically, using exponential backoff on failures, and fixed worker counting to exclude post-processing tasks. Enhanced post-processing and verification workflows to avoid double completion callbacks and ensure proper task state transitions.
2025-09-07 19:57:32 -07:00
Broque Thomas
6773ef1c5f Add post-processing verification for downloads
Introduces a new post-processing workflow in web_server.py that verifies file existence and integrity before marking download tasks as completed. Updates status handling to include a 'post_processing' state and reflects this in the frontend UI, ensuring users see accurate progress and preventing premature completion status for downloads.
2025-09-07 12:36:28 -07:00
Broque Thomas
d8d12bcc2c Improve download worker management and UI polling
Adds server-side validation and healing for download batch worker counts to prevent ghost workers and orphaned tasks, including periodic batch state checks and recovery logic. Enhances thread safety with batch-specific locks and improves error handling in worker slot management. On the frontend, implements exponential backoff for polling failures, validates server responses, and logs worker count discrepancies for better debugging and UI consistency.
2025-09-06 09:25:15 -07:00
Broque Thomas
de1c535ae6 Update style.css 2025-09-05 22:04:30 -07:00
Broque Thomas
ac9f911d13 Update style.css 2025-09-05 20:48:51 -07:00
Broque Thomas
c74d60b712 batch process 2025-09-05 13:41:24 -07:00
Broque Thomas
f1bc9c6f24 Update script.js 2025-09-04 14:34:00 -07:00
Broque Thomas
8cedc1f60a Update script.js 2025-09-04 14:08:26 -07:00
Broque Thomas
306001ade8 Improve artist download status updates and UI
Added debounced updates for the artist downloads section to prevent rapid UI refreshes. Enhanced debug logging and error handling for download status changes and bulk completion. Introduced a utility to force refresh all artist download statuses. Updated CSS for better spacing and overflow handling in artist bubble containers and images.
2025-09-04 13:46:50 -07:00
Broque Thomas
871dc6cb1c Add artist album download management UI
Introduces backend API and frontend integration for downloading missing tracks from artist albums and singles. Adds artist download bubbles, management modal, and related state/UI logic to script.js, with supporting styles in style.css. Also refactors some type hints in web_server.py for consistency.
2025-09-04 13:23:54 -07:00
Broque Thomas
245a8d3270 Update script.js 2025-09-03 23:11:43 -07:00
Broque Thomas
245c6dfbf2 scan db on artist page 2025-09-03 23:00:20 -07:00
Broque Thomas
cff48b2498 artist design 2025-09-03 18:40:25 -07:00
Broque Thomas
c29c5d6495 artists page 2025-09-03 18:02:44 -07:00
Broque Thomas
57b0833fe2 'starting...' wasn't needed 2025-09-03 13:53:10 -07:00
Broque Thomas
36cc15f0a9 fix 2025-09-03 13:32:52 -07:00
Broque Thomas
6d40ddf998 Update script.js 2025-09-03 12:14:52 -07:00
Broque Thomas
b08090ebe1 fix 2025-09-03 09:25:02 -07:00
Broque Thomas
f39eb561dc download mising tracks 2025-09-02 23:13:41 -07:00
Broque Thomas
ae98bb8806 sync 2025-09-02 21:27:52 -07:00
Broque Thomas
5806b3672d Update script.js 2025-09-02 14:18:04 -07:00
Broque Thomas
2070e24394 consistency 2025-09-02 14:14:51 -07:00
Broque Thomas
417c76e68c move to backend 2025-09-01 20:34:40 -07:00
Broque Thomas
252eb32bf9 tidal 2025-09-01 19:33:07 -07:00
Broque Thomas
b6fc2f5f07 Update script.js 2025-09-01 10:17:44 -07:00
Broque Thomas
867ec97cdb Update style.css 2025-09-01 03:01:08 -07:00
Broque Thomas
b2c1d21bf0 download missing functionality 2025-09-01 02:37:38 -07:00
Broque Thomas
bd2866b348 Update script.js 2025-08-31 21:44:26 -07:00
Broque Thomas
bde755f6e5 move youtube processing to backend 2025-08-31 21:05:37 -07:00
Broque Thomas
a7927eaa58 Update style.css 2025-08-31 16:04:49 -07:00
Broque Thomas
7c7ddc06e0 Update script.js 2025-08-31 15:08:43 -07:00
Broque Thomas
f99c550484 youtube playlists 2025-08-31 14:54:16 -07:00
Broque Thomas
146543b852 Update style.css 2025-08-31 13:41:31 -07:00
Broque Thomas
08c55217b6 youtube shell 2025-08-31 13:36:24 -07:00
Broque Thomas
632834b30a ui informaiton 2025-08-30 21:48:41 -07:00
Broque Thomas
b1af7161c8 Update script.js 2025-08-30 21:31:04 -07:00
Broque Thomas
697a255047 move wishlist processing to backend 2025-08-30 21:18:10 -07:00
Broque Thomas
ab9be91a90 auto run wishlist 2025-08-30 09:11:18 -07:00
Broque Thomas
9f6a98a72d add to wishlist on fail 2025-08-29 22:16:50 -07:00
Broque Thomas
079ac5c81d fix wishlist additions 2025-08-29 18:15:41 -07:00
Broque Thomas
3c8e728cd6 Update script.js 2025-08-29 15:31:53 -07:00
Broque Thomas
5d02ee16b0 Update style.css 2025-08-29 15:13:54 -07:00
Broque Thomas
b88467f949 wishlist 2025-08-29 14:33:05 -07:00
Broque Thomas
017d72b38a wishlist button 2025-08-28 22:19:57 -07:00
Broque Thomas
888299fe83 stream tracking 2025-08-28 18:16:03 -07:00
Broque Thomas
f67a44476f live progress 2025-08-28 18:09:13 -07:00
Broque Thomas
e33d7e7c0d Update script.js 2025-08-28 18:04:39 -07:00
Broque Thomas
c5617d874e stream 2025-08-28 17:57:04 -07:00
Broque Thomas
58c00831bc cleanup fix 2025-08-28 17:05:35 -07:00
Broque Thomas
bf48569c8b sequential sync 2025-08-28 15:23:20 -07:00
Broque Thomas
58e160aba5 cancel button 2025-08-28 13:04:58 -07:00
Broque Thomas
fd9fcf6c90 cleanup batch after closing completed modal 2025-08-27 21:27:10 -07:00
Broque Thomas
6ff6cc0e59 fix a break in front end content from backend 2025-08-27 15:32:20 -07:00
Broque Thomas
39a6a87ab5 Update script.js 2025-08-27 15:23:05 -07:00
Broque Thomas
17533ae40b persistent when closed 2025-08-27 14:34:06 -07:00
Broque Thomas
9f4e007818 style 2025-08-26 22:36:02 -07:00
Broque Thomas
c9704764ae active modal adjustments 2025-08-26 22:16:50 -07:00
Broque Thomas
aad6eb7da6 persistent download missing track modal 2025-08-26 21:48:12 -07:00
Broque Thomas
fcdf41aac2 cancel button 2025-08-25 23:30:28 -07:00
Broque Thomas
7817e40f31 style 2025-08-25 18:29:39 -07:00
Broque Thomas
2475586523 style 2025-08-25 17:43:13 -07:00
Broque Thomas
b84a3ae108 progress 2025-08-25 16:16:31 -07:00
Broque Thomas
b9879c4375 closer 2025-08-25 14:36:25 -07:00
Broque Thomas
632f45c68e download missing tracks modal 2025-08-24 21:23:24 -07:00
Broque Thomas
584245f8a4 Update script.js 2025-08-24 20:54:07 -07:00
Broque Thomas
e912be68e7 better 2025-08-24 20:45:40 -07:00
Broque Thomas
042baf429f progress 2025-08-24 20:18:54 -07:00
Broque Thomas
628e8b7709 sync working 2025-08-24 19:47:24 -07:00
Broque Thomas
3b0a626b6e Update script.js 2025-08-24 17:38:30 -07:00
Broque Thomas
d6d31606ce Update script.js 2025-08-24 17:31:20 -07:00
Broque Thomas
429622610e cache spotify playlists 2025-08-24 17:23:32 -07:00
Broque Thomas
8cee3f0e33 sync page 2025-08-24 17:06:00 -07:00
Broque Thomas
b60abecbc9 Update style.css 2025-08-24 14:12:40 -07:00
Broque Thomas
2c9f19137b sync page design 2025-08-24 14:03:16 -07:00
Broque Thomas
cd9a466e9e database updater 2025-08-24 13:11:54 -07:00
Broque Thomas
2f535d8222 database updater 2025-08-24 12:36:30 -07:00
Broque Thomas
facc45e6f4 dashboard design 2025-08-24 12:14:38 -07:00
Broque Thomas
9686c6f1df style changes 2025-08-24 11:09:33 -07:00
Broque Thomas
ee6c95a92e adjust styling 2025-08-24 10:23:16 -07:00
Broque Thomas
5802c4b30a Update style.css 2025-08-23 23:55:01 -07:00
Broque Thomas
724f385768 matched album downloads 2025-08-23 23:27:30 -07:00
Broque Thomas
008ddcf0ed Update script.js 2025-08-23 22:38:07 -07:00
Broque Thomas
edbfe6bb74 matched downloads 2025-08-23 22:18:09 -07:00
Broque Thomas
c5d9b010c9 stream bug 2025-08-23 15:19:43 -07:00
Broque Thomas
886c2e84c8 stream functionality 2025-08-23 15:03:25 -07:00
Broque Thomas
e31abbda27 Update style.css 2025-08-23 13:32:05 -07:00
Broque Thomas
92656fbe25 filters 2025-08-23 12:31:25 -07:00
Broque Thomas
f6cc9bffdb styling issue 2025-08-23 10:46:47 -07:00
Broque Thomas
afd5662afa progress 2025-08-23 10:39:12 -07:00
Broque Thomas
a78732fb08 progress 2025-08-23 10:14:38 -07:00
Broque Thomas
bb6be656e0 progress 2025-08-23 09:53:07 -07:00
Broque Thomas
5142b5153e base downloads design 2025-08-22 21:06:52 -07:00
Broque Thomas
557151b9e7 Revert "downloads page started"
This reverts commit 7c5c149a40.
2025-08-22 16:50:53 -07:00
Broque Thomas
7c5c149a40 downloads page started 2025-08-22 15:20:39 -07:00
Broque Thomas
36b3830a2f settings auto detect fixed 2025-08-22 14:36:30 -07:00
Broque Thomas
d631ad61f8 settings page ready 2025-08-22 12:57:20 -07:00
Broque Thomas
bf445f9939 headless mode foundation 2025-08-21 20:14:16 -07:00