diff --git a/site/release.html b/site/release.html
index 6855436..97f4b81 100644
--- a/site/release.html
+++ b/site/release.html
@@ -71,6 +71,7 @@ async function render(){
${show('title')?`
${esc(r.title||'')}
`:''}${show('artist')?`${aHtml}
`:''}
${meta.map(m=>`${esc(String(m))}`).join('')}
+
${show('cart')||show('price')?`${(d.copies||[]).map(c=>`
${money(c.price)}
${esc(c.condition||'')}${c.sleeve_cond?' / '+esc(c.sleeve_cond):''} · ${esc(c.sku)}
${buy(c)}
`).join('')||'
no copies in stock
'}
`:''}
@@ -78,7 +79,26 @@ async function render(){
${show('tracklist')&&d.tracks.length?`Tracklist
${d.tracks.map(t=>`| ${esc(t.position||'')} | ${esc(t.title||'')} | ${esc(t.duration||'')} |
`).join('')}
`:''}
${show('description')&&r.notes?``:''}`;
+ loadAudio(r.id);
}
+function ytId(uri){ const m=String(uri||'').match(/(?:v=|youtu\.be\/|embed\/)([\w-]{11})/); return m?m[1]:(/^[\w-]{11}$/.test(uri||'')?uri:null); }
+async function loadAudio(rid){
+ const z=$('#listen'); if(!z) return; z.innerHTML='';
+ const d=await fetch('/shop/audio/'+rid).then(r=>r.json()).catch(()=>({})), v=d.videos||[];
+ let html='';
+ if(d.apple_preview){ html=``; }
+ else { const yt=v.map(x=>ytId(x.uri)).find(Boolean);
+ if(yt) html=``;
+ else if(d.beatport_embed) html=d.beatport_embed;
+ else if(d.bandcamp_embed) html=d.bandcamp_embed;
+ }
+ if(d.apple && d.apple.url) html+=` Apple Music ↗`;
+ z.innerHTML=html;
+}
+function resetLbtn(){ const b=$('#lbtn'); if(b) b.innerHTML='▶ Listen · 30s'; }
+function togglePreview(url){ const au=$('#aud'), b=$('#lbtn'); if(!au) return;
+ if(au.paused){ if(au.src!==url) au.src=url; au.play(); b.textContent='⏸ Pause'; } else { au.pause(); resetLbtn(); } }
+function playYT(id){ $('#listen').innerHTML=``; }
boot();