From 28c5a2fcb366e442c85aecd36add8919702b7f9d Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 11 Jan 2026 19:49:44 +0100 Subject: [PATCH] Show artist/album/playlist content directly in Player tab with tracks --- ui.ts | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/ui.ts b/ui.ts index aa59e86..6228ccb 100644 --- a/ui.ts +++ b/ui.ts @@ -286,10 +286,10 @@ async function search(){ document.getElementById('searchBtn').disabled=false;document.getElementById('loading').style.display='none'; } -function render(f){ +function render(f,append){ var el=document.getElementById('results'); - if(!songs.length){el.innerHTML='
No results
';return} - el.innerHTML=songs.map((s,i)=>{ + if(!songs.length){if(!append)el.innerHTML='
No results
';return} + var html=songs.map((s,i)=>{ var type=s.resultType||'song'; var playable=s.videoId&&(type==='song'||type==='video'); var click=''; @@ -302,6 +302,8 @@ function render(f){ var badge=type!=='song'&&type!=='video'?''+type+'':''; return '
'+esc(s.title||s.name||'Unknown')+badge+'
'+esc(s.artists?.map(a=>a.name).join(', ')||s.subtitle||'')+'
'+(s.duration||'')+'
'; }).join(''); + if(append)el.innerHTML+=html; + else el.innerHTML=html; } function play(i){ @@ -317,9 +319,69 @@ function toggle(){if(!ready)return;playing?yt.pauseVideo():yt.playVideo()} function prev(){if(idx>0)play(idx-1)} function next(){if(idx({...s,resultType:'song'}))); + if(data.albums?.results){ + data.albums.results.forEach(a=>{tracks.push({...a,resultType:'album'})}); + } + if(data.singles?.results){ + data.singles.results.forEach(a=>{tracks.push({...a,resultType:'album'})}); + } + songs=tracks; + // Show artist header + var header='
'+esc(data.name||'Artist')+'
'+(data.subscribers||'')+'
'; + document.getElementById('results').innerHTML=header; + render(null,true); + }catch(e){document.getElementById('results').innerHTML='
Failed to load artist
';} + document.getElementById('loading').style.display='none'; +} + +async function viewAlbum(id){ + document.getElementById('loading').style.display='block'; + document.getElementById('results').innerHTML=''; + try{ + var res=await fetch('/api/albums/'+encodeURIComponent(id)); + var data=await res.json(); + songs=(data.tracks||[]).map(t=>({...t,resultType:'song',thumbnails:data.thumbnails})); + // Show album header + var header='
'+esc(data.title||'Album')+'
'+esc(data.artists?.map(a=>a.name).join(', ')||'')+'
'+(data.year||'')+' - '+(data.trackCount||songs.length)+' tracks
'; + document.getElementById('results').innerHTML=header; + render(null,true); + }catch(e){document.getElementById('results').innerHTML='
Failed to load album
';} + document.getElementById('loading').style.display='none'; +} + +async function viewPlaylist(id){ + document.getElementById('loading').style.display='block'; + document.getElementById('results').innerHTML=''; + try{ + // Handle both VL prefix and raw playlist IDs + var playlistId=id.startsWith('VL')?id.substring(2):id; + var res=await fetch('/api/playlists/'+encodeURIComponent(playlistId)); + var data=await res.json(); + songs=(data.tracks||[]).map(t=>({...t,resultType:'song'})); + // Show playlist header + var header='
'+esc(data.title||'Playlist')+'
'+esc(data.author?.name||'')+'
'+(data.trackCount||songs.length)+' tracks
'; + document.getElementById('results').innerHTML=header; + render(null,true); + }catch(e){document.getElementById('results').innerHTML='
Failed to load playlist
';} + document.getElementById('loading').style.display='none'; +} + +var lastSearch=''; +function goBack(){ + var q=document.getElementById('query').value.trim(); + if(q)search(); + else{songs=[];document.getElementById('results').innerHTML='
Search for music
';} +} var cfg={ search:{inputs:[{n:'q',p:'Query',v:'coldplay'}],url:'/api/search'},