{t('nav.music', 'Music')} · OxiCloud
{#if error}

{error}

{:else if loading && playlists.length === 0}
{:else if playlists.length === 0}

{t('music.no_playlists', 'No playlists yet.')}

{t('music.empty_hint', 'Create a playlist to start collecting your tracks.')}

{:else}

{t('music.playlists', 'Playlists')}

{#each playlists as p (p.id)}
select(p)} >
{p.name} {p.track_count} {t('music.tracks', 'tracks')}
{/each}
{#if current}

{current.name}

{t('music.track_count', { n: current.track_count }, '{{n}} tracks')} {#if current.description}· {current.description}{/if}

{#if current.is_public} {t('music.public', 'Public')} {/if}
{#if tracks.length === 0}

{t('music.empty_playlist', 'This playlist has no tracks yet.')}

{:else}
# {t('music.title', 'Title')} {t('music.artist', 'Artist')} {t('music.album', 'Album')}
{#each tracks as track, i (track.id)}
playFromTracks(i)} ondragstart={() => onDragStart(i)} ondragover={(e) => onDragOver(e, i)} ondrop={onDrop} ondragend={() => (dragIndex = null)} > { e.stopPropagation(); if (currentTrack?.id === track.id) togglePlay(); else playFromTracks(i); }} > {#if currentTrack?.id === track.id} {:else} {i + 1} {/if} {trackLabel(track)} {track.artist || '—'} {track.album || '-'} {fmtDuration(track.duration_secs)}
{/each} {/if}
{:else}

{t('music.select_playlist', 'Select a playlist.')}

{t('music.select_hint', 'Pick a playlist to view its tracks.')}

{/if}
{/if}
{#if currentTrack}
{#if coverUrl(current)} {:else} {/if}
{trackLabel(currentTrack)} {currentTrack.artist ?? ''}
{fmtTime(currentTime)} {fmtTime(duration)}
{#if queueOpen}

{t('music.queue', 'Queue')}

{#if queue.length === 0}

{t('music.queue_empty', 'Queue is empty.')}

{:else} {#each queue as qt, i (qt.id)}
jumpQueue(i)} > {i + 1} {trackLabel(qt)} {qt.artist ?? ''} {fmtDuration(qt.duration_secs)}
{/each} {/if}
{/if} {/if} {#if addOpen}
{ if (e.target === e.currentTarget) addOpen = false; }} >

{t('music.add_tracks', 'Add tracks')}

{#if addSearching}
{t('common.loading', 'Loading…')}
{:else if addResults.length === 0}
{t('music.no_audio', 'No audio files found.')}
{:else} {#each addResults as f (f.id)} {/each} {/if}
{/if} {#if sharesOpen}
{ if (e.target === e.currentTarget) sharesOpen = false; }} >

{t('music.manage_shares', 'Manage shares')}

{#if sharesLoading}
{:else if shares.length === 0}

{t('music.no_shares', 'Not shared with anyone yet.')}

{:else} {#each shares as s (s.user_id)} {/each} {/if}
{/if}