diff --git a/core/database_update_worker.py b/core/database_update_worker.py
index 9fbe0341..dcee4cca 100644
--- a/core/database_update_worker.py
+++ b/core/database_update_worker.py
@@ -874,7 +874,9 @@ class DatabaseUpdateWorker(QThread):
# Fetch current IDs from media server (lightweight calls)
logger.info(f"π Removal detection: fetching current IDs from {self.server_type}...")
+ self._emit_signal('phase_changed', f"Fetching artist catalog from {self.server_type}...")
server_artist_ids = self.media_client.get_all_artist_ids()
+ self._emit_signal('phase_changed', f"Fetching album catalog from {self.server_type}...")
server_album_ids = self.media_client.get_all_album_ids()
# Safety: if both come back empty, the server is unreachable
@@ -918,6 +920,7 @@ class DatabaseUpdateWorker(QThread):
return None
# Get stored IDs from database
+ self._emit_signal('phase_changed', f"Comparing local database with {self.server_type}...")
db_artist_ids = self.database.get_all_artist_ids_for_server(self.server_type) if check_artists else set()
db_album_ids = self.database.get_all_album_ids_for_server(self.server_type) if check_albums else set()
@@ -947,6 +950,7 @@ class DatabaseUpdateWorker(QThread):
if not removed_artist_ids and not removed_album_ids:
logger.info("π Removal detection: no stale content found")
+ self._emit_signal('phase_changed', "No removed content detected")
return {'artists_removed': 0, 'albums_removed': 0, 'tracks_removed': 0}
logger.info(f"ποΈ Removal detection: found {len(removed_artist_ids)} removed artists, "
diff --git a/webui/static/script.js b/webui/static/script.js
index 0c9a69e7..14c9b25b 100644
--- a/webui/static/script.js
+++ b/webui/static/script.js
@@ -15616,6 +15616,577 @@ const TOOL_HELP_CONTENT = {
Add more artists to your watchlist to expand your discovery pool with their MusicMap similar artists
Fires when the watchlist scanner detects new music from an artist you're watching. This means a new album, EP, or single has been released that you don't already have.
+
+
Conditions
+
+
Artist: Only fire for specific watched artists
+
+
+
Available variables for notifications
+
{artist}, {new_tracks}, {added_to_wishlist}
+
+
Good for
+
+
Getting notified when your favorite artists drop new music
+
Auto-processing the wishlist immediately after new releases are found
Fires after a mirrored playlist is synced to your media server (Plex, Jellyfin, or Navidrome). This means the playlist has been matched and created/updated on your server.
Fires when Spotify/iTunes metadata discovery finishes for a mirrored playlist. Discovery is the process of matching playlist tracks to official Spotify or iTunes metadata.
Fires when the library database refresh finishes β either incremental or full. This means SoulSync's internal database has been synced with your media server.
+
+
Available variables for notifications
+
{total_artists}, {total_albums}, {total_tracks}
+
+
Good for
+
+
Running a quality scan after the database is refreshed
Fires when a downloaded file fails AcoustID verification and is moved to the quarantine folder. This means the audio fingerprint didn't match what was expected β the file might be the wrong song.
+
+
Conditions
+
+
Artist: Only fire for specific artists
+
Title: Match on track title
+
+
+
Available variables for notifications
+
{artist}, {title}, {reason}
+
+
What is quarantine?
+
Files that fail audio fingerprint verification are moved to a quarantine folder instead of your library. This prevents wrong songs from polluting your collection. You can review quarantined files manually.
Fires when the quality scanner finishes. The scanner identifies tracks below your quality preferences and adds them to your wishlist for re-downloading.
Searches Soulseek for tracks in your wishlist and downloads them. This is the same process that runs automatically on a timer β this action lets you trigger it manually or chain it to events.
+
+
Configuration
+
+
Category: Process all wishlist tracks, or only Albums/EPs, or only Singles
+
+
+
How it works
+
+
Picks tracks from the wishlist (alternating Albums and Singles cycles)
Triggers your media server (Plex) to scan its music library folder for new or changed files. This makes newly downloaded music appear in your media server.
+
+
Note
+
Jellyfin and Navidrome detect new files automatically in real-time, so this action is primarily useful for Plex.
Syncs a mirrored playlist to your media server. It matches discovered tracks against your library and creates or updates the playlist on Plex, Jellyfin, or Navidrome.
+
+
Configuration
+
+
Playlist: Select which mirrored playlist to sync
+
+
+
Prerequisites
+
Tracks should be discovered first (matched to Spotify/iTunes metadata) before syncing. Undiscovered tracks will be skipped.
Finds official Spotify or iTunes metadata for tracks in a mirrored playlist. This is required before syncing β it matches each track to a known release so it can be found in your library.
+
+
Configuration
+
+
Playlist: Select a specific playlist, or check "Discover all" to process all mirrored playlists
+
+
+
How it works
+
+
Takes each track name and artist from the mirror
+
Searches Spotify (or iTunes as fallback) for a match
+
Stores the best match with confidence score in the discovery cache
+
Already-discovered tracks are skipped for efficiency
Scans your transfer folder for duplicate audio files (same filename, different format) and removes the lower-quality version. For example, if you have both Song.flac and Song.mp3, the MP3 is removed.
+
+
Safety
+
Removed files are moved to a deleted/ subfolder, not permanently deleted. You can recover them if needed.
Permanently deletes all files in the quarantine folder. Quarantined files are downloads that failed AcoustID audio fingerprint verification β they might be the wrong song.
+
+
Warning
+
This permanently deletes files. Make sure you've reviewed quarantined files before setting up an automation for this.
Refreshes the discovery pool with new tracks from your mirrored playlists. The discovery pool tracks which playlist tracks have been successfully matched and which ones failed.
Scans your library for tracks that don't meet your quality preferences (e.g., MP3 when you prefer FLAC). Low-quality tracks are matched to Spotify and added to your wishlist for re-downloading in better quality.
+
+
Configuration
+
+
Scope: Scan only watchlist artists (faster) or your entire library (thorough)