similar artist functionality for artists page.

This commit is contained in:
Broque Thomas 2025-10-04 17:53:17 -07:00
parent 9fe0b5a7ff
commit dead8da5ee
2 changed files with 39 additions and 17 deletions

View file

@ -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

View file

@ -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');
}
}
}
/**