- {#if selectedAlbum}
- {@const albumSections = buildAlbumSections(albumTracks)}
- {@const showDiscHeaders = albumSections.length > 1}
-
-
-
-
-
-
-
-
-
-
- {#each albumSections as section (section.disc)}
- {#if showDiscHeaders}
-
- {/if}
- {#each section.tracks as track, index (track.id)}
- handleLocalArtistClick(track.artist)
- : undefined}
- onPlay={() => handleTrackPlay(track)}
- menuActions={{
- onPlayNow: () => handleTrackPlay(track),
- onPlayNext: onTrackPlayNext ? () => onTrackPlayNext(track) : undefined,
- onPlayLater: onTrackPlayLater ? () => onTrackPlayLater(track) : undefined,
- onAddToPlaylist: onTrackAddToPlaylist ? () => onTrackAddToPlaylist(track.id) : undefined
- }}
- />
- {/each}
- {/each}
-
-
-
-
- {#if folders.length === 0}
-
-
No folders added yet. Add a folder to start building your library.
-
- {:else}
-
- {#each folders as folder}
-
-
- {folder}
-
- {/each}
-
- {/if}
-
-
-
- {#if hasDiscogsCredentials}
-
- {:else}
-
- Configure Discogs API for automatic artwork fetching
-
- {/if}
-
-
-
-
Danger Zone
-
-
-
- {#if loading}
-
- {:else if error}
-
-
-
Failed to load library
-
{error}
-
-
- {:else if activeTab === 'albums'}
- {#if showHiddenAlbums}
-
-
-
- {#if hiddenAlbums.length === 0}
-
- {:else}
-
- {#each hiddenAlbums as album (album.id)}
-
-
handleAlbumClick(album)}>
- {#if album.artwork_path}
-
})
- {:else}
-
-
-
- {/if}
-
-
handleAlbumClick(album)}>
-
{album.title}
-
{album.artist}
-
- {#if album.year}{album.year}•{/if}
- {album.track_count} tracks
- •
- {formatTotalDuration(album.total_duration_secs)}
- •
- {getAlbumQualityBadge(album)}
-
-
-
-
- {/each}
-
- {/if}
-
- {:else}
-
- {#if albums.length === 0}
-
-
-
No albums in library
-
Add folders and scan to build your library
-
- {:else}
- {@const filteredAlbums = albumSearch.trim()
- ? albums.filter(album => matchesAlbumSearch(album, albumSearch))
- : albums}
-
-
-
-
-
- {#if albumSearch}
-
- {/if}
-
-
-
-
- {#if showGroupMenu}
-
- {/if}
-
-
-
-
-
{filteredAlbums.length} albums
-
-
- {#if filteredAlbums.length === 0}
-
-
-
No albums match your search
-
Try a different artist or album name
-
- {:else}
- {@const groupedAlbums = albumGroupingEnabled ? groupAlbums(filteredAlbums, albumGroupMode) : [{ key: '', id: 'ungrouped', albums: filteredAlbums }]}
- {@const alphaGroups = albumGroupingEnabled && albumGroupMode === 'alpha'
- ? new Set(groupedAlbums.map(group => group.key))
- : new Set
()}
-
-
-
- {#each groupedAlbums as group (group.id)}
-
- {#if albumGroupingEnabled}
-
- {/if}
- {#if albumViewMode === 'grid'}
-
- {#each group.albums as album (album.id)}
-
handleAlbumPlayFromGrid(album)}
- onPlayNext={() => handleAlbumQueueNextFromGrid(album)}
- onPlayLater={() => handleAlbumQueueLaterFromGrid(album)}
- onclick={() => handleAlbumClick(album)}
- />
- {/each}
-
- {:else}
-
- {#each group.albums as album (album.id)}
-
handleAlbumClick(album)}>
-
- {#if album.artwork_path}
-
})
- {:else}
-
-
-
- {/if}
-
-
-
{album.title}
-
- {album.artist}
- {#if album.year}{album.year}{/if}
- {album.track_count} tracks
- {formatTotalDuration(album.total_duration_secs)}
-
-
-
-
- {getAlbumQualityBadge(album)}
-
-
-
- {/each}
-
- {/if}
-
- {/each}
-
-
- {#if albumGroupingEnabled && albumGroupMode === 'alpha'}
-
- {#each alphaIndexLetters as letter}
-
- {/each}
-
- {/if}
-
- {/if}
- {/if}
- {/if}
- {:else if activeTab === 'artists'}
- {#if artists.length === 0}
-
-
-
No artists in library
-
- {:else}
- {@const filteredArtists = artists.filter(artist => matchesArtistSearch(artist, artistSearch))}
-
-
-
-
- {#if artistSearch}
-
- {/if}
-
-
{filteredArtists.length} artists
-
-
- {#if filteredArtists.length === 0}
-
-
-
No artists match your search
-
- {:else}
-
- {#each filteredArtists as artist (artist.name)}
- {@const artistImage = artistImages.get(artist.name)}
-
handleLocalArtistClick(artist.name)}
- onkeydown={(event) => event.key === 'Enter' && handleLocalArtistClick(artist.name)}
- >
-
- {#if artistImage}
-

- {:else}
-
- {/if}
-
- {#if showSettings}
-
- {/if}
-
{artist.name}
-
- {artist.album_count} albums • {artist.track_count} tracks
-
-
- {/each}
-
- {/if}
- {/if}
- {:else if activeTab === 'tracks'}
- {#if tracks.length === 0}
-
-
-
No tracks in library
-
- {:else}
-
-
-
-
- {#if trackSearch}
-
- {/if}
-
-
-
-
- {#if showTrackGroupMenu}
-
- {/if}
-
-
-
{tracks.length} tracks
-
-
- {@const groupedTracks = trackGroupingEnabled ? groupTracks(tracks, trackGroupMode) : [{ id: 'ungrouped', title: '', subtitle: '', tracks, key: '' }]}
- {@const trackIndexTargets = trackGroupingEnabled && trackGroupMode === 'artist'
- ? (() => {
- const map = new Map();
- for (const group of groupedTracks) {
- const letter = alphaGroupKey(group.title);
- if (!map.has(letter)) {
- map.set(letter, group.id);
- }
- }
- return map;
- })()
- : new Map()}
- {@const trackAlphaGroups = trackGroupingEnabled && trackGroupMode === 'name'
- ? new Set(groupedTracks.map(group => group.key))
- : trackGroupingEnabled && trackGroupMode === 'artist'
- ? new Set(trackIndexTargets.keys())
- : new Set()}
-
-
-
- {#each groupedTracks as group (group.id)}
-
- {#if trackGroupingEnabled}
-
- {/if}
-
-
- {#if trackGroupingEnabled && trackGroupMode === 'album'}
- {@const trackSections = buildAlbumSections(group.tracks)}
- {@const showTrackDiscHeaders = trackSections.length > 1}
- {#each trackSections as section (section.disc)}
- {#if showTrackDiscHeaders}
-
- {/if}
- {#each section.tracks as track, index (track.id)}
- handleLocalArtistClick(track.artist) : undefined}
- onAlbumClick={track.album_group_key ? () => handleLocalAlbumLink(track) : undefined}
- onPlay={() => handleTrackPlay(track)}
- menuActions={{
- onPlayNow: () => handleTrackPlay(track),
- onPlayNext: onTrackPlayNext ? () => onTrackPlayNext(track) : undefined,
- onPlayLater: onTrackPlayLater ? () => onTrackPlayLater(track) : undefined,
- onAddToPlaylist: onTrackAddToPlaylist ? () => onTrackAddToPlaylist(track.id) : undefined
- }}
- />
- {/each}
- {/each}
- {:else}
- {#each group.tracks as track, index (track.id)}
- handleLocalArtistClick(track.artist) : undefined}
- onAlbumClick={track.album_group_key ? () => handleLocalAlbumLink(track) : undefined}
- onPlay={() => handleTrackPlay(track)}
- menuActions={{
- onPlayNow: () => handleTrackPlay(track),
- onPlayNext: onTrackPlayNext ? () => onTrackPlayNext(track) : undefined,
- onPlayLater: onTrackPlayLater ? () => onTrackPlayLater(track) : undefined,
- onAddToPlaylist: onTrackAddToPlaylist ? () => onTrackAddToPlaylist(track.id) : undefined
- }}
- />
- {/each}
- {/if}
-
-
- {/each}
-
-
- {#if trackGroupingEnabled && (trackGroupMode === 'name' || trackGroupMode === 'artist')}
-
- {#each alphaIndexLetters as letter}
-
- {/each}
-
- {/if}
-
- {/if}
- {/if}
-