update readme and include automation docs

pull/253/head
Broque Thomas 2 months ago
parent d57b48a62a
commit 20ee504245

@ -105,6 +105,14 @@ SoulSync bridges streaming services to your media server with automated discover
### Automation
**Automation Engine** - Visual drag-and-drop builder for custom workflows
- **Triggers**: Schedule (interval/daily/weekly), Track Downloaded, Batch Complete, Playlist Changed, Discovery Complete, and 10+ more event types
- **Actions**: Process Wishlist, Scan Watchlist, Refresh Mirrored Playlist, Discover Playlist, Sync Playlist, Scan Library, Update Database, Run Duplicate Cleaner, Quality Scan, and more
- **Notifications**: Discord webhooks, Pushbullet, Telegram — with variable substitution for dynamic messages
- **Conditions**: Filter triggers by artist, title, playlist name, quality, and other fields with contains/equals/starts_with operators
- **System Automations**: Built-in wishlist processing (every 30 min) and watchlist scanning (every 24 hr) — configurable but non-deletable
- **Playlist Discovery Pipeline**: Automatically discovers official Spotify/iTunes metadata for YouTube/Tidal mirrored playlists, ensuring nothing syncs or downloads without verified context
**Watchlist** - Monitor unlimited artists with per-artist configuration
- Choose which release types to track: Albums, EPs, Singles
- Content filters: Live, Remixes, Acoustic, Compilations
@ -116,6 +124,16 @@ SoulSync bridges streaming services to your media server with automated discover
- Organized by category (albums vs singles)
- Cleanup tool removes tracks you've since acquired
**Mirrored Playlists** - Mirror playlists from Spotify, Tidal, or YouTube and keep them synced
- Automatic refresh detects track additions and removals from source
- Discovery pipeline matches raw YouTube/Tidal tracks to official Spotify/iTunes metadata
- Sync to media server using verified metadata — undiscovered tracks are held back, not synced with garbage data
**Local Profiles** - Multiple configuration profiles for different setups or users
- Each profile maintains its own watchlist, wishlist, playlists, and automation settings
- Switch between profiles from the UI — all settings and data are isolated
- System automations (wishlist/watchlist) appear across all profiles
**Background Tasks** - Database sync, discovery pool updates, seasonal content, watchlist scanning
### Library Management
@ -334,6 +352,8 @@ If you're using the Unraid template from Community Applications:
| Quality Scanner + Duplicate Cleaner | ✓ | ✗ | ✗ | ✓ |
| Template-Based Organization | ✓ | ✗ | ✗ | ✓ |
| Built-in Streaming Player | ✓ | ✗ | ✗ | ✗ |
| Visual Automation Builder | ✓ | ✗ | ✗ | ✗ |
| Multi-Profile Support | ✓ | ✗ | ✗ | ✗ |
| Import Existing Files | ✓ | ✓ | ✗ | ✓ |
| Web UI | ✓ | ✓ | ✓ | ✗ |
@ -353,6 +373,7 @@ If you're using the Unraid template from Community Applications:
- **Discovery System** — custom algorithms for personalized playlists, seasonal content, and similar artist exploration
- **Metadata Pipeline** — dual-source (Spotify/iTunes) with MusicBrainz enrichment, AcoustID verification, LRC lyrics, album art embedding via mutagen
- **Database Update Worker** — incremental sync from media servers with smart early-stopping (Jellyfin fast-path: ~2 API calls vs thousands)
- **Automation Engine** — event-driven workflow builder with triggers, actions, conditions, notifications, and cross-action guards
- **Web Scan Manager** — debounced media server scanning with completion callbacks
- **Template-based File Organization** — configurable folder structures with automatic fallback
@ -402,7 +423,6 @@ Transfer/Artist/Artist - Album/01 - Track.flac
- Batch wishlist operations
- Download history browser UI
- Source reliability tracking
- Notification center
- Mobile-responsive improvements
### Under Consideration

