similar artist functionality for artists page.
This commit is contained in:
parent
9fe0b5a7ff
commit
dead8da5ee
2 changed files with 39 additions and 17 deletions
22
README.md
22
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
|
- **Smart matching** finds what you're missing vs what you own
|
||||||
- **Download missing tracks** from Soulseek with FLAC priority
|
- **Download missing tracks** from Soulseek with FLAC priority
|
||||||
- **Metadata enhancement** adds proper tags and album art
|
- **Metadata enhancement** adds proper tags and album art
|
||||||
- **🆕 Automatic lyrics** synchronized LRC files for every download
|
- **Automatic lyrics** synchronized LRC files for every download
|
||||||
- **🆕 Auto server scanning** triggers library scans after downloads
|
- **Auto server scanning** triggers library scans after downloads
|
||||||
- **🆕 Auto database updates** keeps SoulSync database current
|
- **Auto database updates** keeps SoulSync database current
|
||||||
- **File organization** creates clean folder structures
|
- **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
|
- **Music library browser** comprehensive collection management with search and completion tracking
|
||||||
- **Wishlist system** saves failed downloads for automatic retry
|
- **Wishlist system** saves failed downloads for automatic retry
|
||||||
- **Artist watchlist** monitors for new releases and adds missing tracks
|
- **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
|
**Search & Download**: Manual track search with preview streaming
|
||||||
**Playlist Sync**: Spotify/Tidal/YouTube playlist analysis and batch downloads
|
**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
|
**Library Browser**: Comprehensive local collection management with search, filtering, and completion tracking
|
||||||
**Smart Matching**: Advanced algorithm prioritizes originals over remixes
|
**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
|
**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
|
**Server Integration**: Auto-triggers library scans on Plex/Jellyfin/Navidrome after downloads complete
|
||||||
**🆕 Smart Database**: Automatically updates SoulSync's internal database with incremental scans
|
**Smart Database**: Automatically updates SoulSync's internal database with incremental scans
|
||||||
**Wishlist Management**: Failed downloads automatically saved and retried hourly
|
**Wishlist Management**: Failed downloads automatically saved and retried hourly
|
||||||
**Artist Watchlist**: Add favorite artists to monitor for new releases automatically
|
**Artist Watchlist**: Add favorite artists to monitor for new releases automatically
|
||||||
**Full Automation**: Hourly retry of failed downloads, metadata enhancement, lyrics, server scanning
|
**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
|
1. **Search**: Query Soulseek via slskd API
|
||||||
2. **Download**: Files saved to configured download folder
|
2. **Download**: Files saved to configured download folder
|
||||||
3. **Process**: Auto-organize to transfer folder with metadata enhancement
|
3. **Process**: Auto-organize to transfer folder with metadata enhancement
|
||||||
4. **🆕 Lyrics**: Automatic LRC file generation using LRClib.net API
|
4. **Lyrics**: Automatic LRC file generation using LRClib.net API
|
||||||
5. **🆕 Server Scan**: Triggers library scan on your media server (60s delay)
|
5. **Server Scan**: Triggers library scan on your media server (60s delay)
|
||||||
6. **🆕 Database Sync**: Updates SoulSync database with new tracks
|
6. **Database Sync**: Updates SoulSync database with new tracks
|
||||||
7. **Structure**: `Transfer/Artist/Artist - Album/01 - Track.flac` + `01 - Track.lrc`
|
7. **Structure**: `Transfer/Artist/Artist - Album/01 - Track.flac` + `01 - Track.lrc`
|
||||||
8. **Import**: Media server picks up organized files with lyrics
|
8. **Import**: Media server picks up organized files with lyrics
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15102,13 +15102,13 @@ async function loadArtistDiscography(artistId) {
|
||||||
*/
|
*/
|
||||||
function displayArtistDiscography(discography) {
|
function displayArtistDiscography(discography) {
|
||||||
console.log(`📀 Displaying discography: ${discography.albums?.length || 0} albums, ${discography.singles?.length || 0} singles`);
|
console.log(`📀 Displaying discography: ${discography.albums?.length || 0} albums, ${discography.singles?.length || 0} singles`);
|
||||||
|
|
||||||
// Populate albums
|
// Populate albums
|
||||||
const albumsContainer = document.getElementById('album-cards-container');
|
const albumsContainer = document.getElementById('album-cards-container');
|
||||||
if (albumsContainer) {
|
if (albumsContainer) {
|
||||||
if (discography.albums?.length > 0) {
|
if (discography.albums?.length > 0) {
|
||||||
albumsContainer.innerHTML = discography.albums.map(album => createAlbumCardHTML(album)).join('');
|
albumsContainer.innerHTML = discography.albums.map(album => createAlbumCardHTML(album)).join('');
|
||||||
|
|
||||||
// Add dynamic glow effects and click handlers to album cards
|
// Add dynamic glow effects and click handlers to album cards
|
||||||
albumsContainer.querySelectorAll('.album-card').forEach((card, index) => {
|
albumsContainer.querySelectorAll('.album-card').forEach((card, index) => {
|
||||||
const album = discography.albums[index];
|
const album = discography.albums[index];
|
||||||
|
|
@ -15117,7 +15117,7 @@ function displayArtistDiscography(discography) {
|
||||||
applyDynamicGlow(card, colors);
|
applyDynamicGlow(card, colors);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add click handler for download missing tracks modal
|
// Add click handler for download missing tracks modal
|
||||||
card.addEventListener('click', () => handleArtistAlbumClick(album, 'albums'));
|
card.addEventListener('click', () => handleArtistAlbumClick(album, 'albums'));
|
||||||
card.style.cursor = 'pointer';
|
card.style.cursor = 'pointer';
|
||||||
|
|
@ -15131,13 +15131,13 @@ function displayArtistDiscography(discography) {
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate singles
|
// Populate singles
|
||||||
const singlesContainer = document.getElementById('singles-cards-container');
|
const singlesContainer = document.getElementById('singles-cards-container');
|
||||||
if (singlesContainer) {
|
if (singlesContainer) {
|
||||||
if (discography.singles?.length > 0) {
|
if (discography.singles?.length > 0) {
|
||||||
singlesContainer.innerHTML = discography.singles.map(single => createAlbumCardHTML(single)).join('');
|
singlesContainer.innerHTML = discography.singles.map(single => createAlbumCardHTML(single)).join('');
|
||||||
|
|
||||||
// Add dynamic glow effects and click handlers to singles cards
|
// Add dynamic glow effects and click handlers to singles cards
|
||||||
singlesContainer.querySelectorAll('.album-card').forEach((card, index) => {
|
singlesContainer.querySelectorAll('.album-card').forEach((card, index) => {
|
||||||
const single = discography.singles[index];
|
const single = discography.singles[index];
|
||||||
|
|
@ -15146,7 +15146,7 @@ function displayArtistDiscography(discography) {
|
||||||
applyDynamicGlow(card, colors);
|
applyDynamicGlow(card, colors);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add click handler for download missing tracks modal
|
// Add click handler for download missing tracks modal
|
||||||
card.addEventListener('click', () => handleArtistAlbumClick(single, 'singles'));
|
card.addEventListener('click', () => handleArtistAlbumClick(single, 'singles'));
|
||||||
card.style.cursor = 'pointer';
|
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');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue