{#if playlist}
{#if cover} {:else}
{/if}

{isSetlist ? "Setlist" : "Playlist"} {#if playlist.pinned} Pinned{/if}

{#if renaming} 22} bind:value={nameInput} onblur={saveName} onkeydown={(e) => { if (e.key === "Enter") saveName(); if (e.key === "Escape") renaming = false; }} use:focusOnMount spellcheck="false" /> {:else} {/if} {#if editingDesc} {:else if playlist.description} {:else} {/if}

{items.length} {items.length === 1 ? "track" : "tracks"} {#if totalSecs} · {fmtTotal(totalSecs)}{/if} {#if unresolvedCount > 0}  · {unresolvedCount} unresolved {/if} {#if missingCount > 0}  · {missingCount} missing {/if}

{#if playlistBulk.playlistId === playlist.id && (playlistBulk.active || playlistBulk.summary)}
{#if playlistBulk.active} {playlistBulk.mode === "cached" ? "Adding streamed tracks to the library" : "Downloading tracks"} — {playlistBulk.done}/{playlistBulk.total} {#if playlistBulk.organized} · {playlistBulk.organized} saved{/if} {#if playlistBulk.queued} · {playlistBulk.queued} downloading{/if} {#if playlistBulk.missed} · {playlistBulk.missed} missed{/if} {:else} {playlistBulk.summary} {/if}
{/if}
{#if loaded && items.length === 0}

This playlist is empty.

Add tracks from an album page, or import a playlist file from the Playlists screen.

{:else if loaded && visible.length === 0}

Nothing here matches “{query}”.

{:else}
# Title
{#each visible as item, index (item.id)} {@const isNow = nowItemId != null && nowItemId === item.id} {@const isDragged = drag?.id === item.id}
gripDown(e, index)} onpointermove={gripMove} onpointerup={gripUp} onpointercancel={gripUp} > {#if isNow} {:else if isSetlist && stampsCoherent} {fmtStamp(item.start_ms)} {:else} {index + 1} {/if} {#if item.art_path && rowArt[item.art_path]} {:else if item.art_url} {:else} {/if} {#if item.kind !== "local" || item.missing} {/if} {fmtDuration(item.duration_secs)}
{#if matchFor === item.id}
Find a local match for “{item.title}”
{#if matchLoading}

Searching…

{:else if matchResults.length === 0}

No library tracks match. You can stream it instead by clicking the row.

{:else}
{#each matchResults as candidate (candidate.path)} {/each}
{/if}
{/if} {/each}
{/if}
{:else}

Playlist not found.

{/if} {#if undo}
{undo.label}
{/if}