@ -0,0 +1,237 @@
# Automations Guide
## Overview
The Automations page lets you build custom workflows that run automatically. Each automation connects a **trigger** (when to run) to an **action** (what to do), with optional **conditions** (filters) and **notifications** (alerts when it runs).
Navigate to the Automations page from the sidebar. You'll see your automation cards and a builder panel for creating new ones.
---
## Building an Automation
### The Builder
The builder has three slots:
- **WHEN** — drag a trigger here (required)
- **DO** — drag an action here (required)
- **NOTIFY** — drag a notification method here (optional)
Drag blocks from the sidebar into the slots. Each block expands to show its configuration fields. Give your automation a name and click **Save**.
### Conditions
Event-based triggers support conditions to filter when they fire. For example, a "Track Downloaded" trigger can have a condition like `artist contains "Taylor"` so it only fires for specific artists.
- **Match mode**: "All" (every condition must pass) or "Any" (at least one must pass)
- **Operators**: contains, equals, starts_with, not_contains
### Delay
Action blocks have an optional **Delay** field (in minutes). The action waits that long after the trigger fires before executing. Useful for letting other processes finish first.
---
## Triggers
### Timer-Based
| Trigger | Description | Configuration |
|---------|-------------|---------------|
| **Schedule** | Run on a repeating interval | Interval + unit (minutes/hours/days) |
| **Daily Time** | Run every day at a specific time | Time picker (e.g., 03:00) |
| **Weekly Schedule** | Run on specific days at a set time | Day selector + time picker |
### Event-Based
| Trigger | Fires When | Condition Fields | Variables |
|---------|-----------|-----------------|-----------|
| **App Started** | SoulSync starts up | — | — |
| **Track Downloaded** | A track finishes downloading | artist, title, album, quality | artist, title, album, quality |
| **Batch Complete** | An album/playlist download finishes | playlist_name | playlist_name, total_tracks, completed_tracks, failed_tracks |
| **New Release Found** | Watchlist detects new music | artist | artist, new_tracks, added_to_wishlist |
| **Playlist Synced** | A playlist sync completes | playlist_name | playlist_name, total_tracks, matched_tracks, synced_tracks, failed_tracks |
| **Playlist Changed** | A mirrored playlist detects track changes | playlist_name | playlist_name, old_count, new_count, added, removed |
| **Discovery Complete** | Playlist track discovery finishes | playlist_name | playlist_name, total_tracks, discovered_count, failed_count, skipped_count |
| **Wishlist Processed** | Auto-wishlist processing finishes | — | tracks_processed, tracks_found, tracks_failed |
| **Watchlist Scan Done** | Watchlist scan finishes | — | artists_scanned, new_tracks_found, tracks_added |
| **Database Updated** | Library database refresh finishes | — | total_artists, total_albums, total_tracks |
| **Download Failed** | A track permanently fails to download | artist, title, reason | artist, title, reason |
| **File Quarantined** | AcoustID verification fails | artist, title | artist, title, reason |
| **Wishlist Item Added** | A track is added to wishlist | artist, title | artist, title, reason |
| **Artist Watched** | An artist is added to watchlist | artist | artist, artist_id |
| **Artist Unwatched** | An artist is removed from watchlist | artist | artist, artist_id |
| **Import Complete** | Album/track import finishes | artist, album_name | track_count, album_name, artist |
| **Playlist Mirrored** | A new playlist is mirrored | playlist_name, source | playlist_name, source, track_count |
| **Quality Scan Done** | Quality scan finishes | — | quality_met, low_quality, total_scanned |
| **Duplicate Scan Done** | Duplicate cleaner finishes | — | files_scanned, duplicates_found, space_freed |
---
## Actions
| Action | Description | Configuration |
|--------|-------------|---------------|
| **Process Wishlist** | Retry failed downloads from wishlist | Category: All, Albums, or Singles |
| **Scan Watchlist** | Check watched artists for new releases | — |
| **Scan Library** | Trigger media server library scan | — |
| **Refresh Mirrored Playlist** | Re-fetch playlist from source (Spotify/Tidal/YouTube) and update the mirror | Select playlist or "Refresh all" |
| **Discover Playlist** | Find official Spotify/iTunes metadata for mirrored playlist tracks | Select playlist or "Discover all" |
| **Sync Playlist** | Sync mirrored playlist to media server (only discovered tracks are included) | Select playlist |
| **Notify Only** | No action — just send the notification | — |
| **Update Database** | Trigger library database refresh | Full refresh checkbox |
| **Run Duplicate Cleaner** | Scan for and remove duplicate files | — |
| **Clear Quarantine** | Delete all quarantined files | — |
| **Clean Up Wishlist** | Remove duplicate/already-owned tracks from wishlist | — |
| **Update Discovery** | Refresh discovery pool with new tracks | — |
| **Run Quality Scan** | Scan for low-quality audio files | Scope: Watchlist Artists or Full Library |
| **Backup Database** | Create timestamped database backup | — |
---
## Notifications
Add a notification block to get alerted when an automation runs.
| Method | Configuration | Notes |
|--------|---------------|-------|
| **Discord Webhook** | Webhook URL + message template | Posts to a Discord channel |
| **Pushbullet** | Access token + title + message | Push to phone/desktop |
| **Telegram** | Bot token + chat ID + message | Sends via Telegram Bot API |
### Variable Substitution
Notification messages support `{variable}` placeholders that get replaced with actual values when the automation runs.
**Always available**: `{time}`, `{name}` (automation name), `{run_count}`, `{status}`
**Event-specific**: Each trigger provides additional variables (see the Variables column in the triggers table above). For example, a "Track Downloaded" trigger provides `{artist}`, `{title}`, `{album}`, `{quality}`.
**Example message**:
```
Downloaded {title} by {artist} from {album} — quality: {quality}
```
---
## System Automations
SoulSync includes two built-in system automations that cannot be deleted:
| Automation | Schedule | Initial Delay |
|-----------|----------|---------------|
| **Auto-Process Wishlist** | Every 30 minutes | 1 minute after startup |
| **Auto-Scan Watchlist** | Every 24 hours | 5 minutes after startup |
These appear with a "System" badge on their cards. You can:
- Change the interval
- Enable or disable them
- Add notifications
You cannot:
- Delete them
- Change the trigger or action type
---
## Mirrored Playlist Sync Pipeline
For mirrored playlists (especially from YouTube and Tidal), a multi-step automation chain ensures tracks are synced with proper metadata:
### The Problem
YouTube and Tidal playlists have raw metadata — cleaned video titles, uploader names. If you sync these directly, unmatched tracks hit the wishlist with garbage data (no Spotify ID, wrong album, no cover art). Downloads would fail or get the wrong track.
### The Solution
Three automations chained via events:
**Step 1: Refresh** — Re-fetch the playlist from its source
```
WHEN: Schedule (every 6 hours)
DO: Refresh Mirrored Playlist (all)
```
This detects added/removed tracks by comparing source track IDs. If changes are found, it emits a "Playlist Changed" event.
**Step 2: Discover** — Match raw tracks to official Spotify/iTunes metadata
```
WHEN: Playlist Changed
DO: Discover Playlist (all)
```
For each undiscovered track, the discovery pipeline:
1. Checks the discovery cache (instant if previously matched)
2. Searches Spotify (preferred) or iTunes (fallback) using the matching engine
3. Scores candidates with title/artist fuzzy matching
4. Stores the official match (Spotify ID, proper title, artist, album) on the track
When done, emits a "Discovery Complete" event.
**Step 3: Sync** — Push to media server with verified metadata
```
WHEN: Discovery Complete
DO: Sync Playlist (select playlist)
```
Only discovered tracks are included in the sync. Undiscovered tracks are skipped entirely — they never reach the wishlist with bad data. Unmatched discovered tracks go to the wishlist with proper Spotify/iTunes IDs and album context.
### Spotify Playlists
Spotify-sourced mirrored playlists skip Step 2 automatically. Their data is already official, so tracks are marked as discovered during refresh with confidence 1.0. You can go directly from "Playlist Changed" to "Sync Playlist".
### Discovery Caching
Discovery results are cached globally. If the same track appears in multiple playlists, or was discovered previously, the cache provides instant results without hitting the Spotify/iTunes API again. The cache persists across restarts.
---
## Examples
### Get notified when a watched artist drops new music
```
WHEN: New Release Found (artist contains "Kendrick")
DO: Notify Only
NOTIFY: Discord Webhook — "{artist} dropped {new_tracks} new tracks!"
```
### Nightly library maintenance
```
WHEN: Daily Time (03:00)
DO: Update Database (full refresh)
```
### Auto-download wishlist failures every hour
```
WHEN: Schedule (every 1 hour)
DO: Process Wishlist (all)
NOTIFY: Telegram — "Wishlist processed: {tracks_found} found, {tracks_failed} failed"
```
### Quality upgrade pipeline
```
WHEN: Database Updated
DO: Run Quality Scan (watchlist artists)
```
### Discord alert on download failures
```
WHEN: Download Failed
DO: Notify Only
NOTIFY: Discord Webhook — "Failed to download {title} by {artist}: {reason}"
```
### Weekly database backup
```
WHEN: Weekly Schedule (Sun at 02:00)
DO: Backup Database
```
---
## Tips
- **Test with "Run Now"**: Every automation card has a play button that triggers it immediately, regardless of its schedule. Use this to verify your setup before waiting for the timer.
- **Check the activity feed**: The Dashboard activity feed shows when automations run and their results.
- **Conditions narrow, not widen**: Without conditions, an event trigger fires for every event of that type. Conditions filter it down to specific cases.
- **Delay is per-execution**: If you set a 5-minute delay, the action waits 5 minutes after each trigger fire, not 5 minutes after the last execution.
- **Cross-guards**: The system automations (wishlist/watchlist) have mutual exclusion — if one is running, the other waits until the next scheduled time rather than queueing up.
- **Discovery is incremental**: Running "Discover Playlist" only processes tracks that haven't been discovered yet. Already-discovered tracks are skipped. Failed tracks are re-attempted on subsequent runs.
Loading…
Cancel
Save