<!-- SOLID CITY · part 2863 -->
ick', function () { st.shuffle = !st.shuffle; setQueue(visible()); renderBtns(); save(); });
    el.rep.addEventListener('click', function () { st.repeat = st.repeat === 'all' ? 'one' : st.repeat === 'one' ? 'off' : 'all'; renderBtns(); save(); });
    el.q.addEventListener('input', function () { query = el.q.value; renderList(); });
    p.querySelectorAll('.mp-tabs button').forEach(function (b) { b.addEventListener('click', function () { tab = b.dataset.t; p.querySelectorAll('.mp-tabs button').forEach(function (x) { x.classList.toggle('is-on', x === b); }); q('.mp-songs').hidden = tab !== 'songs'; q('.mp-lyrics').hidden = tab !== 'lyrics'; if (tab === 'lyrics') loadLyrics(); }); });
    el.list.addEventListener('click', function (e) { var r = e.target.closest('[data-n]'); if (!r) return; ensureCtx(); setQueue(visible()); playSong(byN[+r.dataset.n], 0); });
    ['keydown', 'keyup'].forEach(function (ev) { p.addEventListener(ev, function (e) { e.stopPropagation(); }); });
    renderBtns();
  }
  function renderFilters() {
    if (!data) return;
    var counts = { all: data.songs.length }; data.songs.forEach(function (s) { counts[s.kind] = (counts[s.kind] || 0) + 1; });
    var opts = [['all', 'ALL'], ['lyric', 'LYRIC SONGS'], ['instrumental', 'INSTRUMENTALS']]; if (data.covers) opts.push(['cover', 'COVERS (ADMIN)']);
    el.filters.innerHTML = opts.map(function (o) { return '<button type="button" data-f="' + o[0] + '" class="' + (filter === o[0] ? 'is-on' : '') + '">' + o[1] + ' <small>' + (counts[o[0]] || 0) + '</small></button>'; }).join('');
    el.filters.querySelectorAll('button').forEach(function (b) { b.addEventListener('click', function () { filter = b.dataset.f; renderFilters(); renderList(); }); });
    el.note.textContent = data.covers ? 'Admin view: covers of other artists’ songs are visible to you only.' : '';
  }
  function esc(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }
  function renderList() {
    if (!data) { el.list.innerHTML = '<div class="mp-empty">Loading the catalogue…</div>'; return; }
    var v = visible();
    el.list.innerHTML = v.length ? v.map(function (s) {
      return '<div class="mp-row' + (cur === s ? ' is-cur' : '') + '" role="listitem" data-n="' + s.n + '"><span class="mp-n">' + s.n + '</span><span class="mp-rt">' + esc(s.title) + '<small>' + (KIND[s.kind] || s.kind) + (s.lyr ? ' · LYRICS' : '') + '</small></span><span class="mp-d">' + fmt(s.dur) + '</span></div>';
    }).join('') : '<div class="mp-empty">No songs match.</div>';
  }
  function renderNow() {
    if (!cur) return;
    var playing = !audio.paused;
    el.mTitle.textContent = cur.title; el.mKind.textContent = el.mini.classList.contains('is-cockpit') ? 'SHIP AUDIO · CH 1 · ' + (KIND[cur.kind] || '') : (KIND[cur.kind] || '') + ' · SOLIDBIGISLAND';
    el.title.textContent = cur.title; el.badge.textContent = KIND[cur.kind] || cur.kind; el.badge.className = 'mp-badge k-' + cur.kind;
    el.sub.textContent = '#' + cur.n + ' · ' + fmt(cur.dur) + ' · ' + (data ? data.songs.length : '') + ' songs';
    if (cur.thumb) { el.thumb.src = THUMB + cur.thumb; el.thumb.hidden = false; } else el.thumb.hidden = true;
    el.list.querySelectorAll('.is-cur').forEach(function (r) { r.classList.remove('is-cur'); });
    var row = el.list.querySelector('[data-n="' + cur.n + '"]'); if (row) row.classList.add('is-cur');
    if ('mediaSession' in navigator && window.MediaMetadata && msMetaFor !== cur.n) {
      msMetaFor = cur.n;
      try {
        var art = cur.thumb ? [{ src: new URL(THUMB + cur.thumb, location.href).href, sizes: '512x512', type: /\.png$/i.test(cur.thumb) ? 'image/png' : /\.jpe?g$/i.test(cur.thumb) ? 'image/jpeg' : 'image/webp' }] : [];
        navigator.mediaSession.metadata = new MediaMetadata({ title: cur.title, artist: 'SolidBigIsland', album: 'Solid City Radio · ' + (KIND[cur.kind] || ''), artwork: art });
      } catch (e) {}
    }
    renderBtns();
  }
  /* ---------- Media Session: lock-screen / Control Center / headphones ---------- */
  var msMetaFor = null, msHandlers = [];
  function msSet(a, f) { try { navigator.mediaSession.setActionHandler(a, f); msHandlers.push(a); } catch (e) {} }
  if ('mediaSession' in navigator) {
    msSet('play', function () { if (!data) return toggle(); playNow(); });
    msSet('pause', pauseNow);
    msSet('stop', pauseNow);
    msSet('nexttrack', function () { if (data) step(1); });
    msSet('previoustrack', function () { if (data) prev(); });
    msSet('seekto', function (d) { if (d && d.seekTime != null && isFinite(audio.duration)) { if (d.fastSeek && audio.fastSeek) audio.fastSeek(d.seekTime); else audio.currentTime = d.seekTime; msPos(); save(); } });
    msSet('seekbackward', function (d) { audio.currentTime = Math.max(0, audio.currentTime - ((d && d.seekOffset) || 10)); msPos(); });
    msSet('seekforward', function (d) { if (isFinite(audio.duration)