From dead8da5eebdc2cd7906cc1332b741d35c7dfac5 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Sat, 4 Oct 2025 17:53:17 -0700 Subject: [PATCH] similar artist functionality for artists page. --- README.md | 22 +++++++++++----------- webui/static/script.js | 34 ++++++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1c7de267..efc8f379 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,11 @@ Bridge the gap between streaming services and your local music library. Automati - **Smart matching** finds what you're missing vs what you own - **Download missing tracks** from Soulseek with FLAC priority - **Metadata enhancement** adds proper tags and album art -- **🆕 Automatic lyrics** synchronized LRC files for every download -- **🆕 Auto server scanning** triggers library scans after downloads -- **🆕 Auto database updates** keeps SoulSync database current +- **Automatic lyrics** synchronized LRC files for every download +- **Auto server scanning** triggers library scans after downloads +- **Auto database updates** keeps SoulSync database current - **File organization** creates clean folder structures -- **Artist discovery** browse complete discographies +- **Artist discovery** browse complete discographies with similar artists recommendations powered by [music-map.com](https://music-map.com) - **Music library browser** comprehensive collection management with search and completion tracking - **Wishlist system** saves failed downloads for automatic retry - **Artist watchlist** monitors for new releases and adds missing tracks @@ -160,12 +160,12 @@ If accessing SoulSync from a different machine than where it's running: **Search & Download**: Manual track search with preview streaming **Playlist Sync**: Spotify/Tidal/YouTube playlist analysis and batch downloads -**Artist Explorer**: Complete discography browsing with missing indicators +**Artist Explorer**: Complete discography browsing with missing indicators and real-time similar artist discovery via [music-map.com](https://music-map.com) **Library Browser**: Comprehensive local collection management with search, filtering, and completion tracking **Smart Matching**: Advanced algorithm prioritizes originals over remixes -**🆕 Automatic Lyrics**: Downloads synchronized LRC files from LRClib.net - works with any media player that supports .lrc files -**🆕 Server Integration**: Auto-triggers library scans on Plex/Jellyfin/Navidrome after downloads complete -**🆕 Smart Database**: Automatically updates SoulSync's internal database with incremental scans +**Automatic Lyrics**: Downloads synchronized LRC files from LRClib.net - works with any media player that supports .lrc files +**Server Integration**: Auto-triggers library scans on Plex/Jellyfin/Navidrome after downloads complete +**Smart Database**: Automatically updates SoulSync's internal database with incremental scans **Wishlist Management**: Failed downloads automatically saved and retried hourly **Artist Watchlist**: Add favorite artists to monitor for new releases automatically **Full Automation**: Hourly retry of failed downloads, metadata enhancement, lyrics, server scanning @@ -187,9 +187,9 @@ Just hit up the Beatport section in the web UI and start exploring. Perfect for 1. **Search**: Query Soulseek via slskd API 2. **Download**: Files saved to configured download folder 3. **Process**: Auto-organize to transfer folder with metadata enhancement -4. **🆕 Lyrics**: Automatic LRC file generation using LRClib.net API -5. **🆕 Server Scan**: Triggers library scan on your media server (60s delay) -6. **🆕 Database Sync**: Updates SoulSync database with new tracks +4. **Lyrics**: Automatic LRC file generation using LRClib.net API +5. **Server Scan**: Triggers library scan on your media server (60s delay) +6. **Database Sync**: Updates SoulSync database with new tracks 7. **Structure**: `Transfer/Artist/Artist - Album/01 - Track.flac` + `01 - Track.lrc` 8. **Import**: Media server picks up organized files with lyrics diff --git a/webui/static/script.js b/webui/static/script.js index cbd27a23..a926c357 100644 --- a/webui/static/script.js +++ b/webui/static/script.js @@ -15102,13 +15102,13 @@ async function loadArtistDiscography(artistId) { */ function displayArtistDiscography(discography) { console.log(`📀 Displaying discography: ${discography.albums?.length || 0} albums, ${discography.singles?.length || 0} singles`); - + // Populate albums const albumsContainer = document.getElementById('album-cards-container'); if (albumsContainer) { if (discography.albums?.length > 0) { albumsContainer.innerHTML = discography.albums.map(album => createAlbumCardHTML(album)).join(''); - + // Add dynamic glow effects and click handlers to album cards albumsContainer.querySelectorAll('.album-card').forEach((card, index) => { const album = discography.albums[index]; @@ -15117,7 +15117,7 @@ function displayArtistDiscography(discography) { applyDynamicGlow(card, colors); }); } - + // Add click handler for download missing tracks modal card.addEventListener('click', () => handleArtistAlbumClick(album, 'albums')); card.style.cursor = 'pointer'; @@ -15131,13 +15131,13 @@ function displayArtistDiscography(discography) { `; } } - + // Populate singles const singlesContainer = document.getElementById('singles-cards-container'); if (singlesContainer) { if (discography.singles?.length > 0) { singlesContainer.innerHTML = discography.singles.map(single => createAlbumCardHTML(single)).join(''); - + // Add dynamic glow effects and click handlers to singles cards singlesContainer.querySelectorAll('.album-card').forEach((card, index) => { const single = discography.singles[index]; @@ -15146,7 +15146,7 @@ function displayArtistDiscography(discography) { applyDynamicGlow(card, colors); }); } - + // Add click handler for download missing tracks modal card.addEventListener('click', () => handleArtistAlbumClick(single, 'singles')); card.style.cursor = 'pointer'; @@ -15160,6 +15160,28 @@ function displayArtistDiscography(discography) { `; } } + + // Auto-switch to Singles tab if no albums but has singles + if ((!discography.albums || discography.albums.length === 0) && + discography.singles && discography.singles.length > 0) { + console.log('📀 No albums found, auto-switching to Singles & EPs tab'); + + // Switch to singles tab + const albumsTab = document.getElementById('albums-tab'); + const singlesTab = document.getElementById('singles-tab'); + const albumsContent = document.getElementById('albums-content'); + const singlesContent = document.getElementById('singles-content'); + + if (albumsTab && singlesTab && albumsContent && singlesContent) { + // Remove active from albums + albumsTab.classList.remove('active'); + albumsContent.classList.remove('active'); + + // Add active to singles + singlesTab.classList.add('active'); + singlesContent.classList.add('active'); + } + } } /**